mmc: dw_mmc: Fix switch from DMA to PIO
authorSeungwon Jeon <tgih.jun@samsung.com>
Tue, 10 Apr 2012 00:53:32 +0000 (09:53 +0900)
committerChris Ball <cjb@laptop.org>
Sat, 21 Apr 2012 00:30:37 +0000 (20:30 -0400)
When dw_mci_pre_dma_transfer returns failure in some reasons,
dw_mci_submit_data will prepare to switch the PIO mode from DMA.
After switching to PIO mode, DMA(IDMAC in particular) is still
enabled. This makes the corruption in handling interrupt and
the driver lock-up.

Signed-off-by: Seungwon Jeon <tgih.jun@samsung.com>
Acked-by: Will Newton <will.newton@imgtec.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/host/dw_mmc.c

index bf3c9b456aaf1080d6db5163eacefb3e7805787a..f3b0fcd002df84e6156d687aa45ab129be2bd8e4 100644 (file)
@@ -526,8 +526,10 @@ static int dw_mci_submit_data_dma(struct dw_mci *host, struct mmc_data *data)
                return -ENODEV;
 
        sg_len = dw_mci_pre_dma_transfer(host, data, 0);
-       if (sg_len < 0)
+       if (sg_len < 0) {
+               host->dma_ops->stop(host);
                return sg_len;
+       }
 
        host->using_dma = 1;