From nobody Sun Feb 8 06:05:15 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 5BFF5202976; Sat, 1 Nov 2025 10:47:17 +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=1761994040; cv=none; b=soLjB6HGttMY6FjARoFJtAAp0rf70wflTZsgF5A5WPrz3BgV9aIh6ivj1enwhA1si9y5zYLpbW9a5nZs9AU3UxaP5Gkxq/dCXi77/LHdRYAmOr/Ev4Ou23+hevcTQqhFc6GxnkrLAdQc6SEyjHckyrYB7TbPS+9eekarrW9xJvk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994040; c=relaxed/simple; bh=UjOuX9/BbnJ9RsEIAnt1Ieid0/6suaQQrzhkfQxv8cE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Am6HnrOnAAtTLVCnTE8Ab/XVFan8CEefhrN0+1mlsZ7K2ZTxaZHVpVrGuOvrjUTafAsNBKoOWAopNONLut3y8qPwBhNu5rTLEgfOOYf2rMB/A3ZSJh9zdkIyqJVNdPLhEKmBL/H3xBZI7l4mTJjJpik5CwFql1E2Qd6OXCUnXOw= 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=S7netvRH; 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="S7netvRH" Received: from relay11 (localhost.localdomain [127.0.0.1]) by relay11.grserver.gr (Proxmox) with ESMTP id 673FAC113D; Sat, 1 Nov 2025 12:47:16 +0200 (EET) 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 EB6CFC10FB; Sat, 1 Nov 2025 12:47:15 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c2:511b:0:8d8a:5967:d692:ea4e]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 16B3F2007D3; Sat, 1 Nov 2025 12:47:15 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1761994035; bh=f4GerbM+Sf2qFfTt4Gnn+zyb5DwLrfXW+1y82PL91aQ=; h=From:To:Subject; b=S7netvRHMHutfVWQTB/XTr75wjfAaKIjcgJb552SUskji6ibes/azwBZ/+tJKG/xe xS2n1k9roPmzEWgTwY+MXKISnd+8X5ORe8v9Y8sgjC7YVMkGGl6exOi3BvLfUchadn 2ksy/u75Vg2rz9zFj4XCIFPgYz7MOBltq/tzuwP8DFCjEv6CMP7HBBux4lz74BkZAC VZBkPNS7+0ezMflarUp7GLfapZAX1EvSZM7q0rzrmMHZv0rlAqwObrnm/AD5b+xFXj SM6YQoV4WQsZQNutBsqCSfTJ8sHW1LsoNruFLuDaXYgf/CeSB9TWRrqtyF6NmCqaqO 1v40POmfYQsdw== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:8d8a:5967:d692:ea4e) 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 v8 01/10] HID: asus: simplify RGB init sequence Date: Sat, 1 Nov 2025 11:47:03 +0100 Message-ID: <20251101104712.8011-2-lkml@antheas.dev> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251101104712.8011-1-lkml@antheas.dev> References: <20251101104712.8011-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: <176199403562.3745545.346681419463454916@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, RGB initialization forks depending on whether a device is NKEY. Then, NKEY devices are initialized using 0x5a, 0x5d, 0x5e endpoints, and non-NKEY devices with 0x5a and then a backlight check, which is omitted for NKEY devices. Remove the fork, using a common initialization sequence for both, where they are both only initialized with 0x5a, then checked for backlight support. This patch should not affect existing functionality. 0x5d and 0x5e endpoint initializations are performed by Windows userspace programs associated with different usages that reside under the vendor HID. Specifically, 0x5d is used by Armoury Crate, which controls RGB and 0x5e by an animation program for certain Asus laptops. Neither is used currently in the driver. Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 56 ++++++++++++++---------------------------- 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index a444d41e53b6..7ea1037c3979 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -638,50 +638,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.2 From nobody Sun Feb 8 06:05:15 2026 Received: from relay10.grserver.gr (relay10.grserver.gr [37.27.248.198]) (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 D21D723E355; Sat, 1 Nov 2025 10:47:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=37.27.248.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994042; cv=none; b=BjORtlYwDfWUL/IHSOzPDL7c+CiwKhXpY5luul8YxOQ/uwvryOiI6C8KAA2ttC9v+xjQqSNZuH+HFiQ40zQmVkiYJJKdWQhTIbhrWsswYl5xm1N0OQirPl09wUh7ycUBjdoe2qhhyoNDuOUbSNTFCSeYg6Uk1lEzLO2ViqmG86A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994042; c=relaxed/simple; bh=qZNSB8N/A+v8k50MOtbjy9/8YdW8jGQAH6RO5wkg5Xs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bA7wtGW5lxvhuWHXw4DhpkVfnXvc7rTZIEemsp1POv6vaTh//OZziLt2W46E5gk8KcV7s3hYJDp/QhyY4sJsraE7UAZpTII3mWNuzqwPQoiodK+X197rXyGJx+i0ZpLmaLSpLszHhAw9sqA5inzatRuW1OI1Z31Fa6ybGfTHy4A= 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=B1JBuiv+; arc=none smtp.client-ip=37.27.248.198 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="B1JBuiv+" Received: from relay10 (localhost.localdomain [127.0.0.1]) by relay10.grserver.gr (Proxmox) with ESMTP id 06C9C3F23B; Sat, 1 Nov 2025 12:47:18 +0200 (EET) 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 relay10.grserver.gr (Proxmox) with ESMTPS id 446A13F2AF; Sat, 1 Nov 2025 12:47:17 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c2:511b:0:8d8a:5967:d692:ea4e]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 3C5C31FDFA6; Sat, 1 Nov 2025 12:47:15 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1761994036; bh=4XeEM2YT0PMFF4GTcrUqHusx4GHSY2qqSp0o9BBPPhI=; h=From:To:Subject; b=B1JBuiv+1peJX50fiaCNdhJOx+7FtIgce+c/biFBqkgNgGdttJwuXL39TeNxnXQ2v bRK+oO1jgQRlqJHob/0WcFM1tf/XzehzGBwslJjTvw3FwClhpILmTPCwIOztJojgf3 NkAFsIrzQpQL2TFD0TgDrGJV9q0HAxazSOiPGVgX0e9GmOoNYR6OazEAtrDXj1FUcO jGVbu0ibsnz1fuSCO2Rgp6AWmk1/j0cQLNGI0AuPolERQSONDNMa4A9LgSt9Hx9Hhr 0BZc66+Om+OOU0NQoQFMSIFbS92qQU+uNBlq+lA/8kSEJBK9uqMk1naNxGgwKZU50t S7wmAInRDFang== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:8d8a:5967:d692:ea4e) 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 v8 02/10] HID: asus: use same report_id in response Date: Sat, 1 Nov 2025 11:47:04 +0100 Message-ID: <20251101104712.8011-3-lkml@antheas.dev> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251101104712.8011-1-lkml@antheas.dev> References: <20251101104712.8011-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: <176199403677.3745607.11326383290476525437@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_get_functions prods the device using feature report report_id, but then is hardcoded to check the response through FEATURE_KBD_REPORT_ID. This only works if report_id is that value (currently true). So, use report_id in the response as well to maintain functionality if that value changes in the future. Signed-off-by: Antheas Kapenekakis Reviewed-by: Denis Benato --- drivers/hid/hid-asus.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 7ea1037c3979..4676b7f20caf 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -422,7 +422,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) { --=20 2.51.2 From nobody Sun Feb 8 06:05:15 2026 Received: from relay10.grserver.gr (relay10.grserver.gr [37.27.248.198]) (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 8336925A324; Sat, 1 Nov 2025 10:47:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=37.27.248.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994042; cv=none; b=rA+6QHasIgnSkTJYNqP2qOtKhU/T7GhoHzEa998SwB53o2xXla5AjqupOsSe1jWH1Q3xp7y+WpMh2Rmf22o/y6yuNnFoZx3U30H9Ti50rdtDN1hvcFd1LoabeUQr57zLRMQyw4ZuZCqZtfg58xZviJ+Apbb3QIuaqLhPOY9WZP8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994042; c=relaxed/simple; bh=JSc2lszIEpD8a8iA0ZRn1mO2QvxcTabpcXabxiAfjVg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KUr/NJbU/wZ+4ZAI6EIpSgXGP2P9sOoLLp+dzhtVUWyCwE7hU6tChdRcHGa8Oh0OWQAhOLluCLMCzGdJ/SV1DPdzM1hqGvObSapclV4fIDbG4Vbbq0N6JQqXu68x61boJHqCY35mBdp6DcZ9SheZMUNhqF7qcMRYiF+vuEw9Jys= 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=dX8A089H; arc=none smtp.client-ip=37.27.248.198 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="dX8A089H" Received: from relay10 (localhost.localdomain [127.0.0.1]) by relay10.grserver.gr (Proxmox) with ESMTP id B62773F2B3; Sat, 1 Nov 2025 12:47:18 +0200 (EET) 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 relay10.grserver.gr (Proxmox) with ESMTPS id 2DC993F243; Sat, 1 Nov 2025 12:47:18 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c2:511b:0:8d8a:5967:d692:ea4e]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 227AB2007D3; Sat, 1 Nov 2025 12:47:17 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1761994037; bh=KQJAL9Vr0SDfU+v0XB50ssK/poRqYcE+jczWSdGO4Jk=; h=From:To:Subject; b=dX8A089H/P+tK/cL5hJuB4q0ftLdZy6WwrCH+nqZJuge3kEmhTkDg/jf17BDA2Nij vSEBlwkQ2Sdgu8O0UtUljfRYk4utA1v/5Tcj5UQ9rq44TwVR7dv33U2OkTJm4zbm+n CtWCvwjFjo2p16oXtNs52bJsL9x8agnVV76rS83/gKhN7ywIfvT1xpix5eHjoKJoHw 1mGU6BvsUoTjYFVYplvb6l/rHIu37aT0eQgydYOXtib+jJMr192N8jP/wrs8p2BHD1 WFfW971YvF3XswQ3N+gdhYTRE1r1aHE7BFwrVfyZOx+y2+XetBtkm8kyr+OeRtYK4a /iltvNw+sSI/w== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:8d8a:5967:d692:ea4e) 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 v8 03/10] HID: asus: fortify keyboard handshake Date: Sat, 1 Nov 2025 11:47:05 +0100 Message-ID: <20251101104712.8011-4-lkml@antheas.dev> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251101104712.8011-1-lkml@antheas.dev> References: <20251101104712.8011-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: <176199403767.3745641.5832137544554412432@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" Handshaking with an Asus device involves sending it a feature report with the string "ASUS Tech.Inc." and then reading it back to verify the handshake was successful, under the feature ID the interaction will take place. Currently, the driver only does the first part. Add the readback to verify the handshake was successful. As this could cause breakages, allow the verification to fail with a dmesg error until we verify all devices work with it (they seem to). Since the response is more than 16 bytes, increase the buffer size to 64 as well to avoid overflow errors. Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 4676b7f20caf..03f0d86936fc 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,40 @@ 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) { + /* + * 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 until this is + * verified to work for all devices. + */ + } =20 + kfree(readbuf); return ret; } =20 --=20 2.51.2 From nobody Sun Feb 8 06:05:15 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 739612D238C; Sat, 1 Nov 2025 10:47:21 +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=1761994043; cv=none; b=dVg/JWK4HiOYXBlIqe8vN9Wy8C+VP34+Zs34D3o6MD1AaGfXZk0qpxndUdeOnQNbGPLad8Uum/nZmPzg6pQKM6mfbDeRPtaci4vMmW7uf//NY1SckGwu/Bcr4WRWUOuBtbSnJJGu7CLhSBi25W4cgUKhITBL3LBZTt/l+XRA/zY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994043; c=relaxed/simple; bh=hC6070P6CTkCEkuDUQ3WZyS79ctkJ0MKf3eGXomcsns=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fMEpGVSypl1JXO/dmg33iGYh+/91Tfsrlfua7W01Njrp7JLmHq5TuEqCGYPTnFbCkW2T1mXNnxMCRnJN55k70jCERJYEaRkIvQ050XfWCkkaU+Sb7Tk1SMda1eQs/gW1U66P9G9SOmVrP2wO6agL6q98fss8nm49OwJNtFB+Ig8= 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=leYpaqVD; 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="leYpaqVD" Received: from relay13 (localhost [127.0.0.1]) by relay13.grserver.gr (Proxmox) with ESMTP id 17DB55E505; Sat, 1 Nov 2025 12:47:20 +0200 (EET) 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 6561C5E5C8; Sat, 1 Nov 2025 12:47:19 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c2:511b:0:8d8a:5967:d692:ea4e]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 0C3891FF536; Sat, 1 Nov 2025 12:47:18 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1761994038; bh=KuiLqBBQ1pCEtSyAjKMrxQAViAd0saKWzZB6a/YWhCM=; h=From:To:Subject; b=leYpaqVD7U0UDCUvXJVTffbYK8MZ4eDK6mvxmu7KjKnMTCoGg+DF/IalIb27HtFZJ BepkTxZA4HH6nrjs3wZDk9/QoeolV+9fqWdlnTi5H12vVrFhyr40tVUmEZ4HwIHHZn GAzvLcUdHUNnhZztF9CaFQ5E0FQYhYWnlipCzizabPPB24VJyDpSCZvHHdSiYjTIKE EooYcyGybBJ3WPPLjK2aGFvEgO7KzfgAcfK6lHvh+F2zo/+Fb44qqVhsXZgNOyizWF 3gSEQ21e4F+cwG8ugIy0NDpK+xNmz98D6ryw9fqSyPZbR7xDJWKgywpXvDkH+L5PTH o4Hov4Fd7ZJrw== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:8d8a:5967:d692:ea4e) 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 v8 04/10] HID: asus: prevent binding to all HID devices on ROG Date: Sat, 1 Nov 2025 11:47:06 +0100 Message-ID: <20251101104712.8011-5-lkml@antheas.dev> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251101104712.8011-1-lkml@antheas.dev> References: <20251101104712.8011-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: <176199403856.3745682.5183610210093536438@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, when hid-asus is not loaded, NKEY keyboards load as ~6 event devices with a pretty ASUSTEK name. When it loads, it concatenates all applications per HID endpoint, renames them, and prints errors when some of them do not have an input device. Therefore, change probe so that this is no longer the case. Stop renaming the devices, omit the check for .input which causes errors on e.g., the Z13 for some hiddev only devices, and move RGB checks into probe. Reviewed-by: Luke D. Jones Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 52 ++++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 03f0d86936fc..726f5d8e22d1 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_SKIP_REPORT_FIXUP 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", @@ -931,11 +932,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 @@ -1008,15 +1004,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; } @@ -1133,8 +1120,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) { @@ -1218,12 +1207,37 @@ 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, disable fixups except vendor devices. + */ + if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD && !is_vendor) + drvdata->quirks |=3D QUIRK_SKIP_REPORT_FIXUP; + 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"); + + /* + * 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; + /* * Check that input registration succeeded. Checking that * HID_CLAIMED_INPUT is set prevents a UAF when all input devices @@ -1352,6 +1366,10 @@ static const __u8 *asus_report_fixup(struct hid_devi= ce *hdev, __u8 *rdesc, rdesc =3D new_rdesc; } =20 + /* Vendor fixups should only apply to NKEY vendor devices. */ + if (drvdata->quirks & QUIRK_SKIP_REPORT_FIXUP) + return rdesc; + if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD && *rsize =3D=3D 331 && rdesc[190] =3D=3D 0x85 && rdesc[191] =3D=3D 0x5a && rdesc[204] =3D=3D 0x95 && rdesc[205] =3D=3D 0x05) { --=20 2.51.2 From nobody Sun Feb 8 06:05:15 2026 Received: from relay14.grserver.gr (relay14.grserver.gr [46.224.16.114]) (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 E42A52D593D; Sat, 1 Nov 2025 10:47:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=46.224.16.114 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994045; cv=none; b=Q/MI/n6nxlmTCm5KbQcXPCylwJyYW9M5tR1Z/oKzr/ze2Jk7tvreoL3U7djErPpzCjXkrHpJX4V0g/V7GKgOweC9HTMHp+IOBkELHc9lyocgTCxwFpfiiH83WUPp1lSr6QEf/ExH8CKiXMkfQCaL4RxdMso/xTi0DFiYsXyx7PY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994045; c=relaxed/simple; bh=isjzd5ksZHnrqxaachHQisgZp6mPlr30IorV4Yd8olw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hjLQtEtVSfuWoHW91CFfG50pj4gipt/DEq9v6i0gReRi57Bwi4AEfl9/TwgCFVxAGbvyttq3fo79lhdQO6KdhUsrdZ38jXjw0lbSbcVjGTRKsx5hz7D7ClQcedAB7AbIcNkewKfWSFnNrA/9Rql1T8uqeOICNQaQSewXiZLWokw= 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=g8y/m8CD; arc=none smtp.client-ip=46.224.16.114 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="g8y/m8CD" Received: from relay14 (localhost [127.0.0.1]) by relay14.grserver.gr (Proxmox) with ESMTP id 5507F43D1F; Sat, 1 Nov 2025 10:47:20 +0000 (UTC) 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 relay14.grserver.gr (Proxmox) with ESMTPS id B044243D11; Sat, 1 Nov 2025 10:47:19 +0000 (UTC) Received: from antheas-z13 (unknown [IPv6:2a05:f6c2:511b:0:8d8a:5967:d692:ea4e]) by linux3247.grserver.gr (Postfix) with ESMTPSA id CF674201E6F; Sat, 1 Nov 2025 12:47:18 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1761994039; bh=i5+uSgUiR32f+7oalVlvJwAuka7WUscUO2PT+s80XuI=; h=From:To:Subject; b=g8y/m8CDvktAGNYvi284+SDgBAVh3cgdcnWOCuyeDUK2r7fSNKL1FXQ35E+GMWRAZ /dbEzUq3O+M7jcZxxZgq0quj1SHRtxCLr6cSOTn3dgEdiHrxK8d7ry1nSOLJic8Qag XpwwyO9mSP3wgRTWcHMCCzOIm8QQP1RIc2Pfgdnjv6TuVjMSJrtjrC0CEkPHK3fYLd S9GRZXvwSHlZyg5TxboJQmaHbu2+klSPTFNlyV2OE/0qEPJzt5qrxhG2eYkbyCb7r9 mTD2aD6/iU1PQ61OaOT0XB0zg/kuzcjZVtXM5n8s3AY601qNuEgVrNUajgz6+seivH 6ZUOx2LldRAzw== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:8d8a:5967:d692:ea4e) 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 v8 05/10] HID: asus: initialize LED endpoint early for old NKEY keyboards Date: Sat, 1 Nov 2025 11:47:07 +0100 Message-ID: <20251101104712.8011-6-lkml@antheas.dev> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251101104712.8011-1-lkml@antheas.dev> References: <20251101104712.8011-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: <176199403936.3745725.1466774852186976742@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" These keyboards have always had initialization in the kernel for 0x5d. At this point, it is hard to verify again and we risk regressions by removing this. Therefore, initialize with 0x5d as well. Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 726f5d8e22d1..221c7195e885 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -91,6 +91,7 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); #define QUIRK_ROG_CLAYMORE_II_KEYBOARD BIT(12) #define QUIRK_ROG_ALLY_XPAD BIT(13) #define QUIRK_SKIP_REPORT_FIXUP BIT(14) +#define QUIRK_ROG_NKEY_LEGACY BIT(15) =20 #define I2C_KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \ QUIRK_NO_INIT_REPORTS | \ @@ -669,6 +670,16 @@ static int asus_kbd_register_leds(struct hid_device *h= dev) if (ret < 0) return ret; =20 + if (drvdata->quirks & QUIRK_ROG_NKEY_LEGACY) { + /* + * These keyboards might need 0x5d for shortcuts to work. + * As it has been more than 5 years, it is hard to verify. + */ + ret =3D asus_kbd_init(hdev, FEATURE_KBD_LED_REPORT_ID1); + if (ret < 0) + return ret; + } + /* Get keyboard functions */ ret =3D asus_kbd_get_functions(hdev, &kbd_func, FEATURE_KBD_REPORT_ID); if (ret < 0) @@ -1409,10 +1420,10 @@ static const struct hid_device_id asus_devices[] = =3D { QUIRK_USE_KBD_BACKLIGHT }, { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD), - QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, + QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD | QUIRK_ROG_NKEY_LEGA= CY }, { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD2), - QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, + QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD | QUIRK_ROG_NKEY_LEGA= CY }, { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_Z13_LIGHTBAR), QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, --=20 2.51.2 From nobody Sun Feb 8 06:05:15 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 16CAF2D3A9B; Sat, 1 Nov 2025 10:47:23 +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=1761994045; cv=none; b=bhx/yG191wZZq4zoh6Cy9IUfR7U0e9xeVf7z4GLBtzxfk/V7nuxcuBG6BsXKIf3O1iIggPEFda6pYiCBDxnuDGYjgLeuv0LqjXDo5NTvVjRVFMlMyhS5JbT/z3IdEPUFknj8qFU+YieT9GUhLUce/yo3POdeXhYLOiIsDnDEMXs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994045; c=relaxed/simple; bh=UynFcgzjc6+JVEN/KVIPSykd3r+Z8UGlE4s92jxmf1k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TmgMqZThDp3O3Ylb4u94R9jQvGYQyHJExixEl9Zx20B89oen00IISSh6x+43Xvaa+T6FfMkq03E5iPJnduMEO8K8jC6HfvQ3I9JYwlz0MHdnZfzzDn3BblPv7kFWJghkkbojcTb00+YPxVPKF80GFui+Fy2aGHBbLeDuqCgLRf0= 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=CD1YJzeT; 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="CD1YJzeT" Received: from relay11 (localhost.localdomain [127.0.0.1]) by relay11.grserver.gr (Proxmox) with ESMTP id A9AA7C1168; Sat, 1 Nov 2025 12:47:21 +0200 (EET) 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 A03FAC10FB; Sat, 1 Nov 2025 12:47:20 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c2:511b:0:8d8a:5967:d692:ea4e]) by linux3247.grserver.gr (Postfix) with ESMTPSA id A00731FF536; Sat, 1 Nov 2025 12:47:19 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1761994040; bh=5AGW3wiEceSYuyRcb+ay7RhNPJY2L0lKFUfLIAsIslE=; h=From:To:Subject; b=CD1YJzeTSY7vVboq5oo03v1EOzNW/S1MKL4xUnx4gzcQ0Bse6obs5RKxMWrCbkf/q cRx1b0DmnU4l7vDFadlJYGpkvtXBdHrLDkFD53DNLQSNfbeT+kdY1AytOjrmS1ltSA 6RGwtHLhhRbI0ikhedNnsYhuCJU6LrpFnR9eyJxdDNQT42xGF84UF2pyu7v620ti3H TWcMh3OxroT3RYZaqnMPiC5pQx+fDeha/hv0SMhTGS9GKuR4nKtbnDz+DXwrMTwHpS GBgzC3r++ULb94loGeJ66heKRoOCXV/65U+mB2NseKcH+y77+TqRjh+a44V+NP2mdH dhVlrD15tGx1g== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:8d8a:5967:d692:ea4e) 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 v8 06/10] platform/x86: asus-wmi: Add support for multiple kbd led handlers Date: Sat, 1 Nov 2025 11:47:08 +0100 Message-ID: <20251101104712.8011-7-lkml@antheas.dev> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251101104712.8011-1-lkml@antheas.dev> References: <20251101104712.8011-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: <176199404028.3745763.7388842331781622427@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. Since both hid-asus and asus-wmi can both interact with the led objects including from an atomic context, protect the brightness access with a spinlock and update the values from a workqueue. Use this workqueue to process WMI keyboard events as well, so they are processed asynchronously. Reviewed-by: Luke D. Jones Tested-by: Luke D. Jones Signed-off-by: Antheas Kapenekakis --- drivers/platform/x86/asus-wmi.c | 174 ++++++++++++++++++--- include/linux/platform_data/x86/asus-wmi.h | 17 ++ 2 files changed, 167 insertions(+), 24 deletions(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wm= i.c index e72a2b5d158e..5f23aedbf34f 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include =20 @@ -258,6 +259,9 @@ struct asus_wmi { int tpd_led_wk; struct led_classdev kbd_led; int kbd_led_wk; + bool kbd_led_notify; + bool kbd_led_avail; + bool kbd_led_registered; struct led_classdev lightbar_led; int lightbar_led_wk; struct led_classdev micmute_led; @@ -266,6 +270,7 @@ struct asus_wmi { struct work_struct tpd_led_work; struct work_struct wlan_led_work; struct work_struct lightbar_led_work; + struct work_struct kbd_led_work; =20 struct asus_rfkill wlan; struct asus_rfkill bluetooth; @@ -1530,6 +1535,99 @@ 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; + /* Protects concurrent access from hid-asus and asus-wmi to leds */ + spinlock_t lock; +}; + +static struct asus_hid_ref asus_ref =3D { + .listeners =3D LIST_HEAD_INIT(asus_ref.listeners), + .asus =3D NULL, + /* + * Protects .asus, .asus.kbd_led_{wk,notify}, and .listener refs. Other + * asus variables are read-only after .asus is set. Except the led cdev + * device if not kbd_led_avail. That becomes read-only after the + * first hid-asus listener registers and triggers the work queue. It is + * then not referenced again until unregistering, which happens after + * .asus ref is dropped. Since .asus needs to be accessed by hid-asus + * IRQs to check if forwarding events is possible, a spinlock is used. + */ + .lock =3D __SPIN_LOCK_UNLOCKED(asus_ref.lock), +}; + +/* + * Allows registering hid-asus listeners that want to be notified of + * keyboard backlight changes. + */ +int asus_hid_register_listener(struct asus_hid_listener *bdev) +{ + struct asus_wmi *asus; + + guard(spinlock_irqsave)(&asus_ref.lock); + list_add_tail(&bdev->list, &asus_ref.listeners); + asus =3D asus_ref.asus; + if (asus) + queue_work(asus->led_workqueue, &asus->kbd_led_work); + return 0; +} +EXPORT_SYMBOL_GPL(asus_hid_register_listener); + +/* + * Allows unregistering hid-asus listeners that were added with + * asus_hid_register_listener(). + */ +void asus_hid_unregister_listener(struct asus_hid_listener *bdev) +{ + guard(spinlock_irqsave)(&asus_ref.lock); + list_del(&bdev->list); +} +EXPORT_SYMBOL_GPL(asus_hid_unregister_listener); + +static void do_kbd_led_set(struct led_classdev *led_cdev, int value); + +static void kbd_led_update_all(struct work_struct *work) +{ + struct asus_wmi *asus; + bool registered, notify; + int ret, value; + + asus =3D container_of(work, struct asus_wmi, kbd_led_work); + + scoped_guard(spinlock_irqsave, &asus_ref.lock) { + registered =3D asus->kbd_led_registered; + value =3D asus->kbd_led_wk; + notify =3D asus->kbd_led_notify; + } + + if (!registered) { + /* + * This workqueue runs under asus-wmi, which means probe has + * completed and asus-wmi will keep running until it finishes. + * Therefore, we can safely register the LED without holding + * a spinlock. + */ + ret =3D devm_led_classdev_register(&asus->platform_device->dev, + &asus->kbd_led); + if (!ret) { + scoped_guard(spinlock_irqsave, &asus_ref.lock) + asus->kbd_led_registered =3D true; + } else { + pr_warn("Failed to register keyboard backlight LED: %d\n", ret); + return; + } + } + + if (value >=3D 0) + do_kbd_led_set(&asus->kbd_led, value); + if (notify) { + scoped_guard(spinlock_irqsave, &asus_ref.lock) + asus->kbd_led_notify =3D false; + led_classdev_notify_brightness_hw_changed(&asus->kbd_led, value); + } +} + /* * These functions actually update the LED's, and are called from a * workqueue. By doing this as separate work rather than when the LED @@ -1576,7 +1674,8 @@ static void kbd_led_update(struct asus_wmi *asus) { int ctrl_param =3D 0; =20 - ctrl_param =3D 0x80 | (asus->kbd_led_wk & 0x7F); + scoped_guard(spinlock_irqsave, &asus_ref.lock) + ctrl_param =3D 0x80 | (asus->kbd_led_wk & 0x7F); asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL); } =20 @@ -1609,14 +1708,23 @@ static int kbd_led_read(struct asus_wmi *asus, int = *level, 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 asus =3D container_of(led_cdev, struct asus_wmi, kbd_led); max_level =3D asus->kbd_led.max_brightness; =20 - asus->kbd_led_wk =3D clamp_val(value, 0, max_level); - kbd_led_update(asus); + scoped_guard(spinlock_irqsave, &asus_ref.lock) + asus->kbd_led_wk =3D clamp_val(value, 0, max_level); + + if (asus->kbd_led_avail) + kbd_led_update(asus); + + scoped_guard(spinlock_irqsave, &asus_ref.lock) { + 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, @@ -1631,10 +1739,11 @@ static void kbd_led_set(struct led_classdev *led_cd= ev, =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; - - do_kbd_led_set(led_cdev, value); - led_classdev_notify_brightness_hw_changed(led_cdev, asus->kbd_led_wk); + scoped_guard(spinlock_irqsave, &asus_ref.lock) { + asus->kbd_led_wk =3D value; + asus->kbd_led_notify =3D true; + } + queue_work(asus->led_workqueue, &asus->kbd_led_work); } =20 static enum led_brightness kbd_led_get(struct led_classdev *led_cdev) @@ -1644,10 +1753,18 @@ static enum led_brightness kbd_led_get(struct led_c= lassdev *led_cdev) =20 asus =3D container_of(led_cdev, struct asus_wmi, kbd_led); =20 + scoped_guard(spinlock_irqsave, &asus_ref.lock) { + if (!asus->kbd_led_avail) + return asus->kbd_led_wk; + } + retval =3D kbd_led_read(asus, &value, NULL); if (retval < 0) return retval; =20 + scoped_guard(spinlock_irqsave, &asus_ref.lock) + asus->kbd_led_wk =3D value; + return value; } =20 @@ -1759,7 +1876,9 @@ static int camera_led_set(struct led_classdev *led_cd= ev, =20 static void asus_wmi_led_exit(struct asus_wmi *asus) { - led_classdev_unregister(&asus->kbd_led); + scoped_guard(spinlock_irqsave, &asus_ref.lock) + asus_ref.asus =3D NULL; + led_classdev_unregister(&asus->tpd_led); led_classdev_unregister(&asus->wlan_led); led_classdev_unregister(&asus->lightbar_led); @@ -1797,22 +1916,25 @@ 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_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; + 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); + INIT_WORK(&asus->kbd_led_work, kbd_led_update_all); =20 + if (asus->kbd_led_avail) { + asus->kbd_led_wk =3D led_val; if (num_rgb_groups !=3D 0) asus->kbd_led.groups =3D kbd_rgb_mode_groups; + } else + asus->kbd_led_wk =3D -1; =20 - rv =3D led_classdev_register(&asus->platform_device->dev, - &asus->kbd_led); - if (rv) - goto error; + scoped_guard(spinlock_irqsave, &asus_ref.lock) { + asus_ref.asus =3D asus; + if (asus->kbd_led_avail || !list_empty(&asus_ref.listeners)) + queue_work(asus->led_workqueue, &asus->kbd_led_work); } =20 if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_WIRELESS_LED) @@ -4272,6 +4394,7 @@ static int asus_wmi_get_event_code(union acpi_object = *obj) =20 static void asus_wmi_handle_event_code(int code, struct asus_wmi *asus) { + enum led_brightness led_value; unsigned int key_value =3D 1; bool autorelease =3D 1; =20 @@ -4288,19 +4411,22 @@ static void asus_wmi_handle_event_code(int code, st= ruct asus_wmi *asus) return; } =20 + scoped_guard(spinlock_irqsave, &asus_ref.lock) + led_value =3D asus->kbd_led_wk; + if (code =3D=3D NOTIFY_KBD_BRTUP) { - kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1); + kbd_led_set_by_kbd(asus, led_value + 1); return; } if (code =3D=3D NOTIFY_KBD_BRTDWN) { - kbd_led_set_by_kbd(asus, asus->kbd_led_wk - 1); + kbd_led_set_by_kbd(asus, led_value - 1); return; } if (code =3D=3D NOTIFY_KBD_BRTTOGGLE) { - if (asus->kbd_led_wk =3D=3D asus->kbd_led.max_brightness) + if (led_value =3D=3D asus->kbd_led.max_brightness) kbd_led_set_by_kbd(asus, 0); else - kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1); + kbd_led_set_by_kbd(asus, led_value + 1); return; } =20 diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/pla= tform_data/x86/asus-wmi.h index 8a515179113d..1165039013b1 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -163,11 +163,20 @@ enum asus_ally_mcu_hack { ASUS_WMI_ALLY_MCU_HACK_DISABLED, }; =20 +/* Used to notify hid-asus when asus-wmi changes keyboard backlight */ +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 +193,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.2 From nobody Sun Feb 8 06:05:15 2026 Received: from relay14.grserver.gr (relay14.grserver.gr [46.224.16.114]) (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 0B8052D594A; Sat, 1 Nov 2025 10:47:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=46.224.16.114 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994046; cv=none; b=kGyftHbbtugtK58/026R+MbB6w6zUkuzmHI2a7ouxhQDFL7ex5P0ACIkjgQo4EaJ2TzKI14ONE8vUTFAO5vAqepMSZXjG2G7YJJ95A3u7zaWvzsacrkCqBCThtEaKwQ2BBf9ghWbSE3vNiRVnMrn2JzIyG1uqyDNeVsbcOG4lo0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994046; c=relaxed/simple; bh=a/0Ymer+leQcxsboadwwm2n8L3RFgDYBiRcF15Zg37k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BDweyY0gJ+DbSz4stgcmLhTU2jrP6MgTN+9zsr3cgCWyi6SOhfwZc5fMpwzMZnGh3pE/wJD/mOSuRpr3t8LRz9GKiDdSq9FAtsfuSU2zqOjBCP/LzIOW7UUayq52PU9lCFzE8alcgedfyqG6RK0FH2aHiZd/Ag5jqt7zLHx2I7U= 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=D2Vv376M; arc=none smtp.client-ip=46.224.16.114 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="D2Vv376M" Received: from relay14 (localhost [127.0.0.1]) by relay14.grserver.gr (Proxmox) with ESMTP id 234EE43D26; Sat, 1 Nov 2025 10:47:22 +0000 (UTC) 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 relay14.grserver.gr (Proxmox) with ESMTPS id 7F52143D21; Sat, 1 Nov 2025 10:47:21 +0000 (UTC) Received: from antheas-z13 (unknown [IPv6:2a05:f6c2:511b:0:8d8a:5967:d692:ea4e]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 9384E201E6F; Sat, 1 Nov 2025 12:47:20 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1761994041; bh=elapNGWEU4MXP9I1Liy4xDHltt7Tj386vuZApJNG+hw=; h=From:To:Subject; b=D2Vv376MGY+3zVF6aKrI5Nmn/4pdBqVB+wc7fK526z5KPmTIv8AK7uB+4q0oyrOtz f7Chd0g7joK1XxeJshNggCmBYfQ7HvGHDL4yvP360qF0DroaRGpGEKN2nPeGL6uM0C LahhxtJmqNc2hyg8v4TpWu/Y0tIAg9+Ro/Agv9PUKFnvZCoepHzNzE8QH5qCO18z6q Mq+RoQYnx4AlPfitICT9BwKZ239BKLYhHN7/DJsG/a19ebDOwHWK6CDN/U4mV2HRlK PkYddJqURcxHmc+BTZBCwX/xjDbKLQfOyiAxqFMkwMVgpC870A2hO1agyI5AXjQ5o9 +ILw96BTDnvrA== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:8d8a:5967:d692:ea4e) 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 v8 07/10] HID: asus: listen to the asus-wmi brightness device instead of creating one Date: Sat, 1 Nov 2025 11:47:09 +0100 Message-ID: <20251101104712.8011-8-lkml@antheas.dev> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251101104712.8011-1-lkml@antheas.dev> References: <20251101104712.8011-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: <176199404113.3745803.4860281854004119557@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 221c7195e885..e5d3f28c1fad 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -103,7 +103,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 @@ -711,14 +669,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); @@ -1107,7 +1062,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); @@ -1238,7 +1193,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 @@ -1285,6 +1239,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.2 From nobody Sun Feb 8 06:05:15 2026 Received: from relay10.grserver.gr (relay10.grserver.gr [37.27.248.198]) (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 33B872D6E48; Sat, 1 Nov 2025 10:47:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=37.27.248.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994047; cv=none; b=aBJY1Pz2BGx6u5M5tgmSEUaaWqbU5iD6zy+zx62Nu+YtIjnQED9BG4PX+7VcFa98p1yMJ+eeBLnRw6NOoreAP0HtogkEFRWCJuAEpA6fIn3Uzb1kWRXpJhL+/BQqjy4RV0MntZhWtzr4E+5tobBC30rojCUdmBiR8Lbgt/HZNEk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994047; c=relaxed/simple; bh=9Xz6LJlI5B/MJaRlqpCBUZcDhtrp83uHo95KBxa6T8A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LbebaZFodZXYlCZ0r+pRdCh0B2NS1GgrI0mq+DoKsJUhvffzyk6LvUjIUCN2id4HQiscvAyz8vyc90k+leyyFtZkpXQfo4OLd0GCMGYDm2QnfZ8uHapB4X3L14OhTv4AIcnJ8YoH6W7uKbniE4Mf7xnW62T6orSycNxlvBHlpn0= 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=Sn9uNVYl; arc=none smtp.client-ip=37.27.248.198 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="Sn9uNVYl" Received: from relay10 (localhost.localdomain [127.0.0.1]) by relay10.grserver.gr (Proxmox) with ESMTP id 0E4013F2BC; Sat, 1 Nov 2025 12:47:23 +0200 (EET) 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 relay10.grserver.gr (Proxmox) with ESMTPS id 86C6E3F2AF; Sat, 1 Nov 2025 12:47:22 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c2:511b:0:8d8a:5967:d692:ea4e]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 6DEF81FF536; Sat, 1 Nov 2025 12:47:21 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1761994042; bh=7IfXul8dh5zsFR8IiMqz8MnXce3Ha9T49jE1rlnj3fk=; h=From:To:Subject; b=Sn9uNVYlc+TMxV/MG8+IXcwTqtbXMjvlhAi59ek60YBTGLt44HdoOqNqVdo1gGh73 VpZLDYfwisq/zX+F70EV4ynoEhjBs0f5zgZzbnAbrQgJ0Zl+yqfCSbTe9JZL3iPvhE 3GlxiUyIJH/tsy3UHUSDjH4Cp1m1GamRbzrK3YEuZW13zrHgEncgY6QrZsUnvsvOhO 67v4L5pcM53YVu+VsBOF6NkOFK8FENigVMCzVkWPkY11EQHBr0apAbkyveqp6DEOyG 4nZfurvcVW1prFniOVP0Z5SsdslTYO4COBZvxSVbTrCtrqGqdRf1DT1t+PbzgzJD6Q H/FcPBHX8h2JQ== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:8d8a:5967:d692:ea4e) 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 v8 08/10] platform/x86: asus-wmi: remove unused keyboard backlight quirk Date: Sat, 1 Nov 2025 11:47:10 +0100 Message-ID: <20251101104712.8011-9-lkml@antheas.dev> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251101104712.8011-1-lkml@antheas.dev> References: <20251101104712.8011-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: <176199404201.3745851.17459440846174576120@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 1165039013b1..d8c5269854b0 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -203,44 +203,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.2 From nobody Sun Feb 8 06:05:15 2026 Received: from relay10.grserver.gr (relay10.grserver.gr [37.27.248.198]) (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 903B52D738E; Sat, 1 Nov 2025 10:47:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=37.27.248.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994047; cv=none; b=fKSV08mMTHgFYaBwD5y5U+OGSSMO+XkqDTntXBV0LeFrnyynaWZVWk2vOrdcZIGk8WRVc1AEAz7okjX/kNbrKs3vx4mdDe7OEhkV+3VuDyjzLANTRl4x+JG9c9GNI9asYWZkHMrdvBxcQtgp+isvgWGycaNmhQkK1lTTPH7ab58= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994047; c=relaxed/simple; bh=FxUXAaTCnNdmJ0DSnCqWmRjuBpid1lMDFSDfB6pymjs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=la9GmKeqBIYtfUqbhAsdgjmBBzYTKifyE87XE4eukLKVgXva8YN+vHodli3oU8LX650kiyh3WOXnFA71fHCBfnhi8hFtDvWsdp5JP5MCesp+CgyUhU/Dyw+NPtfsOTNHigDl80RvdAJvGjzkn89GdvYFTX4DRw8Q93loPvOTD/o= 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=oI/wnb8I; arc=none smtp.client-ip=37.27.248.198 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="oI/wnb8I" Received: from relay10 (localhost.localdomain [127.0.0.1]) by relay10.grserver.gr (Proxmox) with ESMTP id EAC6D3F2C8; Sat, 1 Nov 2025 12:47:23 +0200 (EET) 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 relay10.grserver.gr (Proxmox) with ESMTPS id 6B2B03F2AF; Sat, 1 Nov 2025 12:47:23 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c2:511b:0:8d8a:5967:d692:ea4e]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 599412007D3; Sat, 1 Nov 2025 12:47:22 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1761994043; bh=JMsvUErq4V5qN/2j92h9mIs/BE578cCisEu+HYqbudk=; h=From:To:Subject; b=oI/wnb8Isi3QYnqbL7gwUQ4GJBAmnoyw/+qOHs28BLuyZwHiCNDARBKPe3o+I0hPx LJGJZcr4hJnUs2fgL5deTF859Cy2maqzvWW6IKVoPBVR5/ctn7uDpUUWlEyO7J8vYJ J3Ue5azuReB87xQJMiDSTW7zHouRgQqnRAafgAAfs3afu6kVPGb9YzdeYmG+hm3O2d 00FsP28iPvw0eyK9vD47zWwjtAQj8OCJM5TfYIMNCtspKnV+6l/++LulBemWJLWb47 HJIW8kAadz2C9Mz/DpottTKip3oPB+NZgtQbdYsJZqqV53sBO2LGYiX+EKqxA5IDJo LVKZfo2xQ8qyg== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:8d8a:5967:d692:ea4e) 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 v8 09/10] platform/x86: asus-wmi: add keyboard brightness event handler Date: Sat, 1 Nov 2025 11:47:11 +0100 Message-ID: <20251101104712.8011-10-lkml@antheas.dev> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251101104712.8011-1-lkml@antheas.dev> References: <20251101104712.8011-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: <176199404293.3745903.8697429662101418782@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 keyboard brightness control of Asus WMI keyboards is handled in 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. Since this handler is called from an interrupt context, defer the actual work to a workqueue. In the process, introduce ASUS_EV_MAX_BRIGHTNESS to hold the constant for maximum brightness since it is shared between hid-asus/asus-wmi. Reviewed-by: Luke D. Jones Tested-by: Luke D. Jones Signed-off-by: Antheas Kapenekakis --- drivers/platform/x86/asus-wmi.c | 46 +++++++++++++++++++--- include/linux/platform_data/x86/asus-wmi.h | 13 ++++++ 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wm= i.c index 5f23aedbf34f..a7482c97cc5b 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -1628,6 +1628,44 @@ static void kbd_led_update_all(struct work_struct *w= ork) } } =20 +/* + * This function is called from hid-asus to inform asus-wmi of brightness + * changes initiated by the keyboard backlight keys. + */ +int asus_hid_event(enum asus_hid_event event) +{ + struct asus_wmi *asus; + int brightness; + + guard(spinlock_irqsave)(&asus_ref.lock); + asus =3D asus_ref.asus; + if (!asus || !asus->kbd_led_registered) + return -EBUSY; + + brightness =3D 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; + } + + asus->kbd_led_wk =3D clamp_val(brightness, 0, ASUS_EV_MAX_BRIGHTNESS); + asus->kbd_led_notify =3D true; + queue_work(asus->led_workqueue, &asus->kbd_led_work); + 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 @@ -1710,13 +1748,11 @@ 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 asus =3D container_of(led_cdev, struct asus_wmi, kbd_led); - max_level =3D asus->kbd_led.max_brightness; =20 scoped_guard(spinlock_irqsave, &asus_ref.lock) - asus->kbd_led_wk =3D clamp_val(value, 0, max_level); + asus->kbd_led_wk =3D clamp_val(value, 0, ASUS_EV_MAX_BRIGHTNESS); =20 if (asus->kbd_led_avail) kbd_led_update(asus); @@ -1920,7 +1956,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); INIT_WORK(&asus->kbd_led_work, kbd_led_update_all); =20 @@ -4423,7 +4459,7 @@ static void asus_wmi_handle_event_code(int code, stru= ct asus_wmi *asus) return; } if (code =3D=3D NOTIFY_KBD_BRTTOGGLE) { - if (led_value =3D=3D asus->kbd_led.max_brightness) + if (led_value =3D=3D ASUS_EV_MAX_BRIGHTNESS) kbd_led_set_by_kbd(asus, 0); else kbd_led_set_by_kbd(asus, led_value + 1); diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/pla= tform_data/x86/asus-wmi.h index d8c5269854b0..3f679598b629 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -169,6 +169,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); @@ -177,6 +185,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) { @@ -201,6 +210,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.2 From nobody Sun Feb 8 06:05:15 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 9E226189F3B; Sat, 1 Nov 2025 10:47:26 +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=1761994048; cv=none; b=Sjgaa+0iOhBXlnENRTgbajH+q4r0gpP2LxAxjFgH157gya3tvNPfSR5Dt3rFTP3A8KJdcgw4nEkl3ajv/8bg/i86xduf1znmywCycYo4XQ09c/Z5SYLNIbanaQNaxiQGCirGo01zwt1ArU3xy965pwdgHG8GA7LX0OFhMYX1I8M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761994048; c=relaxed/simple; bh=Gwa/WQk/xj079I4Ej8YkVWk2rs3/+gWOrbRhP7ZHHHc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q5lmc1TUaRvO+9wx4pihwoeM0koFbHdu/hcOoJ7nHFru3RNxWUw7g0IMqL9LSIn5O3XLWWD8wWYXtYocKYqqWjgi/UZGJH3ZSZNX2TG3e3sDlVqbgKHrZwgNr+5dkETuLUXxZqxBuSu88x4ckffeiSw8Si4o4al+nMe4G8j5Kkw= 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=aN2bHYtX; 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="aN2bHYtX" Received: from relay12 (localhost [127.0.0.1]) by relay12.grserver.gr (Proxmox) with ESMTP id CF52CC1B97; Sat, 1 Nov 2025 12:47:24 +0200 (EET) 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 66D4DC1BCF; Sat, 1 Nov 2025 12:47:24 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c2:511b:0:8d8a:5967:d692:ea4e]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 48FFD1FF536; Sat, 1 Nov 2025 12:47:23 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1761994044; bh=sKyp44I3nTVlmUCkPmKCLcA1wkuc+IxWTQk6uSnUt2k=; h=From:To:Subject; b=aN2bHYtXWFGM+MF+yJfFutxiyjbusgcpeHDBYxSJPE+IKPmXqrqN7IcS8bdgDoo1E J2PvTxAfvinG28M2D9bz+LGW+59ldy3eWWglsC2lfyt3jH923n9FDh++liQT5+YDaM XZBlyYOFUndf/tK49NTWgy4btoMEie9ShdOHOAEfFTLzrTr5i2lxLPtAUk4LmW9Z6w YFpiJr+CgIX9xOJObIg1DrwzdZiXc1iwJ6TYt3+cilm2uQSLByArSveM1G+IPw9m8/ 4q3QDWNNixAzCvbJ7f7zxhq8Xjm0klhsdmuStx3czAuGp5bypry+AuWfgL/tIGQUo1 0Nd9cwD9GkamQ== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:8d8a:5967:d692:ea4e) 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 v8 10/10] HID: asus: add support for the asus-wmi brightness handler Date: Sat, 1 Nov 2025 11:47:12 +0100 Message-ID: <20251101104712.8011-11-lkml@antheas.dev> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20251101104712.8011-1-lkml@antheas.dev> References: <20251101104712.8011-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: <176199404390.3745949.13918222675205834482@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 e5d3f28c1fad..de64451e315d 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -325,6 +325,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.2