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)
 {