Skip to content

Commit dbb3d78

Browse files
Chris Chiuandy-shev
authored andcommitted
platform/x86: asus-wmi: Call led hw_changed API on kbd brightness change
Make asus-wmi notify on hotkey kbd brightness changes, listen for brightness events and update the brightness directly in the driver. Create new do_kbd_led_set function for in-driver update, and leave kbd_led_set for original led_classdev call path. Update the brightness by led_classdev_notify_brightness_hw_changed. This will allow userspace to monitor (poll) for brightness changes on the LED without reporting via input keymapping. Signed-off-by: Chris Chiu <chiu@endlessm.com> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
1 parent 4cf2afd commit dbb3d78

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed

drivers/platform/x86/asus-wmi.c

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@ static void kbd_led_update(struct work_struct *work)
470470
ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F);
471471

472472
asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL);
473+
led_classdev_notify_brightness_hw_changed(&asus->kbd_led, asus->kbd_led_wk);
473474
}
474475

475476
static int kbd_led_read(struct asus_wmi *asus, int *level, int *env)
@@ -500,22 +501,29 @@ static int kbd_led_read(struct asus_wmi *asus, int *level, int *env)
500501
return retval;
501502
}
502503

503-
static void kbd_led_set(struct led_classdev *led_cdev,
504-
enum led_brightness value)
504+
static void do_kbd_led_set(struct led_classdev *led_cdev, int value)
505505
{
506506
struct asus_wmi *asus;
507+
int max_level;
507508

508509
asus = container_of(led_cdev, struct asus_wmi, kbd_led);
510+
max_level = asus->kbd_led.max_brightness;
509511

510-
if (value > asus->kbd_led.max_brightness)
511-
value = asus->kbd_led.max_brightness;
512+
if (value > max_level)
513+
value = max_level;
512514
else if (value < 0)
513515
value = 0;
514516

515517
asus->kbd_led_wk = value;
516518
queue_work(asus->led_workqueue, &asus->kbd_led_work);
517519
}
518520

521+
static void kbd_led_set(struct led_classdev *led_cdev,
522+
enum led_brightness value)
523+
{
524+
do_kbd_led_set(led_cdev, value);
525+
}
526+
519527
static enum led_brightness kbd_led_get(struct led_classdev *led_cdev)
520528
{
521529
struct asus_wmi *asus;
@@ -666,6 +674,7 @@ static int asus_wmi_led_init(struct asus_wmi *asus)
666674

667675
asus->kbd_led_wk = led_val;
668676
asus->kbd_led.name = "asus::kbd_backlight";
677+
asus->kbd_led.flags = LED_BRIGHT_HW_CHANGED;
669678
asus->kbd_led.brightness_set = kbd_led_set;
670679
asus->kbd_led.brightness_get = kbd_led_get;
671680
asus->kbd_led.max_brightness = 3;
@@ -1758,6 +1767,15 @@ static void asus_wmi_notify(u32 value, void *context)
17581767
}
17591768
}
17601769

1770+
if (code == NOTIFY_KBD_BRTUP) {
1771+
do_kbd_led_set(&asus->kbd_led, asus->kbd_led_wk + 1);
1772+
goto exit;
1773+
}
1774+
if (code == NOTIFY_KBD_BRTDWN) {
1775+
do_kbd_led_set(&asus->kbd_led, asus->kbd_led_wk - 1);
1776+
goto exit;
1777+
}
1778+
17611779
if (is_display_toggle(code) &&
17621780
asus->driver->quirks->no_display_toggle)
17631781
goto exit;

0 commit comments

Comments
 (0)