diff options
Diffstat (limited to 'drivers/mmc/host/sdhci-esdhc.h')
-rw-r--r-- | drivers/mmc/host/sdhci-esdhc.h | 16 |
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); |