power: reset: reboot-mode: Add managed resource API
authorBjorn Andersson <bjorn.andersson@linaro.org>
Thu, 4 Aug 2016 05:04:05 +0000 (22:04 -0700)
committerSebastian Reichel <sre@kernel.org>
Mon, 15 Aug 2016 22:29:22 +0000 (00:29 +0200)
Provide managed resource version of reboot_mode_register() and
reboot_mode_unregister() to simplify implementations.

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Tested-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Sebastian Reichel <sre@kernel.org>
Documentation/driver-model/devres.txt
drivers/power/reset/reboot-mode.c
drivers/power/reset/reboot-mode.h

index b0d775d28e97bebe4875385530a26f0335f90b29..b1ff0b7edb450b3b00506a344671f023c6323dda 100644 (file)
@@ -342,6 +342,10 @@ PINCTRL
   devm_pinctrl_register()
   devm_pinctrl_unregister()
 
+POWER
+  devm_reboot_mode_register()
+  devm_reboot_mode_unregister()
+
 PWM
   devm_pwm_get()
   devm_pwm_put()
index 2dfbbce0f8174dca4a50a8b9dd29e657bad8af78..fb512183ace3ed818004e10f072a2d4ebc45a184 100644 (file)
@@ -135,6 +135,65 @@ int reboot_mode_unregister(struct reboot_mode_driver *reboot)
 }
 EXPORT_SYMBOL_GPL(reboot_mode_unregister);
 
+static void devm_reboot_mode_release(struct device *dev, void *res)
+{
+       reboot_mode_unregister(*(struct reboot_mode_driver **)res);
+}
+
+/**
+ * devm_reboot_mode_register() - resource managed reboot_mode_register()
+ * @dev: device to associate this resource with
+ * @reboot: reboot mode driver
+ *
+ * Returns: 0 on success or a negative error code on failure.
+ */
+int devm_reboot_mode_register(struct device *dev,
+                             struct reboot_mode_driver *reboot)
+{
+       struct reboot_mode_driver **dr;
+       int rc;
+
+       dr = devres_alloc(devm_reboot_mode_release, sizeof(*dr), GFP_KERNEL);
+       if (!dr)
+               return -ENOMEM;
+
+       rc = reboot_mode_register(reboot);
+       if (rc) {
+               devres_free(dr);
+               return rc;
+       }
+
+       *dr = reboot;
+       devres_add(dev, dr);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(devm_reboot_mode_register);
+
+static int devm_reboot_mode_match(struct device *dev, void *res, void *data)
+{
+       struct reboot_mode_driver **p = res;
+
+       if (WARN_ON(!p || !*p))
+               return 0;
+
+       return *p == data;
+}
+
+/**
+ * devm_reboot_mode_unregister() - resource managed reboot_mode_unregister()
+ * @dev: device to associate this resource with
+ * @reboot: reboot mode driver
+ */
+void devm_reboot_mode_unregister(struct device *dev,
+                                struct reboot_mode_driver *reboot)
+{
+       WARN_ON(devres_release(dev,
+                              devm_reboot_mode_release,
+                              devm_reboot_mode_match, reboot));
+}
+EXPORT_SYMBOL_GPL(devm_reboot_mode_unregister);
+
 MODULE_AUTHOR("Andy Yan <andy.yan@rock-chips.com");
 MODULE_DESCRIPTION("System reboot mode core library");
 MODULE_LICENSE("GPL v2");
index 2491bb71f5911ed39c78391ce439a600c0d17361..75f7fe5c881f0711051ba3385c2ac294d48903dc 100644 (file)
@@ -10,5 +10,9 @@ struct reboot_mode_driver {
 
 int reboot_mode_register(struct reboot_mode_driver *reboot);
 int reboot_mode_unregister(struct reboot_mode_driver *reboot);
+int devm_reboot_mode_register(struct device *dev,
+                             struct reboot_mode_driver *reboot);
+void devm_reboot_mode_unregister(struct device *dev,
+                                struct reboot_mode_driver *reboot);
 
 #endif
This page took 0.026193 seconds and 5 git commands to generate.