diff options
author | Thierry Reding <treding@nvidia.com> | 2015-09-25 11:29:04 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-10-05 00:02:40 -0400 |
commit | dbe2256ddd8e8420c254c79f4045c41cb5f4bd6b (patch) | |
tree | e90776bacb2349a6828b4e079aa131ff5293a61d /drivers/base | |
parent | 7568fb63f57ac8672f8bf2018171255441238882 (diff) |
driver-core: platform: Provide helpers for multi-driver modules
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.
Signed-off-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/platform.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 07cec9ba5e70..1dd6d3bf1098 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
@@ -710,6 +710,67 @@ err_out: | |||
710 | } | 710 | } |
711 | EXPORT_SYMBOL_GPL(__platform_create_bundle); | 711 | EXPORT_SYMBOL_GPL(__platform_create_bundle); |
712 | 712 | ||
713 | /** | ||
714 | * __platform_register_drivers - register an array of platform drivers | ||
715 | * @drivers: an array of drivers to register | ||
716 | * @count: the number of drivers to register | ||
717 | * @owner: module owning the drivers | ||
718 | * | ||
719 | * Registers platform drivers specified by an array. On failure to register a | ||
720 | * driver, all previously registered drivers will be unregistered. Callers of | ||
721 | * this API should use platform_unregister_drivers() to unregister drivers in | ||
722 | * the reverse order. | ||
723 | * | ||
724 | * Returns: 0 on success or a negative error code on failure. | ||
725 | */ | ||
726 | int __platform_register_drivers(struct platform_driver * const *drivers, | ||
727 | unsigned int count, struct module *owner) | ||
728 | { | ||
729 | unsigned int i; | ||
730 | int err; | ||
731 | |||
732 | for (i = 0; i < count; i++) { | ||
733 | pr_debug("registering platform driver %ps\n", drivers[i]); | ||
734 | |||
735 | err = __platform_driver_register(drivers[i], owner); | ||
736 | if (err < 0) { | ||
737 | pr_err("failed to register platform driver %ps: %d\n", | ||
738 | drivers[i], err); | ||
739 | goto error; | ||
740 | } | ||
741 | } | ||
742 | |||
743 | return 0; | ||
744 | |||
745 | error: | ||
746 | while (i--) { | ||
747 | pr_debug("unregistering platform driver %ps\n", drivers[i]); | ||
748 | platform_driver_unregister(drivers[i]); | ||
749 | } | ||
750 | |||
751 | return err; | ||
752 | } | ||
753 | EXPORT_SYMBOL_GPL(__platform_register_drivers); | ||
754 | |||
755 | /** | ||
756 | * platform_unregister_drivers - unregister an array of platform drivers | ||
757 | * @drivers: an array of drivers to unregister | ||
758 | * @count: the number of drivers to unregister | ||
759 | * | ||
760 | * Unegisters platform drivers specified by an array. This is typically used | ||
761 | * to complement an earlier call to platform_register_drivers(). Drivers are | ||
762 | * unregistered in the reverse order in which they were registered. | ||
763 | */ | ||
764 | void platform_unregister_drivers(struct platform_driver * const *drivers, | ||
765 | unsigned int count) | ||
766 | { | ||
767 | while (count--) { | ||
768 | pr_debug("unregistering platform driver %ps\n", drivers[count]); | ||
769 | platform_driver_unregister(drivers[count]); | ||
770 | } | ||
771 | } | ||
772 | EXPORT_SYMBOL_GPL(platform_unregister_drivers); | ||
773 | |||
713 | /* modalias support enables more hands-off userspace setup: | 774 | /* modalias support enables more hands-off userspace setup: |
714 | * (a) environment variable lets new-style hotplug events work once system is | 775 | * (a) environment variable lets new-style hotplug events work once system is |
715 | * fully running: "modprobe $MODALIAS" | 776 | * fully running: "modprobe $MODALIAS" |