From nobody Sun Feb 8 00:50:25 2026 Received: from relay15.grserver.gr (relay15.grserver.gr [46.62.234.254]) (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 D5933277CA5; Fri, 16 Jan 2026 13:32:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=46.62.234.254 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570330; cv=none; b=KH9EP/FISnZCc/fOoLHnExdIgjmxVMXzikQPfMouWnOYVF3GeZnQEwYCO8xO7APR6NFtaMXK7rRoAB/FsGuHjXpZE62bihg16XcrjIWwLX8x4t8pbykX0MzPWdgNpMZQSe8Dt36/73dF6ROHLteobpxubPzy4lFavQ+MnZ+dI54= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570330; c=relaxed/simple; bh=xvCg7zOYdy9FyIIo4uzv80svRawVDeDbsraVxgub+w0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MLcOwys7bLw5sDyMsLuwSUFV14VOHScr9VCFtrYm+rU/bcBdkaWGw/o331sy1R0l9gxdYynxOjs0+mv65lD6l5jbiNgqJWrj33JqUfxJrsBZlQVq+1CDEWJWoACvTgQRc7YDixxCmLL80hJomKRBfArhdO5Xgsb4JxwYSHoqqnY= 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=QYPPBgc/; arc=none smtp.client-ip=46.62.234.254 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="QYPPBgc/" Received: from relay15 (localhost [127.0.0.1]) by relay15.grserver.gr (Proxmox) with ESMTP id B9341409BF; Fri, 16 Jan 2026 13:32:00 +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 relay15.grserver.gr (Proxmox) with ESMTPS id EF4634094D; Fri, 16 Jan 2026 13:31:59 +0000 (UTC) Received: from antheas-z13 (unknown [IPv6:2a05:f6c3:fefd:0:42c:a43d:2848:c282]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 7E9B91FD57F; Fri, 16 Jan 2026 15:31:58 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1768570319; bh=D08pQAfWzA5LBVvxbPafmANS5uUpsxec2CIzT0lSssM=; h=From:To:Subject; b=QYPPBgc/2l/JF11PHrczaiUTt3rDwE+eRday9yKUQC57CPE6Hp5GPq5Q/IRhKD/XH ouZ5onuezFd7LcmvTvmYOjfIBygcAtFI9n+Z3BnCH5textq9I2HnnKgyJ8zRVJLYr8 Ot2iKfjyDOEff90VaS1ezh+lBq7r/6vJ24hwQAs5WCIMiEdG6wz+B6FXb8dtWVsm32 vuRFgXi0AaihKboZHRHDfIKbRyfSA6IE0Q6W/sNiP3Mto2V0k2zPqjkpyIHcp6bFwY f6B2WYWc8ApgB9/MEinydyvaKxRgACnzwN2RmaAesOPBGvxacKiswlY9H906qpLpBd SCert2sPQFS3Q== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c3:fefd:0:42c:a43d:2848:c282) 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 v11 01/11] HID: asus: simplify RGB init sequence Date: Fri, 16 Jan 2026 14:31:40 +0100 Message-ID: <20260116133150.5606-2-lkml@antheas.dev> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260116133150.5606-1-lkml@antheas.dev> References: <20260116133150.5606-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: <176857031947.3550173.4253814440876741287@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. However, in reality both initialization forks are the same, other than the NKEY initialization initializing the LED_REPORT_ID1, LED_REPORT_ID2 endpoints, and the non-NKEY initialization having a functionality check which is skipped for the NKEY path. Therefore, merge the if blocks, gate the ID1/ID2 initializations behind the NKEY quirk instead, and introduce the functionality check for NKEY devices (it is supported by them). There should be no functional change with this patch. Acked-by: Benjamin Tissoires Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 52 ++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 472bca54642b..323e6302bac5 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -639,13 +639,20 @@ 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; + ret =3D asus_kbd_init(hdev, FEATURE_KBD_REPORT_ID); + if (ret < 0) + return ret; =20 - /* The LED endpoint is initialised in two HID */ + /* Get keyboard functions */ + ret =3D asus_kbd_get_functions(hdev, &kbd_func, FEATURE_KBD_REPORT_ID); + if (ret < 0) + return ret; + + /* Check for backlight support */ + if (!(kbd_func & SUPPORT_KBD_BACKLIGHT)) + return -ENODEV; + + if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { ret =3D asus_kbd_init(hdev, FEATURE_KBD_LED_REPORT_ID1); if (ret < 0) return ret; @@ -653,34 +660,19 @@ static int asus_kbd_register_leds(struct hid_device *= hdev) ret =3D asus_kbd_init(hdev, FEATURE_KBD_LED_REPORT_ID2); if (ret < 0) return ret; + } =20 - 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)); - } - - } 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 (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 drvdata->kbd_backlight =3D devm_kzalloc(&hdev->dev, --=20 2.52.0 From nobody Sun Feb 8 00:50:25 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 5C5D226CE0A; Fri, 16 Jan 2026 13:32:08 +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=1768570330; cv=none; b=eyJmhaKh8dqXfRBN1tDhgfyLd3Lykovqh6/yvyi2QB5HSRcUH8lCyfMKNPRD7hxNOle7AxY2bx0hEgYn2gpI5puAwOvDMQNdPPK9PfTpqcIpEGkvg+ta238Bclz9mct1xX9UWId1UCoyOz68ICKCTQNbMZHNMTOUUZNaevr8W8E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570330; c=relaxed/simple; bh=1F/gx60RajL+YvcEpME2kqm7cIo73glNT0zTGoeIwaA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nCUS79BTEY2XubRwdUZ7DAVFdjq7V+6uR0bXqtstg4NY/NoLH++IFjTWdgY2dYxYerL7sFDgR0CcoVUgCNG+aySUf7sQDxFx/ftoym/wsr4HK3t/mNpFSGBTRMKNMWuv6RHKY4qGk4s0r3thTrrGf3EEantWYh7gxkjC3jl4SSk= 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=dgCi6n9g; 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="dgCi6n9g" Received: from relay12 (localhost [127.0.0.1]) by relay12.grserver.gr (Proxmox) with ESMTP id 7DFC4BC04F; Fri, 16 Jan 2026 15:32:01 +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 BB541BC0A7; Fri, 16 Jan 2026 15:32:00 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c3:fefd:0:42c:a43d:2848:c282]) by linux3247.grserver.gr (Postfix) with ESMTPSA id BB29820258B; Fri, 16 Jan 2026 15:31:59 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1768570320; bh=bfujesMJBE+aRyuNxZ0Tl8U2vZgGSJ4wLaIchfYocfs=; h=From:To:Subject; b=dgCi6n9glcv3S9AFqXOCawoHy0w3ZzZ2RAaDvJ0eNFCxX9ADd6QgedVfMdVmejCsy WXcm+Vu0SgQLy6zb2ni9s9pThbkjNzlTGoxNxUg/3Fo17mCpSKLEHUGofk4znlWh2H 2EHKsLDo2rVzTCl3OdfTx+LFBHu4WBWbiuTLXNK4lZY94O9OhViyHP0BoWns+Vk/J3 gDNiLcGn5VlASr9Rn1+IdRSiLYJZ6SiGkHxNZi0WBLUc+YxRZKvwTMvO1D9Ty9NRBa xehdmmldV8/lo8fIyJF8WiVxBqai4cVW9nQbgtvrV56a8Tz+YxsWI9CBgdtupYuUDN pp/6otl53kbfw== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c3:fefd:0:42c:a43d:2848:c282) 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 v11 02/11] HID: asus: initialize additional endpoints only for legacy devices Date: Fri, 16 Jan 2026 14:31:41 +0100 Message-ID: <20260116133150.5606-3-lkml@antheas.dev> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260116133150.5606-1-lkml@antheas.dev> References: <20260116133150.5606-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: <176857032035.3550222.11231665196123298108@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, ID1/ID2 initializations are performed for all NKEY devices. However, ID1 initializations are only required for RGB control and are only supported for RGB capable devices. ID2 initializations are only required for initializing the Anime display endpoint which is only supported on devices with an Anime display. Both of these initializations are out of scope for this driver (this is a brightness control and keyboard shortcut driver) and they should not be performed for devices that do not support them in any case. At the same time, there are older NKEY devices that have only been tested with these initializations in the kernel and it is not possible to recheck them. There is a possibility that especially with the ID1 initialization, certain laptop models might have their shortcuts stop working (currently unproven). For an abundance of caution, only initialize ID1/ID2 for those older NKEY devices by introducing a quirk for them and replacing the NKEY quirk in the block that performs the inits with that. In addition, as these initializations might not be supported by the affected devices, change the function to not bail if they fail. Acked-by: Benjamin Tissoires Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 323e6302bac5..dc7af12cf31a 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -90,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_ROG_NKEY_LEGACY BIT(14) =20 #define I2C_KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \ QUIRK_NO_INIT_REPORTS | \ @@ -652,14 +653,9 @@ static int asus_kbd_register_leds(struct hid_device *h= dev) if (!(kbd_func & SUPPORT_KBD_BACKLIGHT)) return -ENODEV; =20 - if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { - 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 (drvdata->quirks & QUIRK_ROG_NKEY_LEGACY) { + asus_kbd_init(hdev, FEATURE_KBD_LED_REPORT_ID1); + asus_kbd_init(hdev, FEATURE_KBD_LED_REPORT_ID2); } =20 if (dmi_match(DMI_PRODUCT_FAMILY, "ProArt P16")) { @@ -1376,10 +1372,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.52.0 From nobody Sun Feb 8 00:50:25 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 D5CAE28135D; Fri, 16 Jan 2026 13:32:08 +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=1768570331; cv=none; b=ITf6KPZbOeqXpPhGcBY7iW+8oA0CXfxG3oKJOgMGb4o+06jznEf0bEHWoqfznfNeGOUVkPutzC9YFnvllhxtIXOGQRXvPIfSulMkkCoiV0qFYgMCZ4wct8bVp26J0v4xdNGIPdOhEM6KN4pAYIYJ2K8ybSfyRROs8LIKMt73Nw4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570331; c=relaxed/simple; bh=S3Zxdf/ZgW6lI3NSz6o4ZHzaERf5MORAzzfC2k7oBF4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hHjJPtQEkZHCAgPXLBxCD/nsw/z43VUka7s2T+rgWL2PN6T3inchUMRzbTIOwpJlh0TNFZAc4kemoMa3qN3AecQJAalFqCsyrEa7fHJNnaqhzkpgHNBdRUtdvCZduPGGiSjcftePL+Ttrxg3L5dr5cvn+39d70sQ2uaUNkRDeNA= 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=aNnMA3DU; 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="aNnMA3DU" Received: from relay13 (localhost [127.0.0.1]) by relay13.grserver.gr (Proxmox) with ESMTP id 9A1AA5E661; Fri, 16 Jan 2026 15:32:02 +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 31F095E68C; Fri, 16 Jan 2026 15:32:02 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c3:fefd:0:42c:a43d:2848:c282]) by linux3247.grserver.gr (Postfix) with ESMTPSA id A2190202536; Fri, 16 Jan 2026 15:32:00 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1768570321; bh=alZLovtjCdJqM39H2ifkZ6i5VO7rVbgOW+PNwXnFJ80=; h=From:To:Subject; b=aNnMA3DUQ2ZTO0JNpOkntNPKTuODQd8XeYzmektYLgwz4DFv3L5hbbSof6Ims+w59 ajThwh57xUes0Gh2U48Y8G2kDkh2lIZ3R5SIJl1GU+82Np7g2s3nmzqBrlihMunPfa Whgh9XVzvYSxR78VB+OtnAuOlj7yJXrqVsb+Q0ZewECXVF+lVLwGEW6/5nqR7u8baJ gGXW/Hr7Z//jD4bPo4HGHs5DMlosl+Smh8q6+KDkYUAD35iRXCeTZY+ks7VfLsP1GN bC7eRQSh0NWdr/ztKvLTHdyECallXUE+xZL21zZ++JM/GWxWZl7Fr1xOUzNK3jEd2E gcDanjBP0FT7Q== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c3:fefd:0:42c:a43d:2848:c282) 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 , Denis Benato Subject: [PATCH v11 03/11] HID: asus: use same report_id in response Date: Fri, 16 Jan 2026 14:31:42 +0100 Message-ID: <20260116133150.5606-4-lkml@antheas.dev> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260116133150.5606-1-lkml@antheas.dev> References: <20260116133150.5606-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: <176857032123.3550311.16139940450092211207@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. Reviewed-by: Denis Benato Acked-by: Benjamin Tissoires Signed-off-by: Antheas Kapenekakis --- 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 dc7af12cf31a..6ec7322284b1 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -424,7 +424,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.52.0 From nobody Sun Feb 8 00:50:25 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 94C3F285CA7; Fri, 16 Jan 2026 13:32:11 +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=1768570337; cv=none; b=N4aHd18IPLCLa0+ba6hFh9ZwJ5D6dTXr+3N4FlZWuiHsKidN/0daeQJc6HqNAVLsnzfKb2XSggsSpJaIUgwZk18aKoB9uGTPsTXNzzMYzxwN1b0k/qog6hmeDgfo79Wy4DHjdXERfIAk/G4he5pQrcElm/cXIp25/QuQBmh5NiE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570337; c=relaxed/simple; bh=oVmVmGx2Jxe9gL5rFYVzpSsCRWpAFbqQZGCD2uDSYvY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=F7aC/+qiXlFa5HaVlBPgwpsT3LpNSndbZUZuPOBbCFlnbaHwIArZgAuPui6fSHWgkN99+SV0cCz3ikri9zUkAGOy9jS3CLmos3TtK360pqOzZYqdVnRleeW+xds5NiD0zBkYgsQTnC+6agUP1FvlMDEP9jPQG+1zN+P/hoLARGY= 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=m4kIjjIo; 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="m4kIjjIo" Received: from relay10 (localhost.localdomain [127.0.0.1]) by relay10.grserver.gr (Proxmox) with ESMTP id 4370442B00; Fri, 16 Jan 2026 15:32:04 +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 CF24A429B3; Fri, 16 Jan 2026 15:32:02 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c3:fefd:0:42c:a43d:2848:c282]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 9372520253A; Fri, 16 Jan 2026 15:32:01 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1768570322; bh=74mtRGk4u2sX2DL2XwBX/3rE2+bjcyiUEvuPvyRuVzc=; h=From:To:Subject; b=m4kIjjIojH7Am1HYC/JHzRt4Di+NXAszwySqgJSmC4G6MVji6chzoaBZqDIgU3i9d LyNRvexcCdkeivbIc4ZP4lT3BIf4PTZ1B8i/7qC0GpcLjvEND5d2Wb9KGKuZXPlQMm As9GRHFidEDV7VjwEy5ruTFPaOOFpKSkPtyUN5anqtybuhg2/+kXHb5kHGp1w3VTsU I3LTQjaAuVoSE4m9ivgnwi9G76iDM0nkj/LjiHYAMnkEX+y+RuiIE01tfgmli+BIU7 pcMgX0F20SuxcUkZv8pei9P1F81TgrnkC8agvFKf3EuGoO/1quDtjb3KbHBpIbz+D+ GnsDTq9bUoSYA== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c3:fefd:0:42c:a43d:2848:c282) 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 , Denis Benato Subject: [PATCH v11 04/11] HID: asus: fortify keyboard handshake Date: Fri, 16 Jan 2026 14:31:43 +0100 Message-ID: <20260116133150.5606-5-lkml@antheas.dev> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260116133150.5606-1-lkml@antheas.dev> References: <20260116133150.5606-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: <176857032226.3550930.14109064583325225588@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. In addition, add the report ID to prints, to help identify failed handshakes. Reviewed-by: Benjamin Tissoires Reviewed-by: Denis Benato Acked-by: Benjamin Tissoires Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 6ec7322284b1..e1291dcd99fd 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -49,7 +49,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 @@ -395,15 +395,41 @@ 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 }; 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 handshake %02x failed to send: %d\n", + report_id, ret); + return ret; + } =20 - return ret; + u8 *readbuf __free(kfree) =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_warn(hdev, "Asus handshake %02x failed to receive ack: %d\n", + report_id, ret); + } else if (memcmp(readbuf, buf, sizeof(buf)) !=3D 0) { + hid_warn(hdev, "Asus handshake %02x returned invalid response: %*ph\n", + report_id, FEATURE_KBD_REPORT_SIZE, readbuf); + } + + /* + * Do not return error if handshake is wrong until this is + * verified to work for all devices. + */ + return 0; } =20 static int asus_kbd_get_functions(struct hid_device *hdev, --=20 2.52.0 From nobody Sun Feb 8 00:50:25 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 A4C4328A72B; Fri, 16 Jan 2026 13:32:11 +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=1768570336; cv=none; b=qxXOhB/Hn0Fz30H+QFKYH44bP95Sm6VXkHYmkebQRoHuGFtCwOqAqhvqWJmLGOKdOuWU8F0wWFLMyCAqtlDCs0xf+4Gfu9aSXIRq6kmQUFHjcdPYURwOlFBsO6f41l+K/1flkNu4qzxtgfg97Ah4YjMdqyxglkkqD/FclFSRujw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570336; c=relaxed/simple; bh=FNwfLN/2a2Z8ba4Afw/Zh9aFLDPCPF7bAP1fTJxuVuE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BjiGqylgOrZ4ACyiObExzFiFfXb8BCW02JXRhy3jJbsApnKZYZYEGGtMJ5UePdToc6ZaZ9tYiXl81QFR3ZZadq2ApVnwjuQQ1FE+3fFMpy5QJy4WQtBxMuY4T7GRS6Cf7NFFRFlMvhq2J/7nGNbE44XT5GygwoHHOsJuN0jboH0= 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=TNTYzJdD; 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="TNTYzJdD" Received: from relay13 (localhost [127.0.0.1]) by relay13.grserver.gr (Proxmox) with ESMTP id 305795E68C; Fri, 16 Jan 2026 15:32:05 +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 4E5925E6D5; Fri, 16 Jan 2026 15:32:04 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c3:fefd:0:42c:a43d:2848:c282]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 9A76F202536; Fri, 16 Jan 2026 15:32:02 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1768570323; bh=lgJGD0wxBv38weYfamsn9R4XrcH+I6fUscoTw9rNdSM=; h=From:To:Subject; b=TNTYzJdDDfZX3VSGFcsZEoj3tme9ab8zqaq/ys2fdlAVLDxy/pwF0HHSl0isoDWRQ hWP8gbD2aXBwZCG0WeLkPCtvcb5Joq1CUEcj3/MDnF0ArPY/EHiSUdO4EnJwpRRHmk qpd/CYDSOi+zRTvCDqlsjOUYOXDyeWP3LTgabXpPxfOwy7bxD7NIsdhWhlmZgEh696 PMwVk005ZTqgqa/4SFjDw0O4wV521p1Ohqb2NvJPoWt+ncCxG2iM+/wzgxjHwJI6FA Lyfh1A9sE+TXK4C4VQWzqkzoRjskXtlAQPyHgF2QDc0LsKIknPl7WoAkXGwnQzsJql QWLg8LZ9B+uBQ== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c3:fefd:0:42c:a43d:2848:c282) 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 v11 05/11] HID: asus: move vendor initialization to probe Date: Fri, 16 Jan 2026 14:31:44 +0100 Message-ID: <20260116133150.5606-6-lkml@antheas.dev> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260116133150.5606-1-lkml@antheas.dev> References: <20260116133150.5606-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: <176857032340.3552097.4360040713724160672@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 NKEY devices have multiple HID endpoints, around 3-4. One of those endpoints has a usage page of 0xff31, and is the one that emits keyboard shortcuts and controls RGB/backlight. Currently, this driver places the usage page check under asus_input_mapping and then inits backlight in asus_input_configured which is unnecessarily complicated and prevents probe from performing customizations on the vendor endpoint. Simplify the logic by introducing an is_vendor variable into probe that checks for usage page 0xff31. Then, use this variable to move backlight initialization into probe instead of asus_input_configured, and remove the backlight check from asus_input_mapping. Acked-by: Benjamin Tissoires Signed-off-by: Antheas Kapenekakis Reviewed-by: Denis Benato --- drivers/hid/hid-asus.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index e1291dcd99fd..428481aa2083 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -48,6 +48,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 @@ -127,7 +128,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; @@ -318,7 +318,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", @@ -938,11 +938,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 @@ -1015,15 +1010,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; } @@ -1140,8 +1126,11 @@ 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; + bool is_vendor =3D false; + int ret; =20 drvdata =3D devm_kzalloc(&hdev->dev, sizeof(*drvdata), GFP_KERNEL); if (drvdata =3D=3D NULL) { @@ -1225,12 +1214,24 @@ 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; + } + 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 --=20 2.52.0 From nobody Sun Feb 8 00:50:25 2026 Received: from relay14.grserver.gr (relay14.grserver.gr [157.180.73.62]) (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 D121D20DD51; Fri, 16 Jan 2026 13:37:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=157.180.73.62 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570659; cv=none; b=ZagBsUIYtlxH0D92MUhBqKWwtDa2MpX/IN24+z+AV3jV9ylw2LuD8XLWQyDV8C+FDnI4i7HDf1beKBKiYwywb2oIzmaJZCSnJuOYtWLku9xHqpYi7XKXyrLZkSt6ZMZfCZfOrUuVIx3XQi0i396b8PCtyLaAcdhMtNt+xV3QL60= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570659; c=relaxed/simple; bh=7B00bWTFczRZotRf5p6Jzti5MO+LG/J9cuFWikevjtg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AkTKh+L+Dw1NbJguG29zQDFAfACforAIXGmMheosKMZKN9iKNlKJ46RGIvhSPCymt2u3v635jJvSPuyaAXAa341iwgHCOTTkuw0X1EtjNZhI9s0zX/5VJ7p2eUmPzA/hp+GxIggoz3R+lmSut7qx8p1k2caRySrZfcI2Do1vHq8= 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=EG23HQ8D; arc=none smtp.client-ip=157.180.73.62 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="EG23HQ8D" Received: from relay14 (localhost [127.0.0.1]) by relay14.grserver.gr (Proxmox) with ESMTP id D76E34088E; Fri, 16 Jan 2026 13:32:05 +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 2E206408A7; Fri, 16 Jan 2026 13:32:05 +0000 (UTC) Received: from antheas-z13 (unknown [IPv6:2a05:f6c3:fefd:0:42c:a43d:2848:c282]) by linux3247.grserver.gr (Postfix) with ESMTPSA id CF00C20253A; Fri, 16 Jan 2026 15:32:03 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1768570324; bh=/GlAVvn2CO0NZJ1bdhUEo/jKU/saNux1zwkagaLT4+U=; h=From:To:Subject; b=EG23HQ8DNK8GH5r/iY25SlwNHr44DWOamXpU1xagd9Ln+clUfcs6X/uJMzFX8pubJ QTMAwcdG6d0coJzXwxFaiRsGOW0ktnf2mnwoN4OJ71E+T7mpy3YE+W2QnYJjRsssYM ac2aIzcdvgNyBxF/PlqC+dOm7mJK4MtN9fNQ4F3wOO8olEQ61j1aKaKou/t6V5C4Q/ /zjK5q5QlHMkYLxz3HN23ymHZzsywNl5pO9/YpNUoHmMxk9LAf9QUB5buxAo6pPXJt LPMEi4+JFxAoj02PxJM8ILUI38XUbAJqTPD/g7D4OndLqaxG7BAj2A3wA7/IwDdHHv IpAeVlVRcsTsQ== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c3:fefd:0:42c:a43d:2848:c282) 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 v11 06/11] HID: asus: early return for ROG devices Date: Fri, 16 Jan 2026 14:31:45 +0100 Message-ID: <20260116133150.5606-7-lkml@antheas.dev> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260116133150.5606-1-lkml@antheas.dev> References: <20260116133150.5606-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: <176857032467.3552611.9181164287335716018@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 devices have a new dynamic backlight interface for control by Windows. This interface does not create an ->input device, causing the kernel to print an error message and to eject it. In addition, ROG devices have proper HID names in their descriptors so renaming them is not necessary. Therefore, if a device is identified as ROG, early return from probe to skip renaming and ->input checks. Acked-by: Benjamin Tissoires Signed-off-by: Antheas Kapenekakis Reviewed-by: Denis Benato --- drivers/hid/hid-asus.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 428481aa2083..90dc1fcd54ac 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -1232,6 +1232,13 @@ static int asus_probe(struct hid_device *hdev, const= struct hid_device_id *id) asus_kbd_register_leds(hdev)) hid_warn(hdev, "Failed to initialize backlight.\n"); =20 + /* + * 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 --=20 2.52.0 From nobody Sun Feb 8 00:50:25 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 2C5B5284883; Fri, 16 Jan 2026 13:32:15 +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=1768570337; cv=none; b=NNwDY1kQ1Seoe/ShFq09p3lZdcygDVK+8vPDl0kVlmOdL1IAt3fw0DbNWeQhzpDyALpke3QwtUJyg5c1+47EDV1JLaiYbR5d127RGMAuX70ipmY5vBurTib4k0rsnTH+Sy+FwwF3sJWj+juOOyPRVkqckjmWgOPMiYrlYENGqlE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570337; c=relaxed/simple; bh=pGMMieTrhluMXDcIm19lxg8dKlHdcXYc2YksPFOEI3E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GW4YNdUnadzjxXzdiBH8b/uxEB0COugcb6/Y73QDkgOjckzpAkqSTzkDV1vRHHu2PRJwHrd+FK/0ItiRXAdiZ8ntQ3uMqEfkfLd5svHIvIPuZK0METFDbr+FhfHwKo+k1PN/f1D6/wOegVe7fRkbk0qMRhN/6sqtnSrh/aFOojI= 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=VVnpK3FQ; 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="VVnpK3FQ" Received: from relay10 (localhost.localdomain [127.0.0.1]) by relay10.grserver.gr (Proxmox) with ESMTP id 93480459B6; Fri, 16 Jan 2026 15:32:08 +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 8D176456FC; Fri, 16 Jan 2026 15:32:07 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c3:fefd:0:42c:a43d:2848:c282]) by linux3247.grserver.gr (Postfix) with ESMTPSA id B40F71FD3F3; Fri, 16 Jan 2026 15:32:05 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1768570327; bh=hkrvrI972Ef90CDbf645zSKorkV0C0IEHrCTpUb1ric=; h=From:To:Subject; b=VVnpK3FQrdUBhKcEQpIW9BQmmNwLLbNtzKPhMSjBnOFBXSttzOoXBI7w8xpQiVgkl oG+IFFJ1BEpgjkvCjkQeb8TAMRH05fPdf+i3m9oGG69H+uw1/t5H6OI64icp/iRi6E 2snwyDphMs9fOUQx8nTu5uKpyP2QIchjZCx/MZZIsLL6EZB0tmSEmKX1x+KgzNnSET ZFp795ARDcfttlClHuXk7uxYo4TrvRH0Af2jIyijJiqQrSqjM9fvF3kkqYpmj6Y8Lc 2PZs26iEiE0xLNVkkBz9BujWjCjGPnZWwg8uqq1YmTla6Uq+2lTZ4Cd9K9hKF7aAD3 VI09sMpyKrhuA== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c3:fefd:0:42c:a43d:2848:c282) 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 v11 07/11] platform/x86: asus-wmi: Add support for multiple kbd led handlers Date: Fri, 16 Jan 2026 14:31:46 +0100 Message-ID: <20260116133150.5606-8-lkml@antheas.dev> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260116133150.5606-1-lkml@antheas.dev> References: <20260116133150.5606-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: <176857032701.3552757.18353398208370756653@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 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 also process WMI keyboard events, so they are handled asynchronously. Acked-by: Benjamin Tissoires Signed-off-by: Antheas Kapenekakis --- drivers/platform/x86/asus-wmi.c | 183 ++++++++++++++++++--- include/linux/platform_data/x86/asus-wmi.h | 15 ++ 2 files changed, 173 insertions(+), 25 deletions(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wm= i.c index 4aec7ec69250..df2365efb2b8 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -31,13 +31,13 @@ #include #include #include -#include #include #include #include #include #include #include +#include #include #include =20 @@ -256,6 +256,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; @@ -264,6 +267,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; @@ -1615,6 +1619,106 @@ static void asus_wmi_battery_exit(struct asus_wmi *= asus) =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. + * + * The led cdev device is not protected because it calls backlight_get + * during initialization, which would result in a nested lock attempt. + * + * The led cdev is safe to access without a lock because if + * kbd_led_avail is true it is initialized before .asus is set and never + * changed until .asus is dropped. If kbd_led_avail is false, the led + * cdev is registered by the workqueue, which is single-threaded and + * cancelled before asus-wmi would access the led cdev to unregister it. + * + * A spinlock is used, because the protected variables can be accessed + * from an IRQ context from asus-hid. + */ + .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 @@ -1661,7 +1765,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 @@ -1694,14 +1799,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 int kbd_led_set(struct led_classdev *led_cdev, enum led_brightness = value) @@ -1716,10 +1830,11 @@ static int kbd_led_set(struct led_classdev *led_cde= v, enum led_brightness value) =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) @@ -1729,10 +1844,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 @@ -1844,7 +1967,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); @@ -1882,22 +2007,26 @@ 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_blocking =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_blocking =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) @@ -4372,6 +4501,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 @@ -4388,19 +4518,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 419491d4abca..d347cffd05d5 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -172,12 +172,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_get_devstate_dsts(u32 dev_id, u32 *retval); 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) { @@ -198,6 +206,13 @@ 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 #endif /* __PLATFORM_DATA_X86_ASUS_WMI_H */ --=20 2.52.0 From nobody Sun Feb 8 00:50:25 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 2C6F828726A; Fri, 16 Jan 2026 13:32:11 +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=1768570345; cv=none; b=p3W1J9b6gTSdgAiXpnl1oFNZmi9+jqTRKvXl84uGApbLjWgrb6UIQLKY1J7/wXWRR9BbzC8+Pu55du3o9keZHCTHQsBFukmqfui52rQPnuXRww2EIMmbRQzvSGt9w5ZgG9qf/Js69MQTGGmoIniqBjnRX4axt4ka3gy3VTWQ+nc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570345; c=relaxed/simple; bh=YumH5r3U15n+UfZVhbgpl4k5KY8bZ/BZ6dyxPvX5Qmc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Fd5H3c7xopmY9fdxNYaG9bNC7GzQHmPXo5Cyy+8C/st70CB9iH0zE2tPCVechwk75sXKGB0GdOQz7ElHywwmEWsBm2pv//TBF3wwm1+HgvKlz42afPnlrcxa/c/7WbUhiis85Z+3ST97mNlpHRmTqhQjC+ww8LiyDAunyIto1oY= 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=k50193tO; 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="k50193tO" Received: from relay10 (localhost.localdomain [127.0.0.1]) by relay10.grserver.gr (Proxmox) with ESMTP id 465B23F732; Fri, 16 Jan 2026 15:32:10 +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 6B9A845714; Fri, 16 Jan 2026 15:32:09 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c3:fefd:0:42c:a43d:2848:c282]) by linux3247.grserver.gr (Postfix) with ESMTPSA id AA72320258B; Fri, 16 Jan 2026 15:32:07 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1768570329; bh=aKNnCZNss+13k8mt9xfvxvwF7o/H8Um4LPWkGOou51U=; h=From:To:Subject; b=k50193tOsMSJB+8Pviaszx63KFBWrgPHHvwQo0JdgPORmHtCZ33189d4L7htTX9bK moWa9Vv5kegJSZYphBBYzTMYpMB+sAwmN8x8GDBemAiU9SNX1fHod7YurBocqh7Dbw LgJUzUzuLplnkFft2bPBnnNd9fhS5An3e1FalusJDS4ykQ/LT3Bm2buCFl550Cyuuq 8LKe7LLiCcIE/8KCMRqkKosys/wz0RM79JDcjbGAsyJZYdk9vrUtAiOS2f/hMZ3JYE W2uFLWAPov7xj5wYaRHzNhJ4XcBvwgVMLe4Buk1vjLMJZt8K3dSpp/eWbNroyKVfdi 88iegZPsuJfVQ== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c3:fefd:0:42c:a43d:2848:c282) 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 , Denis Benato Subject: [PATCH v11 08/11] HID: asus: listen to the asus-wmi brightness device instead of creating one Date: Fri, 16 Jan 2026 14:31:47 +0100 Message-ID: <20260116133150.5606-9-lkml@antheas.dev> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260116133150.5606-1-lkml@antheas.dev> References: <20260116133150.5606-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: <176857032888.3552899.1473251838999611060@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 Reviewed-by: Benjamin Tissoires Reviewed-by: Denis Benato Acked-by: Benjamin Tissoires Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 65 +++++++----------------------------------- 1 file changed, 10 insertions(+), 55 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 90dc1fcd54ac..19fc43f27ff3 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -27,7 +27,6 @@ #include #include #include -#include #include #include /* For to_usb_interface for T100 touchpad intf chec= k */ #include @@ -103,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 +494,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 +508,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 +524,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 @@ -706,14 +663,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); @@ -1102,7 +1056,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); @@ -1228,7 +1182,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 @@ -1275,6 +1228,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.52.0 From nobody Sun Feb 8 00:50:25 2026 Received: from relay14.grserver.gr (relay14.grserver.gr [157.180.73.62]) (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 D1290277CA5; Fri, 16 Jan 2026 13:37:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=157.180.73.62 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570660; cv=none; b=oNGsRkxbQjGgaXUeUMLsPC6K+JHOugSGCIdZVFlBdMSly+Zgpl31U7Ow2VHfLqb5dnDRPhNkB9a9pN6zn35tpDbIil9C76JCaQF8uuRgWN7OosuU8s5EmI+kiwrXdcyOhojBPah4B5mIq1x1LpnKf9/Pok8eQe/BnzpaFmLu6SQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570660; c=relaxed/simple; bh=qC/J0+4+tdmZ37XLBWyV/NfGCb0il0AY9ubrh5qmRhs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YcFVoN8/iLV/DWtuIx1jOe7a2TN/WWcXKxiPn4xVdEJY0Nhq0mCiBvlJ/uYenCIQEzxuI4xrqKwa9k8evEQlPSf0OH2iSfbPI8o4w9ws3CxUKA7idsuKNSYBoGwLHasMfrZh2ZzRjqLZIog+929VFmvLYd1Mh2gOKehJwQHyYCA= 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=XYCZktrW; arc=none smtp.client-ip=157.180.73.62 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="XYCZktrW" Received: from relay14 (localhost [127.0.0.1]) by relay14.grserver.gr (Proxmox) with ESMTP id 9938C408E8; Fri, 16 Jan 2026 13:32:11 +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 186984088C; Fri, 16 Jan 2026 13:32:11 +0000 (UTC) Received: from antheas-z13 (unknown [IPv6:2a05:f6c3:fefd:0:42c:a43d:2848:c282]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 41065202536; Fri, 16 Jan 2026 15:32:09 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1768570330; bh=EZI62rLY8T5iCqJeT156w6aRaLQTMZvHv5YNdeVWJHQ=; h=From:To:Subject; b=XYCZktrW3q3PhEUkbcdI3lLhZowCGhZh8Rw6RRtsTfDKwWRK9y3uda6PQY8vTV9pK D8IITk2VZ8ZtO78sgLQYc4FLECY4kd38l7UHPHFAV8ufCvJJsVic2Od9Du6chkNsI4 s3ih7zeaKlXEPTtvMe6rVcxKa1TlIwmbE5jOMmK+qrjwxS4xCENyqHSSbrmzGjLWfY gVzrgXxQC/ixxtktl8e3MIVSuC5vaQ3X/VT8XxddWMgWauhqVtT/p/QimEA9sqNb1Z ok3sgzsgJr9mnaNnbzxn1bpxuPfEqWj69y4o7CzMu3mQQnOX9XMNPrgQt+rlDhTGqC qK1njUQMoDV4Q== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c3:fefd:0:42c:a43d:2848:c282) 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 , Denis Benato Subject: [PATCH v11 09/11] platform/x86: asus-wmi: remove unused keyboard backlight quirk Date: Fri, 16 Jan 2026 14:31:48 +0100 Message-ID: <20260116133150.5606-10-lkml@antheas.dev> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260116133150.5606-1-lkml@antheas.dev> References: <20260116133150.5606-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: <176857033060.3552944.3515433525594511802@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 the file containing it. Reviewed-by: Denis Benato Acked-by: Benjamin Tissoires Signed-off-by: Antheas Kapenekakis --- .../platform_data/x86/asus-wmi-leds-ids.h | 50 ------------------- 1 file changed, 50 deletions(-) delete mode 100644 include/linux/platform_data/x86/asus-wmi-leds-ids.h diff --git a/include/linux/platform_data/x86/asus-wmi-leds-ids.h b/include/= linux/platform_data/x86/asus-wmi-leds-ids.h deleted file mode 100644 index 034a039c4e37..000000000000 --- a/include/linux/platform_data/x86/asus-wmi-leds-ids.h +++ /dev/null @@ -1,50 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __PLATFORM_DATA_X86_ASUS_WMI_LEDS_IDS_H -#define __PLATFORM_DATA_X86_ASUS_WMI_LEDS_IDS_H - -#include -#include - -/* To be used by both hid-asus and asus-wmi to determine which controls kb= d_brightness */ -#if IS_REACHABLE(CONFIG_ASUS_WMI) || IS_REACHABLE(CONFIG_HID_ASUS) -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 - -#endif /* __PLATFORM_DATA_X86_ASUS_WMI_LEDS_IDS_H */ --=20 2.52.0 From nobody Sun Feb 8 00:50:25 2026 Received: from relay14.grserver.gr (relay14.grserver.gr [157.180.73.62]) (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 7F3A713C9C4; Fri, 16 Jan 2026 13:42:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=157.180.73.62 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570959; cv=none; b=hvMJfKC25nfQwqlJ1gtr4SwYdFPKYQriRFmeKCy8LWyx+0wzQcv3Xl7Bbj3DtYWIHCPdySCcedQigEFTzmH7kwWRTh0AyzCGMDaXBf+B86x3TU4DYw/QSATGE2+txBYq+g/yjL+JNSnmXCH+YQI+jPGSEs2BiBPW8r4Mvp6qgKo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570959; c=relaxed/simple; bh=hG1EkQ+OvNsfJoq0DWyfjxDRwFK1Zz2d3pmz1qT8MXA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eGrGiy+d9Ga7FTVfXxpzoDY55SW+oXd6+MlmNces0eIOA6EAOkMHo/6NaDMKvZFUGyJ4cPL6gzKqlzLEFvlagFWeJb4mZMP1Lb5KltNqfDSTfnstUR4zYUF1haLp4iK3NHOI67ekxUOJ/vQWMJ+KFAsw/5Q+ojfTinIbC2FaIRo= 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=Y3ux5rJt; arc=none smtp.client-ip=157.180.73.62 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="Y3ux5rJt" Received: from relay14 (localhost [127.0.0.1]) by relay14.grserver.gr (Proxmox) with ESMTP id 99D1C4083C; Fri, 16 Jan 2026 13:32:13 +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 E446940868; Fri, 16 Jan 2026 13:32:12 +0000 (UTC) Received: from antheas-z13 (unknown [IPv6:2a05:f6c3:fefd:0:42c:a43d:2848:c282]) by linux3247.grserver.gr (Postfix) with ESMTPSA id 2CA101FD3F3; Fri, 16 Jan 2026 15:32:11 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1768570332; bh=8hSaoQfEIyYZ4F+L0MrHWED5H3ltWjnoArChTNuPCUc=; h=From:To:Subject; b=Y3ux5rJtuGInU5KzTEAEe95Zej7hgpD7/PJ/DIaC5rcVywYgmtOIRXUt6bVZ/kfJB upKn+OwAmbjrmxB1Q4N3b2c8G17bvC3LaXyLghWaTqyjiDrKFXS0N8zn5EhFiQoiWX iHwFjzodsVjfLWxW7ACaBRBzjy61djK8/cFzWZO80kStF1yyryVubIoLficJs35TQl 3u+kM0QScXrJ8/T0abaKHEHKOQzvmQSzU+x10e8PK8I6oG2WyUokkjEq/P8zwMPhUo dbocFsLGsf20y2fUMcbBwQYvjXtdFM3dsHnH3l9VP2M5jIcUjuwK50pcXZQCN9znLz Il24WY+4uHS/g== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c3:fefd:0:42c:a43d:2848:c282) 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 v11 10/11] platform/x86: asus-wmi: add keyboard brightness event handler Date: Fri, 16 Jan 2026 14:31:49 +0100 Message-ID: <20260116133150.5606-11-lkml@antheas.dev> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260116133150.5606-1-lkml@antheas.dev> References: <20260116133150.5606-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: <176857033243.3553042.4180730708922187340@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 Acked-by: Benjamin Tissoires Signed-off-by: Antheas Kapenekakis Reviewed-by: Denis Benato --- 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 df2365efb2b8..e65d91a11000 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -1719,6 +1719,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 @@ -1801,13 +1839,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); @@ -2011,7 +2047,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_blocking =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 @@ -4530,7 +4566,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 d347cffd05d5..7b872b5d0960 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -178,6 +178,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); @@ -186,6 +194,7 @@ int asus_wmi_set_devstate(u32 dev_id, u32 ctrl_param, u= 32 *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); +int asus_hid_event(enum asus_hid_event event); #else static inline void set_ally_mcu_hack(enum asus_ally_mcu_hack status) { @@ -213,6 +222,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.52.0 From nobody Sun Feb 8 00:50:25 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 6D1B528468E; Fri, 16 Jan 2026 13:32:22 +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=1768570343; cv=none; b=HfBega60wQh9ZKiZAeOa+siK71hPKAj2x0R7iRC1+Bn7e5kpodnF0vKr5NVntHs/wR2ytBkYYcavI8heNuA5OdKxLc1y37w1DNxFDVM9BUlYpGhP+T0OcfOBtyVSdQA7joShv9fcEPGSsUhY3M+4jIK4w+Cqm2UNdqQKCwZlmgk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768570343; c=relaxed/simple; bh=5uG41aLShCcfj/uFUz7az+7E5DwHNwZzvz9y5mbxRtE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=U6jXG4a8bRAqPT7ScC3YTKn2t4B+s6Ys6RFmFTn8xXfhJ+zhnLIUVQnbuOF9K7bIq4UE8ZND4a3gbsC5k1bv1XvQH9uHZGaHDK2s+Bk/9/LZBfy8tlCQzcZVU1Q8Hi9ccKSdkmStx7jwapzuVb9gUBLfjLx+nwNViZWhRJDIqCE= 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=BN7B85MO; 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=pass (2048-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="BN7B85MO" Received: from relay11 (localhost.localdomain [127.0.0.1]) by relay11.grserver.gr (Proxmox) with ESMTP id D6F00C25E9; Fri, 16 Jan 2026 15:32:14 +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 70CC5C3F6A; Fri, 16 Jan 2026 15:32:14 +0200 (EET) Received: from antheas-z13 (unknown [IPv6:2a05:f6c3:fefd:0:42c:a43d:2848:c282]) by linux3247.grserver.gr (Postfix) with ESMTPSA id D68E520258D; Fri, 16 Jan 2026 15:32:12 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1768570334; bh=IKZt/JbnpFu3QnnIaWTLBLJBzSG1TZ3OBW978bHJPSY=; h=From:To:Subject; b=BN7B85MOer3++fGkgisqTr1/vopQholrBrk38cMsfHezeLVBBUhXVjMS3BgAlZmfY VYBYd6CE8/XfhOzXVOif6/4TawKMmFWLnNdQoGUxsKs3IPJ0nV6tvgdkHoZqRQSQ6Z CVm7pazzDnuk31Z476r2EQMXMRYeJaOpN9sL5+/jB+OofOEACrI8BieVbeC0ru0YkD ya1MGpzRVZWvP/mSTLyXyBMAijgEcDpxsJTleBX/e74xYN/fCYXLowlWZAe6F1dB7N KFUAypbffrh2RRtgWenphMOnkWzNFgKfZY7chVSrRZhGf5DpENQT12Xr56E7D9hJiZ zN7KiexvjhcNQ== Authentication-Results: linux3247.grserver.gr; spf=pass (sender IP is 2a05:f6c3:fefd:0:42c:a43d:2848:c282) 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 , Denis Benato Subject: [PATCH v11 11/11] HID: asus: add support for the asus-wmi brightness handler Date: Fri, 16 Jan 2026 14:31:50 +0100 Message-ID: <20260116133150.5606-12-lkml@antheas.dev> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260116133150.5606-1-lkml@antheas.dev> References: <20260116133150.5606-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: <176857033397.3553103.9242304130852948831@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 Reviewed-by: Denis Benato Acked-by: Benjamin Tissoires 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 19fc43f27ff3..50410b1c81ab 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.52.0