Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b0b36b86 authored by Bryan Freed's avatar Bryan Freed Committed by Mark Brown
Browse files

spi: Unlock a spinlock before calling into the controller driver.



spi_pump_messages() calls into a controller driver with
unprepare_transfer_hardware() which is documented as "This may sleep".
As in the prepare_transfer_hardware() call below, we should release the
queue_lock spinlock before making the call.
Rework the logic a bit to hold queue_lock to protect the 'busy' flag,
then release it to call unprepare_transfer_hardware().

Signed-off-by: default avatarBryan Freed <bfreed@chromium.org>
Reviewed-by: default avatarDoug Anderson <dianders@chromium.org>
Signed-off-by: default avatarDoug Anderson <dianders@chromium.org>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent 375981f2
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -543,17 +543,16 @@ static void spi_pump_messages(struct kthread_work *work)
	/* Lock queue and check for queue work */
	spin_lock_irqsave(&master->queue_lock, flags);
	if (list_empty(&master->queue) || !master->running) {
		if (master->busy && master->unprepare_transfer_hardware) {
			ret = master->unprepare_transfer_hardware(master);
			if (ret) {
		if (!master->busy) {
			spin_unlock_irqrestore(&master->queue_lock, flags);
				dev_err(&master->dev,
					"failed to unprepare transfer hardware\n");
			return;
		}
		}
		master->busy = false;
		spin_unlock_irqrestore(&master->queue_lock, flags);
		if (master->unprepare_transfer_hardware &&
		    master->unprepare_transfer_hardware(master))
			dev_err(&master->dev,
				"failed to unprepare transfer hardware\n");
		return;
	}