iwmc3200wifi: Test of wrong pointer after kzalloc in iwm_mlme_update_bss_table()
[safe/jmp/linux-2.6] / drivers / amba / bus.c
index 268e301..f60b2b6 100644 (file)
 #include <linux/device.h>
 #include <linux/string.h>
 #include <linux/slab.h>
+#include <linux/io.h>
 #include <linux/amba/bus.h>
 
-#include <asm/io.h>
+#include <asm/irq.h>
 #include <asm/sizes.h>
 
 #define to_amba_device(d)      container_of(d, struct amba_device, dev)
@@ -44,15 +45,12 @@ static int amba_match(struct device *dev, struct device_driver *drv)
 }
 
 #ifdef CONFIG_HOTPLUG
-static int amba_uevent(struct device *dev, char **envp, int nr_env, char *buf, int bufsz)
+static int amba_uevent(struct device *dev, struct kobj_uevent_env *env)
 {
        struct amba_device *pcdev = to_amba_device(dev);
-       int retval = 0, i = 0, len = 0;
+       int retval = 0;
 
-       retval = add_uevent_var(envp, nr_env, &i,
-                               buf, bufsz, &len,
-                               "AMBA_ID=%08x", pcdev->periphid);
-       envp[i] = NULL;
+       retval = add_uevent_var(env, "AMBA_ID=%08x", pcdev->periphid);
        return retval;
 }
 #else
@@ -206,13 +204,24 @@ 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;
 
+       device_initialize(&dev->dev);
+
+       /*
+        * Copy from device_add
+        */
+       if (dev->dev.init_name) {
+               dev_set_name(&dev->dev, "%s", dev->dev.init_name);
+               dev->dev.init_name = NULL;
+       }
+
        dev->dev.release = amba_device_release;
        dev->dev.bus = &amba_bustype;
        dev->dev.dma_mask = &dev->dma_mask;
-       dev->res.name = dev->dev.bus_id;
+       dev->res.name = dev_name(&dev->dev);
 
        if (!dev->dev.coherent_dma_mask && dev->dma_mask)
                dev_warn(&dev->dev, "coherent dma mask is unset\n");
@@ -221,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);
 
@@ -242,7 +260,7 @@ int amba_device_register(struct amba_device *dev, struct resource *parent)
                goto err_release;
        }
 
-       ret = device_register(&dev->dev);
+       ret = device_add(&dev->dev);
        if (ret)
                goto err_release;
 
@@ -296,7 +314,7 @@ static int amba_find_match(struct device *dev, void *data)
        if (d->parent)
                r &= d->parent == dev->parent;
        if (d->busid)
-               r &= strcmp(dev->bus_id, d->busid) == 0;
+               r &= strcmp(dev_name(dev), d->busid) == 0;
 
        if (r) {
                get_device(dev);
@@ -345,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;
@@ -363,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);