From 7994d6ab1f6d8423a3bbf303d68b7d8fd79ce734 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 9 Mar 2018 16:45:55 -0700 Subject: [PATCH] Fix resume from suspend keyboard backlight --- kb_led.c | 28 +++++++++++++++++++++++----- system76.c | 19 ++++++++++++++++--- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/kb_led.c b/kb_led.c index 0e45481..dd739f1 100644 --- a/kb_led.c +++ b/kb_led.c @@ -102,7 +102,7 @@ static void kb_led_color_set(enum kb_led_region region, union kb_led_color color } static struct led_classdev kb_led = { - .name = "system76::kbd_backlight", + .name = "system76::k_backlight", .flags = LED_BRIGHT_HW_CHANGED, .brightness_get = kb_led_get, .brightness_set_blocking = kb_led_set, @@ -197,19 +197,37 @@ static struct device_attribute kb_led_color_extra_dev_attr = { .store = kb_led_color_extra_store, }; +static void kb_led_suspend(void) { + S76_INFO("kb_led_suspend\n"); + + // Disable keyboard backlight + s76_wmbb(SET_KB_LED, 0xE0003001, NULL); +} + static void kb_led_resume(void) { enum kb_led_region region; - // Enable keyboard backlight - s76_wmbb(SET_KB_LED, 0xE007F001, NULL); + S76_INFO("kb_led_resume\n"); - // Reset current brightness - kb_led_set(&kb_led, kb_led_brightness); + // Disable keyboard backlight + s76_wmbb(SET_KB_LED, 0xE0003001, NULL); + + msleep(1000); // Reset current color for (region = 0; region < sizeof(kb_led_regions)/sizeof(union kb_led_color); region++) { kb_led_color_set(region, kb_led_regions[region]); } + + msleep(1000); + + // Reset current brightness + kb_led_set(&kb_led, kb_led_brightness); + + msleep(1000); + + // Enable keyboard backlight + s76_wmbb(SET_KB_LED, 0xE007F001, NULL); } static int __init kb_led_init(struct device *dev) { diff --git a/system76.c b/system76.c index 659e375..221787c 100644 --- a/system76.c +++ b/system76.c @@ -91,11 +91,9 @@ static int s76_wmbb(u32 method_id, u32 arg, u32 *retval) { return 0; } -//#include "ec.c" #include "ap_led.c" #include "input.c" #include "kb_led.c" -//#include "kb.c" #include "hwmon.c" static void s76_debug_wmi(void) { @@ -169,8 +167,12 @@ static void s76_wmi_notify(u32 value, void *context) { case 0x83: kb_wmi_color(); break; + case 0x7b: + kb_led_suspend(); + break; case 0x95: - s76_debug_wmi(); + //s76_debug_wmi(); + kb_led_resume(); break; case 0x9F: kb_wmi_toggle(); @@ -243,7 +245,17 @@ static int s76_remove(struct platform_device *dev) { return 0; } +static int s76_suspend(struct platform_device *dev, pm_message_t status) { + S76_INFO("s76_suspend\n"); + + kb_led_suspend(); + + return 0; +} + static int s76_resume(struct platform_device *dev) { + S76_INFO("s76_resume\n"); + // Enable hotkey support s76_wmbb(0x46, 0, NULL); @@ -255,6 +267,7 @@ static int s76_resume(struct platform_device *dev) { static struct platform_driver s76_platform_driver = { .remove = s76_remove, + .suspend = s76_suspend, .resume = s76_resume, .driver = { .name = S76_DRIVER_NAME,