sdio: Provide a bustype shutdown function

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>
This commit is contained in:
Uwe Kleine-König
2026-01-12 16:46:57 +01:00
committed by Johannes Berg
parent 853800c746
commit c5c57e56de
2 changed files with 26 additions and 0 deletions

View 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);

View 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;
};