瀏覽代碼

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>
Pierre Ossman 18 年之前
父節點
當前提交
6ba736a10e
共有 1 個文件被更改,包括 9 次插入0 次删除
  1. 9 0
      drivers/mmc/host/sdhci.c

+ 9 - 0
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))
 		if (intmask & (SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL))
 			sdhci_transfer_pio(host);
 			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)
 		if (intmask & SDHCI_INT_DATA_END)
 			sdhci_finish_data(host);
 			sdhci_finish_data(host);
 	}
 	}