]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00288842 mmc: sdhci-esdhc-imx: add ADMA Length Mismatch errata fix
authorDong Aisheng <b29396@freescale.com>
Tue, 19 Nov 2013 10:10:27 +0000 (18:10 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Wed, 20 Aug 2014 08:06:44 +0000 (10:06 +0200)
The uSDHC has an ADMA Length Mismatch errata ERR004536 which may cause ADMA
work abnormally. The errata has already been fixed for i.MX6Q TO1.2
and i.MX6DL TO1.1 by enable the bit 7 in 0x6c register.
Unfortunately this fix is not included in i.MX6SL.
So we disable ADMA for i.MX6SL and use SDMA instead.

Signed-off-by: Dong Aisheng <b29396@freescale.com>
drivers/mmc/host/sdhci-esdhc-imx.c

index 886ea975e5df971687090b016878b4abea371518..4e1970187d075c424ef84bf6d131fdeb3b9d22c0 100644 (file)
 #define ESDHC_FLAG_STD_TUNING          BIT(5)
 /* The IP has SDHCI_CAPABILITIES_1 register */
 #define ESDHC_FLAG_HAVE_CAP1           BIT(6)
+/* The IP has errata ERR004536 */
+#define ESDHC_FLAG_ERR004536           BIT(7)
 
 struct esdhc_soc_data {
        u32 flags;
@@ -146,7 +148,7 @@ static struct esdhc_soc_data usdhc_imx6q_data = {
 
 static struct esdhc_soc_data usdhc_imx6sl_data = {
        .flags = ESDHC_FLAG_USDHC | ESDHC_FLAG_STD_TUNING
-                       | ESDHC_FLAG_HAVE_CAP1,
+                       | ESDHC_FLAG_HAVE_CAP1 | ESDHC_FLAG_ERR004536,
 };
 
 struct pltfm_imx_data {
@@ -1053,6 +1055,12 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
                writel(0x08100810, host->ioaddr + ESDHC_WTMK_LVL);
                host->quirks2 |= SDHCI_QUIRK2_PRESET_VALUE_BROKEN;
                host->mmc->caps |= MMC_CAP_1_8V_DDR;
+
+               /*
+                * errata ESDHC_FLAG_ERR004536 fix for MX6Q TO1.2 and MX6DL
+                * TO1.1, it's harmless for MX6SL
+                */
+               writel(readl(host->ioaddr + 0x6c) | BIT(7), host->ioaddr + 0x6c);
        }
 
        if (imx_data->socdata->flags & ESDHC_FLAG_MAN_TUNING)
@@ -1064,6 +1072,9 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
                        ESDHC_STD_TUNING_EN | ESDHC_TUNING_START_TAP,
                        host->ioaddr + ESDHC_TUNING_CTRL);
 
+       if (imx_data->socdata->flags & ESDHC_FLAG_ERR004536)
+               host->quirks |= SDHCI_QUIRK_BROKEN_ADMA;
+
        boarddata = &imx_data->boarddata;
        if (sdhci_esdhc_imx_probe_dt(pdev, boarddata) < 0) {
                if (!host->mmc->parent->platform_data) {