Currenlty, the keyboard brightness control of Asus WMI keyboards is handled in the kernel, which leads to the shortcut going from brightness 0, to 1, to 2, and 3. However, for HID keyboards it is exposed as a key and handled by the user's desktop environment. For the toggle button, this means that brightness control becomes on/off. In addition, in the absence of a DE, the keyboard brightness does not work. Therefore, expose an event handler for the keyboard brightness control which can then be used by hid-asus. Signed-off-by: Antheas Kapenekakis <lkml@xxxxxxxxxxx> --- drivers/platform/x86/asus-wmi.c | 39 ++++++++++++++++++++++ include/linux/platform_data/x86/asus-wmi.h | 10 ++++++ 2 files changed, 49 insertions(+) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c index 0cb1cf3c25a28..2a394f56e44c8 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -1529,6 +1529,45 @@ void asus_brt_unregister_listener(struct asus_brt_listener *bdev) } EXPORT_SYMBOL_GPL(asus_brt_unregister_listener); +static void do_kbd_led_set(struct led_classdev *led_cdev, int value); + +int asus_brt_event(enum asus_brt_event event) +{ + int brightness; + + mutex_lock(&asus_brt_lock); + if (!asus_brt_ref || !asus_brt_ref->kbd_led_registered) { + mutex_unlock(&asus_brt_lock); + return -EBUSY; + } + brightness = asus_brt_ref->kbd_led_wk; + mutex_unlock(&asus_brt_lock); + + switch (event) { + case ASUS_BRT_UP: + brightness += 1; + break; + case ASUS_BRT_DOWN: + brightness -= 1; + break; + case ASUS_BRT_TOGGLE: + if (brightness >= 3) + brightness = 0; + else + brightness += 1; + break; + } + + do_kbd_led_set(&asus_brt_ref->kbd_led, brightness); + led_classdev_notify_brightness_hw_changed(&asus_brt_ref->kbd_led, + asus_brt_ref->kbd_led_wk); + + mutex_unlock(&asus_brt_lock); + + return 0; +} +EXPORT_SYMBOL_GPL(asus_brt_event); + /* * These functions actually update the LED's, and are called from a * workqueue. By doing this as separate work rather than when the LED diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h index add04524031d8..c683492be5de5 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -162,11 +162,18 @@ struct asus_brt_listener { void (*notify)(struct asus_brt_listener *listener, int brightness); }; +enum asus_brt_event { + ASUS_BRT_UP, + ASUS_BRT_DOWN, + ASUS_BRT_TOGGLE, +}; + #if IS_REACHABLE(CONFIG_ASUS_WMI) int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval); int asus_brt_register_listener(struct asus_brt_listener *cdev); void asus_brt_unregister_listener(struct asus_brt_listener *cdev); +int asus_brt_event(enum asus_brt_event event); #else static inline int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval) @@ -181,6 +188,9 @@ static inline int asus_brt_register_listener(struct asus_brt_listener *bdev) static inline void asus_brt_unregister_listener(struct asus_brt_listener *bdev) { } +static inline void asus_brt_event(enum asus_brt_event event) +{ +} #endif #endif /* __PLATFORM_DATA_X86_ASUS_WMI_H */ -- 2.48.1