aboutsummaryrefslogtreecommitdiff
path: root/drivers/mmc/host/sdhci-esdhc.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mmc/host/sdhci-esdhc.h')
-rw-r--r--drivers/mmc/host/sdhci-esdhc.h16
1 files changed, 14 insertions, 2 deletions
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);