omap1: Fix gpio mpuio bank to work for multi-omap for 7xx/15xx/16xx
authorTony Lindgren <tony@atomide.com>
Wed, 8 Dec 2010 00:26:58 +0000 (16:26 -0800)
committerTony Lindgren <tony@atomide.com>
Wed, 8 Dec 2010 00:26:58 +0000 (16:26 -0800)
We need to divide the 15xx/16xx offset by 2 for 7xx. Use bank->stride
for that. This allows us to get rid of the duplicate defines for the
MPUIO registers.

Note that this will cause omap-keypad.c driver to not work on 7xx.
However, the right fix there is to move over to matrix_keypad instead
as suggested by Cory Maccarrone <darkstar6262@gmail.com> and
Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>.

Cc: Cory Maccarrone <darkstar6262@gmail.com>
Acked-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap1/gpio15xx.c
arch/arm/mach-omap1/gpio16xx.c
arch/arm/mach-omap1/gpio7xx.c
arch/arm/plat-omap/gpio.c
arch/arm/plat-omap/include/plat/gpio.h

index dbd81688eadab3b033020032fac0ed8447209d1f..04c4b04cf54eba1a72c08a42d3bc96e53dbb5a1f 100644 (file)
@@ -38,6 +38,7 @@ static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = {
        .virtual_irq_start      = IH_MPUIO_BASE,
        .bank_type              = METHOD_MPUIO,
        .bank_width             = 16,
+       .bank_stride            = 1,
 };
 
 static struct __initdata platform_device omap15xx_mpu_gpio = {
index 8d4d0a061b56b938c9fb8772f98e29d23194b642..5dd0d4c82b247601fd8ceafbb690df17d236f600 100644 (file)
@@ -41,6 +41,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = {
        .virtual_irq_start      = IH_MPUIO_BASE,
        .bank_type              = METHOD_MPUIO,
        .bank_width             = 16,
+       .bank_stride            = 1,
 };
 
 static struct __initdata platform_device omap16xx_mpu_gpio = {
index 94bccd44181df70e704e2fac39aea376604dae01..1204c8b871af505bd2ccc001271bb15f1d87585f 100644 (file)
@@ -43,6 +43,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = {
        .virtual_irq_start      = IH_MPUIO_BASE,
        .bank_type              = METHOD_MPUIO,
        .bank_width             = 32,
+       .bank_stride            = 2,
 };
 
 static struct __initdata platform_device omap7xx_mpu_gpio = {
index 6f53dee98a91e0349547545a6fc42774bd21d807..8d493b992e703b65ed904c80017c46c61f7f59d8 100644 (file)
@@ -159,6 +159,7 @@ struct gpio_bank {
        u32 dbck_enable_mask;
        struct device *dev;
        bool dbck_flag;
+       int stride;
 };
 
 #ifdef CONFIG_ARCH_OMAP3
@@ -267,7 +268,7 @@ static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input)
        switch (bank->method) {
 #ifdef CONFIG_ARCH_OMAP1
        case METHOD_MPUIO:
-               reg += OMAP_MPUIO_IO_CNTL;
+               reg += OMAP_MPUIO_IO_CNTL / bank->stride;
                break;
 #endif
 #ifdef CONFIG_ARCH_OMAP15XX
@@ -315,7 +316,7 @@ static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable)
        switch (bank->method) {
 #ifdef CONFIG_ARCH_OMAP1
        case METHOD_MPUIO:
-               reg += OMAP_MPUIO_OUTPUT;
+               reg += OMAP_MPUIO_OUTPUT / bank->stride;
                l = __raw_readl(reg);
                if (enable)
                        l |= 1 << gpio;
@@ -387,7 +388,7 @@ static int _get_gpio_datain(struct gpio_bank *bank, int gpio)
        switch (bank->method) {
 #ifdef CONFIG_ARCH_OMAP1
        case METHOD_MPUIO:
-               reg += OMAP_MPUIO_INPUT_LATCH;
+               reg += OMAP_MPUIO_INPUT_LATCH / bank->stride;
                break;
 #endif
 #ifdef CONFIG_ARCH_OMAP15XX
@@ -433,7 +434,7 @@ static int _get_gpio_dataout(struct gpio_bank *bank, int gpio)
        switch (bank->method) {
 #ifdef CONFIG_ARCH_OMAP1
        case METHOD_MPUIO:
-               reg += OMAP_MPUIO_OUTPUT;
+               reg += OMAP_MPUIO_OUTPUT / bank->stride;
                break;
 #endif
 #ifdef CONFIG_ARCH_OMAP15XX
@@ -620,7 +621,7 @@ static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio)
 
        switch (bank->method) {
        case METHOD_MPUIO:
-               reg += OMAP_MPUIO_GPIO_INT_EDGE;
+               reg += OMAP_MPUIO_GPIO_INT_EDGE / bank->stride;
                break;
 #ifdef CONFIG_ARCH_OMAP15XX
        case METHOD_GPIO_1510:
@@ -654,7 +655,7 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
        switch (bank->method) {
 #ifdef CONFIG_ARCH_OMAP1
        case METHOD_MPUIO:
-               reg += OMAP_MPUIO_GPIO_INT_EDGE;
+               reg += OMAP_MPUIO_GPIO_INT_EDGE / bank->stride;
                l = __raw_readl(reg);
                if ((trigger & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH)
                        bank->toggle_mask |= 1 << gpio;
@@ -840,7 +841,7 @@ static u32 _get_gpio_irqbank_mask(struct gpio_bank *bank)
        switch (bank->method) {
 #ifdef CONFIG_ARCH_OMAP1
        case METHOD_MPUIO:
-               reg += OMAP_MPUIO_GPIO_MASKIT;
+               reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride;
                mask = 0xffff;
                inv = 1;
                break;
@@ -897,7 +898,7 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask, int enab
        switch (bank->method) {
 #ifdef CONFIG_ARCH_OMAP1
        case METHOD_MPUIO:
-               reg += OMAP_MPUIO_GPIO_MASKIT;
+               reg += OMAP_MPUIO_GPIO_MASKIT / bank->stride;
                l = __raw_readl(reg);
                if (enable)
                        l &= ~(gpio_mask);
@@ -1147,7 +1148,8 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
        bank = get_irq_data(irq);
 #ifdef CONFIG_ARCH_OMAP1
        if (bank->method == METHOD_MPUIO)
-               isr_reg = bank->base + OMAP_MPUIO_GPIO_INT;
+               isr_reg = bank->base +
+                               OMAP_MPUIO_GPIO_INT / bank->stride;
 #endif
 #ifdef CONFIG_ARCH_OMAP15XX
        if (bank->method == METHOD_GPIO_1510)
@@ -1345,7 +1347,8 @@ static int omap_mpuio_suspend_noirq(struct device *dev)
 {
        struct platform_device *pdev = to_platform_device(dev);
        struct gpio_bank        *bank = platform_get_drvdata(pdev);
-       void __iomem            *mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT;
+       void __iomem            *mask_reg = bank->base +
+                                       OMAP_MPUIO_GPIO_MASKIT / bank->stride;
        unsigned long           flags;
 
        spin_lock_irqsave(&bank->lock, flags);
@@ -1360,7 +1363,8 @@ static int omap_mpuio_resume_noirq(struct device *dev)
 {
        struct platform_device *pdev = to_platform_device(dev);
        struct gpio_bank        *bank = platform_get_drvdata(pdev);
-       void __iomem            *mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT;
+       void __iomem            *mask_reg = bank->base +
+                                       OMAP_MPUIO_GPIO_MASKIT / bank->stride;
        unsigned long           flags;
 
        spin_lock_irqsave(&bank->lock, flags);
@@ -1440,7 +1444,7 @@ static int gpio_is_input(struct gpio_bank *bank, int mask)
 
        switch (bank->method) {
        case METHOD_MPUIO:
-               reg += OMAP_MPUIO_IO_CNTL;
+               reg += OMAP_MPUIO_IO_CNTL / bank->stride;
                break;
        case METHOD_GPIO_1510:
                reg += OMAP1510_GPIO_DIR_CONTROL;
@@ -1601,8 +1605,8 @@ static void omap_gpio_mod_init(struct gpio_bank *bank, int id)
                }
        } else if (cpu_class_is_omap1()) {
                if (bank_is_mpuio(bank))
-                       __raw_writew(0xffff, bank->base
-                                               + OMAP_MPUIO_GPIO_MASKIT);
+                       __raw_writew(0xffff, bank->base +
+                               OMAP_MPUIO_GPIO_MASKIT / bank->stride);
                if (cpu_is_omap15xx() && bank->method == METHOD_GPIO_1510) {
                        __raw_writew(0xffff, bank->base
                                                + OMAP1510_GPIO_INT_MASK);
@@ -1716,6 +1720,7 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
        bank->method = pdata->bank_type;
        bank->dev = &pdev->dev;
        bank->dbck_flag = pdata->dbck_flag;
+       bank->stride = pdata->bank_stride;
        bank_width = pdata->bank_width;
 
        spin_lock_init(&bank->lock);
index 5f118ff0d3ebd45f4994038117ea407132972205..41ff2f8943f07545281db357d5f4b925b4d79b94 100644 (file)
 
 #define OMAP1_MPUIO_BASE                       0xfffb5000
 
-#if (defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850))
-
-#define OMAP_MPUIO_INPUT_LATCH         0x00
-#define OMAP_MPUIO_OUTPUT              0x02
-#define OMAP_MPUIO_IO_CNTL             0x04
-#define OMAP_MPUIO_KBR_LATCH           0x08
-#define OMAP_MPUIO_KBC                 0x0a
-#define OMAP_MPUIO_GPIO_EVENT_MODE     0x0c
-#define OMAP_MPUIO_GPIO_INT_EDGE       0x0e
-#define OMAP_MPUIO_KBD_INT             0x10
-#define OMAP_MPUIO_GPIO_INT            0x12
-#define OMAP_MPUIO_KBD_MASKIT          0x14
-#define OMAP_MPUIO_GPIO_MASKIT         0x16
-#define OMAP_MPUIO_GPIO_DEBOUNCING     0x18
-#define OMAP_MPUIO_LATCH               0x1a
-#else
+/*
+ * These are the omap15xx/16xx offsets. The omap7xx offset are
+ * OMAP_MPUIO_ / 2 offsets below.
+ */
 #define OMAP_MPUIO_INPUT_LATCH         0x00
 #define OMAP_MPUIO_OUTPUT              0x04
 #define OMAP_MPUIO_IO_CNTL             0x08
@@ -61,7 +49,6 @@
 #define OMAP_MPUIO_GPIO_MASKIT         0x2c
 #define OMAP_MPUIO_GPIO_DEBOUNCING     0x30
 #define OMAP_MPUIO_LATCH               0x34
-#endif
 
 #define OMAP34XX_NR_GPIOS              6
 
@@ -88,6 +75,7 @@ struct omap_gpio_platform_data {
        u16 virtual_irq_start;
        int bank_type;
        int bank_width;         /* GPIO bank width */
+       int bank_stride;        /* Only needed for omap1 MPUIO */
        bool dbck_flag;         /* dbck required or not - True for OMAP3&4 */
 };