mmc: omap_hsmmc: enable wakeup event for sdio OMAP4
authorBalaji T K <balajitk@ti.com>
Thu, 29 May 2014 08:28:02 +0000 (10:28 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 9 Jul 2014 09:26:04 +0000 (11:26 +0200)
To detect sdio irqs properly without spurious events,
OMAP4 needs IWE in CON and CTPL, CLKEXTFREE in HCTL to be set

Tested-by: Andreas Fenkart <afenkart@gmail.com>
Signed-off-by: Balaji T K <balajitk@ti.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/omap_hsmmc.c

index ad3a2acd366499e94ecbf41f56159b54a70246bd..b12a2882ec742c854e8281cc7c28a40fcf8f034f 100644 (file)
 #define BCE                    (1 << 1)
 #define FOUR_BIT               (1 << 1)
 #define HSPE                   (1 << 2)
+#define IWE                    (1 << 24)
 #define DDR                    (1 << 19)
+#define CLKEXTFREE             (1 << 16)
+#define CTPL                   (1 << 11)
 #define DW8                    (1 << 5)
 #define OD                     0x1
 #define STAT_CLEAR             0xFFFFFFFF
@@ -687,6 +690,9 @@ static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host)
                capa = VS18;
        }
 
+       if (host->mmc->caps & MMC_CAP_SDIO_IRQ)
+               hctl |= IWE;
+
        OMAP_HSMMC_WRITE(host->base, HCTL,
                        OMAP_HSMMC_READ(host->base, HCTL) | hctl);
 
@@ -1684,19 +1690,23 @@ static void omap_hsmmc_init_card(struct mmc_host *mmc, struct mmc_card *card)
 static void omap_hsmmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
 {
        struct omap_hsmmc_host *host = mmc_priv(mmc);
-       u32 irq_mask;
+       u32 irq_mask, con;
        unsigned long flags;
 
        spin_lock_irqsave(&host->irq_lock, flags);
 
+       con = OMAP_HSMMC_READ(host->base, CON);
        irq_mask = OMAP_HSMMC_READ(host->base, ISE);
        if (enable) {
                host->flags |= HSMMC_SDIO_IRQ_ENABLED;
                irq_mask |= CIRQ_EN;
+               con |= CTPL | CLKEXTFREE;
        } else {
                host->flags &= ~HSMMC_SDIO_IRQ_ENABLED;
                irq_mask &= ~CIRQ_EN;
+               con &= ~(CTPL | CLKEXTFREE);
        }
+       OMAP_HSMMC_WRITE(host->base, CON, con);
        OMAP_HSMMC_WRITE(host->base, IE, irq_mask);
 
        /*
@@ -1746,6 +1756,8 @@ static int omap_hsmmc_configure_wake_irq(struct omap_hsmmc_host *host)
                goto err;
        }
 
+       OMAP_HSMMC_WRITE(host->base, HCTL,
+                        OMAP_HSMMC_READ(host->base, HCTL) | IWE);
        return 0;
 
 err: