summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRitesh Harjani <riteshh@codeaurora.org>2015-05-27 15:40:24 +0530
committerSubhash Jadavani <subhashj@codeaurora.org>2016-05-31 15:26:48 -0700
commite925dcbfb5c794edde43ca6d42809c01bdcbc7d5 (patch)
treefa0872316592e610e51dc5a5ce1e1e04a04424b0
parent5254590eb277ed9d9822bfe97dc6798e2663c32e (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.c52
-rw-r--r--drivers/mmc/host/sdhci-msm.h1
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;