mirror of https://gitee.com/openkylin/linux.git
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: Ritesh Harjani <riteshh@codeaurora.org> Acked-by: Adrian Hunter <adrian.hunter@intel.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
ff06ce4178
commit
abf270e5c6
|
@ -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 {
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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)) {
|
||||||
|
|
Loading…
Reference in New Issue