mmc: sdhci-esdhc-imx: Reset before sending tuning command for manual tuning
authorHaibo Chen <haibo.chen@nxp.com>
Tue, 11 Aug 2020 08:37:37 +0000 (16:37 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 7 Sep 2020 07:11:28 +0000 (09:11 +0200)
According to IC suggestion, everytime before sending the tuning command,
need to reset the usdhc, so to reset the tuning circuit, to let every
tuning command work well for the manual tuning method. For standard tuning
method, IC already add the reset operation in the hardware logic.

Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Link: https://lore.kernel.org/r/1597135057-22272-1-git-send-email-haibo.chen@nxp.com
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci-esdhc-imx.c

index d738907a622f7ad01aecd9bafd9cd628d345098c..0be334759c82ad8936a8f29637caa3c1da16273a 100644 (file)
@@ -987,10 +987,20 @@ static int usdhc_execute_tuning(struct mmc_host *mmc, u32 opcode)
 static void esdhc_prepare_tuning(struct sdhci_host *host, u32 val)
 {
        u32 reg;
+       u8 sw_rst;
+       int ret;
 
        /* FIXME: delay a bit for card to be ready for next tuning due to errors */
        mdelay(1);
 
+       /* IC suggest to reset USDHC before every tuning command */
+       esdhc_clrset_le(host, 0xff, SDHCI_RESET_ALL, SDHCI_SOFTWARE_RESET);
+       ret = readb_poll_timeout(host->ioaddr + SDHCI_SOFTWARE_RESET, sw_rst,
+                               !(sw_rst & SDHCI_RESET_ALL), 10, 100);
+       if (ret == -ETIMEDOUT)
+               dev_warn(mmc_dev(host->mmc),
+               "warning! RESET_ALL never complete before sending tuning command\n");
+
        reg = readl(host->ioaddr + ESDHC_MIX_CTRL);
        reg |= ESDHC_MIX_CTRL_EXE_TUNE | ESDHC_MIX_CTRL_SMPCLK_SEL |
                        ESDHC_MIX_CTRL_FBCLK_SEL;