diff options
author | Fabio Baltieri <fabio.baltieri@linaro.org> | 2012-12-19 08:41:56 -0500 |
---|---|---|
committer | Fabio Baltieri <fabio.baltieri@linaro.org> | 2013-01-14 04:51:12 -0500 |
commit | 53d6d68f3c1792bce0144d8499435468e425a995 (patch) | |
tree | 0eae17de605454927d3e69dd78741dde8c838a97 /drivers/dma/ste_dma40.c | |
parent | 7407048bec896268b50e3c43c1d012a4764dc210 (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.c | 15 |
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) |