backlight: Propagate errors from get_brightness()
authorThomas Weißschuh <linux@weissschuh.net>
Tue, 7 Sep 2021 12:47:51 +0000 (14:47 +0200)
committerLee Jones <lee.jones@linaro.org>
Thu, 23 Sep 2021 09:48:00 +0000 (10:48 +0100)
backlight.h documents "struct backlight_ops->get_brightness()" to return
a negative errno on failure.

So far these errors have not been handled in the backlight core.
This leads to negative values being exposed through sysfs although only
positive values are documented to be reported.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
drivers/video/backlight/backlight.c

index fc990e576340be6f36ccf4e63903b3ffc46db576..4ae6fae94ac29ba30d3403ec1e26cc8180a7e8cd 100644 (file)
@@ -292,10 +292,13 @@ static ssize_t actual_brightness_show(struct device *dev,
        struct backlight_device *bd = to_backlight_device(dev);
 
        mutex_lock(&bd->ops_lock);
-       if (bd->ops && bd->ops->get_brightness)
-               rc = sprintf(buf, "%d\n", bd->ops->get_brightness(bd));
-       else
+       if (bd->ops && bd->ops->get_brightness) {
+               rc = bd->ops->get_brightness(bd);
+               if (rc >= 0)
+                       rc = sprintf(buf, "%d\n", rc);
+       } else {
                rc = sprintf(buf, "%d\n", bd->props.brightness);
+       }
        mutex_unlock(&bd->ops_lock);
 
        return rc;
@@ -381,9 +384,18 @@ ATTRIBUTE_GROUPS(bl_device);
 void backlight_force_update(struct backlight_device *bd,
                            enum backlight_update_reason reason)
 {
+       int brightness;
+
        mutex_lock(&bd->ops_lock);
-       if (bd->ops && bd->ops->get_brightness)
-               bd->props.brightness = bd->ops->get_brightness(bd);
+       if (bd->ops && bd->ops->get_brightness) {
+               brightness = bd->ops->get_brightness(bd);
+               if (brightness >= 0)
+                       bd->props.brightness = brightness;
+               else
+                       dev_err(&bd->dev,
+                               "Could not update brightness from device: %pe\n",
+                               ERR_PTR(brightness));
+       }
        mutex_unlock(&bd->ops_lock);
        backlight_generate_event(bd, reason);
 }