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); |