diff options
Diffstat (limited to 'drivers/mmc')
| -rw-r--r-- | drivers/mmc/core/sdio_bus.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c index 10799772494a..6e5bdc2f0cc8 100644 --- a/drivers/mmc/core/sdio_bus.c +++ b/drivers/mmc/core/sdio_bus.c @@ -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); |
