On Thu, 13 Jun 2024, Lee Jones wrote: > If both set_brightness functions return -ENOTSUPP, then the LED doesn't > support setting a fixed brightness value, and the error message isn't > helpful. This can be the case e.g. for LEDs supporting a specific hw > trigger only. > > Pinched the subject line and commit message from Heiner: > Link: https://lore.kernel.org/all/44177e37-9512-4044-8991-bb23b184bf37@xxxxxxxxx/ > > Reworked the function to provide Heiner's required semantics whilst > simultaneously increasing readability and flow. > > Cc: Pavel Machek <pavel@xxxxxx> > Cc: linux-leds@xxxxxxxxxxxxxxx > Suggested-by: Heiner Kallweit <hkallweit1@xxxxxxxxx> Heiner, you good with this solution? A Tested-by or Reviewed-by would be good if you have the time. > Signed-off-by: Lee Jones <lee@xxxxxxxxxx> > --- > drivers/leds/led-core.c | 19 +++++++++++++------ > 1 file changed, 13 insertions(+), 6 deletions(-) > > diff --git a/drivers/leds/led-core.c b/drivers/leds/led-core.c > index ef7d1c6767ca..3b4db39f2326 100644 > --- a/drivers/leds/led-core.c > +++ b/drivers/leds/led-core.c > @@ -123,15 +123,22 @@ static void led_timer_function(struct timer_list *t) > static void set_brightness_delayed_set_brightness(struct led_classdev *led_cdev, > unsigned int value) > { > - int ret = 0; > + int ret; > > ret = __led_set_brightness(led_cdev, value); > - if (ret == -ENOTSUPP) > + if (ret == -ENOTSUPP) { > ret = __led_set_brightness_blocking(led_cdev, value); > - if (ret < 0 && > - /* LED HW might have been unplugged, therefore don't warn */ > - !(ret == -ENODEV && (led_cdev->flags & LED_UNREGISTERING) && > - (led_cdev->flags & LED_HW_PLUGGABLE))) > + if (ret == -ENOTSUPP) > + /* No back-end support to set a fixed brightness value */ > + return; > + } > + > + /* LED HW might have been unplugged, therefore don't warn */ > + if (ret == -ENODEV && led_cdev->flags & LED_UNREGISTERING && > + led_cdev->flags & LED_HW_PLUGGABLE) > + return; > + > + if (ret < 0) > dev_err(led_cdev->dev, > "Setting an LED's brightness failed (%d)\n", ret); > } > -- > 2.45.2.505.gda0bf45e8d-goog > -- Lee Jones [李琼斯]