summaryrefslogtreecommitdiffstats
path: root/drivers/mmc
diff options
context:
space:
mode:
authorPierre Ossman <drzeus@drzeus.cx>2007-05-13 22:39:23 +0200
committerPierre Ossman <drzeus@drzeus.cx>2007-05-14 18:51:37 +0200
commit6ba736a10e4ae63b38ccfee9f22b3263a6e5d050 (patch)
tree83d35c393117d572d863cde7993a594db30f280d /drivers/mmc
parentc0f3b6c777af071063984fdbc4efb6c904f665f4 (diff)
downloadkernel-crypto-6ba736a10e4ae63b38ccfee9f22b3263a6e5d050.tar.gz
kernel-crypto-6ba736a10e4ae63b38ccfee9f22b3263a6e5d050.tar.xz
kernel-crypto-6ba736a10e4ae63b38ccfee9f22b3263a6e5d050.zip
sdhci: handle dma boundary interrupts
When the device hits certain memory boundaries, it signals an interrupt and expects to be serviced. We don't need the feature but we need to make sure the device doesn't stall. Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/host/sdhci.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index ff5bf73cdd2..a359efdd77e 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -963,6 +963,15 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
if (intmask & (SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL))
sdhci_transfer_pio(host);
+ /*
+ * We currently don't do anything fancy with DMA
+ * boundaries, but as we can't disable the feature
+ * we need to at least restart the transfer.
+ */
+ if (intmask & SDHCI_INT_DMA_END)
+ writel(readl(host->ioaddr + SDHCI_DMA_ADDRESS),
+ host->ioaddr + SDHCI_DMA_ADDRESS);
+
if (intmask & SDHCI_INT_DATA_END)
sdhci_finish_data(host);
}