]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
HID: asus: Implement Fn+F5 fan control key handler
authorIonut Nechita <ionut_n2001@yahoo.com>
Wed, 7 Jan 2026 15:42:24 +0000 (17:42 +0200)
committerJiri Kosina <jkosina@suse.com>
Thu, 8 Jan 2026 11:17:16 +0000 (12:17 +0100)
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>
drivers/hid/hid-asus.c

index f778387c3c5577c161026abfb059770f519e8c0b..7d21899165652e5b7c2b22c7003fdffb30bfa836 100644 (file)
@@ -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 ||