[ARM] 3371/1: ep93xx: gpio support
authorLennert Buytenhek <buytenh@wantstofly.org>
Mon, 20 Mar 2006 17:10:14 +0000 (17:10 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 21 Mar 2006 22:06:12 +0000 (22:06 +0000)
Patch from Lennert Buytenhek

Add support for setting the direction of and getting/setting the
value of the 64 GPIO lines.

Signed-off-by: Lennert Buytenhek <buytenh@wantstofly.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-ep93xx/core.c
include/asm-arm/arch-ep93xx/ep93xx-regs.h
include/asm-arm/arch-ep93xx/gpio.h [new file with mode: 0644]

index f831f74dc8cc4d80ef8d22848c794875abd929c5..7d3e79990fadcedb01dd1625ed653c7698bdb078 100644 (file)
@@ -45,6 +45,7 @@
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
 #include <asm/mach/irq.h>
+#include <asm/arch/gpio.h>
 
 #include <asm/hardware/vic.h>
 
@@ -146,6 +147,73 @@ struct sys_timer ep93xx_timer = {
 };
 
 
+/*************************************************************************
+ * GPIO handling for EP93xx
+ *************************************************************************/
+static unsigned char data_register_offset[8] = {
+       0x00, 0x04, 0x08, 0x0c, 0x20, 0x30, 0x38, 0x40,
+};
+
+static unsigned char data_direction_register_offset[8] = {
+       0x10, 0x14, 0x18, 0x1c, 0x24, 0x34, 0x3c, 0x44,
+};
+
+void gpio_line_config(int line, int direction)
+{
+       unsigned int data_direction_register;
+       unsigned long flags;
+       unsigned char v;
+
+       data_direction_register =
+               EP93XX_GPIO_REG(data_direction_register_offset[line >> 3]);
+
+       local_irq_save(flags);
+       if (direction == GPIO_OUT) {
+               v = __raw_readb(data_direction_register);
+               v |= 1 << (line & 7);
+               __raw_writeb(v, data_direction_register);
+       } else if (direction == GPIO_IN) {
+               v = __raw_readb(data_direction_register);
+               v &= ~(1 << (line & 7));
+               __raw_writeb(v, data_direction_register);
+       }
+       local_irq_restore(flags);
+}
+EXPORT_SYMBOL(gpio_line_config);
+
+int gpio_line_get(int line)
+{
+       unsigned int data_register;
+
+       data_register = EP93XX_GPIO_REG(data_register_offset[line >> 3]);
+
+       return !!(__raw_readb(data_register) & (1 << (line & 7)));
+}
+EXPORT_SYMBOL(gpio_line_get);
+
+void gpio_line_set(int line, int value)
+{
+       unsigned int data_register;
+       unsigned long flags;
+       unsigned char v;
+
+       data_register = EP93XX_GPIO_REG(data_register_offset[line >> 3]);
+
+       local_irq_save(flags);
+       if (value == EP93XX_GPIO_HIGH) {
+               v = __raw_readb(data_register);
+               v |= 1 << (line & 7);
+               __raw_writeb(v, data_register);
+       } else if (value == EP93XX_GPIO_LOW) {
+               v = __raw_readb(data_register);
+               v &= ~(1 << (line & 7));
+               __raw_writeb(v, data_register);
+       }
+       local_irq_restore(flags);
+}
+EXPORT_SYMBOL(gpio_line_set);
+
+
 /*************************************************************************
  * EP93xx IRQ handling
  *************************************************************************/
index 693f23886e855b18cb751ca2a12fa4dd6a47f35d..c1efacc83b75a95e974d9e9eaa68890eb5e1a888 100644 (file)
@@ -71,6 +71,7 @@
 #define EP93XX_SECURITY_BASE           (EP93XX_APB_VIRT_BASE + 0x00030000)
 
 #define EP93XX_GPIO_BASE               (EP93XX_APB_VIRT_BASE + 0x00040000)
+#define EP93XX_GPIO_REG(x)             (EP93XX_GPIO_BASE + (x))
 
 #define EP93XX_AAC_BASE                        (EP93XX_APB_VIRT_BASE + 0x00080000)
 
diff --git a/include/asm-arm/arch-ep93xx/gpio.h b/include/asm-arm/arch-ep93xx/gpio.h
new file mode 100644 (file)
index 0000000..1ee14a1
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * linux/include/asm-arm/arch-ep93xx/gpio.h
+ */
+
+#ifndef __ASM_ARCH_GPIO_H
+#define __ASM_ARCH_GPIO_H
+
+#define GPIO_IN                                0
+#define GPIO_OUT                       1
+
+#define EP93XX_GPIO_LOW                        0
+#define EP93XX_GPIO_HIGH               1
+
+extern void gpio_line_config(int line, int direction);
+extern int  gpio_line_get(int line);
+extern void gpio_line_set(int line, int value);
+
+/* GPIO port A.  */
+#define EP93XX_GPIO_LINE_A(x)          ((x) + 0)
+#define EP93XX_GPIO_LINE_EGPIO0                EP93XX_GPIO_LINE_A(0)
+#define EP93XX_GPIO_LINE_EGPIO1                EP93XX_GPIO_LINE_A(1)
+#define EP93XX_GPIO_LINE_EGPIO2                EP93XX_GPIO_LINE_A(2)
+#define EP93XX_GPIO_LINE_EGPIO3                EP93XX_GPIO_LINE_A(3)
+#define EP93XX_GPIO_LINE_EGPIO4                EP93XX_GPIO_LINE_A(4)
+#define EP93XX_GPIO_LINE_EGPIO5                EP93XX_GPIO_LINE_A(5)
+#define EP93XX_GPIO_LINE_EGPIO6                EP93XX_GPIO_LINE_A(6)
+#define EP93XX_GPIO_LINE_EGPIO7                EP93XX_GPIO_LINE_A(7)
+
+/* GPIO port B.  */
+#define EP93XX_GPIO_LINE_B(x)          ((x) + 8)
+#define EP93XX_GPIO_LINE_EGPIO8                EP93XX_GPIO_LINE_B(0)
+#define EP93XX_GPIO_LINE_EGPIO9                EP93XX_GPIO_LINE_B(1)
+#define EP93XX_GPIO_LINE_EGPIO10       EP93XX_GPIO_LINE_B(2)
+#define EP93XX_GPIO_LINE_EGPIO11       EP93XX_GPIO_LINE_B(3)
+#define EP93XX_GPIO_LINE_EGPIO12       EP93XX_GPIO_LINE_B(4)
+#define EP93XX_GPIO_LINE_EGPIO13       EP93XX_GPIO_LINE_B(5)
+#define EP93XX_GPIO_LINE_EGPIO14       EP93XX_GPIO_LINE_B(6)
+#define EP93XX_GPIO_LINE_EGPIO15       EP93XX_GPIO_LINE_B(7)
+
+/* GPIO port C.  */
+#define EP93XX_GPIO_LINE_C(x)          ((x) + 16)
+#define EP93XX_GPIO_LINE_ROW0          EP93XX_GPIO_LINE_C(0)
+#define EP93XX_GPIO_LINE_ROW1          EP93XX_GPIO_LINE_C(1)
+#define EP93XX_GPIO_LINE_ROW2          EP93XX_GPIO_LINE_C(2)
+#define EP93XX_GPIO_LINE_ROW3          EP93XX_GPIO_LINE_C(3)
+#define EP93XX_GPIO_LINE_ROW4          EP93XX_GPIO_LINE_C(4)
+#define EP93XX_GPIO_LINE_ROW5          EP93XX_GPIO_LINE_C(5)
+#define EP93XX_GPIO_LINE_ROW6          EP93XX_GPIO_LINE_C(6)
+#define EP93XX_GPIO_LINE_ROW7          EP93XX_GPIO_LINE_C(7)
+
+/* GPIO port D.  */
+#define EP93XX_GPIO_LINE_D(x)          ((x) + 24)
+#define EP93XX_GPIO_LINE_COL0          EP93XX_GPIO_LINE_D(0)
+#define EP93XX_GPIO_LINE_COL1          EP93XX_GPIO_LINE_D(1)
+#define EP93XX_GPIO_LINE_COL2          EP93XX_GPIO_LINE_D(2)
+#define EP93XX_GPIO_LINE_COL3          EP93XX_GPIO_LINE_D(3)
+#define EP93XX_GPIO_LINE_COL4          EP93XX_GPIO_LINE_D(4)
+#define EP93XX_GPIO_LINE_COL5          EP93XX_GPIO_LINE_D(5)
+#define EP93XX_GPIO_LINE_COL6          EP93XX_GPIO_LINE_D(6)
+#define EP93XX_GPIO_LINE_COL7          EP93XX_GPIO_LINE_D(7)
+
+/* GPIO port E.  */
+#define EP93XX_GPIO_LINE_E(x)          ((x) + 32)
+#define EP93XX_GPIO_LINE_GRLED         EP93XX_GPIO_LINE_E(0)
+#define EP93XX_GPIO_LINE_RDLED         EP93XX_GPIO_LINE_E(1)
+#define EP93XX_GPIO_LINE_DIORn         EP93XX_GPIO_LINE_E(2)
+#define EP93XX_GPIO_LINE_IDECS1n       EP93XX_GPIO_LINE_E(3)
+#define EP93XX_GPIO_LINE_IDECS2n       EP93XX_GPIO_LINE_E(4)
+#define EP93XX_GPIO_LINE_IDEDA0                EP93XX_GPIO_LINE_E(5)
+#define EP93XX_GPIO_LINE_IDEDA1                EP93XX_GPIO_LINE_E(6)
+#define EP93XX_GPIO_LINE_IDEDA2                EP93XX_GPIO_LINE_E(7)
+
+/* GPIO port F.  */
+#define EP93XX_GPIO_LINE_F(x)          ((x) + 40)
+#define EP93XX_GPIO_LINE_WP            EP93XX_GPIO_LINE_F(0)
+#define EP93XX_GPIO_LINE_MCCD1         EP93XX_GPIO_LINE_F(1)
+#define EP93XX_GPIO_LINE_MCCD2         EP93XX_GPIO_LINE_F(2)
+#define EP93XX_GPIO_LINE_MCBVD1                EP93XX_GPIO_LINE_F(3)
+#define EP93XX_GPIO_LINE_MCBVD2                EP93XX_GPIO_LINE_F(4)
+#define EP93XX_GPIO_LINE_VS1           EP93XX_GPIO_LINE_F(5)
+#define EP93XX_GPIO_LINE_READY         EP93XX_GPIO_LINE_F(6)
+#define EP93XX_GPIO_LINE_VS2           EP93XX_GPIO_LINE_F(7)
+
+/* GPIO port G.  */
+#define EP93XX_GPIO_LINE_G(x)          ((x) + 48)
+#define EP93XX_GPIO_LINE_EECLK         EP93XX_GPIO_LINE_G(0)
+#define EP93XX_GPIO_LINE_EEDAT         EP93XX_GPIO_LINE_G(1)
+#define EP93XX_GPIO_LINE_SLA0          EP93XX_GPIO_LINE_G(2)
+#define EP93XX_GPIO_LINE_SLA1          EP93XX_GPIO_LINE_G(3)
+#define EP93XX_GPIO_LINE_DD12          EP93XX_GPIO_LINE_G(4)
+#define EP93XX_GPIO_LINE_DD13          EP93XX_GPIO_LINE_G(5)
+#define EP93XX_GPIO_LINE_DD14          EP93XX_GPIO_LINE_G(6)
+#define EP93XX_GPIO_LINE_DD15          EP93XX_GPIO_LINE_G(7)
+
+/* GPIO port H.  */
+#define EP93XX_GPIO_LINE_H(x)          ((x) + 56)
+#define EP93XX_GPIO_LINE_DD0           EP93XX_GPIO_LINE_H(0)
+#define EP93XX_GPIO_LINE_DD1           EP93XX_GPIO_LINE_H(1)
+#define EP93XX_GPIO_LINE_DD2           EP93XX_GPIO_LINE_H(2)
+#define EP93XX_GPIO_LINE_DD3           EP93XX_GPIO_LINE_H(3)
+#define EP93XX_GPIO_LINE_DD4           EP93XX_GPIO_LINE_H(4)
+#define EP93XX_GPIO_LINE_DD5           EP93XX_GPIO_LINE_H(5)
+#define EP93XX_GPIO_LINE_DD6           EP93XX_GPIO_LINE_H(6)
+#define EP93XX_GPIO_LINE_DD7           EP93XX_GPIO_LINE_H(7)
+
+
+#endif