gpio/omap: consolidate IRQ status handling, remove #ifdefs
authorKevin Hilman <khilman@ti.com>
Thu, 21 Apr 2011 16:17:35 +0000 (09:17 -0700)
committerKevin Hilman <khilman@ti.com>
Thu, 16 Jun 2011 18:13:46 +0000 (11:13 -0700)
Cleanup IRQ status handling by passing IRQ status register offsets
via platform data.

Cleans up clearing of GPIO IRQ status and GPIO ISR handler.

Signed-off-by: Kevin Hilman <khilman@ti.com>
arch/arm/mach-omap1/gpio15xx.c
arch/arm/mach-omap1/gpio16xx.c
arch/arm/mach-omap1/gpio7xx.c
arch/arm/mach-omap2/gpio.c
arch/arm/plat-omap/include/plat/gpio.h
drivers/gpio/gpio-omap.c

index a622d567b53edab707cd7ef0f3e55f5b0c899231..487a087496554ef3adc2ff3c620b463422c9994c 100644 (file)
@@ -38,6 +38,7 @@ static struct omap_gpio_reg_offs omap15xx_mpuio_regs = {
        .direction      = OMAP_MPUIO_IO_CNTL,
        .datain         = OMAP_MPUIO_INPUT_LATCH,
        .dataout        = OMAP_MPUIO_OUTPUT,
+       .irqstatus      = OMAP_MPUIO_GPIO_INT,
 };
 
 static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = {
@@ -75,6 +76,7 @@ static struct omap_gpio_reg_offs omap15xx_gpio_regs = {
        .direction      = OMAP1510_GPIO_DIR_CONTROL,
        .datain         = OMAP1510_GPIO_DATA_INPUT,
        .dataout        = OMAP1510_GPIO_DATA_OUTPUT,
+       .irqstatus      = OMAP1510_GPIO_INT_STATUS,
 };
 
 static struct __initdata omap_gpio_platform_data omap15xx_gpio_config = {
index 4ff6ff36ab73f6378f2d3129ffc355208cd0415c..3e52b7f3d9cbd5d468e47e3224898e3b5e0ad252 100644 (file)
@@ -41,6 +41,7 @@ static struct omap_gpio_reg_offs omap16xx_mpuio_regs = {
        .direction      = OMAP_MPUIO_IO_CNTL,
        .datain         = OMAP_MPUIO_INPUT_LATCH,
        .dataout        = OMAP_MPUIO_OUTPUT,
+       .irqstatus      = OMAP_MPUIO_GPIO_INT,
 };
 
 static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = {
@@ -80,6 +81,7 @@ static struct omap_gpio_reg_offs omap16xx_gpio_regs = {
        .clr_dataout    = OMAP1610_GPIO_CLEAR_DATAOUT,
        .datain         = OMAP1610_GPIO_DATAIN,
        .dataout        = OMAP1610_GPIO_DATAOUT,
+       .irqstatus      = OMAP1610_GPIO_IRQSTATUS1,
 };
 
 static struct __initdata omap_gpio_platform_data omap16xx_gpio1_config = {
index efe4dccaa4f2bd5e47b92474b9485feac8358d59..35e8b31688d04354d208d90aba6392cdfad3ace6 100644 (file)
@@ -43,6 +43,7 @@ static struct omap_gpio_reg_offs omap7xx_mpuio_regs = {
        .direction      = OMAP_MPUIO_IO_CNTL / 2,
        .datain         = OMAP_MPUIO_INPUT_LATCH / 2,
        .dataout        = OMAP_MPUIO_OUTPUT / 2,
+       .irqstatus      = OMAP_MPUIO_GPIO_INT / 2,
 };
 
 static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = {
@@ -80,6 +81,7 @@ static struct omap_gpio_reg_offs omap7xx_gpio_regs = {
        .direction      = OMAP7XX_GPIO_DIR_CONTROL,
        .datain         = OMAP7XX_GPIO_DATA_INPUT,
        .dataout        = OMAP7XX_GPIO_DATA_OUTPUT,
+       .irqstatus      = OMAP7XX_GPIO_INT_STATUS,
 };
 
 static struct __initdata omap_gpio_platform_data omap7xx_gpio1_config = {
index 357e06956b0c6868af7c8b5e1579c0c4b5d3fe74..7c5e67d0b635d49d8702668cc1919d1348289b6d 100644 (file)
@@ -76,6 +76,8 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
                pdata->regs->dataout = OMAP24XX_GPIO_DATAOUT;
                pdata->regs->set_dataout = OMAP24XX_GPIO_SETDATAOUT;
                pdata->regs->clr_dataout = OMAP24XX_GPIO_CLEARDATAOUT;
+               pdata->regs->irqstatus = OMAP24XX_GPIO_IRQSTATUS1;
+               pdata->regs->irqstatus2 = OMAP24XX_GPIO_IRQSTATUS2;
                break;
        case 2:
                pdata->bank_type = METHOD_GPIO_44XX;
@@ -84,6 +86,8 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
                pdata->regs->dataout = OMAP4_GPIO_DATAOUT;
                pdata->regs->set_dataout = OMAP4_GPIO_SETDATAOUT;
                pdata->regs->clr_dataout = OMAP4_GPIO_CLEARDATAOUT;
+               pdata->regs->irqstatus = OMAP4_GPIO_IRQSTATUS0;
+               pdata->regs->irqstatus2 = OMAP4_GPIO_IRQSTATUS1;
                break;
        default:
                WARN(1, "Invalid gpio bank_type\n");
index 268bccd0f7f65c962163cc849ce0de813c1ec085..aedd732ef464bc70c2c4111721ed6c6c2797f24f 100644 (file)
@@ -180,6 +180,8 @@ struct omap_gpio_reg_offs {
        u16 dataout;
        u16 set_dataout;
        u16 clr_dataout;
+       u16 irqstatus;
+       u16 irqstatus2;
 };
 
 struct omap_gpio_platform_data {
index 945642143e1b3d3090620a63768869730287582b..bdf0132b70ec268a3986c36897a462a6f368d116 100644 (file)
@@ -481,46 +481,14 @@ static void _clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
 {
        void __iomem *reg = bank->base;
 
-       switch (bank->method) {
-#ifdef CONFIG_ARCH_OMAP15XX
-       case METHOD_GPIO_1510:
-               reg += OMAP1510_GPIO_INT_STATUS;
-               break;
-#endif
-#ifdef CONFIG_ARCH_OMAP16XX
-       case METHOD_GPIO_1610:
-               reg += OMAP1610_GPIO_IRQSTATUS1;
-               break;
-#endif
-#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
-       case METHOD_GPIO_7XX:
-               reg += OMAP7XX_GPIO_INT_STATUS;
-               break;
-#endif
-#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
-       case METHOD_GPIO_24XX:
-               reg += OMAP24XX_GPIO_IRQSTATUS1;
-               break;
-#endif
-#if defined(CONFIG_ARCH_OMAP4)
-       case METHOD_GPIO_44XX:
-               reg += OMAP4_GPIO_IRQSTATUS0;
-               break;
-#endif
-       default:
-               WARN_ON(1);
-               return;
-       }
+       reg += bank->regs->irqstatus;
        __raw_writel(gpio_mask, reg);
 
        /* Workaround for clearing DSP GPIO interrupts to allow retention */
-       if (cpu_is_omap24xx() || cpu_is_omap34xx())
-               reg = bank->base + OMAP24XX_GPIO_IRQSTATUS2;
-       else if (cpu_is_omap44xx())
-               reg = bank->base + OMAP4_GPIO_IRQSTATUS1;
-
-       if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx())
+       if (bank->regs->irqstatus2) {
+               reg = bank->base + bank->regs->irqstatus2;
                __raw_writel(gpio_mask, reg);
+       }
 
        /* Flush posted write for the irq status to avoid spurious interrupts */
        __raw_readl(reg);
@@ -841,31 +809,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
        chained_irq_enter(chip, desc);
 
        bank = irq_get_handler_data(irq);
-#ifdef CONFIG_ARCH_OMAP1
-       if (bank->method == METHOD_MPUIO)
-               isr_reg = bank->base +
-                               OMAP_MPUIO_GPIO_INT / bank->stride;
-#endif
-#ifdef CONFIG_ARCH_OMAP15XX
-       if (bank->method == METHOD_GPIO_1510)
-               isr_reg = bank->base + OMAP1510_GPIO_INT_STATUS;
-#endif
-#if defined(CONFIG_ARCH_OMAP16XX)
-       if (bank->method == METHOD_GPIO_1610)
-               isr_reg = bank->base + OMAP1610_GPIO_IRQSTATUS1;
-#endif
-#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
-       if (bank->method == METHOD_GPIO_7XX)
-               isr_reg = bank->base + OMAP7XX_GPIO_INT_STATUS;
-#endif
-#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
-       if (bank->method == METHOD_GPIO_24XX)
-               isr_reg = bank->base + OMAP24XX_GPIO_IRQSTATUS1;
-#endif
-#if defined(CONFIG_ARCH_OMAP4)
-       if (bank->method == METHOD_GPIO_44XX)
-               isr_reg = bank->base + OMAP4_GPIO_IRQSTATUS0;
-#endif
+       isr_reg = bank->base + bank->regs->irqstatus;
 
        if (WARN_ON(!isr_reg))
                goto exit;