aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2015-09-25 11:29:04 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-10-05 00:02:40 -0400
commitdbe2256ddd8e8420c254c79f4045c41cb5f4bd6b (patch)
treee90776bacb2349a6828b4e079aa131ff5293a61d /drivers/base
parent7568fb63f57ac8672f8bf2018171255441238882 (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.c61
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}
711EXPORT_SYMBOL_GPL(__platform_create_bundle); 711EXPORT_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 */
726int __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
745error:
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}
753EXPORT_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 */
764void 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}
772EXPORT_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"