]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
mmc: fsl_esdhc: fix eMMC HS400 stability issue
authorYangbo Lu <yangbo.lu@nxp.com>
Tue, 1 Sep 2020 08:58:07 +0000 (16:58 +0800)
committerPeng Fan <peng.fan@nxp.com>
Mon, 12 Oct 2020 07:47:06 +0000 (15:47 +0800)
There was a fix-up for eMMC HS400 stability issue in Linux.

Patch link:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/
commit/?id=58d0bf843b49fa99588ac9f85178bd8dfd651b53

Description:
Currently only LX2160A eSDHC supports eMMC HS400. According to
a large number of tests, eMMC HS400 failed to work at 150MHz,
and for a few boards failed to work at 175MHz. But eMMC HS400
worked fine on 200MHz. We hadn't found the root cause but
setting eSDHC_DLLCFG0[DLL_FREQ_SEL] = 0 using slow delay chain
seemed to resovle this issue. Let's use this as fixup for now.

Introduce the fix-up in u-boot since the issue could be reproduced
in u-boot too.

Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
drivers/mmc/fsl_esdhc.c

index ce87416f5d946b687b24f5e1e939f8afaeea284d..a6092ad26fb6a5bdeb767cf23e1a863eb7aab60a 100644 (file)
@@ -644,7 +644,10 @@ static void esdhc_set_timing(struct fsl_esdhc_priv *priv, enum bus_mode mode)
                esdhc_setbits32(&regs->sdclkctl, CMD_CLK_CTL);
                esdhc_clock_control(priv, true);
 
-               esdhc_setbits32(&regs->dllcfg0, DLL_ENABLE | DLL_FREQ_SEL);
+               if (priv->clock == 200000000)
+                       esdhc_setbits32(&regs->dllcfg0, DLL_FREQ_SEL);
+
+               esdhc_setbits32(&regs->dllcfg0, DLL_ENABLE);
                esdhc_setbits32(&regs->tbctl, HS400_WNDW_ADJUST);
 
                esdhc_clock_control(priv, false);