]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/dma/qcom/bam_dma.c
dmaengine: qcom: bam_dma: clear BAM interrupt only if it is raised
[karo-tx-linux.git] / drivers / dma / qcom / bam_dma.c
index d5e0a9c3ad5d035d5489fd1fbe5552afe04a3877..789d5f836bf789476923752e48d1fcb5c982e0a8 100644 (file)
@@ -801,13 +801,17 @@ static irqreturn_t bam_dma_irq(int irq, void *data)
        if (srcs & P_IRQ)
                tasklet_schedule(&bdev->task);
 
-       if (srcs & BAM_IRQ)
+       if (srcs & BAM_IRQ) {
                clr_mask = readl_relaxed(bam_addr(bdev, 0, BAM_IRQ_STTS));
 
-       /* don't allow reorder of the various accesses to the BAM registers */
-       mb();
+               /*
+                * don't allow reorder of the various accesses to the BAM
+                * registers
+                */
+               mb();
 
-       writel_relaxed(clr_mask, bam_addr(bdev, 0, BAM_IRQ_CLR));
+               writel_relaxed(clr_mask, bam_addr(bdev, 0, BAM_IRQ_CLR));
+       }
 
        return IRQ_HANDLED;
 }
@@ -1234,6 +1238,9 @@ static int bam_dma_remove(struct platform_device *pdev)
                bam_dma_terminate_all(&bdev->channels[i].vc.chan);
                tasklet_kill(&bdev->channels[i].vc.task);
 
+               if (!bdev->channels[i].fifo_virt)
+                       continue;
+
                dma_free_wc(bdev->dev, BAM_DESC_FIFO_SIZE,
                            bdev->channels[i].fifo_virt,
                            bdev->channels[i].fifo_phys);