diff options
| author | Ionut Nechita <ionut_n2001@yahoo.com> | 2026-01-07 17:42:24 +0200 |
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.com> | 2026-01-08 12:17:16 +0100 |
| commit | 1489a34e97efebf583ff08e506ecf9f7d44537d3 (patch) | |
| tree | 03697a038ee67f8a530e9072478efd83a36f26bb /drivers/hid | |
| parent | c888d0bd055b57688534a884f8f210a91d15e00f (diff) | |
HID: asus: Implement Fn+F5 fan control key handler
On Asus ROG laptops, the Fn+F5 key (HID code 0xae) is used to cycle
through fan modes. This key press needs to be forwarded to the asus-wmi
driver to actually change the fan mode.
Add ASUS_FAN_CTRL_KEY_CODE define and implement the handler in
asus_raw_event() to send WMI events when this key is pressed.
When asus-wmi successfully handles the event, it is blocked from reaching
userspace. If asus-wmi is unavailable or fails, the event is passed to
userspace via evdev, allowing userspace implementations of fan control.
Tested on Asus ROG G14/G15 series laptops.
Reviewed-by: Denis Benato <benato.denis96@gmail.com>
Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>
Signed-off-by: Ionut Nechita <ionut_n2001@yahoo.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
Diffstat (limited to 'drivers/hid')
| -rw-r--r-- | drivers/hid/hid-asus.c | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index f778387c3c55..7d2189916565 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -64,6 +64,9 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); #define ASUS_SPURIOUS_CODE_0X8A 0x8a #define ASUS_SPURIOUS_CODE_0X9E 0x9e +/* Special key codes */ +#define ASUS_FAN_CTRL_KEY_CODE 0xae + #define SUPPORT_KBD_BACKLIGHT BIT(0) #define MAX_TOUCH_MAJOR 8 @@ -378,12 +381,34 @@ static int asus_raw_event(struct hid_device *hdev, if (report->id == FEATURE_KBD_LED_REPORT_ID1 || report->id == FEATURE_KBD_LED_REPORT_ID2) return -1; if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { - /* - * ASUS ROG laptops send these codes during normal operation - * with no discernable reason. Filter them out to avoid - * unmapped warning messages. - */ if (report->id == FEATURE_KBD_REPORT_ID) { + /* + * Fn+F5 fan control key - try to send WMI event to toggle fan mode. + * If successful, block the event from reaching userspace. + * If asus-wmi is unavailable or the call fails, let the event + * pass to userspace so it can implement its own fan control. + */ + if (data[1] == ASUS_FAN_CTRL_KEY_CODE) { + int ret = asus_wmi_send_event(drvdata, ASUS_FAN_CTRL_KEY_CODE); + + if (ret == 0) { + /* Successfully handled by asus-wmi, block event */ + return -1; + } + + /* + * Warn if asus-wmi failed (but not if it's unavailable). + * Let the event reach userspace in all failure cases. + */ + if (ret != -ENODEV) + hid_warn(hdev, "Failed to notify asus-wmi: %d\n", ret); + } + + /* + * ASUS ROG laptops send these codes during normal operation + * with no discernable reason. Filter them out to avoid + * unmapped warning messages. + */ if (data[1] == ASUS_SPURIOUS_CODE_0XEA || data[1] == ASUS_SPURIOUS_CODE_0XEC || data[1] == ASUS_SPURIOUS_CODE_0X02 || |
