[PORT FROM R2]dma: wrong debug message and wrong masking of error interrupts
authorCatalin Popescu <catalinx.popescu@intel.com>
Tue, 17 Jan 2012 16:27:49 +0000 (17:27 +0100)
committerbuildbot <buildbot@intel.com>
Tue, 24 Jan 2012 10:35:25 +0000 (02:35 -0800)
BZ: 20940

oldBZ-20433
This patch fixes 2 issues :
- In DMA tasklet, debug messages when handling error interrupts are the same as when handling
TX complete interrupts.
- In DMA ISR, if errors are detected at the same time on multiple channels, the ISR masks error
interrupts for wrong channel.
Signed-off-by: Catalin Popescu <catalinx.popescu@intel.com>
Change-Id: Idbad4352d3d6a38fe68bec7dbd03363f59983c6e
Old-Change-Id: Id4755d5e85b9bb916569196d5c51a5c3830781d2
Reviewed-on: http://android.intel.com:8080/32590
Reviewed-by: M, Arulselvan <arulselvan.m@intel.com>
Tested-by: M, Arulselvan <arulselvan.m@intel.com>
Reviewed-by: Popescu, CatalinX <catalinx.popescu@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
drivers/dma/intel_mid_dma.c

index 70bf49d..2cb77d5 100644 (file)
@@ -1028,15 +1028,15 @@ static void dma_tasklet(unsigned long data)
                /*err interrupt*/
                i = get_ch_index(&status, mid->chan_base);
                if (i < 0) {
-                       pr_err("ERR_MDMA:Invalid ch index %x\n", i);
+                       pr_err("ERR_MDMA:Invalid ch index %x (raw err)\n", i);
                        return;
                }
                midc = &mid->ch[i];
                if (midc == NULL) {
-                       pr_err("ERR_MDMA:Null param midc\n");
+                       pr_err("ERR_MDMA:Null param midc (raw err)\n");
                        return;
                }
-               pr_debug("MDMA:Tx complete interrupt %x, Ch No %d Index %d\n",
+               pr_debug("MDMA:raw err interrupt %x, Ch No %d Index %d\n",
                                status, midc->ch_id, i);
 
                iowrite32((1 << midc->ch_id), mid->dma_base + CLEAR_ERR);
@@ -1101,7 +1101,9 @@ static irqreturn_t intel_mid_dma_interrupt(int irq, void *data)
        }
        err_status &= mid->intr_mask;
        if (err_status) {
-               iowrite32(MASK_INTR_REG(err_status), mid->dma_base + MASK_ERR);
+               /* mask error interrupts for all channels in error */
+               iowrite32((err_status << INT_MASK_WE),
+                                               mid->dma_base + MASK_ERR);
                call_tasklet = 1;
        }
        if (call_tasklet)