};
 
 static struct omap_gpio_reg_offs omap15xx_mpuio_regs = {
+       .revision       = USHRT_MAX,
        .direction      = OMAP_MPUIO_IO_CNTL,
        .datain         = OMAP_MPUIO_INPUT_LATCH,
        .dataout        = OMAP_MPUIO_OUTPUT,
 };
 
 static struct omap_gpio_reg_offs omap15xx_gpio_regs = {
+       .revision       = USHRT_MAX,
        .direction      = OMAP1510_GPIO_DIR_CONTROL,
        .datain         = OMAP1510_GPIO_DATA_INPUT,
        .dataout        = OMAP1510_GPIO_DATA_OUTPUT,
 
 };
 
 static struct omap_gpio_reg_offs omap16xx_mpuio_regs = {
+       .revision       = USHRT_MAX,
        .direction      = OMAP_MPUIO_IO_CNTL,
        .datain         = OMAP_MPUIO_INPUT_LATCH,
        .dataout        = OMAP_MPUIO_OUTPUT,
 };
 
 static struct omap_gpio_reg_offs omap16xx_gpio_regs = {
+       .revision       = OMAP1610_GPIO_REVISION,
        .direction      = OMAP1610_GPIO_DIRECTION,
        .set_dataout    = OMAP1610_GPIO_SET_DATAOUT,
        .clr_dataout    = OMAP1610_GPIO_CLEAR_DATAOUT,
 
 };
 
 static struct omap_gpio_reg_offs omap7xx_mpuio_regs = {
+       .revision       = USHRT_MAX,
        .direction      = OMAP_MPUIO_IO_CNTL / 2,
        .datain         = OMAP_MPUIO_INPUT_LATCH / 2,
        .dataout        = OMAP_MPUIO_OUTPUT / 2,
 };
 
 static struct omap_gpio_reg_offs omap7xx_gpio_regs = {
+       .revision       = USHRT_MAX,
        .direction      = OMAP7XX_GPIO_DIR_CONTROL,
        .datain         = OMAP7XX_GPIO_DATA_INPUT,
        .dataout        = OMAP7XX_GPIO_DATA_OUTPUT,
 
        case 0:
        case 1:
                pdata->bank_type = METHOD_GPIO_24XX;
+               pdata->regs->revision = OMAP24XX_GPIO_REVISION;
                pdata->regs->direction = OMAP24XX_GPIO_OE;
                pdata->regs->datain = OMAP24XX_GPIO_DATAIN;
                pdata->regs->dataout = OMAP24XX_GPIO_DATAOUT;
                break;
        case 2:
                pdata->bank_type = METHOD_GPIO_44XX;
+               pdata->regs->revision = OMAP4_GPIO_REVISION;
                pdata->regs->direction = OMAP4_GPIO_OE;
                pdata->regs->datain = OMAP4_GPIO_DATAIN;
                pdata->regs->dataout = OMAP4_GPIO_DATAOUT;
 
 };
 
 struct omap_gpio_reg_offs {
+       u16 revision;
        u16 direction;
        u16 datain;
        u16 dataout;
 
 
 static void __init omap_gpio_show_rev(struct gpio_bank *bank)
 {
+       static bool called;
        u32 rev;
 
-       if (cpu_is_omap16xx() && !(bank->method != METHOD_MPUIO))
-               rev = __raw_readw(bank->base + OMAP1610_GPIO_REVISION);
-       else if (cpu_is_omap24xx() || cpu_is_omap34xx())
-               rev = __raw_readl(bank->base + OMAP24XX_GPIO_REVISION);
-       else if (cpu_is_omap44xx())
-               rev = __raw_readl(bank->base + OMAP4_GPIO_REVISION);
-       else
+       if (called || bank->regs->revision == USHRT_MAX)
                return;
 
-       printk(KERN_INFO "OMAP GPIO hardware version %d.%d\n",
+       rev = __raw_readw(bank->base + bank->regs->revision);
+       pr_info("OMAP GPIO hardware version %d.%d\n",
                (rev >> 4) & 0x0f, rev & 0x0f);
+
+       called = true;
 }
 
 /* This lock class tells lockdep that GPIO irqs are in a different