diff options
author | Uwe Kleine-König <u.kleine-koenig@pengutronix.de> | 2021-10-13 15:37:10 +0200 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2021-10-14 13:32:19 +0100 |
commit | 16a8e2fbb2d49111004efc1c7342e083eafabeb0 (patch) | |
tree | ec9c22b3f88095ffa7e4885b9dfa7ba5ced1ab06 /drivers/spi/spi-mux.c | |
parent | 6098475d4cb48d821bdf453c61118c56e26294f0 (diff) | |
download | linux-16a8e2fbb2d49111004efc1c7342e083eafabeb0.tar.gz |
spi-mux: Fix false-positive lockdep splats
io_mutex is taken by spi_setup() and spi-mux's .setup() callback calls
spi_setup() which results in a nested lock of io_mutex.
add_lock is taken by spi_add_device(). The device_add() call in there
can result in calling spi-mux's .probe() callback which registers its
own spi controller which in turn results in spi_add_device() being
called again.
To fix this initialize the controller's locks already in
spi_alloc_controller() to give spi_mux_probe() a chance to set the
lockdep subclass.
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Link: https://lore.kernel.org/r/20211013133710.2679703-2-u.kleine-koenig@pengutronix.de
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi/spi-mux.c')
-rw-r--r-- | drivers/spi/spi-mux.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/spi/spi-mux.c b/drivers/spi/spi-mux.c index 9708b7827ff7..f5d32ec4634e 100644 --- a/drivers/spi/spi-mux.c +++ b/drivers/spi/spi-mux.c @@ -137,6 +137,13 @@ static int spi_mux_probe(struct spi_device *spi) priv = spi_controller_get_devdata(ctlr); priv->spi = spi; + /* + * Increase lockdep class as these lock are taken while the parent bus + * already holds their instance's lock. + */ + lockdep_set_subclass(&ctlr->io_mutex, 1); + lockdep_set_subclass(&ctlr->add_lock, 1); + priv->mux = devm_mux_control_get(&spi->dev, NULL); if (IS_ERR(priv->mux)) { ret = dev_err_probe(&spi->dev, PTR_ERR(priv->mux), |