]> www.infradead.org Git - linux.git/commitdiff
platform: Make platform_driver::remove() return void
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Mon, 9 Oct 2023 10:37:26 +0000 (12:37 +0200)
committerUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Mon, 27 May 2024 08:34:35 +0000 (10:34 +0200)
struct platform_driver::remove returning an integer made driver authors
expect that returning an error code was proper error handling. However
the driver core ignores the error and continues to remove the device
because there is nothing the core could do anyhow and reentering the
remove callback again is only calling for trouble.

To prevent such wrong assumptions, change the return type of the remove
callback to void. This was prepared by introducing an alternative remove
callback returning void and converting all drivers to that. So .remove()
can be changed without further changes in drivers.

This corresponds to step b) of the plan outlined in commit
5c5a7680e67b ("platform: Provide a remove callback that returns no value").

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
drivers/base/platform.c
include/linux/platform_device.h

index 10c5779634182815cb76cc01eb7de7121b0532da..c8aa1be70526496069a13803d32ae51bcc9a40f4 100644 (file)
@@ -1420,14 +1420,8 @@ static void platform_remove(struct device *_dev)
        struct platform_driver *drv = to_platform_driver(_dev->driver);
        struct platform_device *dev = to_platform_device(_dev);
 
-       if (drv->remove_new) {
-               drv->remove_new(dev);
-       } else if (drv->remove) {
-               int ret = drv->remove(dev);
-
-               if (ret)
-                       dev_warn(_dev, "remove callback returned a non-zero value. This will be ignored.\n");
-       }
+       if (drv->remove)
+               drv->remove(dev);
        dev_pm_domain_detach(_dev, true);
 }
 
index 7a41c72c195918af14bda5511bda57d384b26f68..d422db6eec63d0217332dff7f2897f6062be6d53 100644 (file)
@@ -237,15 +237,14 @@ struct platform_driver {
        int (*probe)(struct platform_device *);
 
        /*
-        * Traditionally the remove callback returned an int which however is
-        * ignored by the driver core. This led to wrong expectations by driver
-        * authors who thought returning an error code was a valid error
-        * handling strategy. To convert to a callback returning void, new
-        * drivers should implement .remove_new() until the conversion it done
-        * that eventually makes .remove() return void.
+        * .remove_new() is a relic from a prototype conversion of .remove().
+        * New drivers are supposed to implement .remove(). Once all drivers are
+        * converted to not use .remove_new any more, it will be dropped.
         */
-       int (*remove)(struct platform_device *);
-       void (*remove_new)(struct platform_device *);
+       union {
+               void (*remove)(struct platform_device *);
+               void (*remove_new)(struct platform_device *);
+       };
 
        void (*shutdown)(struct platform_device *);
        int (*suspend)(struct platform_device *, pm_message_t state);