mmc: sdhci-esdhc-imx: fix strobe DLL lock wrong clock issue
authorDong Aisheng <aisheng.dong@nxp.com>
Tue, 12 Jul 2016 07:46:20 +0000 (15:46 +0800)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 25 Jul 2016 08:34:57 +0000 (10:34 +0200)
When enable DDR, the clock factor definition is changed.
e.g. original 200Mhz will become 100Mhz once MIX_CTRL_DDREN bit is set
So we need to update the clock setting then the strobe dll can lock
the correct clock rate.

Additionally we also need disable the clock before locking strobe dll.

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 ac2c83af744008cf9d652b534d2f80193770957e..bbb0bd4eac2848a9705a4ce3e30a148c80e0a7fd 100644 (file)
@@ -853,6 +853,11 @@ static void esdhc_set_strobe_dll(struct sdhci_host *host)
        u32 v;
 
        if (host->mmc->actual_clock > ESDHC_STROBE_DLL_CLK_FREQ) {
+               /* disable clock before enabling strobe dll */
+               writel(readl(host->ioaddr + ESDHC_VENDOR_SPEC) &
+                      ~ESDHC_VENDOR_SPEC_FRC_SDCLK_ON,
+                      host->ioaddr + ESDHC_VENDOR_SPEC);
+
                /* force a reset on strobe dll */
                writel(ESDHC_STROBE_DLL_CTRL_RESET,
                        host->ioaddr + ESDHC_STROBE_DLL_CTRL);
@@ -914,6 +919,8 @@ static void esdhc_set_uhs_signaling(struct sdhci_host *host, unsigned timing)
                m |= ESDHC_MIX_CTRL_DDREN | ESDHC_MIX_CTRL_HS400_EN;
                writel(m, host->ioaddr + ESDHC_MIX_CTRL);
                imx_data->is_ddr = 1;
+               /* update clock after enable DDR for strobe DLL lock */
+               host->ops->set_clock(host, host->clock);
                esdhc_set_strobe_dll(host);
                break;
        }