ARM: 7369/1: amba: add functions to add devices dynamically
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 3 Apr 2012 10:58:42 +0000 (11:58 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 19 Apr 2012 18:31:33 +0000 (19:31 +0100)
Add two functions to add APB and AHB devices to the amba (PrimeCell)
bus dynamically. This is modeled after the static definition
macros recently introduced into <linux/amba/bus.h> and can
help us in factoring out a bunch of code across the kernel.
Since a lot of call sites seem to be using a returned struct
amba device* pointer, let's use that.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
drivers/amba/bus.c
include/linux/amba/bus.h

index cc273226dbd014868ac68342d07225e0b095d6e1..9469d87220389078fff379a43a85169eac0cc49f 100644 (file)
@@ -543,6 +543,55 @@ int amba_device_add(struct amba_device *dev, struct resource *parent)
 }
 EXPORT_SYMBOL_GPL(amba_device_add);
 
+static struct amba_device *
+amba_aphb_device_add(struct device *parent, const char *name,
+                    resource_size_t base, size_t size, int irq1, int irq2,
+                    void *pdata, unsigned int periphid, u64 dma_mask)
+{
+       struct amba_device *dev;
+       int ret;
+
+       dev = amba_device_alloc(name, base, size);
+       if (!dev)
+               return ERR_PTR(-ENOMEM);
+
+       dev->dma_mask = dma_mask;
+       dev->dev.coherent_dma_mask = dma_mask;
+       dev->irq[0] = irq1;
+       dev->irq[1] = irq2;
+       dev->periphid = periphid;
+       dev->dev.platform_data = pdata;
+       dev->dev.parent = parent;
+
+       ret = amba_device_add(dev, &iomem_resource);
+       if (ret) {
+               amba_device_put(dev);
+               return ERR_PTR(ret);
+       }
+
+       return dev;
+}
+
+struct amba_device *
+amba_apb_device_add(struct device *parent, const char *name,
+                   resource_size_t base, size_t size, int irq1, int irq2,
+                   void *pdata, unsigned int periphid)
+{
+       return amba_aphb_device_add(parent, name, base, size, irq1, irq2, pdata,
+                                   periphid, 0);
+}
+EXPORT_SYMBOL_GPL(amba_apb_device_add);
+
+struct amba_device *
+amba_ahb_device_add(struct device *parent, const char *name,
+                   resource_size_t base, size_t size, int irq1, int irq2,
+                   void *pdata, unsigned int periphid)
+{
+       return amba_aphb_device_add(parent, name, base, size, irq1, irq2, pdata,
+                                   periphid, ~0ULL);
+}
+EXPORT_SYMBOL_GPL(amba_ahb_device_add);
+
 static void amba_device_initialize(struct amba_device *dev, const char *name)
 {
        device_initialize(&dev->dev);
index 8d54f79457ba54ae2c85ce1a0e03c0ca5a34e8fc..d36417158d8f1811f914fb257d58ea97a092bdfc 100644 (file)
@@ -63,6 +63,14 @@ struct amba_device *amba_device_alloc(const char *, resource_size_t, size_t);
 void amba_device_put(struct amba_device *);
 int amba_device_add(struct amba_device *, struct resource *);
 int amba_device_register(struct amba_device *, struct resource *);
+struct amba_device *amba_apb_device_add(struct device *parent, const char *name,
+                                       resource_size_t base, size_t size,
+                                       int irq1, int irq2, void *pdata,
+                                       unsigned int periphid);
+struct amba_device *amba_ahb_device_add(struct device *parent, const char *name,
+                                       resource_size_t base, size_t size,
+                                       int irq1, int irq2, void *pdata,
+                                       unsigned int periphid);
 void amba_device_unregister(struct amba_device *);
 struct amba_device *amba_find_device(const char *, struct device *, unsigned int, unsigned int);
 int amba_request_regions(struct amba_device *, const char *);