diff options
author | Jayeeta Banerjee <jayeeta.banerjee@stericsson.com> | 2010-03-03 17:38:54 +0530 |
---|---|---|
committer | John Rigby <john.rigby@linaro.org> | 2010-09-02 22:44:17 -0600 |
commit | 7680c9db15f08558f767535d159baf2caac12a84 (patch) | |
tree | 9004c52f82790cb762557293c4469e4d53be0b80 /drivers/mmc | |
parent | 79d0e222646a8222d00495f40616ad05e8b58ad3 (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.c | 21 |
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) |