Commit 9c0bb43b authored by Russell King - ARM Linux's avatar Russell King - ARM Linux Committed by Dan Williams
Browse files

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: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
Acked-by: default avatarLinus Walleij <linus.walleij@stericsson.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent dafa7317
Loading
Loading
Loading
Loading
+4 −8
Original line number Diff line number Diff line
@@ -1294,16 +1294,12 @@ 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) {
	/* 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;
	}

	/* Didn't get a physical channel so waiting for it ... */
	if (plchan->state == PL08X_CHAN_WAITING)
		return;

	/* Take the first element in the queue and execute it */
	if (!list_empty(&plchan->desc_list)) {
		struct pl08x_txd *next;