platform/x86: lg-laptop: Use correct event for keyboard backlight FN-key
authorMatan Ziv-Av <matan@svgalib.org>
Wed, 18 Aug 2021 12:47:31 +0000 (15:47 +0300)
committerHans de Goede <hdegoede@redhat.com>
Fri, 20 Aug 2021 10:09:42 +0000 (12:09 +0200)
Use led_classdev_notify_brightness_hw_changed() instead of F16 key.

Signed-off-by: Matan Ziv-Av <matan@svgalib.org>
Link: https://lore.kernel.org/r/2196990f167efe6a42d51fb85f4db4cdf4d9e80e.1629291912.git.matan@svgalib.org
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Documentation/admin-guide/laptops/lg-laptop.rst
drivers/platform/x86/lg-laptop.c

index 13d7ec427e76feb4d5e07e3172080844b365dd3c..6fbe165dcd27f83be64ac62718f4bf2eb9915382 100644 (file)
@@ -15,8 +15,6 @@ The following FN keys are ignored by the kernel without this driver:
 - FN-F1 (LG control panel)   - Generates F15
 - FN-F5 (Touchpad toggle)    - Generates F21
 - FN-F6 (Airplane mode)      - Generates RFKILL
-- FN-F8 (Keyboard backlight) - Generates F16.
-  This key also changes keyboard backlight mode.
 - FN-F9 (Reader mode)        - Generates F14
 
 The rest of the FN keys work without a need for a special driver.
index 12b497a11c6f6228eb0876306f23e901468eaf36..3e520d5bca07fb84fb0be9a81b67a2f0c9f37ba8 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/types.h>
 
-#define LED_DEVICE(_name, max) struct led_classdev _name = { \
+#define LED_DEVICE(_name, max, flag) struct led_classdev _name = { \
        .name           = __stringify(_name),   \
        .max_brightness = max,                  \
        .brightness_set = _name##_set,          \
        .brightness_get = _name##_get,          \
+       .flags = flag,                          \
 }
 
 MODULE_AUTHOR("Matan Ziv-Av");
@@ -71,6 +72,8 @@ static u32 inited;
 #define INIT_SPARSE_KEYMAP      0x80
 
 static int battery_limit_use_wmbb;
+static struct led_classdev kbd_backlight;
+static enum led_brightness get_kbd_backlight_level(void);
 
 static const struct key_entry wmi_keymap[] = {
        {KE_KEY, 0x70, {KEY_F15} },      /* LG control panel (F1) */
@@ -217,10 +220,16 @@ static void wmi_notify(u32 value, void *context)
                int eventcode = obj->integer.value;
                struct key_entry *key;
 
-               key =
-                   sparse_keymap_entry_from_scancode(wmi_input_dev, eventcode);
-               if (key && key->type == KE_KEY)
-                       sparse_keymap_report_entry(wmi_input_dev, key, 1, true);
+               if (eventcode == 0x10000000) {
+                       led_classdev_notify_brightness_hw_changed(
+                               &kbd_backlight, get_kbd_backlight_level());
+               } else {
+                       key = sparse_keymap_entry_from_scancode(
+                               wmi_input_dev, eventcode);
+                       if (key && key->type == KE_KEY)
+                               sparse_keymap_report_entry(wmi_input_dev,
+                                                          key, 1, true);
+               }
        }
 
        pr_debug("Type: %i    Eventcode: 0x%llx\n", obj->type,
@@ -548,7 +557,7 @@ static enum led_brightness tpad_led_get(struct led_classdev *cdev)
        return ggov(GOV_TLED) > 0 ? LED_ON : LED_OFF;
 }
 
-static LED_DEVICE(tpad_led, 1);
+static LED_DEVICE(tpad_led, 1, 0);
 
 static void kbd_backlight_set(struct led_classdev *cdev,
                              enum led_brightness brightness)
@@ -565,7 +574,7 @@ static void kbd_backlight_set(struct led_classdev *cdev,
        kfree(r);
 }
 
-static enum led_brightness kbd_backlight_get(struct led_classdev *cdev)
+static enum led_brightness get_kbd_backlight_level(void)
 {
        union acpi_object *r;
        int val;
@@ -596,7 +605,12 @@ static enum led_brightness kbd_backlight_get(struct led_classdev *cdev)
        return val;
 }
 
-static LED_DEVICE(kbd_backlight, 255);
+static enum led_brightness kbd_backlight_get(struct led_classdev *cdev)
+{
+       return get_kbd_backlight_level();
+}
+
+static LED_DEVICE(kbd_backlight, 255, LED_BRIGHT_HW_CHANGED);
 
 static void wmi_input_destroy(void)
 {