Blob Blame History Raw
From 40077b3f942021d90348162d55c607ca10d86c27 Mon Sep 17 00:00:00 2001
From: Jani Nikula <jani.nikula@intel.com>
Date: Wed, 7 May 2014 12:01:01 +0300
Subject: [PATCH] backlight: handle saved brightness exceeding max brightness

If too high a brightness value has been saved (e.g. due to kernel
mechanism changing from one kernel version to another, or booting the
userspace on another system), the brightness update fails and the
process exits.

Clamp saved brightness between the policy minimum introduced in

commit 7b909d7407965c03caaba30daae7aee113627a83
Author: Josh Triplett <josh@joshtriplett.org>
Date:   Tue Mar 11 21:16:33 2014 -0700

    backlight: Avoid restoring brightness to an unreadably dim level

and the absolute maximum.

https://bugs.freedesktop.org/show_bug.cgi?id=78200
(cherry picked from commit 0c9d8f1d4b5018199cb5a9b57580dc1480a7f915)
(cherry picked from commit d4666a88938d3d671f7796ce650fa29ad47579cf)
---
 src/backlight/backlight.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/backlight/backlight.c b/src/backlight/backlight.c
index 34c01d91df..77ae48c26f 100644
--- a/src/backlight/backlight.c
+++ b/src/backlight/backlight.c
@@ -225,7 +225,7 @@ static unsigned get_max_brightness(struct udev_device *device) {
  * would otherwise force the user to disable state restoration. */
 static void clamp_brightness(struct udev_device *device, char **value, unsigned max_brightness) {
         int r;
-        unsigned brightness, new_brightness;
+        unsigned brightness, new_brightness, min_brightness;
 
         r = safe_atou(*value, &brightness);
         if (r < 0) {
@@ -233,7 +233,8 @@ static void clamp_brightness(struct udev_device *device, char **value, unsigned
                 return;
         }
 
-        new_brightness = MAX3(brightness, 1U, max_brightness/20);
+        min_brightness = MAX(1U, max_brightness/20);
+        new_brightness = CLAMP(brightness, min_brightness, max_brightness);
         if (new_brightness != brightness) {
                 char *old_value = *value;
 
@@ -243,7 +244,11 @@ static void clamp_brightness(struct udev_device *device, char **value, unsigned
                         return;
                 }
 
-                log_debug("Saved brightness %s too low; increasing to %s.", old_value, *value);
+                log_info("Saved brightness %s %s to %s.", old_value,
+                         new_brightness > brightness ?
+                         "too low; increasing" : "too high; decreasing",
+                         *value);
+
                 free(old_value);
         }
 }