mmc: sdhci-msm: Save the calculated tuning phase
authorRitesh Harjani <riteshh@codeaurora.org>
Mon, 21 Nov 2016 06:37:24 +0000 (12:07 +0530)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 29 Nov 2016 08:05:18 +0000 (09:05 +0100)
Save the tuning phase once the tuning is performed.
This phase value will be used while calibrating DLL
for HS400 mode.

Signed-off-by: Ritesh Harjani <riteshh@codeaurora.org>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci-msm.c

index b1888c32b6b6f573051be3486ad9e71ee211a944..f4f277b27b96cb22f283f0f589cc99cca4424529 100644 (file)
@@ -75,6 +75,7 @@
 
 #define CORE_VENDOR_SPEC_CAPABILITIES0 0x11c
 
+#define INVALID_TUNING_PHASE   -1
 #define SDHCI_MSM_MIN_CLOCK    400000
 #define CORE_FREQ_100MHZ       (100 * 1000 * 1000)
 
@@ -97,6 +98,7 @@ struct sdhci_msm_host {
        bool use_14lpp_dll_reset;
        bool tuning_done;
        bool calibration_done;
+       u8 saved_tuning_phase;
 };
 
 /* Platform specific tuning */
@@ -136,6 +138,9 @@ static int msm_config_cm_dll_phase(struct sdhci_host *host, u8 phase)
        u32 config;
        struct mmc_host *mmc = host->mmc;
 
+       if (phase > 0xf)
+               return -EINVAL;
+
        spin_lock_irqsave(&host->lock, flags);
 
        config = readl_relaxed(host->ioaddr + CORE_DLL_CONFIG);
@@ -429,6 +434,8 @@ static int sdhci_msm_execute_tuning(struct sdhci_host *host, u32 opcode)
        int rc;
        struct mmc_host *mmc = host->mmc;
        struct mmc_ios ios = host->mmc->ios;
+       struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+       struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host);
 
        /*
         * Tuning is required for SDR104, HS200 and HS400 cards and
@@ -453,6 +460,7 @@ retry:
                if (rc)
                        return rc;
 
+               msm_host->saved_tuning_phase = phase;
                rc = mmc_send_tuning(mmc, opcode, NULL);
                if (!rc) {
                        /* Tuning is successful at this tuning point */
@@ -799,6 +807,8 @@ static int sdhci_msm_probe(struct platform_device *pdev)
 
        sdhci_get_of_property(pdev);
 
+       msm_host->saved_tuning_phase = INVALID_TUNING_PHASE;
+
        /* Setup SDCC bus voter clock. */
        msm_host->bus_clk = devm_clk_get(&pdev->dev, "bus");
        if (!IS_ERR(msm_host->bus_clk)) {