aboutsummaryrefslogtreecommitdiff
path: root/drivers/mmc
diff options
context:
space:
mode:
authorJayeeta Banerjee <jayeeta.banerjee@stericsson.com>2010-03-03 17:38:54 +0530
committerJohn Rigby <john.rigby@linaro.org>2010-09-02 22:44:17 -0600
commit7680c9db15f08558f767535d159baf2caac12a84 (patch)
tree9004c52f82790cb762557293c4469e4d53be0b80 /drivers/mmc
parent79d0e222646a8222d00495f40616ad05e8b58ad3 (diff)
SDIO: Fix for SDIO DMA issue, FIDO ID 251784 Signed-off-by: Jayeeta Banerjee <jayeeta.banerjee@stericsson.com>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/host/mmc-u8500.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/drivers/mmc/host/mmc-u8500.c b/drivers/mmc/host/mmc-u8500.c
index aef1a7aacff..fe2a8f083dd 100644
--- a/drivers/mmc/host/mmc-u8500.c
+++ b/drivers/mmc/host/mmc-u8500.c
@@ -405,6 +405,8 @@ static void u8500_mmc_dma_transfer_done(struct u8500_mmci_host *host)
struct mmc_data *data;
struct mmc_host *mmc;
void __iomem *base;
+ u32 temp_reg;
+ int retry;
base = host->base;
data = host->data;
mmc = host->mmc;
@@ -414,6 +416,18 @@ static void u8500_mmc_dma_transfer_done(struct u8500_mmci_host *host)
u8500_mmci_request_end(host, host->mrq);
return;
}
+ /*
+ * Need to wait for end of transfer, i.e.,
+ * DATAEND bit to be set in SDI STATUS register
+ */
+ temp_reg = readl(base + MMCISTATUS);
+ retry = 200*100; /* Max wait for 100 usec */
+ while (!(temp_reg & MCI_DATAEND) && (retry > 0)) {
+ ndelay(5);
+ retry--;
+ temp_reg = readl(host->base + MMCISTATUS);
+ }
+
#ifndef DMA_SCATERGATHER
spin_lock(&host->lock);
if (!data->error) {
@@ -906,13 +920,6 @@ static void start_data_xfer(struct u8500_mmci_host *host)
writel(temp_reg, (base + MMCIDATACTRL));
- /**
- * Required for SDIO DMA mode, not functional without delay,
- * To be fixed later
- */
- if ((host->cmd->opcode == SD_IO_RW_EXTENDED) && (host->devicemode == MCI_DMAMODE))
- udelay(300);
-
}
static void u8500_mmci_xfer_irq(struct u8500_mmci_host *host,
u32 hoststatus)