dmaengine: set_dma40: ignore spurious interrupts
authorFabio Baltieri <fabio.baltieri@linaro.org>
Wed, 19 Dec 2012 13:41:56 +0000 (14:41 +0100)
committerFabio Baltieri <fabio.baltieri@linaro.org>
Mon, 14 Jan 2013 09:51:12 +0000 (10:51 +0100)
Some DMA channels may be used by other cores in the SoC.  This patch
modifies the dma interrupt handler to ignore interrupts from unknown
channels.

Cc: Rabin Vincent <rabin.vincent@stericsson.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Fabio Baltieri <fabio.baltieri@linaro.org>
drivers/dma/ste_dma40.c

index 2ecefb7113b91f6d7536503beb5279cdac900c90..a97bbd3a4a478ae056178f2404bb6f797c4df0c0 100644 (file)
@@ -1677,13 +1677,22 @@ static irqreturn_t d40_handle_interrupt(int irq, void *data)
                row = chan / BITS_PER_LONG;
                idx = chan & (BITS_PER_LONG - 1);
 
-               /* ACK interrupt */
-               writel(1 << idx, base->virtbase + il[row].clr);
-
                if (il[row].offset == D40_PHY_CHAN)
                        d40c = base->lookup_phy_chans[idx];
                else
                        d40c = base->lookup_log_chans[il[row].offset + idx];
+
+               if (!d40c) {
+                       /*
+                        * No error because this can happen if something else
+                        * in the system is using the channel.
+                        */
+                       continue;
+               }
+
+               /* ACK interrupt */
+               writel(1 << idx, base->virtbase + il[row].clr);
+
                spin_lock(&d40c->lock);
 
                if (!il[row].is_error)