]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
This fixes the spurious interrupt issue on a DMA channel.
authorSantosh Shilimkar <santosh.shilimkar@ti.com>
Fri, 27 Feb 2009 19:38:28 +0000 (11:38 -0800)
committerTony Lindgren <tony@atomide.com>
Fri, 27 Feb 2009 19:38:28 +0000 (11:38 -0800)
    In OMAP sDMA, contrast to the SDMA.DMA4_CSRi registers, the
    SDMA.DMA4_IRQSTATUS_Lj registers are updated regardless of
    the corresponding bits in the SDMA.DMA4_IRQENABLE_Lj registers.
    Since there are four sDMA interrupt lines and if more than one
    line is actively used by two concurrently running sDMA softwares
    modules,then the spurious interrupt can be observed on the other
     lines.

    Fix in this patch will only dispatch the relevant and enabled
    interrupts on a particular line thus perevting spurious IRQ.

Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Acked By: Nishant Kamat <nskamat@ti.com>
cc: Tony Lindgren <tony@atomide.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/plat-omap/dma.c

index e9b540805d7b7584bf2c7f537558a1a41cc68aa8..3fd0e77bb9f8409d2ab9cfc701e9abd1d8d8ee5c 100755 (executable)
@@ -1901,7 +1901,7 @@ static int omap2_dma_handle_ch(int ch)
 /* STATUS register count is from 1-32 while our is 0-31 */
 static irqreturn_t omap2_dma_irq_handler(int irq, void *dev_id)
 {
-       u32 val;
+       u32 val, enable_reg;
        int i;
 
        val = dma_read(IRQSTATUS_L0);
@@ -1910,6 +1910,8 @@ static irqreturn_t omap2_dma_irq_handler(int irq, void *dev_id)
                        printk(KERN_WARNING "Spurious DMA IRQ\n");
                return IRQ_HANDLED;
        }
+       enable_reg = dma_read(IRQENABLE_L0);
+       val &= enable_reg; /* Dispatch only relevant interrupts */
        for (i = 0; i < dma_lch_count && val != 0; i++) {
                if (val & 1)
                        omap2_dma_handle_ch(i);