Hi,
On Thu, Oct 03, 2019 at 10:28:10AM +0200, Jean-Jacques Hiblot wrote:
If the LED is acquired by a consumer device with devm_led_get(), it is automatically released when the device is detached.
Signed-off-by: Jean-Jacques Hiblot jjhiblot@ti.com Acked-by: Pavel Machek pavel@ucw.cz
drivers/leds/led-class.c | 49 ++++++++++++++++++++++++++++++++++++++++ include/linux/leds.h | 2 ++ 2 files changed, 51 insertions(+)
diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c index 455545f5d663..80c96dd96afc 100644 --- a/drivers/leds/led-class.c +++ b/drivers/leds/led-class.c @@ -258,6 +258,55 @@ void led_put(struct led_classdev *led_cdev) } EXPORT_SYMBOL_GPL(led_put);
+static void devm_led_release(struct device *dev, void *res) +{
- struct led_classdev **p = res;
- led_put(*p);
+}
+/**
- devm_of_led_get - Resource-managed request of a LED device
- @dev: LED consumer
- @index: index of the LED to obtain in the consumer
- The device node of the device is parse to find the request LED device.
- The LED device returned from this function is automatically released
- on driver detach.
- @return a pointer to a LED device or ERR_PTR(errno) on failure.
- */
+struct led_classdev *__must_check devm_of_led_get(struct device *dev,
int index)
+{
- struct led_classdev *led;
- struct led_classdev **dr;
- if (!dev)
return ERR_PTR(-EINVAL);
- /* Not using device tree? */
- if (!IS_ENABLED(CONFIG_OF) || !dev->of_node)
return ERR_PTR(-ENOTSUPP);
I suggested to move the CONFIG_OF check and the NULL check for of_node into of_led_get(). Otherwise
Reviewed-by: Sebastian Reichel sebastian.reichel@collabora.com
-- Sebastian
- led = of_led_get(dev->of_node, index);
- if (IS_ERR(led))
return led;
- dr = devres_alloc(devm_led_release, sizeof(struct led_classdev *),
GFP_KERNEL);
- if (!dr) {
led_put(led);
return ERR_PTR(-ENOMEM);
- }
- *dr = led;
- devres_add(dev, dr);
- return led;
+} +EXPORT_SYMBOL_GPL(devm_of_led_get);
static int led_classdev_next_name(const char *init_name, char *name, size_t len) { diff --git a/include/linux/leds.h b/include/linux/leds.h index 6f7371bc7757..9b94cf752012 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h @@ -199,6 +199,8 @@ extern void led_classdev_resume(struct led_classdev *led_cdev);
extern struct led_classdev *of_led_get(struct device_node *np, int index); extern void led_put(struct led_classdev *led_cdev); +struct led_classdev *__must_check devm_of_led_get(struct device *dev,
int index);
/**
- led_blink_set - set blinking with software fallback
-- 2.17.1
dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel