]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00155288 [mx6q]sd dat1 glitch causes system panic
authorTony Lin <tony.lin@freescale.com>
Wed, 24 Aug 2011 09:10:31 +0000 (17:10 +0800)
committerOliver Wendt <ow@karo-electronics.de>
Mon, 30 Sep 2013 12:09:31 +0000 (14:09 +0200)
some sd cards insertion will cause a glitch on sd dat1
which is also a card interrupt signal. Thus the wrongly
generated card interrupt will make system panic because
there's no registered sdio interrupt handler.
the patch fixes this issue.

Signed-off-by: Tony Lin <tony.lin@freescale.com>
drivers/mmc/host/sdhci-esdhc-imx.c

index f20e4ad34af749d8f958db176bbf0bb651c21136..41210ed64d9bef0218c2f9b123b2fc2d818edd5c 100644 (file)
@@ -395,6 +395,7 @@ static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pd
        struct clk *clk;
        int err;
        struct pltfm_imx_data *imx_data;
+       u32 reg;
 
        clk = clk_get(mmc_dev(host->mmc), NULL);
        if (IS_ERR(clk)) {
@@ -440,6 +441,20 @@ static int esdhc_pltfm_init(struct sdhci_host *host, struct sdhci_pltfm_data *pd
                host->tuning_step = SDHCI_TUNE_CTRL_STEP;
        }
 
+       /* disable card interrupt enable bit, and clear status bit
+        * the default value of this enable bit is 1, but it should
+        * be 0 regarding to standard host controller spec 2.1.3.
+        * if this bit is 1, it may cause some problems.
+        * there's dat1 glitch when some cards inserting into the slot,
+        * thus wrongly generate a card interrupt that will cause
+        * system panic because it lacks of sdio handler
+        * following code will solve the problem.
+        */
+       reg = sdhci_readl(host, SDHCI_INT_ENABLE);
+       reg &= ~SDHCI_INT_CARD_INT;
+       sdhci_writel(host, reg, SDHCI_INT_ENABLE);
+       sdhci_writel(host, SDHCI_INT_CARD_INT, SDHCI_INT_STATUS);
+
        if (boarddata) {
                /* Device is always present, e.x, populated emmc device */
                if (boarddata->always_present) {