The Linux Kernel Mailing List
 help / color / mirror / Atom feed
From: "Luke D. Jones" <luke@ljones.dev>
To: Antheas Kapenekakis <lkml@antheas.dev>,
	platform-driver-x86@vger.kernel.org, linux-input@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, "Jiri Kosina" <jikos@kernel.org>,
	"Benjamin Tissoires" <bentiss@kernel.org>,
	"Corentin Chary" <corentin.chary@gmail.com>,
	"Hans de Goede" <hdegoede@redhat.com>,
	"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
Subject: Re: [PATCH v3 05/10] HID: asus: listen to the asus-wmi brightness device instead of creating one
Date: Sun, 23 Mar 2025 19:40:58 +1300	[thread overview]
Message-ID: <9578ac78-bc89-40e0-8ffb-82582bf594d2@ljones.dev> (raw)
In-Reply-To: <20250322102804.418000-6-lkml@antheas.dev>

On 22/03/25 23:27, Antheas Kapenekakis wrote:
> 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 <lkml@antheas.dev>
> ---
>   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 e97fb76eda619..c40b5c14c797f 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_hid_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_hid_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);
> @@ -599,14 +557,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.brightness_set = 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_hid_register_listener(&drvdata->kbd_backlight->listener);
> +
>   	if (ret < 0) {
>   		/* No need to have this still around */
>   		devm_kfree(&hdev->dev, drvdata->kbd_backlight);
> @@ -1000,7 +956,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);
> @@ -1139,7 +1095,6 @@ static int asus_probe(struct hid_device *hdev, const struct hid_device_id *id)
>   	}
>   
>   	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");
>   
> @@ -1180,6 +1135,8 @@ static void asus_remove(struct hid_device *hdev)
>   	unsigned long flags;
>   
>   	if (drvdata->kbd_backlight) {
> +		asus_hid_unregister_listener(&drvdata->kbd_backlight->listener);
> +
>   		spin_lock_irqsave(&drvdata->kbd_backlight->lock, flags);
>   		drvdata->kbd_backlight->removed = true;
>   		spin_unlock_irqrestore(&drvdata->kbd_backlight->lock, flags);

Reviewed-by: Luke D. Jones <luke@ljones.dev>

  reply	other threads:[~2025-03-23  6:41 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-22 10:27 [PATCH v3 00/10] HID: asus: Add RGB Support to Asus Z13, Ally, unify backlight asus-wmi, and Z13 QOL Antheas Kapenekakis
2025-03-22 10:27 ` [PATCH v3 01/10] HID: asus: refactor init sequence per spec Antheas Kapenekakis
2025-03-22 22:01   ` Luke D. Jones
2025-03-22 23:05     ` Antheas Kapenekakis
2025-03-22 23:28       ` Luke D. Jones
2025-03-22 23:53         ` Antheas Kapenekakis
2025-03-22 23:54           ` Antheas Kapenekakis
2025-03-23  0:10             ` Luke D. Jones
2025-03-23  0:14           ` Luke D. Jones
2025-03-22 10:27 ` [PATCH v3 02/10] HID: asus: prevent binding to all HID devices on ROG Antheas Kapenekakis
2025-03-22 23:21   ` Luke D. Jones
2025-03-22 10:27 ` [PATCH v3 03/10] HID: Asus: add Z13 folio to generic group for multitouch to work Antheas Kapenekakis
2025-03-22 23:30   ` Luke D. Jones
2025-03-22 23:32     ` Antheas Kapenekakis
2025-03-22 10:27 ` [PATCH v3 04/10] platform/x86: asus-wmi: Add support for multiple kbd RGB handlers Antheas Kapenekakis
2025-03-23  0:02   ` Luke D. Jones
2025-03-24 11:31   ` Hans de Goede
2025-03-24 12:29     ` Antheas Kapenekakis
2025-03-24 12:37       ` Hans de Goede
2025-03-22 10:27 ` [PATCH v3 05/10] HID: asus: listen to the asus-wmi brightness device instead of creating one Antheas Kapenekakis
2025-03-23  6:40   ` Luke D. Jones [this message]
2025-03-22 10:28 ` [PATCH v3 06/10] platform/x86: asus-wmi: remove unused keyboard backlight quirk Antheas Kapenekakis
2025-03-23  0:05   ` Luke D. Jones
2025-03-22 10:28 ` [PATCH v3 07/10] platform/x86: asus-wmi: add keyboard brightness event handler Antheas Kapenekakis
2025-03-23  0:06   ` Luke D. Jones
2025-03-22 10:28 ` [PATCH v3 08/10] HID: asus: add support for the asus-wmi brightness handler Antheas Kapenekakis
2025-03-23  0:08   ` Luke D. Jones
2025-03-22 10:28 ` [PATCH v3 09/10] HID: asus: add basic RGB support Antheas Kapenekakis
2025-03-23  6:21   ` Luke D. Jones
2025-03-23  6:40   ` Luke D. Jones
2025-03-23 11:37     ` Antheas Kapenekakis
2025-03-23 14:45       ` Antheas Kapenekakis
2025-03-23 20:13         ` Luke D. Jones
2025-03-23 20:39       ` Luke D. Jones
2025-03-23 21:08         ` Antheas Kapenekakis
2025-03-22 10:28 ` [PATCH v3 10/10] HID: asus: add RGB support to the ROG Ally units Antheas Kapenekakis
2025-03-23  6:29   ` Luke D. Jones

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=9578ac78-bc89-40e0-8ffb-82582bf594d2@ljones.dev \
    --to=luke@ljones.dev \
    --cc=bentiss@kernel.org \
    --cc=corentin.chary@gmail.com \
    --cc=hdegoede@redhat.com \
    --cc=ilpo.jarvinen@linux.intel.com \
    --cc=jikos@kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lkml@antheas.dev \
    --cc=platform-driver-x86@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox