Message ID | 20230119130053.111344-1-hdegoede@redhat.com |
---|---|
Headers | show |
Series | leds: lookup-table support + int3472/media privacy LED support | expand |
On Thu, Jan 19, 2023 at 3:01 PM Hans de Goede <hdegoede@redhat.com> wrote: > > Turn of_led_get() into a more generic __of_led_get() helper function, > which can lookup LEDs in devicetree by either name or index. > > And use this new helper to add devicetree support to the generic > (non devicetree specific) [devm_]led_get() function. > > This uses the standard devicetree pattern of adding a -names string array > to map names to the indexes for an array of resources. > > Note the new led-names property for LED consumers is not added > to the devicetree documentation because there seems to be no > documentation for the leds property itself to extend it with this. > It seems that how LED consumers should be described is not documented > at all ATM. > > This patch is marked as RFC because of both the missing devicetree > documentation and because there are no devicetree users of > the generic [devm_]led_get() function for now. FWIW, Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Yeah, it's a pity we have no documentation for the LED properties... > Signed-off-by: Hans de Goede <hdegoede@redhat.com> > --- > drivers/leds/led-class.c | 37 ++++++++++++++++++++++++++++--------- > 1 file changed, 28 insertions(+), 9 deletions(-) > > diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c > index 6dff57c41e96..22f658c750d1 100644 > --- a/drivers/leds/led-class.c > +++ b/drivers/leds/led-class.c > @@ -234,19 +234,18 @@ static struct led_classdev *led_module_get(struct device *led_dev) > return led_cdev; > } > > -/** > - * of_led_get() - request a LED device via the LED framework > - * @np: device node to get the LED device from > - * @index: the index of the LED > - * > - * Returns the LED device parsed from the phandle specified in the "leds" > - * property of a device tree node or a negative error-code on failure. > - */ > -struct led_classdev *of_led_get(struct device_node *np, int index) > +static struct led_classdev *__of_led_get(struct device_node *np, int index, > + const char *name) > { > struct device *led_dev; > struct device_node *led_node; > > + /* > + * For named LEDs, first look up the name in the "led-names" property. > + * If it cannot be found, then of_parse_phandle() will propagate the error. > + */ > + if (name) > + index = of_property_match_string(np, "led-names", name); > led_node = of_parse_phandle(np, "leds", index); > if (!led_node) > return ERR_PTR(-ENOENT); > @@ -256,6 +255,19 @@ struct led_classdev *of_led_get(struct device_node *np, int index) > > return led_module_get(led_dev); > } > + > +/** > + * of_led_get() - request a LED device via the LED framework > + * @np: device node to get the LED device from > + * @index: the index of the LED > + * > + * Returns the LED device parsed from the phandle specified in the "leds" > + * property of a device tree node or a negative error-code on failure. > + */ > +struct led_classdev *of_led_get(struct device_node *np, int index) > +{ > + return __of_led_get(np, index, NULL); > +} > EXPORT_SYMBOL_GPL(of_led_get); > > /** > @@ -329,9 +341,16 @@ EXPORT_SYMBOL_GPL(devm_of_led_get); > struct led_classdev *led_get(struct device *dev, char *function) > { > struct led_lookup_data *lookup; > + struct led_classdev *led_cdev; > const char *led_name = NULL; > struct device *led_dev; > > + if (dev->of_node) { > + led_cdev = __of_led_get(dev->of_node, -1, function); > + if (!IS_ERR(led_cdev) || PTR_ERR(led_cdev) != -ENOENT) > + return led_cdev; > + } > + > mutex_lock(&leds_lookup_lock); > list_for_each_entry(lookup, &leds_lookup_list, list) { > if (!strcmp(lookup->consumer_dev_name, dev_name(dev)) && > -- > 2.39.0 >
On Thu, Jan 19, 2023 at 2:01 PM Hans de Goede <hdegoede@redhat.com> wrote: > led_put() is used to "undo" a successful of_led_get() call, > of_led_get() uses class_find_device_by_of_node() which returns > a reference to the device which must be free-ed with put_device() > when the caller is done with it. > > Add a put_device() call to led_put() to free the reference returned > by class_find_device_by_of_node(). > > And also add a put_device() in the error-exit case of try_module_get() > failing. > > Signed-off-by: Hans de Goede <hdegoede@redhat.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Yours, Linus Walleij
On Thu, Jan 19, 2023 at 2:01 PM Hans de Goede <hdegoede@redhat.com> wrote: > Add a __devm_led_get() helper which registers a passed in led_classdev > with devm for unregistration. > > This is a preparation patch for adding a generic (non devicetree specific) > devm_led_get() function. > > Signed-off-by: Hans de Goede <hdegoede@redhat.com> I'm not a fan of __inner_functions because they are easy to confuse with the namespace for __compiler_directives but no big deal so: Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Yours, Linus Walleij
On Thu, Jan 19, 2023 at 2:01 PM Hans de Goede <hdegoede@redhat.com> wrote: > Turn of_led_get() into a more generic __of_led_get() helper function, > which can lookup LEDs in devicetree by either name or index. > > And use this new helper to add devicetree support to the generic > (non devicetree specific) [devm_]led_get() function. > > This uses the standard devicetree pattern of adding a -names string array > to map names to the indexes for an array of resources. > > Note the new led-names property for LED consumers is not added > to the devicetree documentation because there seems to be no > documentation for the leds property itself to extend it with this. > It seems that how LED consumers should be described is not documented > at all ATM. > > This patch is marked as RFC because of both the missing devicetree > documentation and because there are no devicetree users of > the generic [devm_]led_get() function for now. > > Signed-off-by: Hans de Goede <hdegoede@redhat.com> Same grumpiness about __functions but this is overall nice so: Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Yours, Linus Walleij
On Thu, Jan 19, 2023 at 2:01 PM Hans de Goede <hdegoede@redhat.com> wrote: > Here is my version 4 of my series to adjust the INT3472 code's handling of > the privacy LED on x86 laptops with MIPI camera(s) so that it will also > work on devices which have a privacy-LED GPIO but not a clk-enable GPIO > (so that we cannot just tie the LED state to the clk-enable state). > > Changes in v4: I think this is good for merge, I reviewed the LED stuff that I understand, but for the rest in drivers/media FWIW: Acked-by: Linus Walleij <linus.walleij@linaro.org> as well. I really like how this developed to solve a real old outstanding hole in the implementation. Yours, Linus Walleij