]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/arm/mach-omap2/hsmmc.c
hsmmc.c glue uses standard GPIO calls
[linux-2.6-omap-h63xx.git] / arch / arm / mach-omap2 / hsmmc.c
index e16d6c0504ff35910dc3ccfaf5d4f8a57943de7a..b1b18e3eeef16f2b6abdae669386d9825bd8de55 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
+#include <linux/gpio.h>
 #include <linux/i2c/twl4030.h>
-#include <asm/hardware.h>
-#include <asm/arch/mmc.h>
-#include <asm/arch/board.h>
+
+#include <mach/hardware.h>
+#include <mach/mmc.h>
+#include <mach/board.h>
 
 #if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
 
 #define VMMC1_DEDICATED                0x2A
 #define VSEL_3V                        0x02
 #define VSEL_18V               0x00
-#define TWL_GPIO_PUPDCTR1      0x13
 #define TWL_GPIO_IMR1A         0x1C
 #define TWL_GPIO_ISR1A         0x19
 #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);
 }
 
 /*
@@ -61,21 +63,11 @@ static int hsmmc_late_init(struct device *dev)
        /*
         * 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_edge_ctrl(MMC1_CD_IRQ,
-                       TWL4030_GPIO_EDGE_RISING | TWL4030_GPIO_EDGE_FALLING);
-       if (ret)
-               goto err;
-
-       ret = twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x02,
-                                               TWL_GPIO_PUPDCTR1);
-       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;
 
@@ -88,11 +80,7 @@ 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
@@ -134,7 +122,7 @@ static int hsmmc_suspend(struct device *dev, int slot)
 {
        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;
@@ -144,7 +132,7 @@ static int hsmmc_resume(struct device *dev, int slot)
 {
        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;
@@ -255,32 +243,33 @@ err:
        return 1;
 }
 
-static struct omap_mmc_platform_data hsmmc_data = {
+static struct omap_mmc_platform_data mmc1_data = {
        .nr_slots                       = 1,
-       .switch_slot                    = NULL,
        .init                           = hsmmc_late_init,
        .cleanup                        = hsmmc_cleanup,
 #ifdef CONFIG_PM
        .suspend                        = hsmmc_suspend,
        .resume                         = hsmmc_resume,
 #endif
+       .dma_mask                       = 0xffffffff,
        .slots[0] = {
+               .wire4                  = 1,
                .set_power              = hsmmc_set_power,
-               .set_bus_mode           = NULL,
-               .get_ro                 = NULL,
-               .get_cover_state        = NULL,
                .ocr_mask               = MMC_VDD_32_33 | MMC_VDD_33_34 |
                                                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,
        },
 };
 
+static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC];
+
 void __init hsmmc_init(void)
 {
-       omap_set_mmc_info(1, &hsmmc_data);
+       hsmmc_data[0] = &mmc1_data;
+       omap2_init_mmc(hsmmc_data, OMAP34XX_NR_MMC);
 }
 
 #else