.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 = {
        .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 = {
 
        .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 = {
        .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 = {
 
        .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 = {
        .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 = {
 
                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;
                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");
 
        u16 dataout;
        u16 set_dataout;
        u16 clr_dataout;
+       u16 irqstatus;
+       u16 irqstatus2;
 };
 
 struct omap_gpio_platform_data {
 
 {
        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);
        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;