aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/mmc/host/sdhci-esdhc-imx.c6
-rw-r--r--drivers/mmc/host/sdhci-esdhc.h16
2 files changed, 18 insertions, 4 deletions
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
index 63c96aa2a1f..5c6d8f58bcf 100644
--- a/drivers/mmc/host/sdhci-esdhc-imx.c
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -31,8 +31,7 @@
/* VENDOR SPEC register */
#define SDHCI_VENDOR_SPEC 0xC0
#define SDHCI_VENDOR_SPEC_SDIO_QUIRK 0x00000002
-#define SDHCI_MIX_CTRL 0x48
-#define SDHCI_MIX_CTRL_DDREN (1 << 3)
+
#define SDHCI_MIX_CTRL_EXE_TUNE (1 << 22)
#define SDHCI_MIX_CTRL_SMPCLK_SEL (1 << 23)
#define SDHCI_MIX_CTRL_AUTO_TUNE (1 << 24)
@@ -340,6 +339,9 @@ static int plt_ddr_mode(struct sdhci_host *host, int mode)
sdhci_writel(host, reg, SDHCI_MIX_CTRL);
+ /* set clock frequency again */
+ esdhc_set_clock(host, host->clock);
+
return 0;
}
diff --git a/drivers/mmc/host/sdhci-esdhc.h b/drivers/mmc/host/sdhci-esdhc.h
index 62e50ef3121..c4e8fad4d99 100644
--- a/drivers/mmc/host/sdhci-esdhc.h
+++ b/drivers/mmc/host/sdhci-esdhc.h
@@ -42,14 +42,26 @@
#define ESDHC_HOST_CONTROL_RES 0x05
+#define SDHCI_MIX_CTRL 0x48
+#define SDHCI_MIX_CTRL_DDREN (1 << 3)
+
static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
{
int pre_div = 2;
int div = 1;
u32 temp;
+ struct esdhc_platform_data *boarddata;
+ int ddr_mode = 0;
- if (cpu_is_mx6q())
+ boarddata = host->mmc->parent->platform_data;
+ if (cpu_is_mx6q()) {
pre_div = 1;
+ if (readl(host->ioaddr + SDHCI_MIX_CTRL) &
+ SDHCI_MIX_CTRL_DDREN) {
+ ddr_mode = 1;
+ pre_div = 2;
+ }
+ }
temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN
| ESDHC_CLOCK_MASK);
@@ -67,7 +79,7 @@ static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
clock, host->max_clk / pre_div / div);
- pre_div >>= 1;
+ pre_div >>= (1 + ddr_mode);
div--;
temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);