Message ID | d0dcbd098401b5d2a486eee7cf2f9dcabacf9605.1589557526.git.lukas@wunner.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Raspberry Pi SPI unbind fixes | expand |
On Fri, May 15, 2020 at 05:58:05PM +0200, Lukas Wunner wrote: > As a rule, devm_spi_register_controller() must not be used if the > driver's ->remove() hook performs teardown steps which shall be > performed after unbinding of slaves. > > Dozens of drivers are doing it wrong. Document this gotcha to > hopefully prevent further misuse. This is something that needs to be documented at the devm level, it applies to pretty much every managed API.
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index d32bdc6cbf66..e1a35aa7eeb8 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -2714,6 +2714,13 @@ static void devm_spi_unregister(struct device *dev, void *res) * Register a SPI device as with spi_register_controller() which will * automatically be unregistered and freed. * + * Be aware that a managed SPI controller and the attached slaves are + * unregistered after the driver's ->remove() callback has been executed. + * So the SPI slaves may still access the bus during and after ->remove(). + * Thus, devm_spi_register_controller() may only be used if there is no + * ->remove() callback at all or if it does not perform teardown steps + * which render the bus inaccessible. + * * Return: zero on success, else a negative error code. */ int devm_spi_register_controller(struct device *dev,
As a rule, devm_spi_register_controller() must not be used if the driver's ->remove() hook performs teardown steps which shall be performed after unbinding of slaves. Dozens of drivers are doing it wrong. Document this gotcha to hopefully prevent further misuse. Signed-off-by: Lukas Wunner <lukas@wunner.de> --- drivers/spi/spi.c | 7 +++++++ 1 file changed, 7 insertions(+)