dmaengine: qcom: bam_dma: clear BAM interrupt only if it is raised
authorStanimir Varbanov <stanimir.varbanov@linaro.org>
Mon, 11 Apr 2016 08:38:39 +0000 (11:38 +0300)
committerVinod Koul <vinod.koul@intel.com>
Tue, 19 Apr 2016 15:41:31 +0000 (21:11 +0530)
Currently we write BAM_IRQ_CLR register with zero even when no
BAM_IRQ occured. This write has some bad side effects when the
BAM instance is for the crypto engine. In case of crypto engine
some of the BAM registers are xPU protected and they cannot be
controlled by the driver.

Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
Reviewed-by: Andy Gross <andy.gross@linaro.org>
Tested-by: Pramod Gurav <gpramod@codeaurora.org>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/qcom/bam_dma.c

index a486bc0f82e03286f053fd4f83a74ead00dcfba7..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;
 }