Commit abf270e5 authored by Ritesh Harjani's avatar Ritesh Harjani Committed by Ulf Hansson

mmc: sdhci-msm: Save the calculated tuning phase

Save the tuning phase once the tuning is performed.
This phase value will be used while calibrating DLL
for HS400 mode.
Signed-off-by: default avatarRitesh Harjani <riteshh@codeaurora.org>
Acked-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent ff06ce41
...@@ -75,6 +75,7 @@ ...@@ -75,6 +75,7 @@
#define CORE_VENDOR_SPEC_CAPABILITIES0 0x11c #define CORE_VENDOR_SPEC_CAPABILITIES0 0x11c
#define INVALID_TUNING_PHASE -1
#define SDHCI_MSM_MIN_CLOCK 400000 #define SDHCI_MSM_MIN_CLOCK 400000
#define CORE_FREQ_100MHZ (100 * 1000 * 1000) #define CORE_FREQ_100MHZ (100 * 1000 * 1000)
...@@ -97,6 +98,7 @@ struct sdhci_msm_host { ...@@ -97,6 +98,7 @@ struct sdhci_msm_host {
bool use_14lpp_dll_reset; bool use_14lpp_dll_reset;
bool tuning_done; bool tuning_done;
bool calibration_done; bool calibration_done;
u8 saved_tuning_phase;
}; };
/* Platform specific tuning */ /* Platform specific tuning */
...@@ -136,6 +138,9 @@ static int msm_config_cm_dll_phase(struct sdhci_host *host, u8 phase) ...@@ -136,6 +138,9 @@ static int msm_config_cm_dll_phase(struct sdhci_host *host, u8 phase)
u32 config; u32 config;
struct mmc_host *mmc = host->mmc; struct mmc_host *mmc = host->mmc;
if (phase > 0xf)
return -EINVAL;
spin_lock_irqsave(&host->lock, flags); spin_lock_irqsave(&host->lock, flags);
config = readl_relaxed(host->ioaddr + CORE_DLL_CONFIG); config = readl_relaxed(host->ioaddr + CORE_DLL_CONFIG);
...@@ -429,6 +434,8 @@ static int sdhci_msm_execute_tuning(struct sdhci_host *host, u32 opcode) ...@@ -429,6 +434,8 @@ static int sdhci_msm_execute_tuning(struct sdhci_host *host, u32 opcode)
int rc; int rc;
struct mmc_host *mmc = host->mmc; struct mmc_host *mmc = host->mmc;
struct mmc_ios ios = host->mmc->ios; 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 * Tuning is required for SDR104, HS200 and HS400 cards and
...@@ -453,6 +460,7 @@ static int sdhci_msm_execute_tuning(struct sdhci_host *host, u32 opcode) ...@@ -453,6 +460,7 @@ static int sdhci_msm_execute_tuning(struct sdhci_host *host, u32 opcode)
if (rc) if (rc)
return rc; return rc;
msm_host->saved_tuning_phase = phase;
rc = mmc_send_tuning(mmc, opcode, NULL); rc = mmc_send_tuning(mmc, opcode, NULL);
if (!rc) { if (!rc) {
/* Tuning is successful at this tuning point */ /* Tuning is successful at this tuning point */
...@@ -799,6 +807,8 @@ static int sdhci_msm_probe(struct platform_device *pdev) ...@@ -799,6 +807,8 @@ static int sdhci_msm_probe(struct platform_device *pdev)
sdhci_get_of_property(pdev); sdhci_get_of_property(pdev);
msm_host->saved_tuning_phase = INVALID_TUNING_PHASE;
/* Setup SDCC bus voter clock. */ /* Setup SDCC bus voter clock. */
msm_host->bus_clk = devm_clk_get(&pdev->dev, "bus"); msm_host->bus_clk = devm_clk_get(&pdev->dev, "bus");
if (!IS_ERR(msm_host->bus_clk)) { if (!IS_ERR(msm_host->bus_clk)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment