#include <linux/platform_device.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
+#include <linux/gpio.h>
 #include <linux/i2c/twl4030.h>
+
 #include <mach/hardware.h>
 #include <mach/mmc.h>
 #include <mach/board.h>
 #define LDO_CLR                        0x00
 #define VSEL_S2_CLR            0x40
 #define GPIO_0_BIT_POS         (1 << 0)
-#define MMC1_CD_IRQ            0
-#define MMC2_CD_IRQ            1
 
 #define OMAP2_CONTROL_DEVCONF0 0x48002274
 #define OMAP2_CONTROL_DEVCONF1 0x490022E8
 #define OMAP2_CONTROL_PBIAS_PWRDNZ     (1 << 1)
 #define OMAP2_CONTROL_PBIAS_SCTRL      (1 << 2)
 
+
+static const int mmc1_cd_gpio = OMAP_MAX_GPIO_LINES;           /* HACK!! */
+
 static int hsmmc_card_detect(int irq)
 {
-       return twl4030_get_gpio_datain(irq - TWL4030_GPIO_IRQ_BASE);
+       return gpio_get_value_cansleep(mmc1_cd_gpio);
 }
 
 /*
        /*
         * Configure TWL4030 GPIO parameters for MMC hotplug irq
         */
-       ret = twl4030_request_gpio(MMC1_CD_IRQ);
+       ret = gpio_request(mmc1_cd_gpio, "mmc0_cd");
        if (ret)
                goto err;
 
-       ret = twl4030_set_gpio_debounce(MMC1_CD_IRQ, TWL4030_GPIO_IS_ENABLE);
+       ret = twl4030_set_gpio_debounce(0, true);
        if (ret)
                goto err;
 
 
 static void hsmmc_cleanup(struct device *dev)
 {
-       int ret = 0;
-
-       ret = twl4030_free_gpio(MMC1_CD_IRQ);
-       if (ret)
-               dev_err(dev, "Failed to configure TWL4030 GPIO IRQ\n");
+       gpio_free(mmc1_cd_gpio);
 }
 
 #ifdef CONFIG_PM
 {
        int ret = 0;
 
-       disable_irq(TWL4030_GPIO_IRQ_NO(MMC1_CD_IRQ));
+       disable_irq(TWL4030_GPIO_IRQ_NO(0));
        ret = mask_cd_interrupt(1);
 
        return ret;
 {
        int ret = 0;
 
-       enable_irq(TWL4030_GPIO_IRQ_NO(MMC1_CD_IRQ));
+       enable_irq(TWL4030_GPIO_IRQ_NO(0));
        ret = mask_cd_interrupt(0);
 
        return ret;
                                                MMC_VDD_165_195,
                .name                   = "first slot",
 
-               .card_detect_irq        = TWL4030_GPIO_IRQ_NO(MMC1_CD_IRQ),
+               .card_detect_irq        = TWL4030_GPIO_IRQ_NO(0),
                .card_detect            = hsmmc_card_detect,
        },
 };
 
        return (ret < 0) ? ret : data;
 }
 
-/*
- * twl4030 GPIO request function
- */
-int twl4030_request_gpio(int gpio)
-{
-       if (unlikely(gpio >= TWL4030_GPIO_MAX))
-               return -EPERM;
-
-       return gpio_request(twl_gpiochip.base + gpio, NULL);
-}
-EXPORT_SYMBOL(twl4030_request_gpio);
-
-/*
- * TWL4030 GPIO free module
- */
-int twl4030_free_gpio(int gpio)
-{
-       if (unlikely(gpio >= TWL4030_GPIO_MAX))
-               return -EPERM;
-
-       gpio_free(twl_gpiochip.base + gpio);
-       return 0;
-}
-EXPORT_SYMBOL(twl4030_free_gpio);
-
 static int twl4030_set_gpio_direction(int gpio, int is_input)
 {
        u8 d_bnk = gpio >> 3;
        return gpio_twl4030_write(base, d_msk);
 }
 
-int twl4030_get_gpio_datain(int gpio)
+static int twl4030_get_gpio_datain(int gpio)
 {
        u8 d_bnk = gpio >> 3;
        u8 d_off = gpio & 0x7;
 
        return ret;
 }
-EXPORT_SYMBOL(twl4030_get_gpio_datain);
 
 /*
  * Configure debounce timing value for a GPIO pin on TWL4030
 
 /* TWL4030 GPIO interrupt definitions */
 
 #define TWL4030_GPIO_IRQ_NO(n)         (TWL4030_GPIO_IRQ_BASE + (n))
-#define TWL4030_GPIO_IS_ENABLE         1
 
 /*
  * 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);
 int twl4030_set_gpio_debounce(int gpio, int enable);
-int twl4030_free_gpio(int gpio);
 
 #if defined(CONFIG_TWL4030_BCI_BATTERY) || \
        defined(CONFIG_TWL4030_BCI_BATTERY_MODULE)