From: Denis Benato <denis.benato@linux.dev>
To: Paolo Pisati <p.pisati@gmail.com>, Jiri Kosina <jikos@kernel.org>,
Benjamin Tissoires <bentiss@kernel.org>
Cc: "Joshua Leivenzon" <hacker1024@users.sourceforge.net>,
linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
"Luke Jones" <luke@ljones.dev>, "Ivan Levchenko" <me@livan.pro>,
"Rebecca Mara Müller" <rebecca.mara@posteo.de>,
"Nathan Chancellor" <nathan@kernel.org>
Subject: Re: [PATCH v3 4/7] HID: asus: Cycle the platform profile from the Zenbook Duo profile key
Date: Sun, 18 Oct 2026 18:27:08 +0200 [thread overview]
Message-ID: <cc579458-5817-47d3-bf80-781e2e68595f@linux.dev> (raw)
In-Reply-To: <20261013104033.36079-5-p.pisati@gmail.com>
On 10/13/26 12:40, Paolo Pisati wrote:
> From: Joshua Leivenzon <hacker1024@users.sourceforge.net>
>
> The Zenbook Duo keyboard reports Fn+F, the performance mode key, as
> vendor usage 0x9d. On the built-in keyboards of other ASUS laptops the
> same key arrives through asus-wmi, which cycles the platform profile
> in response. Do the same here so the key works on the detachable
> keyboard too.
>
> asus_event() runs from the HID input path, which for USB is the URB
> completion handler, while platform_profile_cycle() takes a mutex, so run
> it from the driver's worker like the Fn-lock toggle, and consume the
> event. Queue at most one cycle at a time, so that a device repeating the
> key cannot grow the worker's list. Only call it when the platform
> profile class is reachable: it is not built on architectures without
> ACPI, where HID_ASUS still is, and it may be a module while HID_ASUS is
> built in.
>
> Signed-off-by: Joshua Leivenzon <hacker1024@users.sourceforge.net>
> [pisati: defer platform_profile_cycle() to the worker and queue at
> most one cycle, return 1 from asus_event() instead of propagating
> its return value, and guard the call with
> IS_REACHABLE(CONFIG_ACPI_PLATFORM_PROFILE)]
> Assisted-by: LLM
> Signed-off-by: Paolo Pisati <p.pisati@gmail.com>
> Tested-by: Rebecca Mara Müller <rebecca.mara@posteo.de> # UX8407AA
> ---
> drivers/hid/hid-asus.c | 67 ++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 65 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c
> index d69431615c27..b127f5c38f60 100644
> --- a/drivers/hid/hid-asus.c
> +++ b/drivers/hid/hid-asus.c
> @@ -29,6 +29,7 @@
> #include <linux/input/mt.h>
> #include <linux/usb.h> /* For to_usb_interface for T100 touchpad intf check */
> #include <linux/power_supply.h>
> +#include <linux/platform_profile.h>
> #include <linux/leds.h>
>
> #include "hid-ids.h"
> @@ -115,6 +116,7 @@ enum asus_work_action_type {
> FN_LOCK_SYNC,
> BRIGHTNESS_SET,
> WMI_FAN,
> + PLATFORM_PROFILE_CYCLE,
> };
>
> struct hid_raw_event_data {
> @@ -423,6 +425,42 @@ static int asus_kbd_fn_lock_set(struct asus_drvdata *drvdata, bool enabled)
> return 0;
> }
>
> +static int asus_platform_profile_cycle(struct asus_drvdata *drvdata)
> +{
> + struct asus_worker *worker = drvdata->worker;
> + struct asus_work_action *action, *pending;
> + unsigned long flags;
> + int ret = 0;
> +
> + if (!IS_REACHABLE(CONFIG_ACPI_PLATFORM_PROFILE))
> + return 0;
> +
Isn't IS_REACHABLE a macro? Why not using #if and/or #else ?
> + spin_lock_irqsave(&worker->lock, flags);
> +
> + /*
> + * One pending cycle is enough: a key press cannot outrun the
> + * worker, and a device repeating the key must not grow the list.
> + */
> + list_for_each_entry(pending, &worker->actions, node) {
> + if (pending->type == PLATFORM_PROFILE_CYCLE)
> + goto unlock;
> + }
> +
> + action = kzalloc_obj(struct asus_work_action, GFP_ATOMIC);
> + if (!action) {
> + ret = -ENOMEM;
> + goto unlock;
> + }
> +
> + action->type = PLATFORM_PROFILE_CYCLE;
> + INIT_LIST_HEAD(&action->node);
> + asus_worker_schedule(worker, action);
> +
> +unlock:
asus_platform_profile_cycle_unlock please because label names
are unique, not per-function
> + spin_unlock_irqrestore(&worker->lock, flags);
> + return ret;
> +}
> +
> static int asus_kbd_wmi_fan_send(struct asus_drvdata *drvdata, u8 *report_data,
> size_t report_size)
> {
> @@ -459,8 +497,25 @@ static int asus_event(struct hid_device *hdev, struct hid_field *field,
> if ((usage->hid & HID_USAGE_PAGE) == HID_UP_ASUSVENDOR &&
> (usage->hid & HID_USAGE) != 0x00 &&
> (usage->hid & HID_USAGE) != 0xff && !usage->type) {
> - hid_warn(hdev, "Unmapped Asus vendor usagepage code 0x%02x\n",
> - usage->hid & HID_USAGE);
> + /*
> + * Some vendor usages do not map to a key and need special
> + * handling.
> + */
> + switch (usage->hid & HID_USAGE) {
> + case 0x9d: /* Zenbook Duo Fn+F: cycle the platform profile */
> + if (value) {
> + ret = asus_platform_profile_cycle(drvdata);
> + if (ret) {
> + hid_err(hdev, "Failed to cycle the platform profile: %d\n",
> + ret);
> + return ret;
> + }
> + }
> + return 1;
> + default:
> + hid_warn(hdev, "Unmapped Asus vendor usagepage code 0x%02x\n",
> + usage->hid & HID_USAGE);
> + }
If asus recycles 0x9d to make something else is nome other hardware it will end up
doing something else... It's acceptable I think but perhaps a guard may be better?
After all there is a warn about that already...
> }
>
> if (usage->type == EV_KEY && value) {
> @@ -765,6 +820,7 @@ static void asus_work(struct work_struct *work)
> struct asus_worker *worker = container_of(work, struct asus_worker, work);
> struct asus_work_action *action = NULL;
> unsigned long flags;
> + int ret;
>
> /* Save the action to be performed and clear the flag */
> spin_lock_irqsave(&worker->lock, flags);
> @@ -788,6 +844,13 @@ static void asus_work(struct work_struct *work)
> case WMI_FAN:
> asus_kbd_wmi_fan(worker->hdev, &action->data.fan_hid_data);
> break;
> + case PLATFORM_PROFILE_CYCLE:
> + if (!IS_REACHABLE(CONFIG_ACPI_PLATFORM_PROFILE))
> + break;
As before: #if !IS_REACHABLE(...)
> + ret = platform_profile_cycle();
> + if (ret)
> + hid_dbg(worker->hdev, "Failed to cycle the platform profile: %d\n", ret);
> + break;
> default:
> hid_err(worker->hdev, "Invalid action type: %d\n", action->type);
> break;
next prev parent reply other threads:[~2026-10-18 16:27 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-13 10:39 [PATCH v3 0/7] HID: asus: ASUS Zenbook Duo keyboard support Paolo Pisati
2026-10-13 10:39 ` [PATCH v3 1/7] HID: asus: Fix up Zenbook Duo report descriptors Paolo Pisati
2026-10-18 15:50 ` Denis Benato
2026-10-18 16:18 ` Rebecca Mara Müller
2026-10-18 17:52 ` Denis Benato
2026-10-13 10:39 ` [PATCH v3 2/7] HID: asus: Add missing Zenbook Duo hotkeys Paolo Pisati
2026-10-18 15:55 ` Denis Benato
2026-10-18 21:38 ` Nathan Chancellor
2026-10-18 21:39 ` Denis Benato
2026-10-13 10:40 ` [PATCH v3 3/7] HID: asus: Force hid-input to bind to the Zenbook Duo hotkey interface Paolo Pisati
2026-10-18 16:06 ` Denis Benato
2026-10-13 10:40 ` [PATCH v3 4/7] HID: asus: Cycle the platform profile from the Zenbook Duo profile key Paolo Pisati
2026-10-18 16:27 ` Denis Benato [this message]
2026-10-13 10:40 ` [PATCH v3 5/7] HID: asus: Do not send feature reports larger than declared Paolo Pisati
2026-10-18 16:52 ` Denis Benato
2026-10-13 10:40 ` [PATCH v3 6/7] HID: asus: add prod-id, quirk for Zenbook Duo keyboard Paolo Pisati
2026-10-18 16:57 ` Denis Benato
2026-10-18 21:43 ` Nathan Chancellor
2026-10-18 21:46 ` Denis Benato
2026-10-13 10:40 ` [PATCH v3 7/7] HID: asus: Re-send the Zenbook Duo keyboard handshake after probe Paolo Pisati
2026-10-18 17:10 ` Denis Benato
2026-10-18 19:18 ` Rebecca Mara Müller
2026-10-18 19:48 ` Denis Benato
2026-10-19 6:12 ` Rebecca Mara Müller
2026-10-19 11:03 ` Denis Benato
2026-10-19 13:36 ` Rebecca Mara Müller
2026-10-13 11:45 ` [PATCH v3 0/7] HID: asus: ASUS Zenbook Duo keyboard support Rebecca Mara Müller
2026-10-13 13:56 ` Denis Benato
2026-10-14 13:21 ` Paolo Pisati
2026-10-18 17:21 ` Denis Benato
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cc579458-5817-47d3-bf80-781e2e68595f@linux.dev \
--to=denis.benato@linux.dev \
--cc=bentiss@kernel.org \
--cc=hacker1024@users.sourceforge.net \
--cc=jikos@kernel.org \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luke@ljones.dev \
--cc=me@livan.pro \
--cc=nathan@kernel.org \
--cc=p.pisati@gmail.com \
--cc=rebecca.mara@posteo.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.