Commit 3341323bb4c198f704cffbfdda37bcec1226ef7d

Authored by Alexander Clouter
Committed by Herbert Xu
1 parent be0ea69674

hwrng: timeriomem - Use phys address rather than virt

There is no ioremap'ing or anything in timeriomem-rng.c as I foolishly
used already remapped virtual addresses instead of passing the physical
address to be polled.

This patch fixes this flaw and lets developers do the Right Thing(tm).

Signed-off-by: Alexander Clouter <alex@digriz.org.uk>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

Showing 2 changed files with 36 additions and 5 deletions Side-by-side Diff

drivers/char/hw_random/timeriomem-rng.c
... ... @@ -90,10 +90,30 @@
90 90  
91 91 static int __init timeriomem_rng_probe(struct platform_device *pdev)
92 92 {
  93 + struct resource *res, *mem;
93 94 int ret;
94 95  
  96 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  97 +
  98 + if (!res)
  99 + return -ENOENT;
  100 +
  101 + mem = request_mem_region(res->start, res->end - res->start + 1,
  102 + pdev->name);
  103 + if (mem == NULL)
  104 + return -EBUSY;
  105 +
  106 + dev_set_drvdata(&pdev->dev, mem);
  107 +
95 108 timeriomem_rng_data = pdev->dev.platform_data;
96 109  
  110 + timeriomem_rng_data->address = ioremap(res->start,
  111 + res->end - res->start + 1);
  112 + if (!timeriomem_rng_data->address) {
  113 + ret = -ENOMEM;
  114 + goto err_ioremap;
  115 + }
  116 +
97 117 if (timeriomem_rng_data->period != 0
98 118 && usecs_to_jiffies(timeriomem_rng_data->period) > 0) {
99 119 timeriomem_rng_timer.expires = jiffies;
100 120  
101 121  
102 122  
... ... @@ -104,22 +124,33 @@
104 124 timeriomem_rng_data->present = 1;
105 125  
106 126 ret = hwrng_register(&timeriomem_rng_ops);
107   - if (ret) {
108   - dev_err(&pdev->dev, "problem registering\n");
109   - return ret;
110   - }
  127 + if (ret)
  128 + goto err_register;
111 129  
112 130 dev_info(&pdev->dev, "32bits from 0x%p @ %dus\n",
113 131 timeriomem_rng_data->address,
114 132 timeriomem_rng_data->period);
115 133  
116 134 return 0;
  135 +
  136 +err_register:
  137 + dev_err(&pdev->dev, "problem registering\n");
  138 + iounmap(timeriomem_rng_data->address);
  139 +err_ioremap:
  140 + release_resource(mem);
  141 +
  142 + return ret;
117 143 }
118 144  
119 145 static int __devexit timeriomem_rng_remove(struct platform_device *pdev)
120 146 {
  147 + struct resource *mem = dev_get_drvdata(&pdev->dev);
  148 +
121 149 del_timer_sync(&timeriomem_rng_timer);
122 150 hwrng_unregister(&timeriomem_rng_ops);
  151 +
  152 + iounmap(timeriomem_rng_data->address);
  153 + release_resource(mem);
123 154  
124 155 return 0;
125 156 }
include/linux/timeriomem-rng.h
... ... @@ -14,7 +14,7 @@
14 14 struct completion completion;
15 15 unsigned int present:1;
16 16  
17   - u32 __iomem *address;
  17 + void __iomem *address;
18 18  
19 19 /* measures in usecs */
20 20 unsigned int period;