gpio/omap: consolidate IRQ status handling, remove #ifdefs
Kevin Hilman [Thu, 21 Apr 2011 16:17:35 +0000 (09:17 -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 a622d56..487a087 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 4ff6ff3..3e52b7f 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 efe4dcc..35e8b31 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 357e069..7c5e67d 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 268bccd..aedd732 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 9456421..bdf0132 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;