platform: msm_shared: Disable dynamic DLL phase shift
CDR (clock-data recovery) enable automatically adjusts
the sampling point based on voltage/temperature variations.
This must be enabled for only read and disabled for write.
CRs-Fixed: 691777
Change-Id: Ic26fb13c1eeb3b2f9ef6ebfe69e83697ca9f0fc1
diff --git a/platform/msm_shared/include/sdhci_msm.h b/platform/msm_shared/include/sdhci_msm.h
index 180f23a..52172b7 100644
--- a/platform/msm_shared/include/sdhci_msm.h
+++ b/platform/msm_shared/include/sdhci_msm.h
@@ -120,4 +120,6 @@
void sdhci_msm_init(struct sdhci_host *host, struct sdhci_msm_data *data);
uint32_t sdhci_msm_execute_tuning(struct sdhci_host *host, uint32_t bus_width);
void sdhci_mode_disable(struct sdhci_host *host);
+/* API: Toggle the bit for clock-data recovery */
+void sdhci_msm_toggle_cdr(struct sdhci_host *host, bool enable);
#endif
diff --git a/platform/msm_shared/sdhci.c b/platform/msm_shared/sdhci.c
index aca30a7..3c1e1eb 100644
--- a/platform/msm_shared/sdhci.c
+++ b/platform/msm_shared/sdhci.c
@@ -839,7 +839,14 @@
trans_mode |= SDHCI_DMA_EN;
if (cmd->trans_mode == SDHCI_MMC_READ)
+ {
trans_mode |= SDHCI_READ_MODE;
+ sdhci_msm_toggle_cdr(host, true);
+ }
+ else
+ {
+ sdhci_msm_toggle_cdr(host, false);
+ }
/* Enable auto cmd23 or cmd12 for multi block transfer
* based on what command card supports
diff --git a/platform/msm_shared/sdhci_msm.c b/platform/msm_shared/sdhci_msm.c
index 25b47e4..7554016 100644
--- a/platform/msm_shared/sdhci_msm.c
+++ b/platform/msm_shared/sdhci_msm.c
@@ -301,6 +301,24 @@
return 0;
}
+void sdhci_msm_toggle_cdr(struct sdhci_host *host, bool enable)
+{
+ uint32_t core_cfg;
+
+ core_cfg = REG_READ32(host, SDCC_DLL_CONFIG_REG);
+
+ if (enable)
+ {
+ core_cfg |= SDCC_DLL_CDR_EN;
+ }
+ else
+ {
+ core_cfg &= ~SDCC_DLL_CDR_EN;
+ }
+
+ REG_WRITE32(host, core_cfg, SDCC_DLL_CONFIG_REG);
+}
+
/* Configure DLL with delay value based on 'phase' */
static uint32_t sdhci_msm_config_dll(struct sdhci_host *host, uint32_t phase)
{