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>
This commit is contained in:
parent
7407048bec
commit
53d6d68f3c
1 changed files with 12 additions and 3 deletions
|
@ -1677,13 +1677,22 @@ static irqreturn_t d40_handle_interrupt(int irq, void *data)
|
||||||
row = chan / BITS_PER_LONG;
|
row = chan / BITS_PER_LONG;
|
||||||
idx = chan & (BITS_PER_LONG - 1);
|
idx = chan & (BITS_PER_LONG - 1);
|
||||||
|
|
||||||
/* ACK interrupt */
|
|
||||||
writel(1 << idx, base->virtbase + il[row].clr);
|
|
||||||
|
|
||||||
if (il[row].offset == D40_PHY_CHAN)
|
if (il[row].offset == D40_PHY_CHAN)
|
||||||
d40c = base->lookup_phy_chans[idx];
|
d40c = base->lookup_phy_chans[idx];
|
||||||
else
|
else
|
||||||
d40c = base->lookup_log_chans[il[row].offset + idx];
|
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);
|
spin_lock(&d40c->lock);
|
||||||
|
|
||||||
if (!il[row].is_error)
|
if (!il[row].is_error)
|
||||||
|
|
Loading…
Add table
Reference in a new issue