From 3871647ee40d235b4f380f2845864afb01030e2a Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 21 Nov 2024 22:00:31 +0000 Subject: [PATCH] Revert "spi: Fix deadlock when adding SPI controllers on SPI buses" This reverts commit aa3f3d7bef59583f2d3234173105a27ff61ef8fe which is commit 6098475d4cb48d821bdf453c61118c56e26294f0 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I2bd07f43254864be68c6426dc3215dcd60aa0516 Signed-off-by: Greg Kroah-Hartman --- drivers/spi/spi.c | 15 ++++++++++----- include/linux/spi/spi.h | 3 --- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index d5a845bd5564..bb0cc9538aec 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -472,6 +472,12 @@ static LIST_HEAD(spi_controller_list); */ static DEFINE_MUTEX(board_lock); +/* + * Prevents addition of devices with same chip select and + * addition of devices below an unregistering controller. + */ +static DEFINE_MUTEX(spi_add_lock); + /** * spi_alloc_device - Allocate a new SPI device * @ctlr: Controller to which device is connected @@ -574,7 +580,7 @@ int spi_add_device(struct spi_device *spi) * chipselect **BEFORE** we call setup(), else we'll trash * its configuration. Lock against concurrent add() calls. */ - mutex_lock(&ctlr->add_lock); + mutex_lock(&spi_add_lock); status = bus_for_each_dev(&spi_bus_type, NULL, spi, spi_dev_check); if (status) { @@ -618,7 +624,7 @@ int spi_add_device(struct spi_device *spi) } done: - mutex_unlock(&ctlr->add_lock); + mutex_unlock(&spi_add_lock); return status; } EXPORT_SYMBOL_GPL(spi_add_device); @@ -2505,7 +2511,6 @@ int spi_register_controller(struct spi_controller *ctlr) spin_lock_init(&ctlr->bus_lock_spinlock); mutex_init(&ctlr->bus_lock_mutex); mutex_init(&ctlr->io_mutex); - mutex_init(&ctlr->add_lock); ctlr->bus_lock_flag = 0; init_completion(&ctlr->xfer_completion); if (!ctlr->max_dma_len) @@ -2656,7 +2661,7 @@ void spi_unregister_controller(struct spi_controller *ctlr) /* Prevent addition of new devices, unregister existing ones */ if (IS_ENABLED(CONFIG_SPI_DYNAMIC)) - mutex_lock(&ctlr->add_lock); + mutex_lock(&spi_add_lock); device_for_each_child(&ctlr->dev, NULL, __unregister); @@ -2688,7 +2693,7 @@ void spi_unregister_controller(struct spi_controller *ctlr) mutex_unlock(&board_lock); if (IS_ENABLED(CONFIG_SPI_DYNAMIC)) - mutex_unlock(&ctlr->add_lock); + mutex_unlock(&spi_add_lock); } EXPORT_SYMBOL_GPL(spi_unregister_controller); diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 8af03d65d07a..e70ddc6d2a1e 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -480,9 +480,6 @@ struct spi_controller { /* I/O mutex */ struct mutex io_mutex; - /* Used to avoid adding the same CS twice */ - struct mutex add_lock; - /* lock and mutex for SPI bus locking */ spinlock_t bus_lock_spinlock; struct mutex bus_lock_mutex;