From patchwork Wed Mar 19 19:13:09 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antheas Kapenekakis X-Patchwork-Id: 14023010 X-Patchwork-Delegate: jikos@jikos.cz Received: from linux1587.grserver.gr (linux1587.grserver.gr [185.138.42.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8E2A4211A24; Wed, 19 Mar 2025 19:13:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.138.42.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411610; cv=none; b=WSgQBBgRQ++igUUBHPkVAk/4F2BT678sMxZb8j17UQqewnv0ce1grmBdLG6px5trBRIPR/gfPL5YkIF959Zayk/L2kMDQkca7HQwJZlzEB61yhD7JWjzjBYQoX8eJDlj1PotMgeCGGwtMOuCvfRA/YcsYc3/sR3RVFst/UxjBpI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411610; c=relaxed/simple; bh=jjlpPxF/o4bcVU3POrsYYyHNWQPPHKAdxI1XlxzBo/A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GZrUz6tEqdG0lZ/liQVqczMssLP2/IbgL8cBLnuTp4QKJ6mnd48HuSSLY4/IG+4n21I6zi6ICuQmH+ZmCI9uXLXF2dWA6K7sDHHI1z1j1GZ5dB4gAb3mXjYx0D9AWWxGcVDYJwGG7nscweyvdxYB8NkqMkciuXfnFyp3VTWjvSA= 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=ITgoLf7O; arc=none smtp.client-ip=185.138.42.100 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="ITgoLf7O" Received: from localhost.localdomain (unknown [IPv6:2a05:f6c2:511b:0:cbc0:999f:73ad:33bd]) by linux1587.grserver.gr (Postfix) with ESMTPSA id E1A682E0924F; Wed, 19 Mar 2025 21:13:23 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1742411605; bh=+2jYk8Z6h7BV4+cq0gxcvdXN9X7tzZNe0V0/p5KrIwc=; h=From:To:Subject; b=ITgoLf7O3nHWNQ4WssO9cRaM+NTs9nI75sGMrBNJmrkmaLx0nyVRCJ1OHWNtRGsIG S+qQic8YWUHkR749RpbHpNAQEOivi/FOszzN1SjTbS+Wo2FMPOVJv7Cq7pnCRoyXJ+ N/XQQyyxP3Z0ke/X3ee8Zq+NWAWQ7aqw2gET04L8= Authentication-Results: linux1587.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:cbc0:999f:73ad:33bd) smtp.mailfrom=lkml@antheas.dev smtp.helo=localhost.localdomain Received-SPF: pass (linux1587.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_J=C3=A4rvinen?= , Antheas Kapenekakis Subject: [PATCH 01/11] HID: asus: refactor init sequence per spec Date: Wed, 19 Mar 2025 20:13:09 +0100 Message-ID: <20250319191320.10092-2-lkml@antheas.dev> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250319191320.10092-1-lkml@antheas.dev> References: <20250319191320.10092-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-PPP-Message-ID: <174241160499.7642.1538751541080314698@linux1587.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 0.103.11 at linux1587.grserver.gr X-Virus-Status: Clean Currently, asus_kbd_init() uses a reverse engineered init sequence from Windows, which contains the handshakes from multiple programs. Keep the main one, which is 0x5a (meant for drivers). In addition, perform a get_response and check if the response is the same. To avoid regressions, print an error if the response does not match instead of rejecting device. Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 82 +++++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 36 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 46e3e42f9eb5f..aa4a481dc4f27 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 @@ -386,16 +386,43 @@ static int asus_kbd_set_report(struct hid_device *hdev, const u8 *buf, size_t bu return ret; } -static int asus_kbd_init(struct hid_device *hdev, u8 report_id) +static int asus_kbd_init(struct hid_device *hdev) { - const u8 buf[] = { report_id, 0x41, 0x53, 0x55, 0x53, 0x20, 0x54, - 0x65, 0x63, 0x68, 0x2e, 0x49, 0x6e, 0x63, 0x2e, 0x00 }; + /* + * Asus handshake identifying us as a driver (0x5A) + * 0x5A then ASCII for "ASUS Tech.Inc." + * 0x5D is for userspace Windows applications. + * + * The handshake is first sent as a set_report, then retrieved + * from a get_report to verify the response. + */ + const u8 buf[] = { FEATURE_KBD_REPORT_ID, 0x41, 0x53, 0x55, 0x53, 0x20, + 0x54, 0x65, 0x63, 0x68, 0x2e, 0x49, 0x6e, 0x63, 0x2e, 0x00 }; + u8 *readbuf; int ret; ret = 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 = kzalloc(FEATURE_KBD_REPORT_SIZE, GFP_KERNEL); + if (!readbuf) + return -ENOMEM; + + ret = hid_hw_raw_request(hdev, FEATURE_KBD_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)) != 0) { + hid_err(hdev, "Asus handshake returned invalid response: %*ph\n", + FEATURE_KBD_REPORT_SIZE, readbuf); + // Do not return error if handshake is wrong to avoid regressions + } + + kfree(readbuf); return ret; } @@ -540,42 +567,25 @@ static int asus_kbd_register_leds(struct hid_device *hdev) unsigned char kbd_func; int ret; - if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { - /* Initialize keyboard */ - ret = asus_kbd_init(hdev, FEATURE_KBD_REPORT_ID); - if (ret < 0) - return ret; - - /* The LED endpoint is initialised in two HID */ - ret = asus_kbd_init(hdev, FEATURE_KBD_LED_REPORT_ID1); - if (ret < 0) - return ret; - - ret = asus_kbd_init(hdev, FEATURE_KBD_LED_REPORT_ID2); - if (ret < 0) - return ret; + ret = asus_kbd_init(hdev); + if (ret < 0) + return ret; - if (dmi_match(DMI_PRODUCT_FAMILY, "ProArt P16")) { - ret = asus_kbd_disable_oobe(hdev); - if (ret < 0) - return ret; - } - } else { - /* Initialize keyboard */ - ret = asus_kbd_init(hdev, FEATURE_KBD_REPORT_ID); - if (ret < 0) - return ret; + /* Get keyboard functions */ + ret = asus_kbd_get_functions(hdev, &kbd_func, FEATURE_KBD_REPORT_ID); + if (ret < 0) + return ret; - /* Get keyboard functions */ - ret = asus_kbd_get_functions(hdev, &kbd_func, FEATURE_KBD_REPORT_ID); + if (dmi_match(DMI_PRODUCT_FAMILY, "ProArt P16")) { + ret = asus_kbd_disable_oobe(hdev); if (ret < 0) return ret; - - /* Check for backlight support */ - if (!(kbd_func & SUPPORT_KBD_BACKLIGHT)) - return -ENODEV; } + /* Check for backlight support */ + if (!(kbd_func & SUPPORT_KBD_BACKLIGHT)) + return -ENODEV; + drvdata->kbd_backlight = devm_kzalloc(&hdev->dev, sizeof(struct asus_kbd_leds), GFP_KERNEL); From patchwork Wed Mar 19 19:13:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antheas Kapenekakis X-Patchwork-Id: 14023011 X-Patchwork-Delegate: jikos@jikos.cz Received: from linux1587.grserver.gr (linux1587.grserver.gr [185.138.42.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1FD9C1B0F1E; Wed, 19 Mar 2025 19:13:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.138.42.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411610; cv=none; b=KOVQGKDMxecCvYDuAnzR6ugvjzzuQGNbyWhdo+7AlCFfid+zxgSHiN9OodFQ2s3ffdxhzWVf346QW/4Ez0kmPslYS9oHlBpR/s0TE/fnWIbdczSiX/PrlRcWfLU8k/oFF4yIDtgt1CUVy5pWEyFHyEPUyHUZF0wHtCA7LpRlD+4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411610; c=relaxed/simple; bh=fdpGiDeNZTffqd3ClYYEe7dLIgqCM5WBpFP3hHCUauk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PcdQwnxyTUgdxx+5MvxPpz6p8+qow8DMDiJSCAC99EXnxEr/L7FcttBzZKqoLLCk4IuiuymESq3MckXU3PTgF/pos+cRdl4L6r9DTqlTmnadQ4u59jW6VO/gIZyTE//KKL+yc7FZn/10JBzzS8Oofh4+N+dMhYr/nlC7obWoLzw= 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=JcGwKjn0; arc=none smtp.client-ip=185.138.42.100 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="JcGwKjn0" Received: from localhost.localdomain (unknown [IPv6:2a05:f6c2:511b:0:cbc0:999f:73ad:33bd]) by linux1587.grserver.gr (Postfix) with ESMTPSA id 8DEAF2E02983; Wed, 19 Mar 2025 21:13:25 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1742411606; bh=CkVyRl6ofkF8tSjqkt4HlEXeT8gWPG11IpspxJDllEg=; h=From:To:Subject; b=JcGwKjn0mHZK98VyOWmVT8GWs81zoQjwwm5XzrwP1USnO0CXK/to6oplo7vy1xSKH W5MUcKTWqKAWuOEJ2npbcleXqJZbmzMHBp/2lERcinb/QjKgCHT/ey8kLypDtq3JwY ndMSF/4ZrsaogXSNTf6HW1zx71RsjZV93yDI3HwU= Authentication-Results: linux1587.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:cbc0:999f:73ad:33bd) smtp.mailfrom=lkml@antheas.dev smtp.helo=localhost.localdomain Received-SPF: pass (linux1587.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_J=C3=A4rvinen?= , Antheas Kapenekakis Subject: [PATCH 02/11] HID: asus: cleanup keyboard backlight check Date: Wed, 19 Mar 2025 20:13:10 +0100 Message-ID: <20250319191320.10092-3-lkml@antheas.dev> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250319191320.10092-1-lkml@antheas.dev> References: <20250319191320.10092-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-PPP-Message-ID: <174241160668.7728.4433485881007523163@linux1587.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 0.103.11 at linux1587.grserver.gr X-Virus-Status: Clean Currently, asus_kbd_get_functions does a set_report to query for the keyboard backlight status using a varying report id. However, it then does get_report with the fixed id 0x5a. The ids of get_report and set_report should always match. Therefore, remove the calling argument and force 0x5a. Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index aa4a481dc4f27..bcc317057b465 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -427,10 +427,9 @@ static int asus_kbd_init(struct hid_device *hdev) } static int asus_kbd_get_functions(struct hid_device *hdev, - unsigned char *kbd_func, - u8 report_id) + unsigned char *kbd_func) { - const u8 buf[] = { report_id, 0x05, 0x20, 0x31, 0x00, 0x08 }; + const u8 buf[] = { FEATURE_KBD_REPORT_ID, 0x05, 0x20, 0x31, 0x00, 0x08 }; u8 *readbuf; int ret; @@ -572,7 +571,7 @@ static int asus_kbd_register_leds(struct hid_device *hdev) return ret; /* Get keyboard functions */ - ret = asus_kbd_get_functions(hdev, &kbd_func, FEATURE_KBD_REPORT_ID); + ret = asus_kbd_get_functions(hdev, &kbd_func); if (ret < 0) return ret; From patchwork Wed Mar 19 19:13:11 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antheas Kapenekakis X-Patchwork-Id: 14023012 X-Patchwork-Delegate: jikos@jikos.cz Received: from linux1587.grserver.gr (linux1587.grserver.gr [185.138.42.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C9BEB214229; Wed, 19 Mar 2025 19:13:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.138.42.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411612; cv=none; b=oy75HbFVxRIe71db6vDKSBu+9NGkUPB7gI141/Hncq3aiCvhkeMNVXC1GMkvOn/2X1pvHmTA9WK/Vli3+sBjOpGrfe6p6fSE2FG53Km9uZ8IlDIxtI7mbWRbGbjNFVLLj4Wb7+7Gms+xmwLYFi7NJcem8LL6OTHRR0qHFsy510Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411612; c=relaxed/simple; bh=H6ahJ6dFl9NtA3U+I5cnYAHTpmlYoRnzVQceCiQh5i8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nN0DOm428h0Sk/U07ZxU7ASlgceptq6lSd4+ytNSCxCwu81g6OEA8DKKjR0K7yr8UjS8tNwtgUr+aGGAFnAZO3OOTLMOSoygvzBNKzHDsWSNWhgnINzU5G2+STzySqJ+2Ahphxv2QWQTG8XFp3dwGKAYrZVsqvRashzYdKDlwE8= 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=e6YW2tCk; arc=none smtp.client-ip=185.138.42.100 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="e6YW2tCk" Received: from localhost.localdomain (unknown [IPv6:2a05:f6c2:511b:0:cbc0:999f:73ad:33bd]) by linux1587.grserver.gr (Postfix) with ESMTPSA id 2BFE42E0927A; Wed, 19 Mar 2025 21:13:27 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1742411608; bh=fjWMrevb+CUxvpgf71+gDqUfL7lddQjGNkYmwGGj3VQ=; h=From:To:Subject; b=e6YW2tCkKmyj2JMbXzA4mwbJIlT3aseK0+RKaUPDJ36ps88PnvvVfGkXUQdp6pKBY H9yuxCy3hnGGoeNXMUqORNFgUXy4uhjv71od9NaOB47beRijBEozznBwVSEtDaOXQm KcVca4PD45+NeYXT7oCUTC+K6Sf0bw0YxLkrkiHw= Authentication-Results: linux1587.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:cbc0:999f:73ad:33bd) smtp.mailfrom=lkml@antheas.dev smtp.helo=localhost.localdomain Received-SPF: pass (linux1587.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_J=C3=A4rvinen?= , Antheas Kapenekakis Subject: [PATCH 03/11] HID: asus: prevent binding to all HID devices on ROG Date: Wed, 19 Mar 2025 20:13:11 +0100 Message-ID: <20250319191320.10092-4-lkml@antheas.dev> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250319191320.10092-1-lkml@antheas.dev> References: <20250319191320.10092-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-PPP-Message-ID: <174241160823.7785.16518627883513381170@linux1587.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 0.103.11 at linux1587.grserver.gr X-Virus-Status: Clean ROG keyboards are HID compliant. We only care about the endpoint that produces vendor events (e.g., fan mode) and has the keyboard backlight. If we attach to all the endpoints, we end up generating errors during probe for two of them because they are missing the ->input attribute and risk side effects during input fixups. Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 52 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index bcc317057b465..490a7ea369961 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -84,6 +84,7 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); #define QUIRK_MEDION_E1239T BIT(10) #define QUIRK_ROG_NKEY_KEYBOARD BIT(11) #define QUIRK_ROG_CLAYMORE_II_KEYBOARD BIT(12) +#define QUIRK_HANDLE_GENERIC BIT(13) #define I2C_KEYBOARD_QUIRKS (QUIRK_FIX_NOTEBOOK_REPORT | \ QUIRK_NO_INIT_REPORTS | \ @@ -326,6 +327,10 @@ static int asus_raw_event(struct hid_device *hdev, { struct asus_drvdata *drvdata = hid_get_drvdata(hdev); + if (drvdata->quirks & QUIRK_HANDLE_GENERIC) + /* NOOP on generic HID devices to avoid side effects. */ + return 0; + if (drvdata->battery && data[0] == BATTERY_REPORT_ID) return asus_report_battery(drvdata, data, size); @@ -773,6 +778,10 @@ static int asus_input_configured(struct hid_device *hdev, struct hid_input *hi) struct input_dev *input = hi->input; struct asus_drvdata *drvdata = hid_get_drvdata(hdev); + if (drvdata->quirks & QUIRK_HANDLE_GENERIC) + /* NOOP on generic HID devices to avoid side effects. */ + return 0; + /* T100CHI uses MULTI_INPUT, bind the touchpad to the mouse hid_input */ if (drvdata->quirks & QUIRK_T100CHI && hi->report->id != T100CHI_MOUSE_REPORT_ID) @@ -850,6 +859,10 @@ static int asus_input_mapping(struct hid_device *hdev, return -1; } + if (drvdata->quirks & QUIRK_HANDLE_GENERIC) + /* NOOP on generic HID devices to avoid side effects. */ + return 0; + /* * Ignore a bunch of bogus collections in the T100CHI descriptor. * This avoids a bunch of non-functional hid_input devices getting @@ -1025,8 +1038,10 @@ static int __maybe_unused asus_reset_resume(struct hid_device *hdev) 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, found = 0; drvdata = devm_kzalloc(&hdev->dev, sizeof(*drvdata), GFP_KERNEL); if (drvdata == NULL) { @@ -1110,6 +1125,37 @@ static int asus_probe(struct hid_device *hdev, const struct hid_device_id *id) return ret; } + if (drvdata->quirks & QUIRK_ROG_NKEY_KEYBOARD) { + /* + * The only application we care about on ROG NKEY keyboards is + * 0xff310076. This is meant Asus drivers and uses report 0x54. + */ + rep_enum = &hdev->report_enum[HID_INPUT_REPORT]; + list_for_each_entry(rep, &rep_enum->report_list, list) { + if (rep->application == 0xff310076) + found = true; + } + + /* + * If we didn't find the application, block hid-asus fixups + * to prevent side effects on generic endpoints. + * + * We cannot -ENODEV here, as hid-generic checked our id_table + * on its match and bailed so it will not take over the device. + * We have to handle it transparently as part of this driver. + */ + if (!found) + drvdata->quirks |= QUIRK_HANDLE_GENERIC; + + /* + * Start all endpoints normally. Include the RGB endpoint + * as it being the only one renamed looks out of place. + * The ->input bail causes regressions in endpoints without + * an input dev and is a NOOP on the RGB endpoint. + */ + return hid_hw_start(hdev, HID_CONNECT_DEFAULT); + } + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); if (ret) { hid_err(hdev, "Asus hw start failed: %d\n", ret); @@ -1166,6 +1212,10 @@ static const __u8 *asus_report_fixup(struct hid_device *hdev, __u8 *rdesc, { struct asus_drvdata *drvdata = hid_get_drvdata(hdev); + if (drvdata->quirks & QUIRK_HANDLE_GENERIC) + /* NOOP on generic HID devices to avoid side effects. */ + return rdesc; + if (drvdata->quirks & QUIRK_FIX_NOTEBOOK_REPORT && *rsize >= 56 && rdesc[54] == 0x25 && rdesc[55] == 0x65) { hid_info(hdev, "Fixing up Asus notebook report descriptor\n"); From patchwork Wed Mar 19 19:13:12 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antheas Kapenekakis X-Patchwork-Id: 14023013 X-Patchwork-Delegate: jikos@jikos.cz Received: from linux1587.grserver.gr (linux1587.grserver.gr [185.138.42.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4F67A2147FD; Wed, 19 Mar 2025 19:13:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.138.42.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411613; cv=none; b=iOykOsuZLL9E3sE4NVL1F22W/0/Fgg3FX47rZPT2A5FBOsYcJo0L4yDiwWAmnBHaV8gkrT1HaLpnO6r2pxrN6eaN3P+cq3U2DPbLOETRLFom4p8qN7dYVrsBARjL2YUtApSd2YdxcOJrm58zcpY7tL5NaAyCU2cOk/QpGTYmGK0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411613; c=relaxed/simple; bh=rmisatLur1khpgNdf78Pr6n6L9e9uepCL2eCXs2uvJc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Do0YkE2GHHKE8TL56npUjdo/i357BljrseuDOEwfRVYRegHxm2SRLTkgjOVkDmB6Q2FR0LME0UJrkGQmLFKfqP25UggP67tPu0ocYJrA5vALTKq9z4LcL4/JRVOA182e2ukKUCKR9jAXzHgYHcoa2zVcqdDF68iWBjeYXGeFaUE= 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=GuGVBCkS; arc=none smtp.client-ip=185.138.42.100 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="GuGVBCkS" Received: from localhost.localdomain (unknown [IPv6:2a05:f6c2:511b:0:cbc0:999f:73ad:33bd]) by linux1587.grserver.gr (Postfix) with ESMTPSA id D38F52E0927F; Wed, 19 Mar 2025 21:13:28 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1742411610; bh=pC9nP4f3CD+iwAPbd/5jHhvg+lorSG81w2KEeyHY9ik=; h=From:To:Subject; b=GuGVBCkSJfD0lMhFhVUdl0CKRuDsJ0ZjDiCQ+HxJcWfZoI7X6Hae+XbBOq6uAVDQX YV469Uk/S3ojTkyyYTJtNgO0Y2LuXKl7CnOzBdE+qu5B8/0ehGB4cEyEUVPN/bYTb3 QPclMZzRtcMu9XDgTb8w42Qhu3aDlIXP+2uYQMPQ= Authentication-Results: linux1587.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:cbc0:999f:73ad:33bd) smtp.mailfrom=lkml@antheas.dev smtp.helo=localhost.localdomain Received-SPF: pass (linux1587.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_J=C3=A4rvinen?= , Antheas Kapenekakis Subject: [PATCH 04/11] HID: asus: rename keyboard3 to Z13_FOLIO Date: Wed, 19 Mar 2025 20:13:12 +0100 Message-ID: <20250319191320.10092-5-lkml@antheas.dev> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250319191320.10092-1-lkml@antheas.dev> References: <20250319191320.10092-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-PPP-Message-ID: <174241160991.7865.2952503598076359399@linux1587.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 0.103.11 at linux1587.grserver.gr X-Virus-Status: Clean Rename the generic keyboard3 to Z13_FOLIO as it refers to the folio of the Z13. Both 2023 and 2025 variants. Signed-off-by: Antheas Kapenekakis Reviewed-by: Luke D. Jones --- drivers/hid/hid-asus.c | 2 +- drivers/hid/hid-ids.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 490a7ea369961..cdd9d9c4fc95f 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -1332,7 +1332,7 @@ static const struct hid_device_id asus_devices[] = { USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD2), QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, - USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD3), + USB_DEVICE_ID_ASUSTEK_ROG_Z13_FOLIO), QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD }, { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_ROG_Z13_LIGHTBAR), diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 7e400624908e3..b1fe7582324ff 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -209,7 +209,7 @@ #define USB_DEVICE_ID_ASUSTEK_ROG_KEYBOARD3 0x1822 #define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD 0x1866 #define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD2 0x19b6 -#define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_KEYBOARD3 0x1a30 +#define USB_DEVICE_ID_ASUSTEK_ROG_Z13_FOLIO 0x1a30 #define USB_DEVICE_ID_ASUSTEK_ROG_Z13_LIGHTBAR 0x18c6 #define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY 0x1abe #define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY_X 0x1b4c From patchwork Wed Mar 19 19:13:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antheas Kapenekakis X-Patchwork-Id: 14023014 X-Patchwork-Delegate: jikos@jikos.cz Received: from linux1587.grserver.gr (linux1587.grserver.gr [185.138.42.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 11994211A24; Wed, 19 Mar 2025 19:13:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.138.42.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411615; cv=none; b=XqGz78Ips/IlcVE6t2YDHrwYTeSrLwsbIeZ0EDzKUXqrCXCLcgLqZk37gVf6SePS3tTvno34WHRvVSOit72YW1ZXjN14jUJXhO0Mwb7GGTveSYt/k1oCflp3+ESRIW7/iXhvg0h2I5i+uVY5cXlqxiS/WHRPJxsd+T57jpCXZdk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411615; c=relaxed/simple; bh=wAhH0wCyLMYN5siRxm3cdhd9sDXfVTdnZj90NLYy+Z4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mwKTzJ6ELW27XFxXvNgVCBmCwfo2A76mOfJ/hNyA4sJXhKC4S5+4Y0VOJIJ/cOa+LveXbyzZCehF2IFZYoUdLagpj3H4OK6IB5b0anmqkK74wuSAFBE5RQA2qT+cGIHpDAQQRmGo+TUAFSmOeBcJE9cUXhHhYhQMbxsgpf5BYvI= 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=WmnHHAcc; arc=none smtp.client-ip=185.138.42.100 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="WmnHHAcc" Received: from localhost.localdomain (unknown [IPv6:2a05:f6c2:511b:0:cbc0:999f:73ad:33bd]) by linux1587.grserver.gr (Postfix) with ESMTPSA id 7BEAF2E095C5; Wed, 19 Mar 2025 21:13:30 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1742411611; bh=dyuxnbEjcCrtzEd+4OBqfcYOiyJ+75xQVkyMc6sKd7Q=; h=From:To:Subject; b=WmnHHAccp3DOLoI+/kFKSE53ZeknXQoqpFalDvKehOEDLV/jazQDby1MSOyu3rtTJ 2g61KAMYB/a4weT5q3247l0SwwovoevuVo2dfdJM+/PsewELC5OWD2Tid3LLSn2tlF tUaAniTPPo1/0SZRCGGiDHe5zB+mWrNKx5aS531o= Authentication-Results: linux1587.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:cbc0:999f:73ad:33bd) smtp.mailfrom=lkml@antheas.dev smtp.helo=localhost.localdomain Received-SPF: pass (linux1587.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_J=C3=A4rvinen?= , Antheas Kapenekakis Subject: [PATCH 05/11] HID: asus: add Asus Z13 2025 Fan key Date: Wed, 19 Mar 2025 20:13:13 +0100 Message-ID: <20250319191320.10092-6-lkml@antheas.dev> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250319191320.10092-1-lkml@antheas.dev> References: <20250319191320.10092-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-PPP-Message-ID: <174241161162.8006.15779185311527245548@linux1587.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 0.103.11 at linux1587.grserver.gr X-Virus-Status: Clean The ASUS Z13 2025 uses the vendor code 0xec for its Fn+F5 fan key. Add a quirk for it. Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index cdd9d9c4fc95f..85ae75478b796 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -897,6 +897,7 @@ static int asus_input_mapping(struct hid_device *hdev, case 0x5c: asus_map_key_clear(KEY_PROG3); break; /* Fn+Space Power4Gear */ case 0x99: asus_map_key_clear(KEY_PROG4); break; /* Fn+F5 "fan" symbol */ case 0xae: asus_map_key_clear(KEY_PROG4); break; /* Fn+F5 "fan" symbol */ + case 0xec: asus_map_key_clear(KEY_PROG4); break; /* Fn+F5 "fan" symbol (Z13 2025) */ case 0x92: asus_map_key_clear(KEY_CALC); break; /* Fn+Ret "Calc" symbol */ case 0xb2: asus_map_key_clear(KEY_PROG2); break; /* Fn+Left previous aura */ case 0xb3: asus_map_key_clear(KEY_PROG3); break; /* Fn+Left next aura */ From patchwork Wed Mar 19 19:13:14 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antheas Kapenekakis X-Patchwork-Id: 14023015 X-Patchwork-Delegate: jikos@jikos.cz Received: from linux1587.grserver.gr (linux1587.grserver.gr [185.138.42.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7F6F1215173; Wed, 19 Mar 2025 19:13:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.138.42.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411617; cv=none; b=NxJ/6BBQeobas0Ohpve5916TAumd4FlXV5JVEIwORwuqQr4PwB510NcHy9M84BO8kkx4a2cWtTS8N+9Su/c56sTz6J/wt4584joW6cB9b/McVVIxr7eg5+RAE+a3UIpqAUsLVoXKLGjWPLhoNWPWikdOZruzkZLMIbVWv8k3V0Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411617; c=relaxed/simple; bh=FSChMSzRlun5F9Gth0PQbQ/Y4HmeD8MHv4+WUmwxsD0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OQmwaGxqhxmecSMD2nEnGIFPc6JDAfzYB2lIPgJBspvITY3n/tETomIRzWiiK2mBcXHuzjtu6+pzCrVcPTHEgIdYJT6he6Zd+mKedRO7Ir3IbkgsT1HuE6BTWVxtKlB21obxzmhlSENEmJ6PUDdjcvveRlOCbLyy2DU9SnRerlw= 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=zuHRTYdS; arc=none smtp.client-ip=185.138.42.100 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="zuHRTYdS" Received: from localhost.localdomain (unknown [IPv6:2a05:f6c2:511b:0:cbc0:999f:73ad:33bd]) by linux1587.grserver.gr (Postfix) with ESMTPSA id 335892E095E4; Wed, 19 Mar 2025 21:13:32 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1742411613; bh=X5MzDAHYvzPqz68MFT4gIzxZ2Qr5Ms9s5Nr8impCml4=; h=From:To:Subject; b=zuHRTYdSxusJpEKG+TD90BwoqP6/sdQ0KhUEaMpBvdO+h7hADpMLrqtUsY6laY0XC PG1iWg2BVTRxO7RIEGYpCrcswyo67EB/Jz4kc1aR1dWdGZJPa1JUI1NCDWm60Gw/E7 wn+BX7JNeV4r9wWpIpg6IuhPd+0sdlnALKtpFuts= Authentication-Results: linux1587.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:cbc0:999f:73ad:33bd) smtp.mailfrom=lkml@antheas.dev smtp.helo=localhost.localdomain Received-SPF: pass (linux1587.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_J=C3=A4rvinen?= , Antheas Kapenekakis Subject: [PATCH 06/11] HID: asus: introduce small delay on Asus Z13 RGB init Date: Wed, 19 Mar 2025 20:13:14 +0100 Message-ID: <20250319191320.10092-7-lkml@antheas.dev> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250319191320.10092-1-lkml@antheas.dev> References: <20250319191320.10092-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-PPP-Message-ID: <174241161347.8125.1358787755995757663@linux1587.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 0.103.11 at linux1587.grserver.gr X-Virus-Status: Clean The folio keyboard of the Z13 can get stuck in its BIOS mode, where the touchpad behaves like a mouse and the keyboard start button is not reliable if we perform the initialization too quickly. This mostly happens during boot, and can be verified to be caused by hid-asus through simple blacklisting. A small delay fixes it. Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 85ae75478b796..5b75ee83ae290 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -571,6 +571,10 @@ static int asus_kbd_register_leds(struct hid_device *hdev) unsigned char kbd_func; int ret; + /* Wait a bit before init to prevent locking the keyboard */ + if (dmi_match(DMI_PRODUCT_FAMILY, "ROG Flow Z13")) + msleep(500); + ret = asus_kbd_init(hdev); if (ret < 0) return ret; From patchwork Wed Mar 19 19:13:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antheas Kapenekakis X-Patchwork-Id: 14023016 Received: from linux1587.grserver.gr (linux1587.grserver.gr [185.138.42.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 438F6218E99; Wed, 19 Mar 2025 19:13:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.138.42.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411619; cv=none; b=D3KExh7sp8VGUSeygrGg7/F9GThp7CQLv8wqtBd37FH+hrw6nkqYHSKGY4ry4ztTsi7PlspORXsBKXTUAMMVlvW3b8UClmRrKGxegkoOPCh8nuICPLJMT7ro6DBTgUSXds9TYEeBfZ54WJYqHwww7ZfR9UxUzo33ShxXUxRWGJM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411619; c=relaxed/simple; bh=GJwwDW3BN8J6YfHmZ4QYl4xAlvZjRCLrNTLGfrLOg5A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bg+DRGuan/42/Xsvm+e+fHeC76O/Cx50owslCUWar9jTQRQFx729OVxrGMKQV8xAE3aSUZGfd6/WNUibbQknVzX9ToaJTDU9ORVW0I+0miFGhZNhxJzEZ7bqn9A+MIUdMbWxOxqOyCnY9Q3DC206QnrrVLzpYWlx/TI7O2/xllw= 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=wziN4Z3E; arc=none smtp.client-ip=185.138.42.100 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="wziN4Z3E" Received: from localhost.localdomain (unknown [IPv6:2a05:f6c2:511b:0:cbc0:999f:73ad:33bd]) by linux1587.grserver.gr (Postfix) with ESMTPSA id E97FA2E095E5; Wed, 19 Mar 2025 21:13:33 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1742411615; bh=Vx6zsktsNHbgLXmD/Z9vYeZrBlKe0HGcXv3+fK1rga8=; h=From:To:Subject; b=wziN4Z3Eq1dY+K519G1TLykcfFMguvCstaYi6NS0ITxlc5b/yvjDVyZrnlVopU1u/ CU24+2zGJcXOAgK/3T58xwURZD8DbsEA0LNAW7UeA4wQe4n8gg5Ac1NC5GGhjbxgUr 6LGYSrdp24gVvP6EC0lzWzLrfF0wfHcarSBvPLdY= Authentication-Results: linux1587.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:cbc0:999f:73ad:33bd) smtp.mailfrom=lkml@antheas.dev smtp.helo=localhost.localdomain Received-SPF: pass (linux1587.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_J=C3=A4rvinen?= , Antheas Kapenekakis Subject: [PATCH 07/11] platform/x86: asus-wmi: Add support for multiple kbd RGB handlers Date: Wed, 19 Mar 2025 20:13:15 +0100 Message-ID: <20250319191320.10092-8-lkml@antheas.dev> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250319191320.10092-1-lkml@antheas.dev> References: <20250319191320.10092-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-PPP-Message-ID: <174241161509.8235.8967813105438721484@linux1587.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 0.103.11 at linux1587.grserver.gr X-Virus-Status: Clean 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. Signed-off-by: Antheas Kapenekakis --- drivers/platform/x86/asus-wmi.c | 98 +++++++++++++++++++--- include/linux/platform_data/x86/asus-wmi.h | 16 ++++ 2 files changed, 103 insertions(+), 11 deletions(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c index 38ef778e8c19b..0cb1cf3c25a28 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -254,6 +254,8 @@ struct asus_wmi { int tpd_led_wk; struct led_classdev kbd_led; int kbd_led_wk; + bool kbd_led_avail; + bool kbd_led_registered; struct led_classdev lightbar_led; int lightbar_led_wk; struct led_classdev micmute_led; @@ -1487,6 +1489,46 @@ static void asus_wmi_battery_exit(struct asus_wmi *asus) /* LEDs ***********************************************************************/ +LIST_HEAD(asus_brt_listeners); +DEFINE_MUTEX(asus_brt_lock); +struct asus_wmi *asus_brt_ref; + +int asus_brt_register_listener(struct asus_brt_listener *bdev) +{ + int ret; + + mutex_lock(&asus_brt_lock); + list_add_tail(&bdev->list, &asus_brt_listeners); + if (asus_brt_ref) { + if (asus_brt_ref->kbd_led_registered && asus_brt_ref->kbd_led_wk >= 0) + bdev->notify(bdev, asus_brt_ref->kbd_led_wk); + else { + asus_brt_ref->kbd_led_registered = true; + ret = led_classdev_register( + &asus_brt_ref->platform_device->dev, + &asus_brt_ref->kbd_led); + } + } + mutex_unlock(&asus_brt_lock); + + return ret; +} +EXPORT_SYMBOL_GPL(asus_brt_register_listener); + +void asus_brt_unregister_listener(struct asus_brt_listener *bdev) +{ + mutex_lock(&asus_brt_lock); + list_del(&bdev->list); + + if (asus_brt_ref && list_empty(&asus_brt_listeners) && + !asus_brt_ref->kbd_led_avail) { + led_classdev_unregister(&asus_brt_ref->kbd_led); + asus_brt_ref->kbd_led_registered = false; + } + mutex_unlock(&asus_brt_lock); +} +EXPORT_SYMBOL_GPL(asus_brt_unregister_listener); + /* * These functions actually update the LED's, and are called from a * workqueue. By doing this as separate work rather than when the LED @@ -1566,6 +1608,7 @@ static int kbd_led_read(struct asus_wmi *asus, int *level, int *env) static void do_kbd_led_set(struct led_classdev *led_cdev, int value) { + struct asus_brt_listener *listener; struct asus_wmi *asus; int max_level; @@ -1573,25 +1616,37 @@ static void do_kbd_led_set(struct led_classdev *led_cdev, int value) max_level = asus->kbd_led.max_brightness; asus->kbd_led_wk = clamp_val(value, 0, max_level); - kbd_led_update(asus); + + if (asus->kbd_led_avail) + kbd_led_update(asus); + + list_for_each_entry(listener, &asus_brt_listeners, list) + listener->notify(listener, asus->kbd_led_wk); } static void kbd_led_set(struct led_classdev *led_cdev, enum led_brightness value) { + mutex_lock(&asus_brt_lock); + /* Prevent disabling keyboard backlight on module unregister */ if (led_cdev->flags & LED_UNREGISTERING) return; do_kbd_led_set(led_cdev, value); + mutex_unlock(&asus_brt_lock); } static void kbd_led_set_by_kbd(struct asus_wmi *asus, enum led_brightness value) { - struct led_classdev *led_cdev = &asus->kbd_led; + struct led_classdev *led_cdev; + + mutex_lock(&asus_brt_lock); + led_cdev = &asus->kbd_led; do_kbd_led_set(led_cdev, value); led_classdev_notify_brightness_hw_changed(led_cdev, asus->kbd_led_wk); + mutex_unlock(&asus_brt_lock); } static enum led_brightness kbd_led_get(struct led_classdev *led_cdev) @@ -1601,6 +1656,9 @@ static enum led_brightness kbd_led_get(struct led_classdev *led_cdev) asus = container_of(led_cdev, struct asus_wmi, kbd_led); + if (!asus->kbd_led_avail) + return asus->kbd_led_wk; + retval = kbd_led_read(asus, &value, NULL); if (retval < 0) return retval; @@ -1716,6 +1774,10 @@ static int camera_led_set(struct led_classdev *led_cdev, static void asus_wmi_led_exit(struct asus_wmi *asus) { + mutex_lock(&asus_brt_lock); + asus_brt_ref = NULL; + mutex_unlock(&asus_brt_lock); + led_classdev_unregister(&asus->kbd_led); led_classdev_unregister(&asus->tpd_led); led_classdev_unregister(&asus->wlan_led); @@ -1730,6 +1792,7 @@ static void asus_wmi_led_exit(struct asus_wmi *asus) static int asus_wmi_led_init(struct asus_wmi *asus) { int rv = 0, num_rgb_groups = 0, led_val; + bool has_listeners; if (asus->kbd_rgb_dev) kbd_rgb_mode_groups[num_rgb_groups++] = &kbd_rgb_mode_group; @@ -1754,24 +1817,37 @@ static int asus_wmi_led_init(struct asus_wmi *asus) goto error; } - if (!kbd_led_read(asus, &led_val, NULL) && !dmi_check_system(asus_use_hid_led_dmi_ids)) { - pr_info("using asus-wmi for asus::kbd_backlight\n"); + asus->kbd_led.name = "asus::kbd_backlight"; + asus->kbd_led.flags = LED_BRIGHT_HW_CHANGED; + asus->kbd_led.brightness_set = kbd_led_set; + asus->kbd_led.brightness_get = kbd_led_get; + asus->kbd_led.max_brightness = 3; + asus->kbd_led_avail = !kbd_led_read(asus, &led_val, NULL); + + if (asus->kbd_led_avail) asus->kbd_led_wk = led_val; - asus->kbd_led.name = "asus::kbd_backlight"; - asus->kbd_led.flags = LED_BRIGHT_HW_CHANGED; - asus->kbd_led.brightness_set = kbd_led_set; - asus->kbd_led.brightness_get = kbd_led_get; - asus->kbd_led.max_brightness = 3; + else + asus->kbd_led_wk = -1; + + if (asus->kbd_led_avail && num_rgb_groups != 0) + asus->kbd_led.groups = kbd_rgb_mode_groups; - if (num_rgb_groups != 0) - asus->kbd_led.groups = kbd_rgb_mode_groups; + mutex_lock(&asus_brt_lock); + has_listeners = !list_empty(&asus_brt_listeners); + mutex_unlock(&asus_brt_lock); + if (asus->kbd_led_avail || has_listeners) { + asus->kbd_led_registered = true; rv = led_classdev_register(&asus->platform_device->dev, &asus->kbd_led); if (rv) goto error; } + mutex_lock(&asus_brt_lock); + asus_brt_ref = asus; + mutex_unlock(&asus_brt_lock); + if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_WIRELESS_LED) && (asus->driver->quirks->wapf > 0)) { INIT_WORK(&asus->wlan_led_work, wlan_led_update); diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h index 783e2a336861b..42e963b70acdb 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -157,14 +157,30 @@ #define ASUS_WMI_DSTS_MAX_BRIGTH_MASK 0x0000FF00 #define ASUS_WMI_DSTS_LIGHTBAR_MASK 0x0000000F +struct asus_brt_listener { + struct list_head list; + void (*notify)(struct asus_brt_listener *listener, int brightness); +}; + #if IS_REACHABLE(CONFIG_ASUS_WMI) int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval); + +int asus_brt_register_listener(struct asus_brt_listener *cdev); +void asus_brt_unregister_listener(struct asus_brt_listener *cdev); #else static inline int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval) { return -ENODEV; } + +static inline int asus_brt_register_listener(struct asus_brt_listener *bdev) +{ + return -ENODEV; +} +static inline void asus_brt_unregister_listener(struct asus_brt_listener *bdev) +{ +} #endif /* To be used by both hid-asus and asus-wmi to determine which controls kbd_brightness */ From patchwork Wed Mar 19 19:13:16 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antheas Kapenekakis X-Patchwork-Id: 14023017 X-Patchwork-Delegate: jikos@jikos.cz Received: from linux1587.grserver.gr (linux1587.grserver.gr [185.138.42.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 40BF821A449; Wed, 19 Mar 2025 19:13:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.138.42.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411621; cv=none; b=rJ4SH1UM46BITOTYIUkXXzzP6L1lkddX6TK6zSygPO2Q9//R0JCsTaJQxQWW00UWaegvsZim90oQ5cF++Qq6kANfojP5LDnfSz9z5xe597vRoatJ/xhihKnY0qrq7boIgsaCA6uvVNSgZAxlgYgP4XZ/egDp5QsBRJ7d1K9UaOE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411621; c=relaxed/simple; bh=d0AWn6n0HU3aKqHBukaitOUT7z5hC8eUSVoitZg2KAg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hXywsv6XpJcsnHRI2w6MAlAcMrAHWRBKDnCRkim1dWyMJLvnARac6aChD49jLusv/69tmSQLaFae8eM8zmEfIzSEEuZvUUTfoBTUlDz7HbWBKteMyxIa549Bm3fRY1Ax7190qrqawliLbEPPtwMI9uaqccU/uwJcS1hSxgntdC4= 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=NDl/i/Vs; arc=none smtp.client-ip=185.138.42.100 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="NDl/i/Vs" Received: from localhost.localdomain (unknown [IPv6:2a05:f6c2:511b:0:cbc0:999f:73ad:33bd]) by linux1587.grserver.gr (Postfix) with ESMTPSA id A82FF2E095E6; Wed, 19 Mar 2025 21:13:35 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1742411617; bh=7SgQNJ88U4jOkXwiLB8JOmfVZKR3hRI/97RSjhIE8XE=; h=From:To:Subject; b=NDl/i/VsU6tKGqsutRGkZThloPvICGA8H+ZxTuhDGMpMcxnm0xeukhsBuycLSK0sv Ws/ZLEkkTjmgYHCRsU2shhC7H1ZLY0WRvQZWAlLM6nYXOU/quD5/9iQDhd3DebSwPd ajnltyBDypoiWUe0QaStcrCxJ5AR/UR/sP7Ek9Xc= Authentication-Results: linux1587.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:cbc0:999f:73ad:33bd) smtp.mailfrom=lkml@antheas.dev smtp.helo=localhost.localdomain Received-SPF: pass (linux1587.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_J=C3=A4rvinen?= , Antheas Kapenekakis Subject: [PATCH 08/11] HID: asus: listen to the asus-wmi brightness device instead of creating one Date: Wed, 19 Mar 2025 20:13:16 +0100 Message-ID: <20250319191320.10092-9-lkml@antheas.dev> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250319191320.10092-1-lkml@antheas.dev> References: <20250319191320.10092-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-PPP-Message-ID: <174241161696.8350.18216879873061530623@linux1587.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 0.103.11 at linux1587.grserver.gr X-Virus-Status: Clean 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. Signed-off-by: Antheas Kapenekakis --- drivers/hid/hid-asus.c | 65 +++++++----------------------------------- 1 file changed, 11 insertions(+), 54 deletions(-) diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c index 5b75ee83ae290..5aae4466c0d63 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -96,7 +96,7 @@ MODULE_DESCRIPTION("Asus HID Keyboard and TouchPad"); #define TRKID_SGN ((TRKID_MAX + 1) >> 1) struct asus_kbd_leds { - struct led_classdev cdev; + struct asus_brt_listener listener; struct hid_device *hdev; struct work_struct work; unsigned int brightness; @@ -493,11 +493,11 @@ static void asus_schedule_work(struct asus_kbd_leds *led) spin_unlock_irqrestore(&led->lock, flags); } -static void asus_kbd_backlight_set(struct led_classdev *led_cdev, - enum led_brightness brightness) +static void asus_kbd_backlight_set(struct asus_brt_listener *listener, + int brightness) { - struct asus_kbd_leds *led = container_of(led_cdev, struct asus_kbd_leds, - cdev); + struct asus_kbd_leds *led = container_of(listener, struct asus_kbd_leds, + listener); unsigned long flags; spin_lock_irqsave(&led->lock, flags); @@ -507,20 +507,6 @@ static void asus_kbd_backlight_set(struct led_classdev *led_cdev, asus_schedule_work(led); } -static enum led_brightness asus_kbd_backlight_get(struct led_classdev *led_cdev) -{ - struct asus_kbd_leds *led = container_of(led_cdev, struct asus_kbd_leds, - cdev); - enum led_brightness brightness; - unsigned long flags; - - spin_lock_irqsave(&led->lock, flags); - brightness = 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 = container_of(work, struct asus_kbd_leds, work); @@ -537,34 +523,6 @@ static void asus_kbd_backlight_work(struct work_struct *work) hid_err(led->hdev, "Asus failed to set keyboard backlight: %d\n", ret); } -/* 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 = 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 = 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); -} - static int asus_kbd_register_leds(struct hid_device *hdev) { struct asus_drvdata *drvdata = hid_get_drvdata(hdev); @@ -603,14 +561,12 @@ static int asus_kbd_register_leds(struct hid_device *hdev) drvdata->kbd_backlight->removed = false; drvdata->kbd_backlight->brightness = 0; drvdata->kbd_backlight->hdev = hdev; - drvdata->kbd_backlight->cdev.name = "asus::kbd_backlight"; - drvdata->kbd_backlight->cdev.max_brightness = 3; - drvdata->kbd_backlight->cdev.brightness_set = asus_kbd_backlight_set; - drvdata->kbd_backlight->cdev.brightness_get = asus_kbd_backlight_get; + drvdata->kbd_backlight->listener.notify = asus_kbd_backlight_set; INIT_WORK(&drvdata->kbd_backlight->work, asus_kbd_backlight_work); spin_lock_init(&drvdata->kbd_backlight->lock); - ret = devm_led_classdev_register(&hdev->dev, &drvdata->kbd_backlight->cdev); + ret = asus_brt_register_listener(&drvdata->kbd_backlight->listener); + if (ret < 0) { /* No need to have this still around */ devm_kfree(&hdev->dev, drvdata->kbd_backlight); @@ -840,7 +796,6 @@ static int asus_input_configured(struct hid_device *hdev, struct hid_input *hi) drvdata->input = input; if (drvdata->enable_backlight && - !asus_kbd_wmi_led_control_present(hdev) && asus_kbd_register_leds(hdev)) hid_warn(hdev, "Failed to initialize backlight.\n"); @@ -1019,7 +974,7 @@ static int __maybe_unused asus_resume(struct hid_device *hdev) { if (drvdata->kbd_backlight) { const u8 buf[] = { FEATURE_KBD_REPORT_ID, 0xba, 0xc5, 0xc4, - drvdata->kbd_backlight->cdev.brightness }; + drvdata->kbd_backlight->brightness }; ret = asus_kbd_set_report(hdev, buf, sizeof(buf)); if (ret < 0) { hid_err(hdev, "Asus failed to set keyboard backlight: %d\n", ret); @@ -1202,6 +1157,8 @@ static void asus_remove(struct hid_device *hdev) spin_unlock_irqrestore(&drvdata->kbd_backlight->lock, flags); cancel_work_sync(&drvdata->kbd_backlight->work); + + asus_brt_unregister_listener(&drvdata->kbd_backlight->listener); } hid_hw_stop(hdev); From patchwork Wed Mar 19 19:13:17 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antheas Kapenekakis X-Patchwork-Id: 14023018 Received: from linux1587.grserver.gr (linux1587.grserver.gr [185.138.42.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0FE3F21ABA5; Wed, 19 Mar 2025 19:13:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.138.42.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411622; cv=none; b=hQsAbVxdnqi08shxfdQX9gTFPGJA5zeTuT25UErYZQQ3h3vwr7XxQvVevI0RXQR1acGafP8fEXAqlE9V4aWtNBqlcCQjinn5lofphGqQIC51hiw3eYWTrfygSs/Qx9jxWmbJcxZFDQ704h+jVnf8K7taL/8BjvZmwmDPolj+LJg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411622; c=relaxed/simple; bh=BaICWmS9DP1Q0qAK8wPYj+KjwWIanEM5K0lWmT6H0qY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZMYJOttrC0ZZBBx0FXUa/R4fvBLM4fQCCCqGEy+SI5K2O8SDEMHCLd1L7kXERZ0J+av1lAahPqSZWzCi+T62h3/Wty/CkrIFcDyif6PlJ1LkiLNFFHZ+ClHK/I2kJe+mYCwmkAw/9AQHZey6/snNjCgdnh4Fb75B0X5claGJnes= 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=mPkJYvo3; arc=none smtp.client-ip=185.138.42.100 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="mPkJYvo3" Received: from localhost.localdomain (unknown [IPv6:2a05:f6c2:511b:0:cbc0:999f:73ad:33bd]) by linux1587.grserver.gr (Postfix) with ESMTPSA id 71E532E095F5; Wed, 19 Mar 2025 21:13:37 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1742411618; bh=roAVJuFN0Ur6MuKE+h23ZI41YgCtmZzT18w2kdWZ1x4=; h=From:To:Subject; b=mPkJYvo3/J0X9tOB3lp0bR9+I7a5YozppZIDwdy/C4j7h16nkkX7F90lqa0VLrkPR ZrQz41TSCijeC2FVOByDkUv6aEWyvn+LIFLDSF9K4fP1O2nZJHR1FCd29T8mqK1pWn M+0BVinIgCUl8zZWGOMlaptsSyejrquV936voI2c= Authentication-Results: linux1587.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:cbc0:999f:73ad:33bd) smtp.mailfrom=lkml@antheas.dev smtp.helo=localhost.localdomain Received-SPF: pass (linux1587.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_J=C3=A4rvinen?= , Antheas Kapenekakis Subject: [PATCH 09/11] platform/x86: asus-wmi: remove unused keyboard backlight quirk Date: Wed, 19 Mar 2025 20:13:17 +0100 Message-ID: <20250319191320.10092-10-lkml@antheas.dev> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250319191320.10092-1-lkml@antheas.dev> References: <20250319191320.10092-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-PPP-Message-ID: <174241161869.8431.6244387660114121696@linux1587.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 0.103.11 at linux1587.grserver.gr X-Virus-Status: Clean The quirk for selecting whether keyboard backlight should be controlled by HID or WMI is not needed anymore, so remove it. 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/platform_data/x86/asus-wmi.h index 42e963b70acdb..add04524031d8 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -183,44 +183,4 @@ static inline void asus_brt_unregister_listener(struct asus_brt_listener *bdev) } #endif -/* To be used by both hid-asus and asus-wmi to determine which controls kbd_brightness */ -static const struct dmi_system_id asus_use_hid_led_dmi_ids[] = { - { - .matches = { - DMI_MATCH(DMI_PRODUCT_FAMILY, "ROG Zephyrus"), - }, - }, - { - .matches = { - DMI_MATCH(DMI_PRODUCT_FAMILY, "ROG Strix"), - }, - }, - { - .matches = { - DMI_MATCH(DMI_PRODUCT_FAMILY, "ROG Flow"), - }, - }, - { - .matches = { - DMI_MATCH(DMI_PRODUCT_FAMILY, "ProArt P16"), - }, - }, - { - .matches = { - DMI_MATCH(DMI_BOARD_NAME, "GA403U"), - }, - }, - { - .matches = { - DMI_MATCH(DMI_BOARD_NAME, "GU605M"), - }, - }, - { - .matches = { - DMI_MATCH(DMI_BOARD_NAME, "RC71L"), - }, - }, - { }, -}; - #endif /* __PLATFORM_DATA_X86_ASUS_WMI_H */ From patchwork Wed Mar 19 19:13:18 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antheas Kapenekakis X-Patchwork-Id: 14023019 Received: from linux1587.grserver.gr (linux1587.grserver.gr [185.138.42.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B3B7D21B8F6; Wed, 19 Mar 2025 19:13:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.138.42.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411624; cv=none; b=oek9B1S9RmhQfx3bVw+xldGIvOL0w4o2oGFjAmxfu9ocw/Z4ORLa7NESNfpPVaYTdIs03PBFw6f0A4E+eJ1czhufNdh39uzIzSbmqiIKsqdNHadxKncuDQC/j/5gNs+Jc5kaihIM7xACNp+HqOx1MihXCaXj0YsR8dc5OUO64y4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411624; c=relaxed/simple; bh=jVUzyPxiItMwy8RcMOljOvY3JW5gWwkF8w4newjslz0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NeL9tikFduttvWbiV4wKluq8LPKMkXzhcSYgbMfx62dWQm9svPd1te36zo36Ua169jhtZK6KufInM77wHTWQkUQfxqU2/9+ogrQyRrvvEhVKpQWKMt+9NWnI6pyzUzrFlHiA5SX58hnVE0o4hDFQRgMOhjGa7CWl55iKK22M4pE= 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=27M5wDNQ; arc=none smtp.client-ip=185.138.42.100 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="27M5wDNQ" Received: from localhost.localdomain (unknown [IPv6:2a05:f6c2:511b:0:cbc0:999f:73ad:33bd]) by linux1587.grserver.gr (Postfix) with ESMTPSA id 34CC12E095F8; Wed, 19 Mar 2025 21:13:39 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1742411620; bh=X49GTfc3HEEFGABt/Wp+fxDe1rG59zQH1jk3K+Pgh3I=; h=From:To:Subject; b=27M5wDNQC33UQ/VbkyN/GFxadDID4ybiaExRYWLrIKh2I/2aNWOBS79uLiQZWzt7q QYY0149D/bBdhCchWmBJOltRzaJdp04L+P4pNZ2/DyWJ3dkWA4vfjDihb+0cffYfQo nU0znIk1CBLG4xuZX4UOhSg7oRCioTmAUfLAgIZE= Authentication-Results: linux1587.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:cbc0:999f:73ad:33bd) smtp.mailfrom=lkml@antheas.dev smtp.helo=localhost.localdomain Received-SPF: pass (linux1587.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_J=C3=A4rvinen?= , Antheas Kapenekakis Subject: [PATCH 10/11] platform/x86: asus-wmi: add keyboard brightness event handler Date: Wed, 19 Mar 2025 20:13:18 +0100 Message-ID: <20250319191320.10092-11-lkml@antheas.dev> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250319191320.10092-1-lkml@antheas.dev> References: <20250319191320.10092-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-PPP-Message-ID: <174241162033.8494.11679206461687113445@linux1587.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 0.103.11 at linux1587.grserver.gr X-Virus-Status: Clean Currenlty, the keyboard brightness control of Asus WMI keyboards is handled in the kernel, which leads to the shortcut going from brightness 0, to 1, to 2, and 3. However, for HID keyboards it is exposed as a key and handled by the user's desktop environment. For the toggle button, this means that brightness control becomes on/off. In addition, in the absence of a DE, the keyboard brightness does not work. Therefore, expose an event handler for the keyboard brightness control which can then be used by hid-asus. Signed-off-by: Antheas Kapenekakis --- drivers/platform/x86/asus-wmi.c | 39 ++++++++++++++++++++++ include/linux/platform_data/x86/asus-wmi.h | 10 ++++++ 2 files changed, 49 insertions(+) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c index 0cb1cf3c25a28..2a394f56e44c8 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -1529,6 +1529,45 @@ void asus_brt_unregister_listener(struct asus_brt_listener *bdev) } EXPORT_SYMBOL_GPL(asus_brt_unregister_listener); +static void do_kbd_led_set(struct led_classdev *led_cdev, int value); + +int asus_brt_event(enum asus_brt_event event) +{ + int brightness; + + mutex_lock(&asus_brt_lock); + if (!asus_brt_ref || !asus_brt_ref->kbd_led_registered) { + mutex_unlock(&asus_brt_lock); + return -EBUSY; + } + brightness = asus_brt_ref->kbd_led_wk; + mutex_unlock(&asus_brt_lock); + + switch (event) { + case ASUS_BRT_UP: + brightness += 1; + break; + case ASUS_BRT_DOWN: + brightness -= 1; + break; + case ASUS_BRT_TOGGLE: + if (brightness >= 3) + brightness = 0; + else + brightness += 1; + break; + } + + do_kbd_led_set(&asus_brt_ref->kbd_led, brightness); + led_classdev_notify_brightness_hw_changed(&asus_brt_ref->kbd_led, + asus_brt_ref->kbd_led_wk); + + mutex_unlock(&asus_brt_lock); + + return 0; +} +EXPORT_SYMBOL_GPL(asus_brt_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 diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h index add04524031d8..c683492be5de5 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -162,11 +162,18 @@ struct asus_brt_listener { void (*notify)(struct asus_brt_listener *listener, int brightness); }; +enum asus_brt_event { + ASUS_BRT_UP, + ASUS_BRT_DOWN, + ASUS_BRT_TOGGLE, +}; + #if IS_REACHABLE(CONFIG_ASUS_WMI) int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval); int asus_brt_register_listener(struct asus_brt_listener *cdev); void asus_brt_unregister_listener(struct asus_brt_listener *cdev); +int asus_brt_event(enum asus_brt_event event); #else static inline int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval) @@ -181,6 +188,9 @@ static inline int asus_brt_register_listener(struct asus_brt_listener *bdev) static inline void asus_brt_unregister_listener(struct asus_brt_listener *bdev) { } +static inline void asus_brt_event(enum asus_brt_event event) +{ +} #endif #endif /* __PLATFORM_DATA_X86_ASUS_WMI_H */ From patchwork Wed Mar 19 19:13:19 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Antheas Kapenekakis X-Patchwork-Id: 14023020 X-Patchwork-Delegate: jikos@jikos.cz Received: from linux1587.grserver.gr (linux1587.grserver.gr [185.138.42.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 16267213245; Wed, 19 Mar 2025 19:13:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.138.42.100 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411625; cv=none; b=o/WHB4FeyOvxT0aTnaX4GTmJ7hbIPrj+1iRV7NlduyBfJU7s6+VShChFsLEF+nAHj4qpogDjj3bfUaqB2N9bcdIwTNAEtMMU+wkmpxwXDLhiek/IB2DbJQ7j1qRcvfFb+Vqt3GddGXyAk2xNbKLPAJBQA63uI55nxw6tUe7M3Zc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742411625; c=relaxed/simple; bh=nKFqyLzOdYQnNuMPN3sgxEFLTbsdKrn6taQM0OsAxpE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hX1JpYcUIil6KiIU0OXuG7bYiRZhu5OfUDooyQ7L+UdkAD2lWAwMZr/aD85Co993QGi2VqZZfbJvznsvaRLj71+lLUyRV9r0mW/zg5o8mlTbvBWea+07v9kRsUXfOQGEzGn+KEC5nL6l8fUqd1Pxj9NrX+xi/GCY3B3AJRlIUsk= 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b=xCK9QSCa; arc=none smtp.client-ip=185.138.42.100 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 (1024-bit key) header.d=antheas.dev header.i=@antheas.dev header.b="xCK9QSCa" Received: from localhost.localdomain (unknown [IPv6:2a05:f6c2:511b:0:cbc0:999f:73ad:33bd]) by linux1587.grserver.gr (Postfix) with ESMTPSA id DA1BC2E095FC; Wed, 19 Mar 2025 21:13:40 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=antheas.dev; s=default; t=1742411622; bh=PwqR14CHjxSDk9sBzaWs7Lu53Z3+jZPrApkkTu2mA+o=; h=From:To:Subject; b=xCK9QSCakX6od9Qqjg3G+S5vl+dFjcAQ26mEawUql83320u7y4JTay0LiuiKNckHL WfF0SlFZYKH4hG8EEoakj7Nzga/QJy8ropoIQrwz1yaOx9m/u6cLsm2wvlJkpSt7ue OEjFW5EwUa8AXjbwTrpMjRRd9uYxRVzJh7E6rRe0= Authentication-Results: linux1587.grserver.gr; spf=pass (sender IP is 2a05:f6c2:511b:0:cbc0:999f:73ad:33bd) smtp.mailfrom=lkml@antheas.dev smtp.helo=localhost.localdomain Received-SPF: pass (linux1587.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_J=C3=A4rvinen?= , Antheas Kapenekakis Subject: [PATCH 11/11] HID: asus: add support for the asus-wmi brightness handler Date: Wed, 19 Mar 2025 20:13:19 +0100 Message-ID: <20250319191320.10092-12-lkml@antheas.dev> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250319191320.10092-1-lkml@antheas.dev> References: <20250319191320.10092-1-lkml@antheas.dev> Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-PPP-Message-ID: <174241162198.8599.7017674513815027462@linux1587.grserver.gr> X-PPP-Vhost: antheas.dev X-Virus-Scanned: clamav-milter 0.103.11 at linux1587.grserver.gr X-Virus-Status: Clean 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. 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 5aae4466c0d63..b1ae0716005d2 100644 --- a/drivers/hid/hid-asus.c +++ b/drivers/hid/hid-asus.c @@ -319,6 +319,17 @@ static int asus_event(struct hid_device *hdev, struct hid_field *field, usage->hid & HID_USAGE); } + if (usage->type == EV_KEY && value) { + switch (usage->code) { + case KEY_KBDILLUMUP: + return !asus_brt_event(ASUS_BRT_UP); + case KEY_KBDILLUMDOWN: + return !asus_brt_event(ASUS_BRT_DOWN); + case KEY_KBDILLUMTOGGLE: + return !asus_brt_event(ASUS_BRT_TOGGLE); + } + } + return 0; }