|
@@ -288,6 +288,63 @@ void led_classdev_unregister(struct led_classdev *led_cdev)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(led_classdev_unregister);
|
|
|
|
|
|
+static void devm_led_classdev_release(struct device *dev, void *res)
|
|
|
+{
|
|
|
+ led_classdev_unregister(*(struct led_classdev **)res);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * devm_led_classdev_register - resource managed led_classdev_register()
|
|
|
+ * @parent: The device to register.
|
|
|
+ * @led_cdev: the led_classdev structure for this device.
|
|
|
+ */
|
|
|
+int devm_led_classdev_register(struct device *parent,
|
|
|
+ struct led_classdev *led_cdev)
|
|
|
+{
|
|
|
+ struct led_classdev **dr;
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ dr = devres_alloc(devm_led_classdev_release, sizeof(*dr), GFP_KERNEL);
|
|
|
+ if (!dr)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ rc = led_classdev_register(parent, led_cdev);
|
|
|
+ if (rc) {
|
|
|
+ devres_free(dr);
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
+
|
|
|
+ *dr = led_cdev;
|
|
|
+ devres_add(parent, dr);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(devm_led_classdev_register);
|
|
|
+
|
|
|
+static int devm_led_classdev_match(struct device *dev, void *res, void *data)
|
|
|
+{
|
|
|
+ struct led_cdev **p = res;
|
|
|
+
|
|
|
+ if (WARN_ON(!p || !*p))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return *p == data;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * devm_led_classdev_unregister() - resource managed led_classdev_unregister()
|
|
|
+ * @parent: The device to unregister.
|
|
|
+ * @led_cdev: the led_classdev structure for this device.
|
|
|
+ */
|
|
|
+void devm_led_classdev_unregister(struct device *dev,
|
|
|
+ struct led_classdev *led_cdev)
|
|
|
+{
|
|
|
+ WARN_ON(devres_release(dev,
|
|
|
+ devm_led_classdev_release,
|
|
|
+ devm_led_classdev_match, led_cdev));
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(devm_led_classdev_unregister);
|
|
|
+
|
|
|
static int __init leds_init(void)
|
|
|
{
|
|
|
leds_class = class_create(THIS_MODULE, "leds");
|