]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
sdio: Provide a bustype shutdown function
authorUwe Kleine-König <u.kleine-koenig@baylibre.com>
Mon, 12 Jan 2026 15:46:57 +0000 (16:46 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 27 Jan 2026 12:42:20 +0000 (13:42 +0100)
To prepare sdio drivers to migrate away from struct device_driver::shutdown
(and then eventually remove that callback) create a serdev driver shutdown
callback and migration code to keep the existing behaviour. Note this
introduces a warning for each driver that isn't converted yet to that
callback at register time.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Link: https://patch.msgid.link/397f45c2818f6632151f92b70e547262f373c3b6.1768232321.git.u.kleine-koenig@baylibre.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/mmc/core/sdio_bus.c
include/linux/mmc/sdio_func.h

index 10799772494a2cfdb67247d5be8abf5b5c9d3726..6e5bdc2f0cc8211c0aa37dcb0fd536968f53cc3d 100644 (file)
@@ -232,6 +232,15 @@ static void sdio_bus_remove(struct device *dev)
                pm_runtime_put_sync(dev);
 }
 
+static void sdio_bus_shutdown(struct device *dev)
+{
+       struct sdio_driver *drv = to_sdio_driver(dev->driver);
+       struct sdio_func *func = dev_to_sdio_func(dev);
+
+       if (dev->driver && drv->shutdown)
+               drv->shutdown(func);
+}
+
 static const struct dev_pm_ops sdio_bus_pm_ops = {
        SET_SYSTEM_SLEEP_PM_OPS(pm_generic_suspend, pm_generic_resume)
        SET_RUNTIME_PM_OPS(
@@ -248,6 +257,7 @@ static const struct bus_type sdio_bus_type = {
        .uevent         = sdio_bus_uevent,
        .probe          = sdio_bus_probe,
        .remove         = sdio_bus_remove,
+       .shutdown       = sdio_bus_shutdown,
        .pm             = &sdio_bus_pm_ops,
 };
 
@@ -261,6 +271,14 @@ void sdio_unregister_bus(void)
        bus_unregister(&sdio_bus_type);
 }
 
+static void sdio_legacy_shutdown(struct sdio_func *func)
+{
+       struct device *dev = &func->dev;
+       struct device_driver *driver = dev->driver;
+
+       driver->shutdown(dev);
+}
+
 /**
  *     __sdio_register_driver - register a function driver
  *     @drv: SDIO function driver
@@ -272,6 +290,13 @@ int __sdio_register_driver(struct sdio_driver *drv, struct module *owner)
        drv->drv.bus = &sdio_bus_type;
        drv->drv.owner = owner;
 
+       /*
+        * This driver needs updating. Note that driver_register() warns about
+        * this, so we're not adding another warning here.
+        */
+       if (!drv->shutdown && drv->drv.shutdown)
+               drv->shutdown = sdio_legacy_shutdown;
+
        return driver_register(&drv->drv);
 }
 EXPORT_SYMBOL_GPL(__sdio_register_driver);
index fed1f5f4a8d333b396112611cdb37ff325bf117f..4534bf462aaca82e05a00ef8064a9636e78a8bb9 100644 (file)
@@ -78,6 +78,7 @@ struct sdio_driver {
 
        int (*probe)(struct sdio_func *, const struct sdio_device_id *);
        void (*remove)(struct sdio_func *);
+       void (*shutdown)(struct sdio_func *);
 
        struct device_driver drv;
 };