From nobody Mon Apr 6 10:31:27 2026 Received: from relay12.grserver.gr (relay12.grserver.gr [88.99.38.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 85A632153D2; Mon, 13 Oct 2025 20:17:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=88.99.38.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760386671; cv=none; b=WeBTjy5t3xAqDm1AHd8FkcD+mOGdwipIlE0ooY4ZXDwEXa/OqAgiiCR4tKlE/meMLD7m9YU62DGY5ClFAWQcbg86FDuFeYbsY+I7V4JGIzp0b+oza5eoBoxLtpsR8uM/dlQt6+DthPZrENi6eStrIbTIwGDDbvOrD8KHZL2GTrA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760386671; c=relaxed/simple; bh=rlpDLaaREwfzK6sYx7OycZ3LKmEvwI0ygD0+uGbc7hw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nLYcsVj5Ixis/wxjhPWOZ2yxt1AhhJMMo4dJYT7U2MGSQ5rCbRMIUzQclaVTIzzQbivWEj/9PtTi6fuKzGJOJjsqgY/Vl0kem/pmTHWV0CxTQlx4SRFiYSRDn+9Pe+sbw95lQ+3xSXU7aMpeLjvyJb8RECXZjxobeAjvLkb2Uiw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=antheas.dev; spf=pass smtp.mailfrom=antheas.dev; dkim=temperror (0-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=RJ/rOLjJ; arc=none smtp.client-ip=88.99.38.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=antheas.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=antheas.dev Authentication-Results: smtp.subspace.kernel.org; dkim=temperror (0-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="RJ/rOLjJ" Received: from relay12 (localhost [127.0.0.1]) by relay12.grserver.gr (Proxmox) with ESMTP id 7DFA8BDA52; Mon, 13 Oct 2025 23:17:42 +0300 (EEST) Received: from linux3247.grserver.gr (linux3247.grserver.gr [213.158.90.240]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by relay12.grserver.gr (Proxmox) with ESMTPS id BCFB8BD71C; Mon, 13 Oct 2025 23:17:41 +0300 (EEST) Received: from antheas-z13 (x5996a8de.customers.hiper-net.dk [89.150.168.222]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 7FD731FDC0B; Mon, 13 Oct 2025 23:17:39 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1760386661; bh=qc+3LsItBV+z9wxTS44elVxHa73zsGTlYy1E2ZNNEr8=; h=From:To:Subject; b=RJ/rOLjJaJT1A5NSGrhFEc/R2POqrlcTfRCclng2SzvAce4ds913Xf900NkZP7g32 evdA5VXrrKMC4TMS7WL7/xEBN0ahi2NqJXs8ywFesLrNLXn/1bg+uHawt7H5Vr1vRy e3g6mr0lBdIeq8NwvT28UswO7PGEuGxk9UlVC+zkJ8DCAv43ldk5uTWoe5oVHM1QTN /3mY6NkGnVAx1HKvpL2oabeY2+6jkIfsSVs4ADuXomz7BjiXyrjF3pIipjlnRty+7x Z48FNBgOFQ1eBvOfubF2IcMcTzceVRbEmpe8Zi63lWwU6ZD29gz6ZfBL8BK5qGDU4C q5LKfyIcu66ag== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 89.150.168.222) smtp.mailfrom=lkml@antheas.dev smtp.helo=antheas-z13 Received-SPF: pass (linux3247.grserver.gr: connection is authenticated) From: Antheas Kapenekakis To: platform-driver-x86@vger.kernel.org, linux-input@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Jiri Kosina , Benjamin Tissoires , Corentin Chary , "Luke D . Jones" , Hans de Goede , =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Denis Benato , Antheas Kapenekakis Subject: [PATCH v6 1/7] HID: asus: refactor init sequence per spec Date: Mon, 13 Oct 2025 22:15:29 +0200 Message-ID: <20251013201535.6737-2-lkml@antheas.dev> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251013201535.6737-1-lkml@antheas.dev> References: <20251013201535.6737-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-PPP-Message-ID: <176038666140.3397346.12049812251057801568@linux3247.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 1.4.3 at linux3247.grserver.gr X-Virus-Status: Clean Content-Type: text/plain; charset="utf-8" Currently, asus_kbd_init() uses a reverse engineered init sequence from Windows, which contains the handshakes from multiple programs. Keep the main one, which is 0x5a (meant for brightness drivers). In addition, perform a get_response and check if the response is the same. To avoid regressions, print an error if the response does not match instead of rejecting device. Then, refactor asus_kbd_get_functions() to use the same ID it is called with, instead of hardcoding it to 0x5a so that it may be used for 0x0d in the future. Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 91 ++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 43 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index a444d41e53b6..d0c783df99bc 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -48,7 +48,7 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); #define FEATURE_REPORT_ID 0x0d #define INPUT_REPORT_ID 0x5d #define FEATURE_KBD_REPORT_ID 0x5a -#define FEATURE_KBD_REPORT_SIZE 16 +#define FEATURE_KBD_REPORT_SIZE 64 #define FEATURE_KBD_LED_REPORT_ID1 0x5d #define FEATURE_KBD_LED_REPORT_ID2 0x5e =20 @@ -393,14 +393,37 @@ static int asus_kbd_set_report(struct hid_device *hde= v, const u8 *buf, size_t bu =20 static int asus_kbd_init(struct hid_device *hdev, u8 report_id) { - const u8 buf[] =3D { report_id, 0x41, 0x53, 0x55, 0x53, 0x20, 0x54, - 0x65, 0x63, 0x68, 0x2e, 0x49, 0x6e, 0x63, 0x2e, 0x00 }; + /* + * The handshake is first sent as a set_report, then retrieved + * from a get_report. They should be equal. + */ + const u8 buf[] =3D { report_id, 0x41, 0x53, 0x55, 0x53, 0x20, + 0x54, 0x65, 0x63, 0x68, 0x2e, 0x49, 0x6e, 0x63, 0x2e, 0x00 }; + u8 *readbuf; int ret; =20 ret =3D asus_kbd_set_report(hdev, buf, sizeof(buf)); - if (ret < 0) - hid_err(hdev, "Asus failed to send init command: %d\n", ret); + if (ret < 0) { + hid_err(hdev, "Asus failed to send handshake: %d\n", ret); + return ret; + } + + readbuf =3D kzalloc(FEATURE_KBD_REPORT_SIZE, GFP_KERNEL); + if (!readbuf) + return -ENOMEM; + + ret =3D hid_hw_raw_request(hdev, report_id, readbuf, + FEATURE_KBD_REPORT_SIZE, HID_FEATURE_REPORT, + HID_REQ_GET_REPORT); + if (ret < 0) { + hid_err(hdev, "Asus failed to receive handshake ack: %d\n", ret); + } else if (memcmp(readbuf, buf, sizeof(buf)) !=3D 0) { + hid_warn(hdev, "Asus handshake returned invalid response: %*ph\n", + FEATURE_KBD_REPORT_SIZE, readbuf); + // Do not return error if handshake is wrong to avoid regressions + } =20 + kfree(readbuf); return ret; } =20 @@ -422,7 +445,7 @@ static int asus_kbd_get_functions(struct hid_device *hd= ev, if (!readbuf) return -ENOMEM; =20 - ret =3D hid_hw_raw_request(hdev, FEATURE_KBD_REPORT_ID, readbuf, + ret =3D hid_hw_raw_request(hdev, report_id, readbuf, FEATURE_KBD_REPORT_SIZE, HID_FEATURE_REPORT, HID_REQ_GET_REPORT); if (ret < 0) { @@ -638,50 +661,32 @@ static int asus_kbd_register_leds(struct hid_device *= hdev) unsigned char kbd_func; int ret; =20 - if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { - /* Initialize keyboard */ - ret =3D asus_kbd_init(hdev, FEATURE_KBD_REPORT_ID); - if (ret < 0) - return ret; - - /* The LED endpoint is initialised in two HID */ - ret =3D asus_kbd_init(hdev, FEATURE_KBD_LED_REPORT_ID1); - if (ret < 0) - return ret; - - ret =3D asus_kbd_init(hdev, FEATURE_KBD_LED_REPORT_ID2); - if (ret < 0) - return ret; - - if (dmi_match(DMI_PRODUCT_FAMILY, "ProArt P16")) { - ret =3D asus_kbd_disable_oobe(hdev); - if (ret < 0) - return ret; - } - - if (drvdata->quirks & QUIRK_ROG_ALLY_XPAD) { - intf =3D to_usb_interface(hdev->dev.parent); - udev =3D interface_to_usbdev(intf); - validate_mcu_fw_version(hdev, - le16_to_cpu(udev->descriptor.idProduct)); - } + ret =3D asus_kbd_init(hdev, FEATURE_KBD_REPORT_ID); + if (ret < 0) + return ret; =20 - } else { - /* Initialize keyboard */ - ret =3D asus_kbd_init(hdev, FEATURE_KBD_REPORT_ID); - if (ret < 0) - return ret; + /* Get keyboard functions */ + ret =3D asus_kbd_get_functions(hdev, &kbd_func, FEATURE_KBD_REPORT_ID); + if (ret < 0) + return ret; =20 - /* Get keyboard functions */ - ret =3D asus_kbd_get_functions(hdev, &kbd_func, FEATURE_KBD_REPORT_ID); + if (dmi_match(DMI_PRODUCT_FAMILY, "ProArt P16")) { + ret =3D asus_kbd_disable_oobe(hdev); if (ret < 0) return ret; + } =20 - /* Check for backlight support */ - if (!(kbd_func & SUPPORT_KBD_BACKLIGHT)) - return -ENODEV; + if (drvdata->quirks & QUIRK_ROG_ALLY_XPAD) { + intf =3D to_usb_interface(hdev->dev.parent); + udev =3D interface_to_usbdev(intf); + validate_mcu_fw_version( + hdev, le16_to_cpu(udev->descriptor.idProduct)); } =20 + /* Check for backlight support */ + if (!(kbd_func & SUPPORT_KBD_BACKLIGHT)) + return -ENODEV; + drvdata->kbd_backlight =3D devm_kzalloc(&hdev->dev, sizeof(struct asus_kbd_leds), GFP_KERNEL); --=20 2.51.0 From nobody Mon Apr 6 10:31:27 2026 Received: from relay13.grserver.gr (relay13.grserver.gr [178.156.171.147]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C86DA2DE711; Mon, 13 Oct 2025 20:17:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=178.156.171.147 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760386674; cv=none; b=fKkgdOnzokFxQQE+0zFMRRROknFSqYFPp3rXtSjOSSiwWR7KGx3YzG5g4gPrWgmbsu9W/lV9G+aizwsQcBp6wYSdm7iulsoty+xbwGbYKb5Muvn2AZfijSKuactiDvl/kJNbRIFDQDPr1cVUXaseNi4P28+LIoNpVVG6ng7kncA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760386674; c=relaxed/simple; bh=rpuSBiB6EgUkCx6CkZ8qNxXaWxXB0j4Lc4dTfPm+GqU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nOIbJ7yNxzbQ938lv+cQ50Mi7eB/tbqeJo66ZdUIt5N9K4xbtBXrPELDCyXoLp/O+rYQYGWu5uvBfdYi7k75KoDFzqtuGHXo0Caswseu9wJ+iTMXyvI/6Dqu6GKvnb78JEXSonm1NDiOBAaD1YG9OMHM/Lw+7eHRmNuNIvGlNwc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=antheas.dev; spf=pass smtp.mailfrom=antheas.dev; dkim=temperror (0-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=XRG5GWCb; arc=none smtp.client-ip=178.156.171.147 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=antheas.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=antheas.dev Authentication-Results: smtp.subspace.kernel.org; dkim=temperror (0-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="XRG5GWCb" Received: from relay13 (localhost [127.0.0.1]) by relay13.grserver.gr (Proxmox) with ESMTP id 7649A5E4E7; Mon, 13 Oct 2025 23:17:46 +0300 (EEST) Received: from linux3247.grserver.gr (linux3247.grserver.gr [213.158.90.240]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by relay13.grserver.gr (Proxmox) with ESMTPS id CE6AE5E4F7; Mon, 13 Oct 2025 23:17:44 +0300 (EEST) Received: from antheas-z13 (x5996a8de.customers.hiper-net.dk [89.150.168.222]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 012C61FDBBF; Mon, 13 Oct 2025 23:17:41 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1760386664; bh=rJl097qdwBHxkGru0hRkRIXBHw7VbtWnCJsB7V1mJXk=; h=From:To:Subject; b=XRG5GWCbrNmwCx1C7aUjI+RtdGQiGaKUuhTmXg8OxxPk5KmeuIQwEWFgxYoGiYGFc Fcqu0ohEekY9SRi/yWNI/7RjkUtCx0dKgYa6jXPUhqS2HLwiZ/Dxz3xLMP0Sfvndq1 S4FoqZygx5uzXw0+OB7Z+ZTLtYgryK/yNsDoM4oKGH1gYqBRF4yn/L7mJHfdcgZYRT y7B3Uex0KxJ+Md23XhI1KHql2qeJ3TX8kVXAskNbpRlt6jmCzzgJl6cNhq0DOUkahx vI03UOg2h+RjGnNMYv0uDXKjqicvEa5b70xRnSXEc7a2ipCgFr6Si0cW+MMblcK+Um gSFQJR8GsNmQg== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 89.150.168.222) smtp.mailfrom=lkml@antheas.dev smtp.helo=antheas-z13 Received-SPF: pass (linux3247.grserver.gr: connection is authenticated) From: Antheas Kapenekakis To: platform-driver-x86@vger.kernel.org, linux-input@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Jiri Kosina , Benjamin Tissoires , Corentin Chary , "Luke D . Jones" , Hans de Goede , =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Denis Benato , Antheas Kapenekakis Subject: [PATCH v6 2/7] HID: asus: prevent binding to all HID devices on ROG Date: Mon, 13 Oct 2025 22:15:30 +0200 Message-ID: <20251013201535.6737-3-lkml@antheas.dev> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251013201535.6737-1-lkml@antheas.dev> References: <20251013201535.6737-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-PPP-Message-ID: <176038666391.3397392.2817820166012120045@linux3247.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 1.4.3 at linux3247.grserver.gr X-Virus-Status: Clean Content-Type: text/plain; charset="utf-8" ROG keyboards are HID compliant and only care about the endpoint that produces vendor events (e.g., fan mode) and has the keyboard backlight. Therefore, handle all of the endpoints of ROG keyboards as compliant, by adding HID_QUIRK_INPUT_PER_APP and, for devices other than the vendor one, by adding QUIRK_HANDLE_GENERIC to stop mutating them. Due to HID_QUIRK_INPUT_PER_APP, rgb register is moved into probe, as the input_* functions are called multiple times (4 for the Z13). Reviewed-by: Luke D. Jones Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 71 +++++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 21 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index d0c783df99bc..a62559e3e064 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -47,6 +47,7 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); #define T100CHI_MOUSE_REPORT_ID 0x06 #define FEATURE_REPORT_ID 0x0d #define INPUT_REPORT_ID 0x5d +#define HID_USAGE_PAGE_VENDOR 0xff310000 #define FEATURE_KBD_REPORT_ID 0x5a #define FEATURE_KBD_REPORT_SIZE 64 #define FEATURE_KBD_LED_REPORT_ID1 0x5d @@ -89,6 +90,7 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); #define QUIRK_ROG_NKEY_KEYBOARD BIT(11) #define QUIRK_ROG_CLAYMORE_II_KEYBOARD BIT(12) #define QUIRK_ROG_ALLY_XPAD BIT(13) +#define QUIRK_HANDLE_GENERIC BIT(14) =20 #define I2C_KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \ QUIRK_NO_INIT_REPORTS | \ @@ -125,7 +127,6 @@ struct asus_drvdata { struct input_dev *tp_kbd_input; struct asus_kbd_leds *kbd_backlight; const struct asus_touchpad_info *tp; - bool enable_backlight; struct power_supply *battery; struct power_supply_desc battery_desc; int battery_capacity; @@ -316,7 +317,7 @@ static int asus_e1239t_event(struct asus_drvdata *drvda= t, u8 *data, int size) static int asus_event(struct hid_device *hdev, struct hid_field *field, struct hid_usage *usage, __s32 value) { - if ((usage->hid & HID_USAGE_PAGE) =3D=3D 0xff310000 && + if ((usage->hid & HID_USAGE_PAGE) =3D=3D HID_USAGE_PAGE_VENDOR && (usage->hid & HID_USAGE) !=3D 0x00 && (usage->hid & HID_USAGE) !=3D 0xff && !usage->type) { hid_warn(hdev, "Unmapped Asus vendor usagepage code 0x%02x\n", @@ -331,6 +332,10 @@ static int asus_raw_event(struct hid_device *hdev, { struct asus_drvdata *drvdata =3D hid_get_drvdata(hdev); =20 + /* NOOP on generic HID devices to avoid side effects. */ + if (drvdata->quirks & QUIRK_HANDLE_GENERIC) + return 0; + if (drvdata->battery && data[0] =3D=3D BATTERY_REPORT_ID) return asus_report_battery(drvdata, data, size); =20 @@ -875,6 +880,10 @@ static int asus_input_configured(struct hid_device *hd= ev, struct hid_input *hi) struct input_dev *input =3D hi->input; struct asus_drvdata *drvdata =3D hid_get_drvdata(hdev); =20 + /* NOOP on generic HID devices to avoid side effects. */ + if (drvdata->quirks & QUIRK_HANDLE_GENERIC) + return 0; + /* T100CHI uses MULTI_INPUT, bind the touchpad to the mouse hid_input */ if (drvdata->quirks & QUIRK_T100CHI && hi->report->id !=3D T100CHI_MOUSE_REPORT_ID) @@ -928,11 +937,6 @@ static int asus_input_configured(struct hid_device *hd= ev, struct hid_input *hi) =20 drvdata->input =3D input; =20 - if (drvdata->enable_backlight && - !asus_kbd_wmi_led_control_present(hdev) && - asus_kbd_register_leds(hdev)) - hid_warn(hdev, "Failed to initialize backlight.\n"); - return 0; } =20 @@ -952,6 +956,10 @@ static int asus_input_mapping(struct hid_device *hdev, return -1; } =20 + /* NOOP on generic HID devices to avoid side effects. */ + if (drvdata->quirks & QUIRK_HANDLE_GENERIC) + return 0; + /* * Ignore a bunch of bogus collections in the T100CHI descriptor. * This avoids a bunch of non-functional hid_input devices getting @@ -1005,15 +1013,6 @@ static int asus_input_mapping(struct hid_device *hde= v, return -1; } =20 - /* - * Check and enable backlight only on devices with UsagePage =3D=3D - * 0xff31 to avoid initializing the keyboard firmware multiple - * times on devices with multiple HID descriptors but same - * PID/VID. - */ - if (drvdata->quirks & QUIRK_USE_KBD_BACKLIGHT) - drvdata->enable_backlight =3D true; - set_bit(EV_REP, hi->input->evbit); return 1; } @@ -1130,8 +1129,10 @@ static int __maybe_unused asus_reset_resume(struct h= id_device *hdev) =20 static int asus_probe(struct hid_device *hdev, const struct hid_device_id = *id) { - int ret; + struct hid_report_enum *rep_enum; struct asus_drvdata *drvdata; + struct hid_report *rep; + int ret, is_vendor =3D 0; =20 drvdata =3D devm_kzalloc(&hdev->dev, sizeof(*drvdata), GFP_KERNEL); if (drvdata =3D=3D NULL) { @@ -1215,18 +1216,42 @@ static int asus_probe(struct hid_device *hdev, cons= t struct hid_device_id *id) return ret; } =20 + /* Check for vendor for RGB init and handle generic devices properly. */ + rep_enum =3D &hdev->report_enum[HID_INPUT_REPORT]; + list_for_each_entry(rep, &rep_enum->report_list, list) { + if ((rep->application & HID_USAGE_PAGE) =3D=3D HID_USAGE_PAGE_VENDOR) + is_vendor =3D true; + } + + /* + * For ROG keyboards, make them hid compliant by + * creating one input per application. For interfaces other than + * the vendor one, disable hid-asus handlers. + */ + if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { + if (!is_vendor) + drvdata->quirks |=3D QUIRK_HANDLE_GENERIC; + hdev->quirks |=3D HID_QUIRK_INPUT_PER_APP; + } + ret =3D hid_hw_start(hdev, HID_CONNECT_DEFAULT); if (ret) { hid_err(hdev, "Asus hw start failed: %d\n", ret); return ret; } =20 + if (is_vendor && (drvdata->quirks & QUIRK_USE_KBD_BACKLIGHT) && + !asus_kbd_wmi_led_control_present(hdev) && + asus_kbd_register_leds(hdev)) + hid_warn(hdev, "Failed to initialize backlight.\n"); + /* - * Check that input registration succeeded. Checking that - * HID_CLAIMED_INPUT is set prevents a UAF when all input devices - * were freed during registration due to no usages being mapped, - * leaving drvdata->input pointing to freed memory. + * For ROG keyboards, skip rename for consistency and ->input check as + * some devices do not have inputs. */ + if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) + return 0; + if (!drvdata->input || !(hdev->claimed & HID_CLAIMED_INPUT)) { hid_err(hdev, "Asus input not registered\n"); ret =3D -ENOMEM; @@ -1277,6 +1302,10 @@ static const __u8 *asus_report_fixup(struct hid_devi= ce *hdev, __u8 *rdesc, { struct asus_drvdata *drvdata =3D hid_get_drvdata(hdev); =20 + /* NOOP on generic HID devices to avoid side effects. */ + if (drvdata->quirks & QUIRK_HANDLE_GENERIC) + return rdesc; + if (drvdata->quirks & QUIRK_FIX_NOTEBOOK_REPORT && *rsize >=3D 56 && rdesc[54] =3D=3D 0x25 && rdesc[55] =3D=3D 0x65) { hid_info(hdev, "Fixing up Asus notebook report descriptor\n"); --=20 2.51.0 From nobody Mon Apr 6 10:31:27 2026 Received: from relay13.grserver.gr (relay13.grserver.gr [178.156.171.147]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D64732E2EE4; Mon, 13 Oct 2025 20:17:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=178.156.171.147 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760386676; cv=none; b=hXHHsaJ7CNxP21SIyc6TIsrs0xRD2sEa+JoNlAx6ltet6P6U5nsHi9QoUV4ZOCExeE1KDrdNuElEvJ9BVHC9vMr7UmQfFEcvHmEpEuCoXMXdg0ra+1qCck4KIEM6FoQR+gb6nnfiA+5wSO/rG3eKFIDP8jcNNcjjtO3CF2/FGkc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760386676; c=relaxed/simple; bh=5zTcIJxcciiINvKHDME9IyVkO0G7SwjDVtfwPljV/R8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OMLXcMsICbJbi5oAsxgGcIS8sP7RpSGHfTz0c7vVpLuJaz5zHr92tAm960qMZWpGzDAYHBbl77qdGUM1fAgMhCjZFSW4ha1bBXHbbz2iTyUGkBTKxoAbzyOm/cjTs/ADjHZQjzJm311tOQuu/WO0Ia/KeHtaznsn4/OWOFg/GaM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=antheas.dev; spf=pass smtp.mailfrom=antheas.dev; dkim=temperror (0-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=QikBfYck; arc=none smtp.client-ip=178.156.171.147 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=antheas.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=antheas.dev Authentication-Results: smtp.subspace.kernel.org; dkim=temperror (0-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="QikBfYck" Received: from relay13 (localhost [127.0.0.1]) by relay13.grserver.gr (Proxmox) with ESMTP id EB4CE5E4D7; Mon, 13 Oct 2025 23:17:47 +0300 (EEST) Received: from linux3247.grserver.gr (linux3247.grserver.gr [213.158.90.240]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by relay13.grserver.gr (Proxmox) with ESMTPS id 2262C5E4F7; Mon, 13 Oct 2025 23:17:47 +0300 (EEST) Received: from antheas-z13 (x5996a8de.customers.hiper-net.dk [89.150.168.222]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 692D41FDC0B; Mon, 13 Oct 2025 23:17:44 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1760386666; bh=Amc5vBhz8hofVCWjkWLyiSEcCiR+R+ulNjbPpMemVkw=; h=From:To:Subject; b=QikBfYck+yWuCbTwWRSPESLohMKjd+Os91ov3ZcEAd08OlxQjQ7qswSSGzoZAJfsN SLGuxR8HkcxJ8gDC8roTV5ozrWiqjk636ghC5TOkmlgFWRfgbUxSemfPUDjtFsKha4 G7z9iraVEfX1tNtjksKdXm11F770LN8Juew68zP+y1zOKmgDZGaDYG2ttmPvxdOcwE FyQAKzojp3MQNr9ODCOV6eDAb/Y/9obvvvxMks8JiOtKXksDmsikbyWZbvlzUp+4YH zqZG8yOCGWr4p9O3WVIqEcBKAYta1V2blnsgA6hFIOkxIsKeaOCPRYFVEd9468goqP jp8Il7c3W+tYg== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 89.150.168.222) smtp.mailfrom=lkml@antheas.dev smtp.helo=antheas-z13 Received-SPF: pass (linux3247.grserver.gr: connection is authenticated) From: Antheas Kapenekakis To: platform-driver-x86@vger.kernel.org, linux-input@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Jiri Kosina , Benjamin Tissoires , Corentin Chary , "Luke D . Jones" , Hans de Goede , =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Denis Benato , Antheas Kapenekakis Subject: [PATCH v6 3/7] platform/x86: asus-wmi: Add support for multiple kbd RGB handlers Date: Mon, 13 Oct 2025 22:15:31 +0200 Message-ID: <20251013201535.6737-4-lkml@antheas.dev> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251013201535.6737-1-lkml@antheas.dev> References: <20251013201535.6737-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-PPP-Message-ID: <176038666622.3397504.9375733686851379643@linux3247.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 1.4.3 at linux3247.grserver.gr X-Virus-Status: Clean Content-Type: text/plain; charset="utf-8" Some devices, such as the Z13 have multiple AURA devices connected to them by USB. In addition, they might have a WMI interface for RGB. In Windows, Armoury Crate exposes a unified brightness slider for all of them, with 3 brightness levels. Therefore, to be synergistic in Linux, and support existing tooling such as UPower, allow adding listeners to the RGB device of the WMI interface. If WMI does not exist, lazy initialize the interface. Reviewed-by: Luke D. Jones Tested-by: Luke D. Jones Signed-off-by: Antheas Kapenekakis --- drivers/platform/x86/asus-wmi.c | 118 ++++++++++++++++++--- include/linux/platform_data/x86/asus-wmi.h | 16 +++ 2 files changed, 121 insertions(+), 13 deletions(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wm= i.c index e72a2b5d158e..a2a7cd61fd59 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -258,6 +258,8 @@ struct asus_wmi { int tpd_led_wk; struct led_classdev kbd_led; int kbd_led_wk; + bool kbd_led_avail; + bool kbd_led_registered; struct led_classdev lightbar_led; int lightbar_led_wk; struct led_classdev micmute_led; @@ -1530,6 +1532,53 @@ static void asus_wmi_battery_exit(struct asus_wmi *a= sus) =20 /* LEDs ******************************************************************= *****/ =20 +struct asus_hid_ref { + struct list_head listeners; + struct asus_wmi *asus; + spinlock_t lock; +}; + +struct asus_hid_ref asus_ref =3D { + .listeners =3D LIST_HEAD_INIT(asus_ref.listeners), + .asus =3D NULL, + .lock =3D __SPIN_LOCK_UNLOCKED(asus_ref.lock), +}; + +int asus_hid_register_listener(struct asus_hid_listener *bdev) +{ + unsigned long flags; + int ret =3D 0; + + spin_lock_irqsave(&asus_ref.lock, flags); + list_add_tail(&bdev->list, &asus_ref.listeners); + if (asus_ref.asus) { + if (asus_ref.asus->kbd_led_registered && asus_ref.asus->kbd_led_wk >=3D = 0) + bdev->brightness_set(bdev, asus_ref.asus->kbd_led_wk); + + if (!asus_ref.asus->kbd_led_registered) { + ret =3D led_classdev_register( + &asus_ref.asus->platform_device->dev, + &asus_ref.asus->kbd_led); + if (!ret) + asus_ref.asus->kbd_led_registered =3D true; + } + } + spin_unlock_irqrestore(&asus_ref.lock, flags); + + return ret; +} +EXPORT_SYMBOL_GPL(asus_hid_register_listener); + +void asus_hid_unregister_listener(struct asus_hid_listener *bdev) +{ + unsigned long flags; + + spin_lock_irqsave(&asus_ref.lock, flags); + list_del(&bdev->list); + spin_unlock_irqrestore(&asus_ref.lock, flags); +} +EXPORT_SYMBOL_GPL(asus_hid_unregister_listener); + /* * These functions actually update the LED's, and are called from a * workqueue. By doing this as separate work rather than when the LED @@ -1609,6 +1658,7 @@ static int kbd_led_read(struct asus_wmi *asus, int *l= evel, int *env) =20 static void do_kbd_led_set(struct led_classdev *led_cdev, int value) { + struct asus_hid_listener *listener; struct asus_wmi *asus; int max_level; =20 @@ -1616,25 +1666,39 @@ static void do_kbd_led_set(struct led_classdev *led= _cdev, int value) max_level =3D asus->kbd_led.max_brightness; =20 asus->kbd_led_wk =3D clamp_val(value, 0, max_level); - kbd_led_update(asus); + + if (asus->kbd_led_avail) + kbd_led_update(asus); + + list_for_each_entry(listener, &asus_ref.listeners, list) + listener->brightness_set(listener, asus->kbd_led_wk); } =20 static void kbd_led_set(struct led_classdev *led_cdev, enum led_brightness value) { + unsigned long flags; + /* Prevent disabling keyboard backlight on module unregister */ if (led_cdev->flags & LED_UNREGISTERING) return; =20 + spin_lock_irqsave(&asus_ref.lock, flags); do_kbd_led_set(led_cdev, value); + spin_unlock_irqrestore(&asus_ref.lock, flags); } =20 static void kbd_led_set_by_kbd(struct asus_wmi *asus, enum led_brightness = value) { - struct led_classdev *led_cdev =3D &asus->kbd_led; + struct led_classdev *led_cdev; + unsigned long flags; + + spin_lock_irqsave(&asus_ref.lock, flags); + led_cdev =3D &asus->kbd_led; =20 do_kbd_led_set(led_cdev, value); led_classdev_notify_brightness_hw_changed(led_cdev, asus->kbd_led_wk); + spin_unlock_irqrestore(&asus_ref.lock, flags); } =20 static enum led_brightness kbd_led_get(struct led_classdev *led_cdev) @@ -1644,6 +1708,9 @@ static enum led_brightness kbd_led_get(struct led_cla= ssdev *led_cdev) =20 asus =3D container_of(led_cdev, struct asus_wmi, kbd_led); =20 + if (!asus->kbd_led_avail) + return asus->kbd_led_wk; + retval =3D kbd_led_read(asus, &value, NULL); if (retval < 0) return retval; @@ -1759,7 +1826,15 @@ static int camera_led_set(struct led_classdev *led_c= dev, =20 static void asus_wmi_led_exit(struct asus_wmi *asus) { - led_classdev_unregister(&asus->kbd_led); + unsigned long flags; + + spin_lock_irqsave(&asus_ref.lock, flags); + asus_ref.asus =3D NULL; + spin_unlock_irqrestore(&asus_ref.lock, flags); + + if (asus->kbd_led_registered) + led_classdev_unregister(&asus->kbd_led); + led_classdev_unregister(&asus->tpd_led); led_classdev_unregister(&asus->wlan_led); led_classdev_unregister(&asus->lightbar_led); @@ -1773,6 +1848,8 @@ static void asus_wmi_led_exit(struct asus_wmi *asus) static int asus_wmi_led_init(struct asus_wmi *asus) { int rv =3D 0, num_rgb_groups =3D 0, led_val; + struct asus_hid_listener *listener; + unsigned long flags; =20 if (asus->kbd_rgb_dev) kbd_rgb_mode_groups[num_rgb_groups++] =3D &kbd_rgb_mode_group; @@ -1797,23 +1874,38 @@ static int asus_wmi_led_init(struct asus_wmi *asus) goto error; } =20 - if (!kbd_led_read(asus, &led_val, NULL) && !dmi_check_system(asus_use_hid= _led_dmi_ids)) { - pr_info("using asus-wmi for asus::kbd_backlight\n"); + asus->kbd_led.name =3D "asus::kbd_backlight"; + asus->kbd_led.flags =3D LED_BRIGHT_HW_CHANGED; + asus->kbd_led.brightness_set =3D kbd_led_set; + asus->kbd_led.brightness_get =3D kbd_led_get; + asus->kbd_led.max_brightness =3D 3; + asus->kbd_led_avail =3D !kbd_led_read(asus, &led_val, NULL); + + if (asus->kbd_led_avail) asus->kbd_led_wk =3D led_val; - asus->kbd_led.name =3D "asus::kbd_backlight"; - asus->kbd_led.flags =3D LED_BRIGHT_HW_CHANGED; - asus->kbd_led.brightness_set =3D kbd_led_set; - asus->kbd_led.brightness_get =3D kbd_led_get; - asus->kbd_led.max_brightness =3D 3; + else + asus->kbd_led_wk =3D -1; =20 - if (num_rgb_groups !=3D 0) - asus->kbd_led.groups =3D kbd_rgb_mode_groups; + if (asus->kbd_led_avail && num_rgb_groups !=3D 0) + asus->kbd_led.groups =3D kbd_rgb_mode_groups; =20 + spin_lock_irqsave(&asus_ref.lock, flags); + if (asus->kbd_led_avail || !list_empty(&asus_ref.listeners)) { rv =3D led_classdev_register(&asus->platform_device->dev, &asus->kbd_led); - if (rv) + if (rv) { + spin_unlock_irqrestore(&asus_ref.lock, flags); goto error; + } + asus->kbd_led_registered =3D true; + + if (asus->kbd_led_wk >=3D 0) { + list_for_each_entry(listener, &asus_ref.listeners, list) + listener->brightness_set(listener, asus->kbd_led_wk); + } } + asus_ref.asus =3D asus; + spin_unlock_irqrestore(&asus_ref.lock, flags); =20 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_WIRELESS_LED) && (asus->driver->quirks->wapf > 0)) { diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/pla= tform_data/x86/asus-wmi.h index 8a515179113d..f13a701f47a8 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -163,11 +163,19 @@ enum asus_ally_mcu_hack { ASUS_WMI_ALLY_MCU_HACK_DISABLED, }; =20 +struct asus_hid_listener { + struct list_head list; + void (*brightness_set)(struct asus_hid_listener *listener, int brightness= ); +}; + #if IS_REACHABLE(CONFIG_ASUS_WMI) void set_ally_mcu_hack(enum asus_ally_mcu_hack status); void set_ally_mcu_powersave(bool enabled); int asus_wmi_set_devstate(u32 dev_id, u32 ctrl_param, u32 *retval); int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retva= l); + +int asus_hid_register_listener(struct asus_hid_listener *cdev); +void asus_hid_unregister_listener(struct asus_hid_listener *cdev); #else static inline void set_ally_mcu_hack(enum asus_ally_mcu_hack status) { @@ -184,6 +192,14 @@ static inline int asus_wmi_evaluate_method(u32 method_= id, u32 arg0, u32 arg1, { return -ENODEV; } + +static inline int asus_hid_register_listener(struct asus_hid_listener *bde= v) +{ + return -ENODEV; +} +static inline void asus_hid_unregister_listener(struct asus_hid_listener *= bdev) +{ +} #endif =20 /* To be used by both hid-asus and asus-wmi to determine which controls kb= d_brightness */ --=20 2.51.0 From nobody Mon Apr 6 10:31:27 2026 Received: from relay12.grserver.gr (relay12.grserver.gr [88.99.38.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5CC6626D4DF; Mon, 13 Oct 2025 20:17:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=88.99.38.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760386673; cv=none; b=f9iu8bG5/vP0hbrekK97LT/WF8soPHqaL4sk+m6i7Gmxb2L+WLVSpdRleSZQS75YCvdMaPPH4PJAaagTUBliNXJhfJVYYIP/8t5UlqDcVvgPwxDeClVQAJtl8gcrCiUmHcb4UGo89X3fRdBQ5CikSRNJ+GBO3m4SsNUdnxG2dnI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760386673; c=relaxed/simple; bh=6F512Lws1Yqct1j/nCf5pOXp+PJ7YrOIdz7oRI2Q0aE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rtzn7/b4uvUF+sP3CLLqDWCJIHade/26SLsGGJMBOHqQw2ZhZQSUEDPcIWTsLeRSd/yliSFd1Fwd7j/IpErTm0jBIM4pqJw9hUGXYQRpL2iovV5+rSKBec05yJM+AtkEOTXC/yGE/IIaasDU/EbZ9IjGJebTE7sEimdICRnmFW8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=antheas.dev; spf=pass smtp.mailfrom=antheas.dev; dkim=temperror (0-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=EkW6Ga7L; arc=none smtp.client-ip=88.99.38.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=antheas.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=antheas.dev Authentication-Results: smtp.subspace.kernel.org; dkim=temperror (0-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="EkW6Ga7L" Received: from relay12 (localhost [127.0.0.1]) by relay12.grserver.gr (Proxmox) with ESMTP id 83552BD8AF; Mon, 13 Oct 2025 23:17:49 +0300 (EEST) Received: from linux3247.grserver.gr (linux3247.grserver.gr [213.158.90.240]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by relay12.grserver.gr (Proxmox) with ESMTPS id EB038BD71C; Mon, 13 Oct 2025 23:17:48 +0300 (EEST) Received: from antheas-z13 (x5996a8de.customers.hiper-net.dk [89.150.168.222]) by linux3247.grserver.gr (Postfix) with ESMTPSA id C7D1A1FDBBF; Mon, 13 Oct 2025 23:17:46 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1760386668; bh=unnD2g3xnhn8qrELEdP2QQJmWZwX9mHbgh96u3AxCq8=; h=From:To:Subject; b=EkW6Ga7LkBqED8F/x2BpNYYQym2vVjvWD5bNveulfw826tmVSQ8Oz2W9cjSf89ACY 9Iv4VicRKkuxkmy5RvQBDKJpyPmvsyObtKPd+L9mlwFAT7+bh81sTtdW1eoSlUmtIx DiJ/rJpdt6UKhPbHETpDj+oERpTqXiP8v5e9yF0DQ2Vbz1vwQCoZhw5qFl4ggvcQbP oy/QWhV5Ni4s39NKudSn5G40wgE+6U0LfEQiCvvBrbzdTffjtxsJ9aos+QFa96F9BQ sc9tafYRE+ol5IDhGVYeVoQpl7fu7uWc3ClR/R//ZcEjo4+epLRC2ldTETuIiTj0xQ X+RAS6TAm81hQ== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 89.150.168.222) smtp.mailfrom=lkml@antheas.dev smtp.helo=antheas-z13 Received-SPF: pass (linux3247.grserver.gr: connection is authenticated) From: Antheas Kapenekakis To: platform-driver-x86@vger.kernel.org, linux-input@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Jiri Kosina , Benjamin Tissoires , Corentin Chary , "Luke D . Jones" , Hans de Goede , =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Denis Benato , Antheas Kapenekakis Subject: [PATCH v6 4/7] HID: asus: listen to the asus-wmi brightness device instead of creating one Date: Mon, 13 Oct 2025 22:15:32 +0200 Message-ID: <20251013201535.6737-5-lkml@antheas.dev> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251013201535.6737-1-lkml@antheas.dev> References: <20251013201535.6737-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-PPP-Message-ID: <176038666859.3397565.3130561150079845048@linux3247.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 1.4.3 at linux3247.grserver.gr X-Virus-Status: Clean Content-Type: text/plain; charset="utf-8" Some ROG laptops expose multiple interfaces for controlling the keyboard/RGB brightness. This creates a name conflict under asus::kbd_brightness, where the second device ends up being named asus::kbd_brightness_1 and they are both broken. Therefore, register a listener to the asus-wmi brightness device instead of creating a new one. Reviewed-by: Luke D. Jones Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 64 +++++++----------------------------------- 1 file changed, 10 insertions(+), 54 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index a62559e3e064..0af19c8ef035 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -102,7 +102,7 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); #define TRKID_SGN ((TRKID_MAX + 1) >> 1) =20 struct asus_kbd_leds { - struct led_classdev cdev; + struct asus_hid_listener listener; struct hid_device *hdev; struct work_struct work; unsigned int brightness; @@ -495,11 +495,11 @@ static void asus_schedule_work(struct asus_kbd_leds *= led) spin_unlock_irqrestore(&led->lock, flags); } =20 -static void asus_kbd_backlight_set(struct led_classdev *led_cdev, - enum led_brightness brightness) +static void asus_kbd_backlight_set(struct asus_hid_listener *listener, + int brightness) { - struct asus_kbd_leds *led =3D container_of(led_cdev, struct asus_kbd_leds, - cdev); + struct asus_kbd_leds *led =3D container_of(listener, struct asus_kbd_leds, + listener); unsigned long flags; =20 spin_lock_irqsave(&led->lock, flags); @@ -509,20 +509,6 @@ static void asus_kbd_backlight_set(struct led_classdev= *led_cdev, asus_schedule_work(led); } =20 -static enum led_brightness asus_kbd_backlight_get(struct led_classdev *led= _cdev) -{ - struct asus_kbd_leds *led =3D container_of(led_cdev, struct asus_kbd_leds, - cdev); - enum led_brightness brightness; - unsigned long flags; - - spin_lock_irqsave(&led->lock, flags); - brightness =3D led->brightness; - spin_unlock_irqrestore(&led->lock, flags); - - return brightness; -} - static void asus_kbd_backlight_work(struct work_struct *work) { struct asus_kbd_leds *led =3D container_of(work, struct asus_kbd_leds, wo= rk); @@ -539,34 +525,6 @@ static void asus_kbd_backlight_work(struct work_struct= *work) hid_err(led->hdev, "Asus failed to set keyboard backlight: %d\n", ret); } =20 -/* WMI-based keyboard backlight LED control (via asus-wmi driver) takes - * precedence. We only activate HID-based backlight control when the - * WMI control is not available. - */ -static bool asus_kbd_wmi_led_control_present(struct hid_device *hdev) -{ - struct asus_drvdata *drvdata =3D hid_get_drvdata(hdev); - u32 value; - int ret; - - if (!IS_ENABLED(CONFIG_ASUS_WMI)) - return false; - - if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD && - dmi_check_system(asus_use_hid_led_dmi_ids)) { - hid_info(hdev, "using HID for asus::kbd_backlight\n"); - return false; - } - - ret =3D asus_wmi_evaluate_method(ASUS_WMI_METHODID_DSTS, - ASUS_WMI_DEVID_KBD_BACKLIGHT, 0, &value); - hid_dbg(hdev, "WMI backlight check: rc %d value %x", ret, value); - if (ret) - return false; - - return !!(value & ASUS_WMI_DSTS_PRESENCE_BIT); -} - /* * We don't care about any other part of the string except the version sec= tion. * Example strings: FGA80100.RC72LA.312_T01, FGA80100.RC71LS.318_T01 @@ -701,14 +659,11 @@ static int asus_kbd_register_leds(struct hid_device *= hdev) drvdata->kbd_backlight->removed =3D false; drvdata->kbd_backlight->brightness =3D 0; drvdata->kbd_backlight->hdev =3D hdev; - drvdata->kbd_backlight->cdev.name =3D "asus::kbd_backlight"; - drvdata->kbd_backlight->cdev.max_brightness =3D 3; - drvdata->kbd_backlight->cdev.brightness_set =3D asus_kbd_backlight_set; - drvdata->kbd_backlight->cdev.brightness_get =3D asus_kbd_backlight_get; + drvdata->kbd_backlight->listener.brightness_set =3D asus_kbd_backlight_se= t; INIT_WORK(&drvdata->kbd_backlight->work, asus_kbd_backlight_work); spin_lock_init(&drvdata->kbd_backlight->lock); =20 - ret =3D devm_led_classdev_register(&hdev->dev, &drvdata->kbd_backlight->c= dev); + ret =3D asus_hid_register_listener(&drvdata->kbd_backlight->listener); if (ret < 0) { /* No need to have this still around */ devm_kfree(&hdev->dev, drvdata->kbd_backlight); @@ -1105,7 +1060,7 @@ static int __maybe_unused asus_resume(struct hid_devi= ce *hdev) { =20 if (drvdata->kbd_backlight) { const u8 buf[] =3D { FEATURE_KBD_REPORT_ID, 0xba, 0xc5, 0xc4, - drvdata->kbd_backlight->cdev.brightness }; + drvdata->kbd_backlight->brightness }; ret =3D asus_kbd_set_report(hdev, buf, sizeof(buf)); if (ret < 0) { hid_err(hdev, "Asus failed to set keyboard backlight: %d\n", ret); @@ -1241,7 +1196,6 @@ static int asus_probe(struct hid_device *hdev, const = struct hid_device_id *id) } =20 if (is_vendor && (drvdata->quirks & QUIRK_USE_KBD_BACKLIGHT) && - !asus_kbd_wmi_led_control_present(hdev) && asus_kbd_register_leds(hdev)) hid_warn(hdev, "Failed to initialize backlight.\n"); =20 @@ -1282,6 +1236,8 @@ static void asus_remove(struct hid_device *hdev) unsigned long flags; =20 if (drvdata->kbd_backlight) { + asus_hid_unregister_listener(&drvdata->kbd_backlight->listener); + spin_lock_irqsave(&drvdata->kbd_backlight->lock, flags); drvdata->kbd_backlight->removed =3D true; spin_unlock_irqrestore(&drvdata->kbd_backlight->lock, flags); --=20 2.51.0 From nobody Mon Apr 6 10:31:27 2026 Received: from relay11.grserver.gr (relay11.grserver.gr [78.46.171.57]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A1A8A2E0B42; Mon, 13 Oct 2025 20:17:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=78.46.171.57 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760386675; cv=none; b=O3STMLHOlJILl+sCoxJvoUXkOXKmylm+yeowFz4IhEI6AEVI7akEvkQD7b0fR71Ytg2URaV0Y+laOJEb+Bplon6RPTinEBFfPUqpwckCtna0GBNum90tJoNdR0ZRK3XPlVs/ItnO519GgmUP5zB9w3U3OIPgJQNSNKr6kH9KFX0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760386675; c=relaxed/simple; bh=Q1R5g6RCR0eVn7osuUYOjOCS0W0OBDb299rSngnMXj0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jwhYaGpxEbY6j2oQ2CX+57BRQTbYZQjVM7A4nbtnHowT7vwAB7PMYyEEhHvilHLYmGNz/siKneHuW9pyp3IGfgPn/Ao0AgfsatltEKMtN/4mAX6ci3Xk/4w1bcCziuRNEjV9srWweYFGU5XPu8RAoQQfUrVNNjywxvTLSqSx9rc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=antheas.dev; spf=pass smtp.mailfrom=antheas.dev; dkim=temperror (0-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=OLji6yeu; arc=none smtp.client-ip=78.46.171.57 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=antheas.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=antheas.dev Authentication-Results: smtp.subspace.kernel.org; dkim=temperror (0-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="OLji6yeu" Received: from relay11 (localhost.localdomain [127.0.0.1]) by relay11.grserver.gr (Proxmox) with ESMTP id D9B78C4CAE; Mon, 13 Oct 2025 23:17:51 +0300 (EEST) Received: from linux3247.grserver.gr (linux3247.grserver.gr [213.158.90.240]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by relay11.grserver.gr (Proxmox) with ESMTPS id 75859C4CA6; Mon, 13 Oct 2025 23:17:51 +0300 (EEST) Received: from antheas-z13 (x5996a8de.customers.hiper-net.dk [89.150.168.222]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 2A77D1FDBCD; Mon, 13 Oct 2025 23:17:49 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1760386671; bh=1/QmJQwkk3LrQS7y/nRlZtkyreNiia4OZ4Tcgd1js5c=; h=From:To:Subject; b=OLji6yeuNTcMgcq9Poqno54265/fJTIvRddU46qQCx+5ppbN5hez+i2mxRAkJZ4BL 8b83ASi2OXSQTjx+VlFfhxUmRHi/v4+af3Kn3b212zb4q7uEfBsa3MrwdFP8mmejE0 Yry5mTvYf/aUHy8VZfXFzGbo6j0oxwyO1NLS8wdBG5HZtwm9Yg7wW1YtRMU8FyWz4H t7RF0PbGoK3PzSStjN8AeSz9b2cvslouP4U3JpcX7ySTMmQIptlGU7c0aNVD7Ac9em ffpq2tNM3zcL5FOTyUQgGTI754mAlWJahWtXtkmeJncfcaT5BhoJE6UhZeGmn8qZmZ qAIMg1Q/rvV9Q== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 89.150.168.222) smtp.mailfrom=lkml@antheas.dev smtp.helo=antheas-z13 Received-SPF: pass (linux3247.grserver.gr: connection is authenticated) From: Antheas Kapenekakis To: platform-driver-x86@vger.kernel.org, linux-input@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Jiri Kosina , Benjamin Tissoires , Corentin Chary , "Luke D . Jones" , Hans de Goede , =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Denis Benato , Antheas Kapenekakis Subject: [PATCH v6 5/7] platform/x86: asus-wmi: remove unused keyboard backlight quirk Date: Mon, 13 Oct 2025 22:15:33 +0200 Message-ID: <20251013201535.6737-6-lkml@antheas.dev> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251013201535.6737-1-lkml@antheas.dev> References: <20251013201535.6737-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-PPP-Message-ID: <176038667114.3397618.15634674993346894509@linux3247.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 1.4.3 at linux3247.grserver.gr X-Virus-Status: Clean Content-Type: text/plain; charset="utf-8" The quirk for selecting whether keyboard backlight should be controlled by HID or WMI is not needed anymore, so remove it. Reviewed-by: Luke D. Jones Signed-off-by: Antheas Kapenekakis --- include/linux/platform_data/x86/asus-wmi.h | 40 ---------------------- 1 file changed, 40 deletions(-) diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/pla= tform_data/x86/asus-wmi.h index f13a701f47a8..1f85d76387a8 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -202,44 +202,4 @@ static inline void asus_hid_unregister_listener(struct= asus_hid_listener *bdev) } #endif =20 -/* To be used by both hid-asus and asus-wmi to determine which controls kb= d_brightness */ -static const struct dmi_system_id asus_use_hid_led_dmi_ids[] =3D { - { - .matches =3D { - DMI_MATCH(DMI_PRODUCT_FAMILY, "ROG Zephyrus"), - }, - }, - { - .matches =3D { - DMI_MATCH(DMI_PRODUCT_FAMILY, "ROG Strix"), - }, - }, - { - .matches =3D { - DMI_MATCH(DMI_PRODUCT_FAMILY, "ROG Flow"), - }, - }, - { - .matches =3D { - DMI_MATCH(DMI_PRODUCT_FAMILY, "ProArt P16"), - }, - }, - { - .matches =3D { - DMI_MATCH(DMI_BOARD_NAME, "GA403U"), - }, - }, - { - .matches =3D { - DMI_MATCH(DMI_BOARD_NAME, "GU605M"), - }, - }, - { - .matches =3D { - DMI_MATCH(DMI_BOARD_NAME, "RC71L"), - }, - }, - { }, -}; - #endif /* __PLATFORM_DATA_X86_ASUS_WMI_H */ --=20 2.51.0 From nobody Mon Apr 6 10:31:27 2026 Received: from relay12.grserver.gr (relay12.grserver.gr [88.99.38.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1673D2E1EFF; Mon, 13 Oct 2025 20:17:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=88.99.38.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760386678; cv=none; b=uqCj52+3EJA8wY4hXlaajjU18o+MMSRiDe5Tofh34TBIqmbNfda57h29pJGAvNBiK7voU0Dkambzco3J5RORWR5LD1kSLABBKCZy96DsVhFtyumyVb4SsfEjiAi+ryItYWrryTOCAxYLW9p34PGLnpXgXjFLP8LowLyWY1A7fd0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760386678; c=relaxed/simple; bh=xyQgSY7ATHyEbgu/L27Am/nvaitQossSrxjojFcg8b0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KXu/4sTvcKuhZgpBFkxnXitGY15OtIQ9/QoPcjUuUIX6/NKTIQgPHTcp/Y2s4ijW/sFNLQ0gAB/rJgzaU7+0vGJYh+qicCNkG2L7lOC8PswXxVRw4BOXrDBuQpwqOhWvTjfATTijrlQ7GO5VE6p+z8sXnU6elsqtK0jUg5HvvBY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=antheas.dev; spf=pass smtp.mailfrom=antheas.dev; dkim=temperror (0-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=fJLMtL/R; arc=none smtp.client-ip=88.99.38.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=antheas.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=antheas.dev Authentication-Results: smtp.subspace.kernel.org; dkim=temperror (0-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="fJLMtL/R" Received: from relay12 (localhost [127.0.0.1]) by relay12.grserver.gr (Proxmox) with ESMTP id 67A36BD71C; Mon, 13 Oct 2025 23:17:54 +0300 (EEST) Received: from linux3247.grserver.gr (linux3247.grserver.gr [213.158.90.240]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by relay12.grserver.gr (Proxmox) with ESMTPS id DA343BCF41; Mon, 13 Oct 2025 23:17:53 +0300 (EEST) Received: from antheas-z13 (x5996a8de.customers.hiper-net.dk [89.150.168.222]) by linux3247.grserver.gr (Postfix) with ESMTPSA id B2F691FDBBF; Mon, 13 Oct 2025 23:17:51 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1760386673; bh=vbpNbTnGcDC5sxeacSKQ3Cf3ynx79dkZOF4R7/C/b7g=; h=From:To:Subject; b=fJLMtL/RZChRRG1zf/yH0ibV4cwZhvqVvQGwO5dCCtCvzYKTk/e+C8TEn0e3oeuwt 01HK+UiU8IFRdmMfcwf1YnDI/R557YrTZ6nv4LHq4Yly7O8cAMXf+cdJaa75L1X/Em 48W34uKyQPEtjlDaOdowXFi/C+Hd3wbL9WmaRbVDB3cBXoNssJFFWyAtXv+ct+DNiE iECoMlXMGzwQwQ27CSswtDOTIqdXZaMQRhd/WRyPrZnwFMZ6RXG5mjwDBKoZOOpz2P Wn59bC7rjNabRqHK4GRUBHw+U6T1XC0VWwnyiqqHaR37O2L4BPUJLu4qY5PBib+Xgo 9gO7WLF78L1fw== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 89.150.168.222) smtp.mailfrom=lkml@antheas.dev smtp.helo=antheas-z13 Received-SPF: pass (linux3247.grserver.gr: connection is authenticated) From: Antheas Kapenekakis To: platform-driver-x86@vger.kernel.org, linux-input@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Jiri Kosina , Benjamin Tissoires , Corentin Chary , "Luke D . Jones" , Hans de Goede , =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Denis Benato , Antheas Kapenekakis Subject: [PATCH v6 6/7] platform/x86: asus-wmi: add keyboard brightness event handler Date: Mon, 13 Oct 2025 22:15:34 +0200 Message-ID: <20251013201535.6737-7-lkml@antheas.dev> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251013201535.6737-1-lkml@antheas.dev> References: <20251013201535.6737-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-PPP-Message-ID: <176038667351.3397675.2342453525099003018@linux3247.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 1.4.3 at linux3247.grserver.gr X-Virus-Status: Clean Content-Type: text/plain; charset="utf-8" Currenlty, the keyboard brightness control of Asus WMI keyboards is handled in the kernel, which leads to the shortcut going from brightness 0, to 1, to 2, and 3. However, for HID keyboards it is exposed as a key and handled by the user's desktop environment. For the toggle button, this means that brightness control becomes on/off. In addition, in the absence of a DE, the keyboard brightness does not work. Therefore, expose an event handler for the keyboard brightness control which can then be used by hid-asus. Reviewed-by: Luke D. Jones Tested-by: Luke D. Jones Signed-off-by: Antheas Kapenekakis --- drivers/platform/x86/asus-wmi.c | 41 +++++++++++++++++++++- include/linux/platform_data/x86/asus-wmi.h | 13 +++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wm= i.c index a2a7cd61fd59..58407a3b6d41 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -1579,6 +1579,45 @@ void asus_hid_unregister_listener(struct asus_hid_li= stener *bdev) } EXPORT_SYMBOL_GPL(asus_hid_unregister_listener); =20 +static void do_kbd_led_set(struct led_classdev *led_cdev, int value); + +int asus_hid_event(enum asus_hid_event event) +{ + unsigned long flags; + int brightness; + + spin_lock_irqsave(&asus_ref.lock, flags); + if (!asus_ref.asus || !asus_ref.asus->kbd_led_registered) { + spin_unlock_irqrestore(&asus_ref.lock, flags); + return -EBUSY; + } + brightness =3D asus_ref.asus->kbd_led_wk; + + switch (event) { + case ASUS_EV_BRTUP: + brightness +=3D 1; + break; + case ASUS_EV_BRTDOWN: + brightness -=3D 1; + break; + case ASUS_EV_BRTTOGGLE: + if (brightness >=3D ASUS_EV_MAX_BRIGHTNESS) + brightness =3D 0; + else + brightness +=3D 1; + break; + } + + do_kbd_led_set(&asus_ref.asus->kbd_led, brightness); + led_classdev_notify_brightness_hw_changed(&asus_ref.asus->kbd_led, + asus_ref.asus->kbd_led_wk); + + spin_unlock_irqrestore(&asus_ref.lock, flags); + + return 0; +} +EXPORT_SYMBOL_GPL(asus_hid_event); + /* * These functions actually update the LED's, and are called from a * workqueue. By doing this as separate work rather than when the LED @@ -1878,7 +1917,7 @@ static int asus_wmi_led_init(struct asus_wmi *asus) asus->kbd_led.flags =3D LED_BRIGHT_HW_CHANGED; asus->kbd_led.brightness_set =3D kbd_led_set; asus->kbd_led.brightness_get =3D kbd_led_get; - asus->kbd_led.max_brightness =3D 3; + asus->kbd_led.max_brightness =3D ASUS_EV_MAX_BRIGHTNESS; asus->kbd_led_avail =3D !kbd_led_read(asus, &led_val, NULL); =20 if (asus->kbd_led_avail) diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/pla= tform_data/x86/asus-wmi.h index 1f85d76387a8..e78e0fbccede 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -168,6 +168,14 @@ struct asus_hid_listener { void (*brightness_set)(struct asus_hid_listener *listener, int brightness= ); }; =20 +enum asus_hid_event { + ASUS_EV_BRTUP, + ASUS_EV_BRTDOWN, + ASUS_EV_BRTTOGGLE, +}; + +#define ASUS_EV_MAX_BRIGHTNESS 3 + #if IS_REACHABLE(CONFIG_ASUS_WMI) void set_ally_mcu_hack(enum asus_ally_mcu_hack status); void set_ally_mcu_powersave(bool enabled); @@ -176,6 +184,7 @@ int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u= 32 arg1, u32 *retval); =20 int asus_hid_register_listener(struct asus_hid_listener *cdev); void asus_hid_unregister_listener(struct asus_hid_listener *cdev); +int asus_hid_event(enum asus_hid_event event); #else static inline void set_ally_mcu_hack(enum asus_ally_mcu_hack status) { @@ -200,6 +209,10 @@ static inline int asus_hid_register_listener(struct as= us_hid_listener *bdev) static inline void asus_hid_unregister_listener(struct asus_hid_listener *= bdev) { } +static inline int asus_hid_event(enum asus_hid_event event) +{ + return -ENODEV; +} #endif =20 #endif /* __PLATFORM_DATA_X86_ASUS_WMI_H */ --=20 2.51.0 From nobody Mon Apr 6 10:31:27 2026 Received: from relay11.grserver.gr (relay11.grserver.gr [78.46.171.57]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9745A2E7F0B; Mon, 13 Oct 2025 20:17:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=78.46.171.57 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760386680; cv=none; b=mF+dkqtZZ4U41wnxzPDBR9F0q/s61SzJxvDpx4CYuPPgmlgRUvh9++R/N/vjLwqwwrniWaWoxCUZYAezVVurhrLpKy2FVMUi2JZw1aMR+YPjGQ2gipy39O03N8PF83yrzB7taWUrOM8s/f/NzDXqQLHQ6jx8dqK/sgthIcLBXTo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760386680; c=relaxed/simple; bh=0RooEeR2UKkdIrkm8tnD/PBHi/7wqKpn+sUQnp/RuFI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CqDTDBLgDr1gqi1QGxplk4IHYS/qKUhW2HydVL46LL1/iYxGW8LDgy98KxxTuLSmIyOPMfkO1jbV0DJ0uDYxBQAkCo+lyWXMJDpg3i4kOna1v0BVKwjNdeig2QUqEIdTm+XuKvj0ixANW6P6qj3xxEvVG73pGD8s1cnpopIK72U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=antheas.dev; spf=pass smtp.mailfrom=antheas.dev; dkim=temperror (0-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=avtxVXlf; arc=none smtp.client-ip=78.46.171.57 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=antheas.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=antheas.dev Authentication-Results: smtp.subspace.kernel.org; dkim=temperror (0-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="avtxVXlf" Received: from relay11 (localhost.localdomain [127.0.0.1]) by relay11.grserver.gr (Proxmox) with ESMTP id A92F0C4CAD; Mon, 13 Oct 2025 23:17:56 +0300 (EEST) Received: from linux3247.grserver.gr (linux3247.grserver.gr [213.158.90.240]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by relay11.grserver.gr (Proxmox) with ESMTPS id 45797C4CA6; Mon, 13 Oct 2025 23:17:56 +0300 (EEST) Received: from antheas-z13 (x5996a8de.customers.hiper-net.dk [89.150.168.222]) by linux3247.grserver.gr (Postfix) with ESMTPSA id F31141FDC0B; Mon, 13 Oct 2025 23:17:53 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1760386676; bh=ObihDIJgc+e3sV164qzQ96xxkTKUky9SvhxpNXrsWIc=; h=From:To:Subject; b=avtxVXlflyJbNr3+Ip6zdFxpT4n3ldDsyH2gpOjTM29pg4tBDdDkz5Dfgh6WuuVca QT2W1PIgKCgEEPv7Ebg+Qv55jVGRyxaYcLtoFdDM6/P+QD961aslw86GvaFY+Ax4vL O2vxVzzp/PPnP1sRZtAHonLcS+S48dtXVGSA+ytuj7FWZ9pQ+oWK8G1HbU/HywET5t CsivZY3oCCUzOuHFejaV+eQg0jEeV9EojxpjAl2yi99XjAK4Xtf6M5gHf6DVHWBlf2 SyJyr43w1iwl9uvSRJQtTj0zkB6ksDFIv8xEhRi24IlB30ShCZNP+YwtO/AKmIrvJo AseT7WkwAhXgA== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 89.150.168.222) smtp.mailfrom=lkml@antheas.dev smtp.helo=antheas-z13 Received-SPF: pass (linux3247.grserver.gr: connection is authenticated) From: Antheas Kapenekakis To: platform-driver-x86@vger.kernel.org, linux-input@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Jiri Kosina , Benjamin Tissoires , Corentin Chary , "Luke D . Jones" , Hans de Goede , =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Denis Benato , Antheas Kapenekakis Subject: [PATCH v6 7/7] HID: asus: add support for the asus-wmi brightness handler Date: Mon, 13 Oct 2025 22:15:35 +0200 Message-ID: <20251013201535.6737-8-lkml@antheas.dev> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251013201535.6737-1-lkml@antheas.dev> References: <20251013201535.6737-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-PPP-Message-ID: <176038667592.3397732.5599229002252934598@linux3247.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 1.4.3 at linux3247.grserver.gr X-Virus-Status: Clean Content-Type: text/plain; charset="utf-8" If the asus-wmi brightness handler is available, send the keyboard brightness events to it instead of passing them to userspace. If it is not, fall back to sending them to it. Reviewed-by: Luke D. Jones Tested-by: Luke D. Jones Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 0af19c8ef035..1f904bb66396 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -324,6 +324,17 @@ static int asus_event(struct hid_device *hdev, struct = hid_field *field, usage->hid & HID_USAGE); } =20 + if (usage->type =3D=3D EV_KEY && value) { + switch (usage->code) { + case KEY_KBDILLUMUP: + return !asus_hid_event(ASUS_EV_BRTUP); + case KEY_KBDILLUMDOWN: + return !asus_hid_event(ASUS_EV_BRTDOWN); + case KEY_KBDILLUMTOGGLE: + return !asus_hid_event(ASUS_EV_BRTTOGGLE); + } + } + return 0; } =20 --=20 2.51.0