aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/amba
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/amba')
-rw-r--r--drivers/amba/bus.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c
index 3d763fdf99b7..768d973d0ded 100644
--- a/drivers/amba/bus.c
+++ b/drivers/amba/bus.c
@@ -204,6 +204,7 @@ static void amba_device_release(struct device *dev)
204int amba_device_register(struct amba_device *dev, struct resource *parent) 204int amba_device_register(struct amba_device *dev, struct resource *parent)
205{ 205{
206 u32 pid, cid; 206 u32 pid, cid;
207 u32 size;
207 void __iomem *tmp; 208 void __iomem *tmp;
208 int i, ret; 209 int i, ret;
209 210
@@ -219,16 +220,25 @@ int amba_device_register(struct amba_device *dev, struct resource *parent)
219 if (ret) 220 if (ret)
220 goto err_out; 221 goto err_out;
221 222
222 tmp = ioremap(dev->res.start, SZ_4K); 223 /*
224 * Dynamically calculate the size of the resource
225 * and use this for iomap
226 */
227 size = resource_size(&dev->res);
228 tmp = ioremap(dev->res.start, size);
223 if (!tmp) { 229 if (!tmp) {
224 ret = -ENOMEM; 230 ret = -ENOMEM;
225 goto err_release; 231 goto err_release;
226 } 232 }
227 233
234 /*
235 * Read pid and cid based on size of resource
236 * they are located at end of region
237 */
228 for (pid = 0, i = 0; i < 4; i++) 238 for (pid = 0, i = 0; i < 4; i++)
229 pid |= (readl(tmp + 0xfe0 + 4 * i) & 255) << (i * 8); 239 pid |= (readl(tmp + size - 0x20 + 4 * i) & 255) << (i * 8);
230 for (cid = 0, i = 0; i < 4; i++) 240 for (cid = 0, i = 0; i < 4; i++)
231 cid |= (readl(tmp + 0xff0 + 4 * i) & 255) << (i * 8); 241 cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) << (i * 8);
232 242
233 iounmap(tmp); 243 iounmap(tmp);
234 244
@@ -343,11 +353,14 @@ amba_find_device(const char *busid, struct device *parent, unsigned int id,
343int amba_request_regions(struct amba_device *dev, const char *name) 353int amba_request_regions(struct amba_device *dev, const char *name)
344{ 354{
345 int ret = 0; 355 int ret = 0;
356 u32 size;
346 357
347 if (!name) 358 if (!name)
348 name = dev->dev.driver->name; 359 name = dev->dev.driver->name;
349 360
350 if (!request_mem_region(dev->res.start, SZ_4K, name)) 361 size = resource_size(&dev->res);
362
363 if (!request_mem_region(dev->res.start, size, name))
351 ret = -EBUSY; 364 ret = -EBUSY;
352 365
353 return ret; 366 return ret;
@@ -361,7 +374,10 @@ int amba_request_regions(struct amba_device *dev, const char *name)
361 */ 374 */
362void amba_release_regions(struct amba_device *dev) 375void amba_release_regions(struct amba_device *dev)
363{ 376{
364 release_mem_region(dev->res.start, SZ_4K); 377 u32 size;
378
379 size = resource_size(&dev->res);
380 release_mem_region(dev->res.start, size);
365} 381}
366 382
367EXPORT_SYMBOL(amba_driver_register); 383EXPORT_SYMBOL(amba_driver_register);