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(
.uevent = sdio_bus_uevent,
.probe = sdio_bus_probe,
.remove = sdio_bus_remove,
+ .shutdown = sdio_bus_shutdown,
.pm = &sdio_bus_pm_ops,
};
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
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);