diff options
| -rw-r--r-- | drivers/mmc/host/mxcmmc.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c index 2c53024ee439..ec18e3b60342 100644 --- a/drivers/mmc/host/mxcmmc.c +++ b/drivers/mmc/host/mxcmmc.c | |||
| @@ -489,6 +489,9 @@ static void mxcmci_datawork(struct work_struct *work) | |||
| 489 | struct mxcmci_host *host = container_of(work, struct mxcmci_host, | 489 | struct mxcmci_host *host = container_of(work, struct mxcmci_host, |
| 490 | datawork); | 490 | datawork); |
| 491 | int datastat = mxcmci_transfer_data(host); | 491 | int datastat = mxcmci_transfer_data(host); |
| 492 | |||
| 493 | writel(STATUS_READ_OP_DONE | STATUS_WRITE_OP_DONE, | ||
| 494 | host->base + MMC_REG_STATUS); | ||
| 492 | mxcmci_finish_data(host, datastat); | 495 | mxcmci_finish_data(host, datastat); |
| 493 | 496 | ||
| 494 | if (host->req->stop) { | 497 | if (host->req->stop) { |
| @@ -553,7 +556,8 @@ static irqreturn_t mxcmci_irq(int irq, void *devid) | |||
| 553 | u32 stat; | 556 | u32 stat; |
| 554 | 557 | ||
| 555 | stat = readl(host->base + MMC_REG_STATUS); | 558 | stat = readl(host->base + MMC_REG_STATUS); |
| 556 | writel(stat & ~STATUS_SDIO_INT_ACTIVE, host->base + MMC_REG_STATUS); | 559 | writel(stat & ~(STATUS_SDIO_INT_ACTIVE | STATUS_DATA_TRANS_DONE | |
| 560 | STATUS_WRITE_OP_DONE), host->base + MMC_REG_STATUS); | ||
| 557 | 561 | ||
| 558 | dev_dbg(mmc_dev(host->mmc), "%s: 0x%08x\n", __func__, stat); | 562 | dev_dbg(mmc_dev(host->mmc), "%s: 0x%08x\n", __func__, stat); |
| 559 | 563 | ||
| @@ -561,6 +565,13 @@ static irqreturn_t mxcmci_irq(int irq, void *devid) | |||
| 561 | sdio_irq = (stat & STATUS_SDIO_INT_ACTIVE) && host->use_sdio; | 565 | sdio_irq = (stat & STATUS_SDIO_INT_ACTIVE) && host->use_sdio; |
| 562 | spin_unlock_irqrestore(&host->lock, flags); | 566 | spin_unlock_irqrestore(&host->lock, flags); |
| 563 | 567 | ||
| 568 | #ifdef HAS_DMA | ||
| 569 | if (mxcmci_use_dma(host) && | ||
| 570 | (stat & (STATUS_READ_OP_DONE | STATUS_WRITE_OP_DONE))) | ||
| 571 | writel(STATUS_READ_OP_DONE | STATUS_WRITE_OP_DONE, | ||
| 572 | host->base + MMC_REG_STATUS); | ||
| 573 | #endif | ||
| 574 | |||
| 564 | if (sdio_irq) { | 575 | if (sdio_irq) { |
| 565 | writel(STATUS_SDIO_INT_ACTIVE, host->base + MMC_REG_STATUS); | 576 | writel(STATUS_SDIO_INT_ACTIVE, host->base + MMC_REG_STATUS); |
| 566 | mmc_signal_sdio_irq(host->mmc); | 577 | mmc_signal_sdio_irq(host->mmc); |
