diff --git a/src/uniwill_keyboard.h b/src/uniwill_keyboard.h index 5dd1ae5..8a2fb84 100644 --- a/src/uniwill_keyboard.h +++ b/src/uniwill_keyboard.h @@ -274,29 +274,40 @@ static void uniwill_write_kbd_bl_enable(u8 enable) void uniwill_event_callb(u32 code) { - if (uniwill_keyboard_driver.input_device != NULL) - if (!sparse_keymap_report_known_event(uniwill_keyboard_driver.input_device, code, 1, true)) { - TUXEDO_DEBUG("Unknown code - %d (%0#6x)\n", code, code); - } - - // Special key combination when mode change key is pressed - if (code == UNIWILL_OSD_MODE_CHANGE_KEY_EVENT) { - input_report_key(uniwill_keyboard_driver.input_device, KEY_LEFTMETA, 1); - input_report_key(uniwill_keyboard_driver.input_device, KEY_LEFTALT, 1); - input_report_key(uniwill_keyboard_driver.input_device, KEY_F6, 1); - input_sync(uniwill_keyboard_driver.input_device); - input_report_key(uniwill_keyboard_driver.input_device, KEY_F6, 0); - input_report_key(uniwill_keyboard_driver.input_device, KEY_LEFTALT, 0); - input_report_key(uniwill_keyboard_driver.input_device, KEY_LEFTMETA, 0); - input_sync(uniwill_keyboard_driver.input_device); - } - - // Refresh keyboard state and charging prio on cable switch event - if (code == UNIWILL_OSD_DC_ADAPTER_CHANGE) { - uniwill_leds_restore_state_extern(); - - msleep(50); - uw_charging_priority_write_state(); + switch (code) { + case UNIWILL_OSD_MODE_CHANGE_KEY_EVENT: + // Special key combination when mode change key is pressed (the one next to + // the power key). Opens TCC by default when installed. + input_report_key(uniwill_keyboard_driver.input_device, KEY_LEFTMETA, 1); + input_report_key(uniwill_keyboard_driver.input_device, KEY_LEFTALT, 1); + input_report_key(uniwill_keyboard_driver.input_device, KEY_F6, 1); + input_sync(uniwill_keyboard_driver.input_device); + input_report_key(uniwill_keyboard_driver.input_device, KEY_F6, 0); + input_report_key(uniwill_keyboard_driver.input_device, KEY_LEFTALT, 0); + input_report_key(uniwill_keyboard_driver.input_device, KEY_LEFTMETA, 0); + input_sync(uniwill_keyboard_driver.input_device); + break; + case UNIWILL_OSD_DC_ADAPTER_CHANGE: + // Refresh keyboard state and charging prio on cable switch event + uniwill_leds_restore_state_extern(); + msleep(50); + uw_charging_priority_write_state(); + break; + case UNIWILL_OSD_KB_LED_LEVEL0: + case UNIWILL_OSD_KB_LED_LEVEL1: + case UNIWILL_OSD_KB_LED_LEVEL2: + case UNIWILL_OSD_KB_LED_LEVEL3: + case UNIWILL_OSD_KB_LED_LEVEL4: + // Notify userspace/UPower that the firmware changed the keyboard backlight + // brightness on white only keyboards. Fallthrough on other keyboards to + // emit KEY_KBDILLUMTOGGLE. + if (uniwill_leds_notify_brightness_change_extern()) + return; + fallthrough; + default: + if (uniwill_keyboard_driver.input_device != NULL) + if (!sparse_keymap_report_known_event(uniwill_keyboard_driver.input_device, code, 1, true)) + TUXEDO_DEBUG("Unknown code - %d (%0#6x)\n", code, code); } } diff --git a/src/uniwill_leds.h b/src/uniwill_leds.h index a129f4c..a572272 100644 --- a/src/uniwill_leds.h +++ b/src/uniwill_leds.h @@ -47,6 +47,7 @@ int uniwill_leds_init_early(struct platform_device *dev); int uniwill_leds_init_late(struct platform_device *dev); int uniwill_leds_remove(struct platform_device *dev); enum uniwill_kb_backlight_types uniwill_leds_get_backlight_type(void); +int uniwill_leds_notify_brightness_change_extern(void); void uniwill_leds_restore_state_extern(void); void uniwill_leds_set_brightness_extern(enum led_brightness brightness); void uniwill_leds_set_color_extern(u32 color); @@ -135,7 +136,8 @@ static struct led_classdev uniwill_led_cdev = { .name = "white:" LED_FUNCTION_KBD_BACKLIGHT, .max_brightness = UNIWILL_KBD_BRIGHTNESS_WHITE_MAX, .brightness_set = &uniwill_leds_set_brightness, - .brightness = UNIWILL_KBD_BRIGHTNESS_WHITE_DEFAULT + .brightness = UNIWILL_KBD_BRIGHTNESS_WHITE_DEFAULT, + .flags = LED_BRIGHT_HW_CHANGED }; static struct mc_subled uw_mcled_cdev_subleds[3] = { @@ -164,6 +166,7 @@ static struct led_classdev_mc uniwill_mcled_cdev = { .led_cdev.max_brightness = UNIWILL_KBD_BRIGHTNESS_MAX, .led_cdev.brightness_set = &uniwill_leds_set_brightness_mc, .led_cdev.brightness = UNIWILL_KBD_BRIGHTNESS_DEFAULT, + .led_cdev.flags = LED_BRIGHT_HW_CHANGED, .num_colors = 3, .subled_info = uw_mcled_cdev_subleds }; @@ -282,6 +285,20 @@ enum uniwill_kb_backlight_types uniwill_leds_get_backlight_type(void) { } EXPORT_SYMBOL(uniwill_leds_get_backlight_type); +int uniwill_leds_notify_brightness_change_extern(void) { + u8 data = 0; + + if (uw_leds_initialized) { + if (uniwill_kb_backlight_type == UNIWILL_KB_BACKLIGHT_TYPE_FIXED_COLOR) { + uniwill_read_ec_ram(UW_EC_REG_KBD_BL_STATUS, &data); + data = (data >> 5) & 0x3; + led_classdev_notify_brightness_hw_changed(&uniwill_led_cdev, data); + return true; + } + } + return false; +} + void uniwill_leds_restore_state_extern(void) { u8 data;