diff options
author | Philippe Langlais <philippe.langlais@linaro.org> | 2011-03-21 17:12:21 +0100 |
---|---|---|
committer | Robert Marklund <robert.marklund@stericsson.com> | 2011-05-04 18:04:52 +0200 |
commit | 437855158c2727065affa065093c6f187ac44903 (patch) | |
tree | b4d99acd78258000933c4e2ff2042c0798feed46 /drivers/mmc | |
parent | c96e0abb0e303b701df8c6c34739b168ee823170 (diff) |
MMCI: Add DDR support
This adds support for eMMC DDR.
ST-Ericsson ID: 255732
ST-Ericsson FOSS-OUT ID: NA
Change-Id: If5007f81090c229dfe1d442eeffc046aa06e7014
Signed-off-by: Mikael Larsson <mikael.xt.larsson@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/11224
Reviewed-by: QATOOLS
Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/host/mmci.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index a5849bc3a80..4f37c5d57df 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c @@ -178,8 +178,22 @@ static void mmci_set_mask1(struct mmci_host *host, unsigned int mask) static void mmci_stop_data(struct mmci_host *host) { + u32 clk; + writel(0, host->base + MMCIDATACTRL); mmci_set_mask1(host, 0); + + /* Needed for DDR */ + if (host->mmc->card && mmc_card_ddr_mode(host->mmc->card)) { + clk = readl(host->base + MMCICLOCK); + if (clk & MCI_ST_UX500_NEG_EDGE) + clk &= ~(MCI_ST_UX500_NEG_EDGE); + if (clk & MCI_ST_UX500_CLK_INV) + clk &= ~(MCI_ST_UX500_CLK_INV); + + writel(clk, (host->base + MMCICLOCK)); + } + host->data = NULL; } @@ -444,6 +458,7 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data) unsigned long long clks; void __iomem *base; int blksz_bits; + u32 clk; dev_dbg(mmc_dev(host->mmc), "blksz %04x blks %04x flags %08x\n", data->blksz, data->blocks, data->flags); @@ -469,6 +484,18 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data) if (data->flags & MMC_DATA_READ) datactrl |= MCI_DPSM_DIRECTION; + if (host->mmc->card && mmc_card_ddr_mode(host->mmc->card)) { + datactrl |= MCI_ST_DPSM_DDRMODE; + + /* Needed for DDR */ + clk = readl(base + MMCICLOCK); + clk |= MCI_ST_UX500_CLK_INV; + if ((data->flags & MMC_DATA_READ)) + clk |= MCI_ST_UX500_NEG_EDGE; + + writel(clk, (base + MMCICLOCK)); + } + /* * Attempt to use DMA operation mode, if this * should fail, fall back to PIO mode |