diff options
Diffstat (limited to 'drivers/amba/bus.c')
| -rw-r--r-- | drivers/amba/bus.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index 246650673010..f60b2b6a0931 100644 --- a/drivers/amba/bus.c +++ b/drivers/amba/bus.c | |||
| @@ -204,6 +204,7 @@ static void amba_device_release(struct device *dev) | |||
| 204 | int amba_device_register(struct amba_device *dev, struct resource *parent) | 204 | int 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 | ||
| @@ -229,16 +230,25 @@ int amba_device_register(struct amba_device *dev, struct resource *parent) | |||
| 229 | if (ret) | 230 | if (ret) |
| 230 | goto err_out; | 231 | goto err_out; |
| 231 | 232 | ||
| 232 | tmp = ioremap(dev->res.start, SZ_4K); | 233 | /* |
| 234 | * Dynamically calculate the size of the resource | ||
| 235 | * and use this for iomap | ||
| 236 | */ | ||
| 237 | size = resource_size(&dev->res); | ||
| 238 | tmp = ioremap(dev->res.start, size); | ||
| 233 | if (!tmp) { | 239 | if (!tmp) { |
| 234 | ret = -ENOMEM; | 240 | ret = -ENOMEM; |
| 235 | goto err_release; | 241 | goto err_release; |
| 236 | } | 242 | } |
| 237 | 243 | ||
| 244 | /* | ||
| 245 | * Read pid and cid based on size of resource | ||
| 246 | * they are located at end of region | ||
| 247 | */ | ||
| 238 | for (pid = 0, i = 0; i < 4; i++) | 248 | for (pid = 0, i = 0; i < 4; i++) |
| 239 | pid |= (readl(tmp + 0xfe0 + 4 * i) & 255) << (i * 8); | 249 | pid |= (readl(tmp + size - 0x20 + 4 * i) & 255) << (i * 8); |
| 240 | for (cid = 0, i = 0; i < 4; i++) | 250 | for (cid = 0, i = 0; i < 4; i++) |
| 241 | cid |= (readl(tmp + 0xff0 + 4 * i) & 255) << (i * 8); | 251 | cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) << (i * 8); |
| 242 | 252 | ||
| 243 | iounmap(tmp); | 253 | iounmap(tmp); |
| 244 | 254 | ||
| @@ -353,11 +363,14 @@ amba_find_device(const char *busid, struct device *parent, unsigned int id, | |||
| 353 | int amba_request_regions(struct amba_device *dev, const char *name) | 363 | int amba_request_regions(struct amba_device *dev, const char *name) |
| 354 | { | 364 | { |
| 355 | int ret = 0; | 365 | int ret = 0; |
| 366 | u32 size; | ||
| 356 | 367 | ||
| 357 | if (!name) | 368 | if (!name) |
| 358 | name = dev->dev.driver->name; | 369 | name = dev->dev.driver->name; |
| 359 | 370 | ||
| 360 | if (!request_mem_region(dev->res.start, SZ_4K, name)) | 371 | size = resource_size(&dev->res); |
| 372 | |||
| 373 | if (!request_mem_region(dev->res.start, size, name)) | ||
| 361 | ret = -EBUSY; | 374 | ret = -EBUSY; |
| 362 | 375 | ||
| 363 | return ret; | 376 | return ret; |
| @@ -371,7 +384,10 @@ int amba_request_regions(struct amba_device *dev, const char *name) | |||
| 371 | */ | 384 | */ |
| 372 | void amba_release_regions(struct amba_device *dev) | 385 | void amba_release_regions(struct amba_device *dev) |
| 373 | { | 386 | { |
| 374 | release_mem_region(dev->res.start, SZ_4K); | 387 | u32 size; |
| 388 | |||
| 389 | size = resource_size(&dev->res); | ||
| 390 | release_mem_region(dev->res.start, size); | ||
| 375 | } | 391 | } |
| 376 | 392 | ||
| 377 | EXPORT_SYMBOL(amba_driver_register); | 393 | EXPORT_SYMBOL(amba_driver_register); |
