spi: Don't have controller clean up spi device before driver unbind
authorSaravana Kannan <saravanak@google.com>
Wed, 5 May 2021 16:47:34 +0000 (09:47 -0700)
committerMark Brown <broonie@kernel.org>
Fri, 14 May 2021 12:24:56 +0000 (13:24 +0100)
When a spi device is unregistered and triggers a driver unbind, the
driver might need to access the spi device. So, don't have the
controller clean up the spi device before the driver is unbound. Clean
up the spi device after the driver is unbound.

Fixes: c7299fea6769 ("spi: Fix spi device unregister flow")
Reported-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Saravana Kannan <saravanak@google.com>
Tested-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lore.kernel.org/r/20210505164734.175546-1-saravanak@google.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi.c

index 98048af04abf9e217bc6d0bddeb596fc411c6aae..e353b7a9e54ebad4f5aa3d3262f474c289e3dc57 100644 (file)
@@ -714,8 +714,6 @@ void spi_unregister_device(struct spi_device *spi)
        if (!spi)
                return;
 
-       spi_cleanup(spi);
-
        if (spi->dev.of_node) {
                of_node_clear_flag(spi->dev.of_node, OF_POPULATED);
                of_node_put(spi->dev.of_node);
@@ -723,7 +721,9 @@ void spi_unregister_device(struct spi_device *spi)
        if (ACPI_COMPANION(&spi->dev))
                acpi_device_clear_enumerated(ACPI_COMPANION(&spi->dev));
        device_remove_software_node(&spi->dev);
-       device_unregister(&spi->dev);
+       device_del(&spi->dev);
+       spi_cleanup(spi);
+       put_device(&spi->dev);
 }
 EXPORT_SYMBOL_GPL(spi_unregister_device);