diff options
| author | Ritesh Harjani <riteshh@codeaurora.org> | 2015-05-27 15:40:24 +0530 |
|---|---|---|
| committer | Subhash Jadavani <subhashj@codeaurora.org> | 2016-05-31 15:26:48 -0700 |
| commit | e925dcbfb5c794edde43ca6d42809c01bdcbc7d5 (patch) | |
| tree | fa0872316592e610e51dc5a5ce1e1e04a04424b0 | |
| parent | 5254590eb277ed9d9822bfe97dc6798e2663c32e (diff) | |
mmc: sdhci-msm: Add hs400 enhanced strobe mode support to host
This adds hs400 enhanced strobe mode(emmc 5.1 feature)
support to sdhci-msm platform host.
Change-Id: Id35e0b9e47ea725202c8e4a3ca479d52cc872920
Signed-off-by: Ritesh Harjani <riteshh@codeaurora.org>
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
| -rw-r--r-- | drivers/mmc/host/sdhci-msm.c | 52 | ||||
| -rw-r--r-- | drivers/mmc/host/sdhci-msm.h | 1 |
2 files changed, 51 insertions, 2 deletions
diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 33cb44a36a5f..6633eec821cb 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -152,7 +152,9 @@ #define CORE_DDR_200_CFG 0x184 #define CORE_CDC_T4_DLY_SEL (1 << 0) +#define CORE_CMDIN_RCLK_EN (1 << 1) #define CORE_START_CDC_TRAFFIC (1 << 6) + #define CORE_VENDOR_SPEC3 0x1B0 #define CORE_PWRSAVE_DLL (1 << 3) @@ -772,6 +774,11 @@ static int sdhci_msm_cm_dll_sdc4_calibration(struct sdhci_host *host) */ writel_relaxed(DDR_CONFIG_POR_VAL, host->ioaddr + CORE_DDR_CONFIG); + if (msm_host->enhanced_strobe) + writel_relaxed((readl_relaxed(host->ioaddr + CORE_DDR_200_CFG) + | CORE_CMDIN_RCLK_EN), + host->ioaddr + CORE_DDR_200_CFG); + /* Write 1 to DDR_CAL_EN field in CORE_DLL_CONFIG_2 */ writel_relaxed((readl_relaxed(host->ioaddr + CORE_DLL_CONFIG_2) | CORE_DDR_CAL_EN), @@ -806,6 +813,42 @@ out: return ret; } +static int sdhci_msm_enhanced_strobe(struct sdhci_host *host) +{ + int ret = 0; + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_msm_host *msm_host = pltfm_host->priv; + struct mmc_host *mmc = host->mmc; + + pr_debug("%s: Enter %s\n", mmc_hostname(host->mmc), __func__); + + if (!msm_host->enhanced_strobe) { + pr_debug("%s: host does not support hs400 enhanced strobe\n", + mmc_hostname(mmc)); + return -EINVAL; + } + + if (msm_host->calibration_done || + !(mmc->ios.timing == MMC_TIMING_MMC_HS400)) { + return 0; + } + + /* + * Reset the tuning block. + */ + ret = msm_init_cm_dll(host); + if (ret) + goto out; + + ret = sdhci_msm_cm_dll_sdc4_calibration(host); +out: + if (!ret) + msm_host->calibration_done = true; + pr_debug("%s: Exit %s, ret:%d\n", mmc_hostname(host->mmc), + __func__, ret); + return ret; +} + static int sdhci_msm_hs400_dll_calibration(struct sdhci_host *host) { int ret = 0; @@ -2544,7 +2587,8 @@ static void sdhci_msm_set_clock(struct sdhci_host *host, unsigned int clock) * Select HS400 mode using the HC_SELECT_IN from VENDOR SPEC * register */ - if (msm_host->tuning_done && !msm_host->calibration_done) { + if ((msm_host->tuning_done || msm_host->enhanced_strobe) && + !msm_host->calibration_done) { /* * Write 0x6 to HC_SELECT_IN and 1 to HC_SELECT_IN_EN * field in VENDOR_SPEC_FUNC @@ -2773,6 +2817,7 @@ static struct sdhci_ops sdhci_msm_ops = { .set_uhs_signaling = sdhci_msm_set_uhs_signaling, .check_power_status = sdhci_msm_check_power_status, .platform_execute_tuning = sdhci_msm_execute_tuning, + .enhanced_strobe = sdhci_msm_enhanced_strobe, .toggle_cdr = sdhci_msm_toggle_cdr, .get_max_segments = sdhci_msm_max_segs, .set_clock = sdhci_msm_set_clock, @@ -2830,9 +2875,12 @@ static void sdhci_set_default_hw_caps(struct sdhci_msm_host *msm_host, /* * SDCC 5 controller with major version 1, minor version 0x42 and later * will require additional steps when resetting DLL. + * It also supports HS400 enhanced strobe mode. */ - if ((major == 1) && (minor >= 0x42)) + if ((major == 1) && (minor >= 0x42)) { msm_host->use_updated_dll_reset = true; + msm_host->enhanced_strobe = true; + } /* * SDCC 5 controller with major version 1 and minor version 0x42, diff --git a/drivers/mmc/host/sdhci-msm.h b/drivers/mmc/host/sdhci-msm.h index 708ab8ba3c3f..d61c50e1491f 100644 --- a/drivers/mmc/host/sdhci-msm.h +++ b/drivers/mmc/host/sdhci-msm.h @@ -154,6 +154,7 @@ struct sdhci_msm_host { bool use_cdclp533; bool use_updated_dll_reset; bool use_14lpp_dll; + bool enhanced_strobe; u32 caps_0; struct sdhci_msm_ice_data ice; u32 ice_clk_rate; |
