mmc: sdhci-esdhc-imx: enable hw auto retuning for MAN_TUNING
authorDong Aisheng <aisheng.dong@nxp.com>
Tue, 12 Jul 2016 07:46:19 +0000 (15:46 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 25 Jul 2016 08:34:56 +0000 (10:34 +0200)
Indicating hw auto retuning support for mx6qdl in the fake caps_1
register and enable auto retuning in post_tuning process after
tuning completes.

Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci-esdhc-imx.c

index c90aa07b106f6c5810a355920662ebe692aa1941..ac2c83af744008cf9d652b534d2f80193770957e 100644 (file)
@@ -302,7 +302,8 @@ static u32 esdhc_readl_le(struct sdhci_host *host, int reg)
                                /* imx6q/dl does not have cap_1 register, fake one */
                                val = SDHCI_SUPPORT_DDR50 | SDHCI_SUPPORT_SDR104
                                        | SDHCI_SUPPORT_SDR50
-                                       | SDHCI_USE_SDR50_TUNING;
+                                       | SDHCI_USE_SDR50_TUNING
+                                       | (SDHCI_TUNING_MODE_3 << SDHCI_RETUNING_MODE_SHIFT);
 
                        if (imx_data->socdata->flags & ESDHC_FLAG_HS400)
                                val |= SDHCI_SUPPORT_HS400;
@@ -472,10 +473,13 @@ static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
                writel(new_val, host->ioaddr + ESDHC_VENDOR_SPEC);
                if (imx_data->socdata->flags & ESDHC_FLAG_MAN_TUNING) {
                        new_val = readl(host->ioaddr + ESDHC_MIX_CTRL);
-                       if (val & SDHCI_CTRL_TUNED_CLK)
+                       if (val & SDHCI_CTRL_TUNED_CLK) {
                                new_val |= ESDHC_MIX_CTRL_SMPCLK_SEL;
-                       else
+                               new_val |= ESDHC_MIX_CTRL_AUTO_TUNE_EN;
+                       } else {
                                new_val &= ~ESDHC_MIX_CTRL_SMPCLK_SEL;
+                               new_val &= ~ESDHC_MIX_CTRL_AUTO_TUNE_EN;
+                       }
                        writel(new_val , host->ioaddr + ESDHC_MIX_CTRL);
                } else if (imx_data->socdata->flags & ESDHC_FLAG_STD_TUNING) {
                        u32 v = readl(host->ioaddr + SDHCI_ACMD12_ERR);
@@ -761,6 +765,7 @@ static void esdhc_post_tuning(struct sdhci_host *host)
 
        reg = readl(host->ioaddr + ESDHC_MIX_CTRL);
        reg &= ~ESDHC_MIX_CTRL_EXE_TUNE;
+       reg |= ESDHC_MIX_CTRL_AUTO_TUNE_EN;
        writel(reg, host->ioaddr + ESDHC_MIX_CTRL);
 }