[ARM] versatile: add PL061 gpiolib support
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Sun, 5 Jul 2009 21:43:01 +0000 (22:43 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 6 Jul 2009 11:02:14 +0000 (12:02 +0100)
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/Kconfig
arch/arm/mach-versatile/core.c
arch/arm/mach-versatile/include/mach/gpio.h [new file with mode: 0644]
arch/arm/mach-versatile/include/mach/irqs.h
arch/arm/mach-versatile/versatile_pb.c

index aef63c8..e4971e4 100644 (file)
@@ -229,6 +229,7 @@ config ARCH_VERSATILE
        select ICST307
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
+       select ARCH_WANT_OPTIONAL_GPIOLIB
        help
          This enables support for ARM Ltd Versatile board.
 
index 69214fc..92273c9 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/interrupt.h>
 #include <linux/amba/bus.h>
 #include <linux/amba/clcd.h>
+#include <linux/amba/pl061.h>
 #include <linux/clocksource.h>
 #include <linux/clockchips.h>
 #include <linux/cnt32_to_63.h>
@@ -706,6 +707,16 @@ static struct clcd_board clcd_plat_data = {
        .remove         = versatile_clcd_remove,
 };
 
+static struct pl061_platform_data gpio0_plat_data = {
+       .gpio_base      = 0,
+       .irq_base       = IRQ_GPIO0_START,
+};
+
+static struct pl061_platform_data gpio1_plat_data = {
+       .gpio_base      = 8,
+       .irq_base       = IRQ_GPIO1_START,
+};
+
 #define AACI_IRQ       { IRQ_AACI, NO_IRQ }
 #define AACI_DMA       { 0x80, 0x81 }
 #define MMCI0_IRQ      { IRQ_MMCI0A,IRQ_SIC_MMCI0B }
@@ -768,8 +779,8 @@ AMBA_DEVICE(clcd,  "dev:20",  CLCD,     &clcd_plat_data);
 AMBA_DEVICE(dmac,  "dev:30",  DMAC,     NULL);
 AMBA_DEVICE(sctl,  "dev:e0",  SCTL,     NULL);
 AMBA_DEVICE(wdog,  "dev:e1",  WATCHDOG, NULL);
-AMBA_DEVICE(gpio0, "dev:e4",  GPIO0,    NULL);
-AMBA_DEVICE(gpio1, "dev:e5",  GPIO1,    NULL);
+AMBA_DEVICE(gpio0, "dev:e4",  GPIO0,    &gpio0_plat_data);
+AMBA_DEVICE(gpio1, "dev:e5",  GPIO1,    &gpio1_plat_data);
 AMBA_DEVICE(rtc,   "dev:e8",  RTC,      NULL);
 AMBA_DEVICE(sci0,  "dev:f0",  SCI,      NULL);
 AMBA_DEVICE(uart0, "dev:f1",  UART0,    NULL);
diff --git a/arch/arm/mach-versatile/include/mach/gpio.h b/arch/arm/mach-versatile/include/mach/gpio.h
new file mode 100644 (file)
index 0000000..94ff276
--- /dev/null
@@ -0,0 +1,6 @@
+#include <asm-generic/gpio.h>
+
+#define gpio_get_value __gpio_get_value
+#define gpio_set_value __gpio_set_value
+#define gpio_cansleep  __gpio_cansleep
+#define gpio_to_irq    __gpio_to_irq
index 9bfdb30..bf44c61 100644 (file)
 #define IRQ_SIC_PCI3           (IRQ_SIC_START + SIC_INT_PCI3)
 #define IRQ_SIC_END            63
 
-#define NR_IRQS                        64
+#define IRQ_GPIO0_START                (IRQ_SIC_END + 1)
+#define IRQ_GPIO0_END          (IRQ_GPIO0_START + 31)
+#define IRQ_GPIO1_START                (IRQ_GPIO0_END + 1)
+#define IRQ_GPIO1_END          (IRQ_GPIO1_START + 31)
+#define IRQ_GPIO2_START                (IRQ_GPIO1_END + 1)
+#define IRQ_GPIO2_END          (IRQ_GPIO2_START + 31)
+#define IRQ_GPIO3_START                (IRQ_GPIO2_END + 1)
+#define IRQ_GPIO3_END          (IRQ_GPIO3_START + 31)
+
+#define NR_IRQS                        (IRQ_GPIO3_END + 1)
index aa051c0..7419451 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/device.h>
 #include <linux/sysdev.h>
 #include <linux/amba/bus.h>
+#include <linux/amba/pl061.h>
 #include <linux/io.h>
 
 #include <mach/hardware.h>
@@ -45,6 +46,16 @@ static struct mmc_platform_data mmc1_plat_data = {
        .status         = mmc_status,
 };
 
+static struct pl061_platform_data gpio2_plat_data = {
+       .gpio_base      = 16,
+       .irq_base       = IRQ_GPIO2_START,
+};
+
+static struct pl061_platform_data gpio3_plat_data = {
+       .gpio_base      = 24,
+       .irq_base       = IRQ_GPIO3_START,
+};
+
 #define UART3_IRQ      { IRQ_SIC_UART3, NO_IRQ }
 #define UART3_DMA      { 0x86, 0x87 }
 #define SCI1_IRQ       { IRQ_SIC_SCI3, NO_IRQ }
@@ -70,8 +81,8 @@ AMBA_DEVICE(sci1,  "fpga:0a", SCI1,     NULL);
 AMBA_DEVICE(mmc1,  "fpga:0b", MMCI1,    &mmc1_plat_data);
 
 /* DevChip Primecells */
-AMBA_DEVICE(gpio2, "dev:e6",  GPIO2,    NULL);
-AMBA_DEVICE(gpio3, "dev:e7",  GPIO3,    NULL);
+AMBA_DEVICE(gpio2, "dev:e6",  GPIO2,    &gpio2_plat_data);
+AMBA_DEVICE(gpio3, "dev:e7",  GPIO3,    &gpio3_plat_data);
 
 static struct amba_device *amba_devs[] __initdata = {
        &uart3_device,