diff options
-rw-r--r-- | drivers/mmc/host/sdhci-esdhc-imx.c | 6 | ||||
-rw-r--r-- | drivers/mmc/host/sdhci-esdhc.h | 16 |
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); |