[ramips] fix GPIOLIB support
authorGabor Juhos <juhosg@openwrt.org>
Mon, 31 Aug 2009 08:29:19 +0000 (08:29 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Mon, 31 Aug 2009 08:29:19 +0000 (08:29 +0000)
SVN-Revision: 17446

target/linux/ramips/files/arch/mips/include/asm/mach-ralink/gpio.h
target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt288x/ralink_soc.h [new file with mode: 0644]
target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt288x_regs.h
target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x/ralink_soc.h [new file with mode: 0644]
target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x_regs.h
target/linux/ramips/files/arch/mips/ralink/common/Makefile
target/linux/ramips/files/arch/mips/ralink/common/gpio.c [new file with mode: 0644]
target/linux/ramips/patches-2.6.30/100-mips-ralink-core.patch

index e8a0836a32a8534aa7ef8710bd6b5bfa37e0abd3..f68ee16856c354215721a435d569abf6b3ab5490 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Ralink RT288x GPIO API definitions
+ *  Ralink SoC GPIO API support
  *
  *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
  *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
  *
  */
 
-#ifndef __ASM_MACH_RT288X_GPIO_H
-#define __ASM_MACH_RT288X_GPIO_H
+#ifndef __ASM_MACH_RALINK_GPIO_H
+#define __ASM_MACH_RALINK_GPIO_H
 
-#define ARCH_NR_GPIOS  64
+#define ARCH_NR_GPIOS  128
 #include <asm-generic/gpio.h>
 
-#include <asm/mach-ralink/rt288x.h>
-
-extern void __rt288x_gpio_set_value(unsigned gpio, int value);
-extern int __rt288x_gpio_get_value(unsigned gpio);
-
-static inline int gpio_to_irq(unsigned gpio)
-{
-       return RT288X_GPIO_IRQ(gpio);
-}
-
-static inline int irq_to_gpio(unsigned irq)
-{
-       return irq - RT288X_GPIO_IRQ_BASE;
-}
-
-static inline int gpio_get_value(unsigned gpio)
-{
-       if (gpio < RT288X_GPIO_COUNT)
-               return __rt288x_gpio_get_value(gpio);
-
-       return __gpio_get_value(gpio);
-}
-
-static inline void gpio_set_value(unsigned gpio, int value)
-{
-       if (gpio < RT288X_GPIO_COUNT)
-               __rt288x_gpio_set_value(gpio, value);
-       else
-               __gpio_set_value(gpio, value);
-}
-
+#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
 
-#endif /* __ASM_MACH_RT288X_GPIO_H */
+#endif /* __ASM_MACH_RALINK_GPIO_H */
diff --git a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt288x/ralink_soc.h b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt288x/ralink_soc.h
new file mode 100644 (file)
index 0000000..c379f39
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Ralink RT288x specific SOC defines
+ *
+ * Copyright (C) 2009 Gabor Juhos <juhosg@openwrt.org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#ifndef __RT288X_RALINK_SOC_H
+#define __RT288X_RALINK_SOC_H
+
+#define RALINK_SOC_GPIO_BASE   0x300600
+
+#define RALINK_SOC_GPIO0_COUNT 24
+#define RALINK_SOC_GPIO1_COUNT 16
+#define RALINK_SOC_GPIO2_COUNT 32
+
+#endif /* __RT288X_RALINK_SOC_H */
index 98308ffe018710e940b5d8825b2d87d7e1273416..dfd5b31599932de62ac4ad0ca76354e5dd001a19 100644 (file)
@@ -16,7 +16,6 @@
 
 #define RT2880_SYSC_BASE       0x00300000
 #define RT2880_TIMER_BASE      0x00300100
-#define RT2880_INTC_BASE       0x00300200
 #define RT2880_MEMC_BASE       0x00300300
 #define RT2880_UART0_BASE      0x00300500
 #define RT2880_PIO_BASE                0x00300600
diff --git a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x/ralink_soc.h b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x/ralink_soc.h
new file mode 100644 (file)
index 0000000..144cc4e
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Ralink RT305x specific SOC defines
+ *
+ * Copyright (C) 2009 Gabor Juhos <juhosg@openwrt.org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#ifndef __RT288X_RALINK_SOC_H
+#define __RT288X_RALINK_SOC_H
+
+#define RALINK_SOC_GPIO_BASE   0x10000600
+
+#define RALINK_SOC_GPIO0_COUNT 24
+#define RALINK_SOC_GPIO1_COUNT 16
+#define RALINK_SOC_GPIO2_COUNT 12
+
+#endif /* __RT288X_RALINK_SOC_H */
index 139dc92e5446d5930c74d734a9b5e6ee1401596a..d4a1920633b4d27c29bd28ee2afa237e91c1f16b 100644 (file)
@@ -20,7 +20,6 @@
 #define RT305X_MEMC_BASE       0x10000300
 #define RT305X_PCM_BASE                0x10000400
 #define RT305X_UART0_BASE      0x10000500
-#define RT305X_PIO_BASE                0x10000600
 #define RT305X_GDMA_BASE       0x10000700
 #define RT305X_NANDC_BASE      0x10000800
 #define RT305X_I2C_BASE                0x10000900
index 2816a67089905a21655e63fe11e78cbedbcc2fd2..08e16dd5c20d896d33bb350e0b0a6d85aa476859 100644 (file)
@@ -7,4 +7,4 @@
 # under the terms of the GNU General Public License version 2 as published
 # by the Free Software Foundation.
 
-obj-y  := intc.o
+obj-y  := intc.o gpio.o
diff --git a/target/linux/ramips/files/arch/mips/ralink/common/gpio.c b/target/linux/ramips/files/arch/mips/ralink/common/gpio.c
new file mode 100644 (file)
index 0000000..af4cac7
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+ * Ralink SoC specific GPIO support
+ *
+ * Copyright (C) 2009 Gabor Juhos <juhosg@openwrt.org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/io.h>
+
+#include <linux/gpio.h>
+
+#include <ralink_soc.h>
+
+#define GPIO0_REG_INT          0x00
+#define GPIO0_REG_EDGE         0x04
+#define GPIO0_REG_RENA         0x08
+#define GPIO0_REG_FENA         0x0c
+#define GPIO0_REG_DATA         0x20
+#define GPIO0_REG_DIR          0x24
+#define GPIO0_REG_POL          0x28
+#define GPIO0_REG_SET          0x2c
+#define GPIO0_REG_RESET                0x30
+#define GPIO0_REG_TOGGLE       0x34
+
+#define GPIO1_REG_INT          0x38
+#define GPIO1_REG_EDGE         0x3c
+#define GPIO1_REG_RENA         0x40
+#define GPIO1_REG_FENA         0x44
+#define GPIO1_REG_DATA         0x48
+#define GPIO1_REG_DIR          0x4c
+#define GPIO1_REG_POL          0x50
+#define GPIO1_REG_SET          0x54
+#define GPIO1_REG_RESET                0x58
+#define GPIO1_REG_TOGGLE       0x5c
+
+#define GPIO2_REG_INT          0x60
+#define GPIO2_REG_EDGE         0x64
+#define GPIO2_REG_RENA         0x68
+#define GPIO2_REG_FENA         0x6c
+#define GPIO2_REG_DATA         0x70
+#define GPIO2_REG_DIR          0x74
+#define GPIO2_REG_POL          0x78
+#define GPIO2_REG_SET          0x7c
+#define GPIO2_REG_RESET                0x80
+#define GPIO2_REG_TOGGLE       0x84
+
+enum ramips_pio_reg {
+       RAMIPS_GPIO_REG_INT,            /* Interrupt status */
+       RAMIPS_GPIO_REG_EDGE,
+       RAMIPS_GPIO_REG_RENA,
+       RAMIPS_GPIO_REG_DATA,
+       RAMIPS_GPIO_REG_DIR,            /* Direction, 0:in, 1: out */
+       RAMIPS_GPIO_REG_POL,            /* Polarity, 0: normal, 1: invert */
+       RAMIPS_GPIO_REG_SET,
+       RAMIPS_GPIO_REG_RESET,
+       RAMIPS_GPIO_REG_TOGGLE,
+       RAMIPS_GPIO_REG_MAX
+};
+
+struct ramips_gpio_chip {
+       struct gpio_chip        chip;
+       u8                      regs[RAMIPS_GPIO_REG_MAX];
+};
+
+static void __iomem *ramips_gpio_base;
+
+static inline struct ramips_gpio_chip *to_ramips_gpio(struct gpio_chip *chip)
+{
+       struct ramips_gpio_chip *rg;
+
+       rg = container_of(chip, struct ramips_gpio_chip, chip);
+       return rg;
+}
+
+static inline void ramips_gpio_wr(struct ramips_gpio_chip *rg, u8 reg, u32 val)
+{
+       __raw_writel(val, ramips_gpio_base + rg->regs[reg]);
+}
+
+static inline u32 ramips_gpio_rr(struct ramips_gpio_chip *rg, u8 reg)
+{
+       return __raw_readl(ramips_gpio_base + rg->regs[reg]);
+}
+
+static int ramips_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
+{
+       struct ramips_gpio_chip *rg = to_ramips_gpio(chip);
+       u32 t;
+
+       t = ramips_gpio_rr(rg, RAMIPS_GPIO_REG_DIR);
+       t &= ~(1 << offset);
+       ramips_gpio_wr(rg, RAMIPS_GPIO_REG_DIR, t);
+
+       return 0;
+}
+
+static int ramips_gpio_direction_output(struct gpio_chip *chip,
+                                       unsigned offset, int value)
+{
+       struct ramips_gpio_chip *rg = to_ramips_gpio(chip);
+       u32 reg;
+       u32 t;
+
+       reg = (value) ? RAMIPS_GPIO_REG_SET : RAMIPS_GPIO_REG_RESET;
+       ramips_gpio_wr(rg, reg, 1 << offset);
+
+       t = ramips_gpio_rr(rg, RAMIPS_GPIO_REG_DIR);
+       t |= 1 << offset;
+       ramips_gpio_wr(rg, RAMIPS_GPIO_REG_DIR, t);
+
+       return 0;
+}
+
+static void ramips_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
+{
+       struct ramips_gpio_chip *rg = to_ramips_gpio(chip);
+       u32 reg;
+
+       reg = (value) ? RAMIPS_GPIO_REG_SET : RAMIPS_GPIO_REG_RESET;
+       ramips_gpio_wr(rg, reg, 1 << offset);
+}
+
+static int ramips_gpio_get(struct gpio_chip *chip, unsigned offset)
+{
+       struct ramips_gpio_chip *rg = to_ramips_gpio(chip);
+       u32 t;
+
+       t = ramips_gpio_rr(rg, RAMIPS_GPIO_REG_DATA);
+       return (t & (1 << offset));
+}
+
+static struct ramips_gpio_chip ramips_gpio_chip0 = {
+       .chip = {
+               .label                  = "ramips-gpio0",
+               .direction_input        = ramips_gpio_direction_input,
+               .direction_output       = ramips_gpio_direction_output,
+               .get                    = ramips_gpio_get,
+               .set                    = ramips_gpio_set,
+               .base                   = 0,
+               .ngpio                  = RALINK_SOC_GPIO0_COUNT,
+       },
+       .regs = {
+               [RAMIPS_GPIO_REG_INT]   = GPIO0_REG_INT,
+               [RAMIPS_GPIO_REG_EDGE]  = GPIO0_REG_EDGE,
+               [RAMIPS_GPIO_REG_RENA]  = GPIO0_REG_RENA,
+               [RAMIPS_GPIO_REG_DATA]  = GPIO0_REG_DATA,
+               [RAMIPS_GPIO_REG_DIR]   = GPIO0_REG_DIR,
+               [RAMIPS_GPIO_REG_POL]   = GPIO0_REG_POL,
+               [RAMIPS_GPIO_REG_SET]   = GPIO0_REG_SET,
+               [RAMIPS_GPIO_REG_RESET] = GPIO0_REG_RESET,
+               [RAMIPS_GPIO_REG_TOGGLE] = GPIO0_REG_TOGGLE,
+       },
+};
+
+static struct ramips_gpio_chip ramips_gpio_chip1 = {
+       .chip = {
+               .label                  = "ramips-gpio1",
+               .direction_input        = ramips_gpio_direction_input,
+               .direction_output       = ramips_gpio_direction_output,
+               .get                    = ramips_gpio_get,
+               .set                    = ramips_gpio_set,
+               .base                   = 32,
+               .ngpio                  = RALINK_SOC_GPIO1_COUNT,
+       },
+       .regs = {
+               [RAMIPS_GPIO_REG_INT]   = GPIO1_REG_INT,
+               [RAMIPS_GPIO_REG_EDGE]  = GPIO1_REG_EDGE,
+               [RAMIPS_GPIO_REG_RENA]  = GPIO1_REG_RENA,
+               [RAMIPS_GPIO_REG_DATA]  = GPIO1_REG_DATA,
+               [RAMIPS_GPIO_REG_DIR]   = GPIO1_REG_DIR,
+               [RAMIPS_GPIO_REG_POL]   = GPIO1_REG_POL,
+               [RAMIPS_GPIO_REG_SET]   = GPIO1_REG_SET,
+               [RAMIPS_GPIO_REG_RESET] = GPIO1_REG_RESET,
+               [RAMIPS_GPIO_REG_TOGGLE] = GPIO1_REG_TOGGLE,
+       },
+};
+
+static struct ramips_gpio_chip ramips_gpio_chip2 = {
+       .chip = {
+               .label                  = "ramips-gpio2",
+               .direction_input        = ramips_gpio_direction_input,
+               .direction_output       = ramips_gpio_direction_output,
+               .get                    = ramips_gpio_get,
+               .set                    = ramips_gpio_set,
+               .base                   = 64,
+               .ngpio                  = RALINK_SOC_GPIO2_COUNT,
+       },
+       .regs = {
+               [RAMIPS_GPIO_REG_INT]   = GPIO2_REG_INT,
+               [RAMIPS_GPIO_REG_EDGE]  = GPIO2_REG_EDGE,
+               [RAMIPS_GPIO_REG_RENA]  = GPIO2_REG_RENA,
+               [RAMIPS_GPIO_REG_DATA]  = GPIO2_REG_DATA,
+               [RAMIPS_GPIO_REG_DIR]   = GPIO2_REG_DIR,
+               [RAMIPS_GPIO_REG_POL]   = GPIO2_REG_POL,
+               [RAMIPS_GPIO_REG_SET]   = GPIO2_REG_SET,
+               [RAMIPS_GPIO_REG_RESET] = GPIO2_REG_RESET,
+               [RAMIPS_GPIO_REG_TOGGLE] = GPIO2_REG_TOGGLE,
+       },
+};
+
+static __init void ramips_gpio_chip_add(struct ramips_gpio_chip *rg)
+{
+       /* set priority to low for all lines */
+       ramips_gpio_wr(rg, RAMIPS_GPIO_REG_POL, 0);
+
+       gpiochip_add(&rg->chip);
+}
+
+__init int ramips_gpio_init(void)
+{
+       ramips_gpio_base = ioremap_nocache(RALINK_SOC_GPIO_BASE, PAGE_SIZE);
+
+       ramips_gpio_chip_add(&ramips_gpio_chip0);
+       ramips_gpio_chip_add(&ramips_gpio_chip1);
+       ramips_gpio_chip_add(&ramips_gpio_chip2);
+
+       return 0;
+}
+
+arch_initcall(ramips_gpio_init);
index a3e5e456547aeedd2a367445218ce343a2924513..63bda672d2fb9f316240c6bbd0cf3b2d6936c518 100644 (file)
@@ -1,6 +1,6 @@
 --- a/arch/mips/Makefile
 +++ b/arch/mips/Makefile
-@@ -603,6 +603,24 @@ else
+@@ -603,6 +603,26 @@
  load-$(CONFIG_CPU_CAVIUM_OCTEON)      += 0xffffffff81100000
  endif
  
 +# Ralink RT288x
 +#
 +core-$(CONFIG_RALINK_RT288X)  += arch/mips/ralink/rt288x/
++cflags-$(CONFIG_RALINK_RT288X)        += -I$(srctree)//arch/mips/include/asm/mach-ralink/rt305x
 +load-$(CONFIG_RALINK_RT288X)  += 0xffffffff88000000
 +
 +#
 +# Ralink RT305x
 +#
 +core-$(CONFIG_RALINK_RT305X)  += arch/mips/ralink/rt305x/
++cflags-$(CONFIG_RALINK_RT305X)        += -I$(srctree)/arch/mips/include/asm/mach-ralink/rt305x
 +load-$(CONFIG_RALINK_RT305X)  += 0xffffffff80000000
 +
  # temporary until string.h is fixed
@@ -27,7 +29,7 @@
  
 --- a/arch/mips/Kconfig
 +++ b/arch/mips/Kconfig
-@@ -22,6 +22,9 @@ choice
+@@ -22,6 +22,9 @@
  config MACH_ALCHEMY
        bool "Alchemy processor based machines"
  
@@ -37,7 +39,7 @@
  config BASLER_EXCITE
        bool "Basler eXcite smart camera"
        select CEVT_R4K
-@@ -638,6 +641,7 @@ source "arch/mips/basler/excite/Kconfig"
+@@ -638,6 +641,7 @@
  source "arch/mips/jazz/Kconfig"
  source "arch/mips/lasat/Kconfig"
  source "arch/mips/pmc-sierra/Kconfig"