]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
backlight: supprt ID_LEDS_CLAMP udev property for leds subsystem devices
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 2 Jan 2024 19:22:27 +0000 (04:22 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 3 Jan 2024 00:30:41 +0000 (09:30 +0900)
Closes #30507.

man/systemd-backlight@.service.xml
src/backlight/backlight.c

index 59e01815f481d0a0dafba852e952f832113b50ce..bb7f2b6b3e77c2397e9d73e9bf9189749ea26805 100644 (file)
   <refsect1>
     <title>Description</title>
 
-    <para><filename>systemd-backlight@.service</filename> is a service that restores the display backlight
-    brightness at early boot and saves it at shutdown. On disk, the backlight brightness is stored in
-    <filename>/var/lib/systemd/backlight/</filename>. During loading, if the udev property
-    <option>ID_BACKLIGHT_CLAMP</option> is not set to false, the brightness is clamped to a value of at least
-    1 or 5% of maximum brightness, whichever is greater. The percentage can be adjusted by specifying a
-    percentage (needs to be suffixed with <literal>%</literal>, e.g. <literal>30%</literal>) to the property
-    <option>ID_BACKLIGHT_CLAMP</option>.</para>
+    <para><filename>systemd-backlight@.service</filename> is a service that restores the brightness of
+    a display backlight or LED (e.g. keyboard backlight) device at early boot, and saves it at shutdown.
+    The brightness is stored in <filename>/var/lib/systemd/backlight/</filename>.</para>
+
+    <para>On restoring brightness of a display backlight device, <command>systemd-backlight</command> reads
+    <varname>ID_BACKLIGHT_CLAMP</varname> udev property, that takes a boolean value or a percentage (needs to
+    be suffixed with <literal>%</literal>, e.g. <literal>30%</literal>). When a percentage is specified, the
+    saved brightness is clamped to a value of at least 1 or the specified percentage of the maximum
+    brightness, whichever is greater. When unset or set to true, the brightness is clamped in the same way
+    with percentage 5%. When false, the saved brightness will not be clamped, and loaded as is.</para>
+
+    <para>On restoring brightness of a LED device, <command>systemd-backlight</command> reads
+    <varname>ID_LEDS_CLAMP</varname> udev property, that also takes a boolean value or a percentage. When a
+    percentage is specified, the saved brightness is clamped to the specified percentage of the maximum
+    brightness. When set to true, the brightness is clamped in the same way with percentage 5%. When unset or
+    set to false, the saved brightness will not be clamped, and loaded as is.</para>
   </refsect1>
 
   <refsect1>
index 5aa3e332b66a3a387f30d71a93e3683b150296a1..6a2ad17fbf6880733ce4099f8d20089c40ab550d 100644 (file)
@@ -338,10 +338,9 @@ static int clamp_brightness(
          * avoids preserving an unreadably dim screen, which would otherwise force the user to disable
          * state restoration. */
 
+        min_brightness = (unsigned) ((double) max_brightness * percent / 100);
         if (device_in_subsystem(device, "backlight"))
-                min_brightness = MAX(1U, (unsigned) ((double) max_brightness * percent / 100));
-        else
-                min_brightness = 0;
+                min_brightness = MAX(1U, min_brightness);
 
         new_brightness = CLAMP(*brightness, min_brightness, max_brightness);
         if (new_brightness != *brightness)
@@ -356,19 +355,28 @@ static int clamp_brightness(
         return 0;
 }
 
-static bool shall_clamp(sd_device *d, unsigned *ret) {
-        const char *s;
+static bool shall_clamp(sd_device *device, unsigned *ret) {
+        const char *property, *s;
+        unsigned default_percent;
         int r;
 
-        assert(d);
+        assert(device);
         assert(ret);
 
-        r = sd_device_get_property_value(d, "ID_BACKLIGHT_CLAMP", &s);
+        if (device_in_subsystem(device, "backlight")) {
+                property = "ID_BACKLIGHT_CLAMP";
+                default_percent = 5;
+        } else {
+                property = "ID_LEDS_CLAMP";
+                default_percent = 0;
+        }
+
+        r = sd_device_get_property_value(device, property, &s);
         if (r < 0) {
                 if (r != -ENOENT)
-                        log_device_debug_errno(d, r, "Failed to get ID_BACKLIGHT_CLAMP property, ignoring: %m");
-                *ret = 5; /* defaults to 5% */
-                return true;
+                        log_device_debug_errno(device, r, "Failed to get %s property, ignoring: %m", property);
+                *ret = default_percent;
+                return default_percent > 0;
         }
 
         r = parse_boolean(s);
@@ -379,9 +387,9 @@ static bool shall_clamp(sd_device *d, unsigned *ret) {
 
         r = parse_percent(s);
         if (r < 0) {
-                log_device_debug_errno(d, r, "Failed to parse ID_BACKLIGHT_CLAMP property, ignoring: %m");
-                *ret = 5;
-                return true;
+                log_device_debug_errno(device, r, "Failed to parse %s property, ignoring: %m", property);
+                *ret = default_percent;
+                return default_percent > 0;
         }
 
         *ret = r;