aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma/ste_dma40.c
diff options
context:
space:
mode:
authorFabio Baltieri <fabio.baltieri@linaro.org>2012-12-19 08:41:56 -0500
committerFabio Baltieri <fabio.baltieri@linaro.org>2013-01-14 04:51:12 -0500
commit53d6d68f3c1792bce0144d8499435468e425a995 (patch)
tree0eae17de605454927d3e69dd78741dde8c838a97 /drivers/dma/ste_dma40.c
parent7407048bec896268b50e3c43c1d012a4764dc210 (diff)
dmaengine: set_dma40: ignore spurious interrupts
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>
Diffstat (limited to 'drivers/dma/ste_dma40.c')
-rw-r--r--drivers/dma/ste_dma40.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c
index 2ecefb7113b9..a97bbd3a4a47 100644
--- a/drivers/dma/ste_dma40.c
+++ b/drivers/dma/ste_dma40.c
@@ -1677,13 +1677,22 @@ static irqreturn_t d40_handle_interrupt(int irq, void *data)
1677 row = chan / BITS_PER_LONG; 1677 row = chan / BITS_PER_LONG;
1678 idx = chan & (BITS_PER_LONG - 1); 1678 idx = chan & (BITS_PER_LONG - 1);
1679 1679
1680 /* ACK interrupt */
1681 writel(1 << idx, base->virtbase + il[row].clr);
1682
1683 if (il[row].offset == D40_PHY_CHAN) 1680 if (il[row].offset == D40_PHY_CHAN)
1684 d40c = base->lookup_phy_chans[idx]; 1681 d40c = base->lookup_phy_chans[idx];
1685 else 1682 else
1686 d40c = base->lookup_log_chans[il[row].offset + idx]; 1683 d40c = base->lookup_log_chans[il[row].offset + idx];
1684
1685 if (!d40c) {
1686 /*
1687 * No error because this can happen if something else
1688 * in the system is using the channel.
1689 */
1690 continue;
1691 }
1692
1693 /* ACK interrupt */
1694 writel(1 << idx, base->virtbase + il[row].clr);
1695
1687 spin_lock(&d40c->lock); 1696 spin_lock(&d40c->lock);
1688 1697
1689 if (!il[row].is_error) 1698 if (!il[row].is_error)