};
 
 
+static struct twl4030_gpio_platform_data sdp2430_gpio_data = {
+       .gpio_base      = OMAP_MAX_GPIO_LINES,
+       .irq_base       = TWL4030_GPIO_IRQ_BASE,
+       .irq_end        = TWL4030_GPIO_IRQ_END,
+};
+
 static struct twl4030_usb_data sdp2430_usb_data = {
        .usb_mode       = T2_USB_MODE_ULPI,
 };
        .irq_end        = TWL4030_IRQ_END,
 
        /* platform_data for children goes here */
+       .gpio           = &sdp2430_gpio_data,
        .keypad         = &sdp2430_kp_data,
        .usb            = &sdp2430_usb_data,
 };
 
        { OMAP_TAG_LCD,         &sdp3430_lcd_config },
 };
 
+static struct twl4030_gpio_platform_data sdp3430_gpio_data = {
+       .gpio_base      = OMAP_MAX_GPIO_LINES,
+       .irq_base       = TWL4030_GPIO_IRQ_BASE,
+       .irq_end        = TWL4030_GPIO_IRQ_END,
+};
+
 static struct twl4030_usb_data sdp3430_usb_data = {
        .usb_mode       = T2_USB_MODE_ULPI,
 };
        .irq_end        = TWL4030_IRQ_END,
 
        /* platform_data for children goes here */
+       .gpio           = &sdp3430_gpio_data,
        .keypad         = &sdp3430_kp_data,
        .usb            = &sdp3430_usb_data,
 };
 
        .usb_mode       = T2_USB_MODE_ULPI,
 };
 
+static struct twl4030_gpio_platform_data ldp_gpio_data = {
+       .gpio_base      = OMAP_MAX_GPIO_LINES,
+       .irq_base       = TWL4030_GPIO_IRQ_BASE,
+       .irq_end        = TWL4030_GPIO_IRQ_END,
+};
+
 static struct twl4030_platform_data ldp_twldata = {
        .irq_base       = TWL4030_IRQ_BASE,
        .irq_end        = TWL4030_IRQ_END,
 
        /* platform_data for children goes here */
        .usb            = &ldp_usb_data,
+       .gpio           = &ldp_gpio_data,
 };
 
 static struct i2c_board_info __initdata ldp_i2c_boardinfo[] = {
 
        { OMAP_TAG_LCD,         &omap2_evm_lcd_config },
 };
 
+static struct twl4030_gpio_platform_data omap2evm_gpio_data = {
+       .gpio_base      = OMAP_MAX_GPIO_LINES,
+       .irq_base       = TWL4030_GPIO_IRQ_BASE,
+       .irq_end        = TWL4030_GPIO_IRQ_END,
+};
+
 static struct twl4030_usb_data omap2evm_usb_data = {
        .usb_mode       = T2_USB_MODE_ULPI,
 };
        /* platform_data for children goes here */
        .keypad         = &omap2evm_kp_data,
        .usb            = &omap2evm_usb_data,
+       .gpio           = &omap2evm_gpio_data,
 };
 
 static struct i2c_board_info __initdata omap2evm_i2c_boardinfo[] = {
 
        .usb_mode       = T2_USB_MODE_ULPI,
 };
 
+static struct twl4030_gpio_platform_data beagle_gpio_data = {
+       .gpio_base      = OMAP_MAX_GPIO_LINES,
+       .irq_base       = TWL4030_GPIO_IRQ_BASE,
+       .irq_end        = TWL4030_GPIO_IRQ_END,
+
+       /* REVISIT:  setup() should use twl gpio index
+        *  - 0 as MMC card detect,
+        *  - 1 as EHCI port overcurrent (active low)
+        */
+};
+
 static struct twl4030_platform_data beagle_twldata = {
        .irq_base       = TWL4030_IRQ_BASE,
        .irq_end        = TWL4030_IRQ_END,
 
        /* platform_data for children goes here */
        .usb            = &beagle_usb_data,
+       .gpio           = &beagle_gpio_data,
 };
 
 static struct i2c_board_info __initdata beagle_i2c_boardinfo[] = {
 
        .enabled_uarts  = ((1 << 0) | (1 << 1) | (1 << 2)),
 };
 
+static struct twl4030_gpio_platform_data omap3evm_gpio_data = {
+       .gpio_base      = OMAP_MAX_GPIO_LINES,
+       .irq_base       = TWL4030_GPIO_IRQ_BASE,
+       .irq_end        = TWL4030_GPIO_IRQ_END,
+};
+
 static struct twl4030_usb_data omap3evm_usb_data = {
        .usb_mode       = T2_USB_MODE_ULPI,
 };
        /* platform_data for children goes here */
        .keypad         = &omap3evm_kp_data,
        .usb            = &omap3evm_usb_data,
+       .gpio           = &omap3evm_gpio_data,
 };
 
 static struct i2c_board_info __initdata omap3evm_i2c_boardinfo[] = {
 
 static struct omap_uart_config overo_uart_config __initdata = {
        .enabled_uarts  = ((1 << 0) | (1 << 1) | (1 << 2)),
 };
+static struct twl4030_gpio_platform_data overo_gpio_data = {
+       .gpio_base      = OMAP_MAX_GPIO_LINES,
+       .irq_base       = TWL4030_GPIO_IRQ_BASE,
+       .irq_end        = TWL4030_GPIO_IRQ_END,
+};
 
 static struct twl4030_usb_data overo_usb_data = {
        .usb_mode       = T2_USB_MODE_ULPI,
 static struct twl4030_platform_data overo_twldata = {
        .irq_base       = TWL4030_IRQ_BASE,
        .irq_end        = TWL4030_IRQ_END,
+       .gpio           = &overo_gpio_data,
        .usb            = &overo_usb_data,
 };
 
 
 #define TWL4030_MODULE_RTC             0x14
 #define TWL4030_MODULE_SECURED_REG     0x15
 
+
+/* TWL4030_GPIO_MAX (18) GPIOs, with interrupts */
+struct twl4030_gpio_platform_data {
+       int             gpio_base;
+       unsigned        irq_base, irq_end;
+
+       /* for gpio-N, bit (1 << N) is set if pullup should be used */
+       u32             pullups;
+
+       int             (*setup)(struct device *dev,
+                               unsigned gpio, unsigned ngpio);
+       int             (*teardown)(struct device *dev,
+                               unsigned gpio, unsigned ngpio);
+};
+
 struct twl4030_keypad_data {
        int rows;
        int cols;
 };
 
 struct twl4030_platform_data {
-       unsigned        irq_base, irq_end;
-       struct twl4030_keypad_data *keypad;
-       struct twl4030_usb_data *usb;
+       unsigned                                irq_base, irq_end;
+       struct twl4030_gpio_platform_data       *gpio;
+       struct twl4030_keypad_data              *keypad;
+       struct twl4030_usb_data                 *usb;
 
        /* REVISIT more to come ... _nothing_ should be hard-wired */
 };
 
 /*
  * Exported TWL4030 GPIO APIs
+ *
+ * WARNING -- use standard GPIO and IRQ calls instead; these will vanish.
  */
 int twl4030_get_gpio_datain(int gpio);
 int twl4030_request_gpio(int gpio);