aboutsummaryrefslogtreecommitdiff
path: root/drivers/mmc
diff options
context:
space:
mode:
authorPhilippe Langlais <philippe.langlais@linaro.org>2011-03-21 17:12:21 +0100
committerRobert Marklund <robert.marklund@stericsson.com>2011-05-04 18:04:52 +0200
commit437855158c2727065affa065093c6f187ac44903 (patch)
treeb4d99acd78258000933c4e2ff2042c0798feed46 /drivers/mmc
parentc96e0abb0e303b701df8c6c34739b168ee823170 (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.c27
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