ARM: PL08x: fix missed spin-unlock in pl08x_issue_pending()
pl08x_issue_pending() returns with the spinlock locked and interrupts disabled if the channel is waiting for a physical DMA to become free. This is wrong - especially as pl08x_issue_pending() is an API function as it leads to deadlocks. Fix it to always return with the spinlock unlocked. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Acked-by: Linus Walleij <linus.walleij@stericsson.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
dafa73171b
commit
9c0bb43bbd
|
@ -1294,15 +1294,11 @@ static void pl08x_issue_pending(struct dma_chan *chan)
|
|||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&plchan->lock, flags);
|
||||
/* Something is already active */
|
||||
if (plchan->at) {
|
||||
spin_unlock_irqrestore(&plchan->lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Didn't get a physical channel so waiting for it ... */
|
||||
if (plchan->state == PL08X_CHAN_WAITING)
|
||||
/* Something is already active, or we're waiting for a channel... */
|
||||
if (plchan->at || plchan->state == PL08X_CHAN_WAITING) {
|
||||
spin_unlock_irqrestore(&plchan->lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Take the first element in the queue and execute it */
|
||||
if (!list_empty(&plchan->desc_list)) {
|
||||
|
|
Loading…
Reference in New Issue