diff options
Diffstat (limited to 'drivers/mmc/host/mmci.c')
| -rw-r--r-- | drivers/mmc/host/mmci.c | 16 | 
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index 50b5f9926f6..fa8dd2fda4b 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c @@ -675,7 +675,8 @@ mmci_data_irq(struct mmci_host *host, struct mmc_data *data,  	      unsigned int status)  {  	/* First check for errors */ -	if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_TXUNDERRUN|MCI_RXOVERRUN)) { +	if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_STARTBITERR| +		      MCI_TXUNDERRUN|MCI_RXOVERRUN)) {  		u32 remain, success;  		/* Terminate the DMA transfer */ @@ -754,8 +755,12 @@ mmci_cmd_irq(struct mmci_host *host, struct mmc_command *cmd,  	}  	if (!cmd->data || cmd->error) { -		if (host->data) +		if (host->data) { +			/* Terminate the DMA transfer */ +			if (dma_inprogress(host)) +				mmci_dma_data_error(host);  			mmci_stop_data(host); +		}  		mmci_request_end(host, cmd->mrq);  	} else if (!(cmd->data->flags & MMC_DATA_READ)) {  		mmci_start_data(host, cmd->data); @@ -955,8 +960,9 @@ static irqreturn_t mmci_irq(int irq, void *dev_id)  		dev_dbg(mmc_dev(host->mmc), "irq0 (data+cmd) %08x\n", status);  		data = host->data; -		if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_TXUNDERRUN| -			      MCI_RXOVERRUN|MCI_DATAEND|MCI_DATABLOCKEND) && data) +		if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_STARTBITERR| +			      MCI_TXUNDERRUN|MCI_RXOVERRUN|MCI_DATAEND| +			      MCI_DATABLOCKEND) && data)  			mmci_data_irq(host, data, status);  		cmd = host->cmd; @@ -1496,6 +1502,8 @@ static struct amba_id mmci_ids[] = {  	{ 0, 0 },  }; +MODULE_DEVICE_TABLE(amba, mmci_ids); +  static struct amba_driver mmci_driver = {  	.drv		= {  		.name	= DRIVER_NAME,  |