aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDong Aisheng <b29396@freescale.com>2013-10-18 07:48:46 -0400
committerChris Ball <chris@printf.net>2013-10-21 15:58:10 -0400
commitde5bdbffd89dea0e3de76f99b0b036422bb93686 (patch)
tree25ba1c08549c4e8c44171184d31e81f9af82d37d
parent114f2bf6a158cd84c1a7280cf6233904c8bce430 (diff)
mmc: sdhci-esdhc-imx: add DDR mode support for mx6
When DDR mode is enabled, the initial pre_div should be 2. And the pre_div value should be changed accordingly from ... 02h) Base clock divided by 4 01h) Base clock divided by 2 00h) Base clock divided by 1 to .. 02h) Base clock divided by 8 01h) Base clock divided by 4 00h) Base clock divided by 2 Signed-off-by: Dong Aisheng <b29396@freescale.com> Acked-by: Shawn Guo <shawn.guo@linaro.org> Signed-off-by: Chris Ball <cjb@laptop.org>
-rw-r--r--drivers/mmc/host/sdhci-esdhc-imx.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
index 1652e18b399b..915fa68e5122 100644
--- a/drivers/mmc/host/sdhci-esdhc-imx.c
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -38,6 +38,7 @@
38#define ESDHC_VENDOR_SPEC_FRC_SDCLK_ON (1 << 8) 38#define ESDHC_VENDOR_SPEC_FRC_SDCLK_ON (1 << 8)
39#define ESDHC_WTMK_LVL 0x44 39#define ESDHC_WTMK_LVL 0x44
40#define ESDHC_MIX_CTRL 0x48 40#define ESDHC_MIX_CTRL 0x48
41#define ESDHC_MIX_CTRL_DDREN (1 << 3)
41#define ESDHC_MIX_CTRL_AC23EN (1 << 7) 42#define ESDHC_MIX_CTRL_AC23EN (1 << 7)
42#define ESDHC_MIX_CTRL_EXE_TUNE (1 << 22) 43#define ESDHC_MIX_CTRL_EXE_TUNE (1 << 22)
43#define ESDHC_MIX_CTRL_SMPCLK_SEL (1 << 23) 44#define ESDHC_MIX_CTRL_SMPCLK_SEL (1 << 23)
@@ -152,6 +153,7 @@ struct pltfm_imx_data {
152 WAIT_FOR_INT, /* sent CMD12, waiting for response INT */ 153 WAIT_FOR_INT, /* sent CMD12, waiting for response INT */
153 } multiblock_status; 154 } multiblock_status;
154 u32 uhs_mode; 155 u32 uhs_mode;
156 u32 is_ddr;
155}; 157};
156 158
157static struct platform_device_id imx_esdhc_devtype[] = { 159static struct platform_device_id imx_esdhc_devtype[] = {
@@ -537,8 +539,10 @@ static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)
537 * The reset on usdhc fails to clear MIX_CTRL register. 539 * The reset on usdhc fails to clear MIX_CTRL register.
538 * Do it manually here. 540 * Do it manually here.
539 */ 541 */
540 if (esdhc_is_usdhc(imx_data)) 542 if (esdhc_is_usdhc(imx_data)) {
541 writel(0, host->ioaddr + ESDHC_MIX_CTRL); 543 writel(0, host->ioaddr + ESDHC_MIX_CTRL);
544 imx_data->is_ddr = 0;
545 }
542 } 546 }
543} 547}
544 548
@@ -582,7 +586,7 @@ static inline void esdhc_pltfm_set_clock(struct sdhci_host *host,
582 goto out; 586 goto out;
583 } 587 }
584 588
585 if (esdhc_is_usdhc(imx_data)) 589 if (esdhc_is_usdhc(imx_data) && !imx_data->is_ddr)
586 pre_div = 1; 590 pre_div = 1;
587 591
588 temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL); 592 temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
@@ -600,7 +604,10 @@ static inline void esdhc_pltfm_set_clock(struct sdhci_host *host,
600 dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n", 604 dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
601 clock, host->mmc->actual_clock); 605 clock, host->mmc->actual_clock);
602 606
603 pre_div >>= 1; 607 if (imx_data->is_ddr)
608 pre_div >>= 2;
609 else
610 pre_div >>= 1;
604 div--; 611 div--;
605 612
606 temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL); 613 temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
@@ -826,6 +833,10 @@ static int esdhc_set_uhs_signaling(struct sdhci_host *host, unsigned int uhs)
826 break; 833 break;
827 case MMC_TIMING_UHS_DDR50: 834 case MMC_TIMING_UHS_DDR50:
828 imx_data->uhs_mode = SDHCI_CTRL_UHS_DDR50; 835 imx_data->uhs_mode = SDHCI_CTRL_UHS_DDR50;
836 writel(readl(host->ioaddr + ESDHC_MIX_CTRL) |
837 ESDHC_MIX_CTRL_DDREN,
838 host->ioaddr + ESDHC_MIX_CTRL);
839 imx_data->is_ddr = 1;
829 break; 840 break;
830 } 841 }
831 842