ux500: rework gpio registration
[pandora-kernel.git] / arch / arm / mach-ux500 / devices-common.c
index 9376a24..fe69f5f 100644 (file)
@@ -13,6 +13,8 @@
 #include <linux/platform_device.h>
 #include <linux/amba/bus.h>
 
+#include <plat/gpio.h>
+
 #include <mach/hardware.h>
 
 #include "devices-common.h"
@@ -105,3 +107,39 @@ dbx500_add_platform_device_4k1irq(const char *name, int id,
        return dbx500_add_platform_device(name, id, pdata, resources,
                                          ARRAY_SIZE(resources));
 }
+
+static struct platform_device *
+dbx500_add_gpio(int id, resource_size_t addr, int irq,
+               struct nmk_gpio_platform_data *pdata)
+{
+       struct resource resources[] = {
+               {
+                       .start  = addr,
+                       .end    = addr + 127,
+                       .flags  = IORESOURCE_MEM,
+               },
+               {
+                       .start  = irq,
+                       .end    = irq,
+                       .flags  = IORESOURCE_IRQ,
+               }
+       };
+
+       return platform_device_register_resndata(NULL, "gpio", id,
+                               resources, ARRAY_SIZE(resources),
+                               pdata, sizeof(*pdata));
+}
+
+void dbx500_add_gpios(resource_size_t *base, int num, int irq,
+                     struct nmk_gpio_platform_data *pdata)
+{
+       int first = 0;
+       int i;
+
+       for (i = 0; i < num; i++, first += 32, irq++) {
+               pdata->first_gpio = first;
+               pdata->first_irq = NOMADIK_GPIO_TO_IRQ(first);
+
+               dbx500_add_gpio(i, base[i], irq, pdata);
+       }
+}