On Fri, Sep 25, 2015 at 6:29 PM, Thierry Reding thierry.reding@gmail.com wrote:
From: Thierry Reding treding@nvidia.com
Some modules register several sub-drivers. Provide a helper that makes it easy to register and unregister a list of sub-drivers, as well as unwind properly on error.
Cc: Greg Kroah-Hartman gregkh@linuxfoundation.org Signed-off-by: Thierry Reding treding@nvidia.com
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index f80aaaf9f610..68c58c43e45a 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -711,6 +711,67 @@ err_out: } EXPORT_SYMBOL_GPL(__platform_create_bundle);
+/**
- __platform_register_drivers - register an array of platform drivers
- @drivers: an array of drivers to register
- @count: the number of drivers to register
- @owner: module owning the drivers
- Registers platform drivers specified by an array. On failure to register a
- driver, all previously registered drivers will be unregistered. Callers of
- this API should use platform_unregister_drivers() to unregister drivers in
- the reverse order.
- Returns: 0 on success or a negative error code on failure.
- */
+int __platform_register_drivers(struct platform_driver * const *drivers,
unsigned int count, struct module *owner)
+{
unsigned int i;
int err;
for (i = 0; i < count; i++) {
pr_debug("registering platform driver %ps\n", drivers[i]);
err = __platform_driver_register(drivers[i], owner);
if (err < 0) {
pr_err("failed to register platform driver %ps: %d\n",
drivers[i], err);
Would platform_unregister_drivers(drivers, i); work?
goto error;
}
}
return 0;
+error:
while (i--) {
I think Jani was confused since often idiom is 'while (--i >=0)' is used.
pr_debug("unregistering platform driver %ps\n", drivers[i]);
platform_driver_unregister(drivers[i]);
}
return err;
+} +EXPORT_SYMBOL_GPL(__platform_register_drivers);
+/**
- platform_unregister_drivers - unregister an array of platform drivers
- @drivers: an array of drivers to unregister
- @count: the number of drivers to unregister
- Unegisters platform drivers specified by an array. This is typically used
- to complement an earlier call to platform_register_drivers(). Drivers are
- unregistered in the reverse order in which they were registered.
- */
+void platform_unregister_drivers(struct platform_driver * const *drivers,
unsigned int count)
+{
while (count--) {
pr_debug("unregistering platform driver %ps\n", drivers[count]);
platform_driver_unregister(drivers[count]);
}
+} +EXPORT_SYMBOL_GPL(platform_unregister_drivers);