Skip to content

Commit c7299fe

Browse files
Saravana Kannanbroonie
authored andcommitted
spi: Fix spi device unregister flow
When an SPI device is unregistered, the spi->controller->cleanup() is called in the device's release callback. That's wrong for a couple of reasons: 1. spi_dev_put() can be called before spi_add_device() is called. And it's spi_add_device() that calls spi_setup(). This will cause clean() to get called without the spi device ever being setup. 2. There's no guarantee that the controller's driver would be present by the time the spi device's release function gets called. 3. It also causes "sleeping in atomic context" stack dump[1] when device link deletion code does a put_device() on the spi device. Fix these issues by simply moving the cleanup from the device release callback to the actual spi_unregister_device() function. [1] - https://lore.kernel.org/lkml/CAHp75Vc=FCGcUyS0v6fnxme2YJ+qD+Y-hQDQLa2JhWNON9VmsQ@mail.gmail.com/ Signed-off-by: Saravana Kannan <saravanak@google.com> Link: https://lore.kernel.org/r/20210426235638.1285530-1-saravanak@google.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 86527bc commit c7299fe

1 file changed

Lines changed: 12 additions & 6 deletions

File tree

drivers/spi/spi.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,6 @@ static void spidev_release(struct device *dev)
4747
{
4848
struct spi_device *spi = to_spi_device(dev);
4949

50-
/* spi controllers may cleanup for released devices */
51-
if (spi->controller->cleanup)
52-
spi->controller->cleanup(spi);
53-
5450
spi_controller_put(spi->controller);
5551
kfree(spi->driver_override);
5652
kfree(spi);
@@ -558,6 +554,12 @@ static int spi_dev_check(struct device *dev, void *data)
558554
return 0;
559555
}
560556

557+
static void spi_cleanup(struct spi_device *spi)
558+
{
559+
if (spi->controller->cleanup)
560+
spi->controller->cleanup(spi);
561+
}
562+
561563
/**
562564
* spi_add_device - Add spi_device allocated with spi_alloc_device
563565
* @spi: spi_device to register
@@ -622,11 +624,13 @@ int spi_add_device(struct spi_device *spi)
622624

623625
/* Device may be bound to an active driver when this returns */
624626
status = device_add(&spi->dev);
625-
if (status < 0)
627+
if (status < 0) {
626628
dev_err(dev, "can't add %s, status %d\n",
627629
dev_name(&spi->dev), status);
628-
else
630+
spi_cleanup(spi);
631+
} else {
629632
dev_dbg(dev, "registered child %s\n", dev_name(&spi->dev));
633+
}
630634

631635
done:
632636
mutex_unlock(&spi_add_lock);
@@ -710,6 +714,8 @@ void spi_unregister_device(struct spi_device *spi)
710714
if (!spi)
711715
return;
712716

717+
spi_cleanup(spi);
718+
713719
if (spi->dev.of_node) {
714720
of_node_clear_flag(spi->dev.of_node, OF_POPULATED);
715721
of_node_put(spi->dev.of_node);

0 commit comments

Comments
 (0)