spi: Fix controller unregister order

[ Upstream commit 84855678ad ]

When an SPI controller unregisters, it unbinds all its slave devices.
For this, their drivers may need to access the SPI bus, e.g. to quiesce
interrupts.

However since commit ffbbdd2132 ("spi: create a message queueing
infrastructure"), spi_destroy_queue() is executed before unbinding the
slaves.  It sets ctlr->running = false, thereby preventing SPI bus
access and causing unbinding of slave devices to fail.

Fix by unbinding slaves before calling spi_destroy_queue().

Fixes: ffbbdd2132 ("spi: create a message queueing infrastructure")
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Cc: stable@vger.kernel.org # v3.4+
Cc: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/8aaf9d44c153fe233b17bc2dec4eb679898d7e7b.1589557526.git.lukas@wunner.de
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Lukas Wunner
2020-05-15 17:58:01 +02:00
committed by Greg Kroah-Hartman
parent 7bc16ca02b
commit c7e41e1caa

View File

@@ -2030,11 +2030,12 @@ void spi_unregister_master(struct spi_master *master)
dev_err(&master->dev, "queue remove failed\n");
}
device_for_each_child(&master->dev, NULL, __unregister);
mutex_lock(&board_lock);
list_del(&master->list);
mutex_unlock(&board_lock);
device_for_each_child(&master->dev, NULL, __unregister);
device_unregister(&master->dev);
}
EXPORT_SYMBOL_GPL(spi_unregister_master);