OSDN Git Service

Staging: rtl8192su: fix test for negative error in rtl8192_rx_isr()
[android-x86/kernel.git] / drivers / amba / bus.c
index 2466506..f60b2b6 100644 (file)
@@ -204,6 +204,7 @@ static void amba_device_release(struct device *dev)
 int amba_device_register(struct amba_device *dev, struct resource *parent)
 {
        u32 pid, cid;
+       u32 size;
        void __iomem *tmp;
        int i, ret;
 
@@ -229,16 +230,25 @@ int amba_device_register(struct amba_device *dev, struct resource *parent)
        if (ret)
                goto err_out;
 
-       tmp = ioremap(dev->res.start, SZ_4K);
+       /*
+        * Dynamically calculate the size of the resource
+        * and use this for iomap
+        */
+       size = resource_size(&dev->res);
+       tmp = ioremap(dev->res.start, size);
        if (!tmp) {
                ret = -ENOMEM;
                goto err_release;
        }
 
+       /*
+        * Read pid and cid based on size of resource
+        * they are located at end of region
+        */
        for (pid = 0, i = 0; i < 4; i++)
-               pid |= (readl(tmp + 0xfe0 + 4 * i) & 255) << (i * 8);
+               pid |= (readl(tmp + size - 0x20 + 4 * i) & 255) << (i * 8);
        for (cid = 0, i = 0; i < 4; i++)
-               cid |= (readl(tmp + 0xff0 + 4 * i) & 255) << (i * 8);
+               cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) << (i * 8);
 
        iounmap(tmp);
 
@@ -353,11 +363,14 @@ amba_find_device(const char *busid, struct device *parent, unsigned int id,
 int amba_request_regions(struct amba_device *dev, const char *name)
 {
        int ret = 0;
+       u32 size;
 
        if (!name)
                name = dev->dev.driver->name;
 
-       if (!request_mem_region(dev->res.start, SZ_4K, name))
+       size = resource_size(&dev->res);
+
+       if (!request_mem_region(dev->res.start, size, name))
                ret = -EBUSY;
 
        return ret;
@@ -371,7 +384,10 @@ int amba_request_regions(struct amba_device *dev, const char *name)
  */
 void amba_release_regions(struct amba_device *dev)
 {
-       release_mem_region(dev->res.start, SZ_4K);
+       u32 size;
+
+       size = resource_size(&dev->res);
+       release_mem_region(dev->res.start, size);
 }
 
 EXPORT_SYMBOL(amba_driver_register);