diff options
author | Dong Aisheng <b29396@freescale.com> | 2013-10-18 07:48:46 -0400 |
---|---|---|
committer | Chris Ball <chris@printf.net> | 2013-10-21 15:58:10 -0400 |
commit | de5bdbffd89dea0e3de76f99b0b036422bb93686 (patch) | |
tree | 25ba1c08549c4e8c44171184d31e81f9af82d37d | |
parent | 114f2bf6a158cd84c1a7280cf6233904c8bce430 (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.c | 17 |
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 | ||
157 | static struct platform_device_id imx_esdhc_devtype[] = { | 159 | static 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 | ||