mmc: sdhci: add timeout for data transfer

Signed-off-by: Lei Wen <leiwen@marvell.com>
master
Lei Wen 13 years ago committed by Andy Fleming
parent 6cf1b17cd0
commit a004abde88
  1. 9
      drivers/mmc/sdhci.c

@ -81,8 +81,9 @@ static void sdhci_transfer_pio(struct sdhci_host *host, struct mmc_data *data)
static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data, static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data,
unsigned int start_addr) unsigned int start_addr)
{ {
unsigned int stat, rdy, mask, block = 0; unsigned int stat, rdy, mask, timeout, block = 0;
timeout = 10000;
rdy = SDHCI_INT_SPACE_AVAIL | SDHCI_INT_DATA_AVAIL; rdy = SDHCI_INT_SPACE_AVAIL | SDHCI_INT_DATA_AVAIL;
mask = SDHCI_DATA_AVAILABLE | SDHCI_SPACE_AVAILABLE; mask = SDHCI_DATA_AVAILABLE | SDHCI_SPACE_AVAILABLE;
do { do {
@ -108,6 +109,12 @@ static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data,
sdhci_writel(host, start_addr, SDHCI_DMA_ADDRESS); sdhci_writel(host, start_addr, SDHCI_DMA_ADDRESS);
} }
#endif #endif
if (timeout-- > 0)
udelay(10);
else {
printf("Transfer data timeout\n");
return -1;
}
} while (!(stat & SDHCI_INT_DATA_END)); } while (!(stat & SDHCI_INT_DATA_END));
return 0; return 0;
} }

Loading…
Cancel
Save