diff options
author | Daniel Drake <drake@endlessm.com> | 2018-10-09 02:40:56 -0400 |
---|---|---|
committer | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2018-10-31 10:11:40 -0400 |
commit | 3b692c55e58d06ba9b17c66784cab5a95ba5be9b (patch) | |
tree | 28a46b5dde2c93e22e0abf34070f5c0e1a38a62f | |
parent | ffb6ce7086ee2d68d8d6d987882f1c5e923fee7e (diff) |
HID: asus: only support backlight when it's not driven by WMI
The Asus GL502VSK has the same 0B05:1837 keyboard as we've seen in
several Republic of Gamers laptops.
However, in this model, the keybard backlight control exposed by hid-asus
has no effect on the keyboard backlight. Instead, the keyboard
backlight is correctly driven by asus-wmi.
With two keyboard backlight devices available (and only the acer-wmi
one working), GNOME is picking the wrong one to drive in the UI.
Avoid this problem by not creating the backlight interface when we
detect a WMI-driven keyboard backlight.
We have also tested Asus GL702VMK which does have the hid-asus
backlight present, and it still works fine with this patch (WMI method
call returns UNSUPPORTED_METHOD).
A direct "depends on ASUS_WMI" is intentionally avoided so that HID_ASUS
users who have ASUS_WMI=n will not quietly lose their HID_ASUS driver on
a kernel upgrade.
Signed-off-by: Daniel Drake <drake@endlessm.com>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
-rw-r--r-- | drivers/hid/Kconfig | 1 | ||||
-rw-r--r-- | drivers/hid/hid-asus.c | 23 |
2 files changed, 23 insertions, 1 deletions
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index 61e1953ff921..5c84b34c142e 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig | |||
@@ -149,6 +149,7 @@ config HID_APPLEIR | |||
149 | config HID_ASUS | 149 | config HID_ASUS |
150 | tristate "Asus" | 150 | tristate "Asus" |
151 | depends on LEDS_CLASS | 151 | depends on LEDS_CLASS |
152 | depends on ASUS_WMI || ASUS_WMI=n | ||
152 | ---help--- | 153 | ---help--- |
153 | Support for Asus notebook built-in keyboard and touchpad via i2c, and | 154 | Support for Asus notebook built-in keyboard and touchpad via i2c, and |
154 | the Asus Republic of Gamers laptop keyboard special keys. | 155 | the Asus Republic of Gamers laptop keyboard special keys. |
diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 88a5672f42cd..dc6d6477e961 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/dmi.h> | 29 | #include <linux/dmi.h> |
30 | #include <linux/hid.h> | 30 | #include <linux/hid.h> |
31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
32 | #include <linux/platform_data/x86/asus-wmi.h> | ||
32 | #include <linux/input/mt.h> | 33 | #include <linux/input/mt.h> |
33 | #include <linux/usb.h> /* For to_usb_interface for T100 touchpad intf check */ | 34 | #include <linux/usb.h> /* For to_usb_interface for T100 touchpad intf check */ |
34 | 35 | ||
@@ -349,6 +350,24 @@ static void asus_kbd_backlight_work(struct work_struct *work) | |||
349 | hid_err(led->hdev, "Asus failed to set keyboard backlight: %d\n", ret); | 350 | hid_err(led->hdev, "Asus failed to set keyboard backlight: %d\n", ret); |
350 | } | 351 | } |
351 | 352 | ||
353 | /* WMI-based keyboard backlight LED control (via asus-wmi driver) takes | ||
354 | * precedence. We only activate HID-based backlight control when the | ||
355 | * WMI control is not available. | ||
356 | */ | ||
357 | static bool asus_kbd_wmi_led_control_present(struct hid_device *hdev) | ||
358 | { | ||
359 | u32 value; | ||
360 | int ret; | ||
361 | |||
362 | ret = asus_wmi_evaluate_method(ASUS_WMI_METHODID_DSTS2, | ||
363 | ASUS_WMI_DEVID_KBD_BACKLIGHT, 0, &value); | ||
364 | hid_dbg(hdev, "WMI backlight check: rc %d value %x", ret, value); | ||
365 | if (ret) | ||
366 | return false; | ||
367 | |||
368 | return !!(value & ASUS_WMI_DSTS_PRESENCE_BIT); | ||
369 | } | ||
370 | |||
352 | static int asus_kbd_register_leds(struct hid_device *hdev) | 371 | static int asus_kbd_register_leds(struct hid_device *hdev) |
353 | { | 372 | { |
354 | struct asus_drvdata *drvdata = hid_get_drvdata(hdev); | 373 | struct asus_drvdata *drvdata = hid_get_drvdata(hdev); |
@@ -436,7 +455,9 @@ static int asus_input_configured(struct hid_device *hdev, struct hid_input *hi) | |||
436 | 455 | ||
437 | drvdata->input = input; | 456 | drvdata->input = input; |
438 | 457 | ||
439 | if (drvdata->enable_backlight && asus_kbd_register_leds(hdev)) | 458 | if (drvdata->enable_backlight && |
459 | !asus_kbd_wmi_led_control_present(hdev) && | ||
460 | asus_kbd_register_leds(hdev)) | ||
440 | hid_warn(hdev, "Failed to initialize backlight.\n"); | 461 | hid_warn(hdev, "Failed to initialize backlight.\n"); |
441 | 462 | ||
442 | return 0; | 463 | return 0; |