mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 0/2] Add ASUS ExpertBook mute LED support
@ 2026-09-15 17:41 patryk.dankow
  2026-09-15 17:41 ` [PATCH 1/2] platform/x86: asus-wmi: Add " patryk.dankow
  2026-09-15 17:41 ` [PATCH 2/2] ALSA: hda/realtek: Add mute LED support for ASUS PM3406CKA patryk.dankow
  0 siblings, 2 replies; 5+ messages in thread
From: patryk.dankow @ 2026-09-15 17:41 UTC (permalink / raw)
  To: platform-driver-x86, linux-sound
  Cc: Patryk Dańków, corentin.chary, luke, denis.benato,
	hansg, ilpo.jarvinen, perex, tiwai, zhangheng, dnaim,
	damien.dagorn29, kailang, habilerenturker, linux-kernel

From: Patryk Dańków <patryk.dankow@protonmail.com>

This series adds speaker mute LED support for the ASUS ExpertBook
PM3406CKA.

The first patch adds the ASUS WMI mute LED endpoint and registers it as
the platform::mute LED using the audio-mute trigger.

The second patch enables vmaster mute LED handling for the PM3406CKA in
the Realtek HDA codec driver. The existing CS35L41 I2C fixup is retained
by chaining the new fixup to it.

The WMI device ID 0x0004001c is present in the PM3406CKA DSDT and is also
used by GHelper for controlling the same LED.

Tested on ASUS ExpertBook PM3406CKA.

Patryk Dańków (2):
  platform/x86: asus-wmi: Add mute LED support
  ALSA: hda/realtek: Add mute LED support for ASUS PM3406CKA

 drivers/platform/x86/asus-wmi.c            | 26 +++++++++++++++++++++-
 include/linux/platform_data/x86/asus-wmi.h |  1 +
 sound/hda/codecs/realtek/alc269.c          | 18 ++++++++++++++-
 3 files changed, 43 insertions(+), 2 deletions(-)


base-commit: 2f0c1cf72f4682178506f513bbf015e591b1aa4a
-- 
2.55.0



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] platform/x86: asus-wmi: Add mute LED support
  2026-09-15 17:41 [PATCH 0/2] Add ASUS ExpertBook mute LED support patryk.dankow
@ 2026-09-15 17:41 ` patryk.dankow
  2026-09-15 19:43   ` Denis Benato
  2026-09-15 17:41 ` [PATCH 2/2] ALSA: hda/realtek: Add mute LED support for ASUS PM3406CKA patryk.dankow
  1 sibling, 1 reply; 5+ messages in thread
From: patryk.dankow @ 2026-09-15 17:41 UTC (permalink / raw)
  To: platform-driver-x86
  Cc: Patryk Dańków, corentin.chary, luke, denis.benato,
	hansg, ilpo.jarvinen, linux-kernel

From: Patryk Dańków <patryk.dankow@protonmail.com>

Add support for WMI device 0x0004001c and register it as the
platform::mute LED using the audio-mute trigger.

The device ID is present in the PM3406CKA DSDT and is also used
by GHelper for controlling the same LED.

Tested on ASUS ExpertBook PM3406CKA.

Signed-off-by: Patryk Dańków <patryk.dankow@protonmail.com>
---
 drivers/platform/x86/asus-wmi.c            | 26 +++++++++++++++++++++-
 include/linux/platform_data/x86/asus-wmi.h |  1 +
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
index a65090429ca7..d7c100dc2020 100644
--- a/drivers/platform/x86/asus-wmi.c
+++ b/drivers/platform/x86/asus-wmi.c
@@ -262,6 +262,7 @@ struct asus_wmi {
 	struct led_classdev lightbar_led;
 	int lightbar_led_wk;
 	struct led_classdev micmute_led;
+	struct led_classdev mute_led;
 	struct led_classdev camera_led;
 	struct workqueue_struct *led_workqueue;
 	struct work_struct tpd_led_work;
@@ -2054,6 +2055,16 @@ static int micmute_led_set(struct led_classdev *led_cdev,
 	return err < 0 ? err : 0;
 }
 
+static int mute_led_set(struct led_classdev *led_cdev,
+			enum led_brightness brightness)
+{
+	int state = brightness != LED_OFF;
+	int err;
+
+	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_MUTE_LED, state, NULL);
+	return err < 0 ? err : 0;
+}
+
 static enum led_brightness camera_led_get(struct led_classdev *led_cdev)
 {
 	struct asus_wmi *asus;
@@ -2084,6 +2095,7 @@ static void asus_wmi_led_exit(struct asus_wmi *asus)
 	led_classdev_unregister(&asus->wlan_led);
 	led_classdev_unregister(&asus->lightbar_led);
 	led_classdev_unregister(&asus->micmute_led);
+	led_classdev_unregister(&asus->mute_led);
 	led_classdev_unregister(&asus->camera_led);
 
 	if (asus->led_workqueue)
@@ -2176,7 +2188,19 @@ static int asus_wmi_led_init(struct asus_wmi *asus)
 		asus->micmute_led.default_trigger = "audio-micmute";
 
 		rv = led_classdev_register(&asus->platform_device->dev,
-						&asus->micmute_led);
+					   &asus->micmute_led);
+		if (rv)
+			goto error;
+	}
+
+	if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MUTE_LED)) {
+		asus->mute_led.name = "platform::mute";
+		asus->mute_led.max_brightness = 1;
+		asus->mute_led.brightness_set_blocking = mute_led_set;
+		asus->mute_led.default_trigger = "audio-mute";
+
+		rv = led_classdev_register(&asus->platform_device->dev,
+					   &asus->mute_led);
 		if (rv)
 			goto error;
 	}
diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h
index b5ed8c83ace1..3810c4a0da23 100644
--- a/include/linux/platform_data/x86/asus-wmi.h
+++ b/include/linux/platform_data/x86/asus-wmi.h
@@ -54,6 +54,7 @@
 #define ASUS_WMI_DEVID_LED5		0x00020015
 #define ASUS_WMI_DEVID_LED6		0x00020016
 #define ASUS_WMI_DEVID_MICMUTE_LED		0x00040017
+#define ASUS_WMI_DEVID_MUTE_LED	0x0004001C
 
 /* Disable Camera LED */
 #define ASUS_WMI_DEVID_CAMERA_LED_NEG	0x00060078 /* 0 = on (unused) */
-- 
2.55.0



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 2/2] ALSA: hda/realtek: Add mute LED support for ASUS PM3406CKA
  2026-09-15 17:41 [PATCH 0/2] Add ASUS ExpertBook mute LED support patryk.dankow
  2026-09-15 17:41 ` [PATCH 1/2] platform/x86: asus-wmi: Add " patryk.dankow
@ 2026-09-15 17:41 ` patryk.dankow
  2026-09-16  7:40   ` Takashi Iwai
  1 sibling, 1 reply; 5+ messages in thread
From: patryk.dankow @ 2026-09-15 17:41 UTC (permalink / raw)
  To: linux-sound
  Cc: Patryk Dańków, perex, tiwai, zhangheng, dnaim,
	damien.dagorn29, kailang, habilerenturker, linux-kernel

From: Patryk Dańków <patryk.dankow@protonmail.com>

Enable vmaster mute LED handling for the PM3406CKA while retaining
the existing CS35L41 I2C fixup by chaining the new fixup to it.

Tested on ASUS ExpertBook PM3406CKA.

Signed-off-by: Patryk Dańków <patryk.dankow@protonmail.com>
---
 sound/hda/codecs/realtek/alc269.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/sound/hda/codecs/realtek/alc269.c b/sound/hda/codecs/realtek/alc269.c
index 3abee617e86e..d1f0c2752624 100644
--- a/sound/hda/codecs/realtek/alc269.c
+++ b/sound/hda/codecs/realtek/alc269.c
@@ -180,6 +180,15 @@ static void alc_enable_headset_jack_key(struct hda_codec *codec)
 	}
 }
 
+static void alc_fixup_pm3406cka_vmaster_led(struct hda_codec *codec,
+					    const struct hda_fixup *fix, int action)
+{
+	struct alc_spec *spec = codec->spec;
+
+	if (action == HDA_FIXUP_ACT_PRE_PROBE)
+		spec->gen.vmaster_mute_led = 1;
+}
+
 static void alc_fixup_headset_jack(struct hda_codec *codec,
 				    const struct hda_fixup *fix, int action)
 {
@@ -4383,6 +4392,7 @@ enum {
 	ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN_HEADSET,
 	ALC285_LENOVO_DAC_RENAME,
 	ALC287_FIXUP_YOGA9_SPEAKER2_TO_DAC1,
+	ALC_FIXUP_PM3406CKA_VMASTER_LED,
 };
 
 /* A special fixup for Lenovo C940 and Yoga Duet 7;
@@ -7129,6 +7139,12 @@ static const struct hda_fixup alc269_fixups[] = {
 		.chained = true,
 		.chain_id = ALC287_FIXUP_TXNW2781_I2C,
 	},
+	[ALC_FIXUP_PM3406CKA_VMASTER_LED] = {
+		.type = HDA_FIXUP_FUNC,
+		.v.func = alc_fixup_pm3406cka_vmaster_led,
+		.chained = true,
+		.chain_id = ALC287_FIXUP_CS35L41_I2C_2,
+	},
 };
 
 static const struct hda_quirk alc269_fixup_tbl[] = {
@@ -7786,7 +7802,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
 	SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650PY/PZ/PV/PU/PYV/PZV/PIV/PVV", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
-	SND_PCI_QUIRK(0x1043, 0x1454, "ASUS PM3406CKA", ALC287_FIXUP_CS35L41_I2C_2),
+	SND_PCI_QUIRK(0x1043, 0x1454, "ASUS PM3406CKA", ALC_FIXUP_PM3406CKA_VMASTER_LED),
 	SND_PCI_QUIRK(0x1043, 0x1460, "Asus VivoBook 15", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1043, 0x1463, "Asus GA402X/GA402N", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
 	SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604VI/VC/VE/VG/VJ/VQ/VU/VV/VY/VZ", ALC285_FIXUP_ASUS_HEADSET_MIC),
-- 
2.55.0



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] platform/x86: asus-wmi: Add mute LED support
  2026-09-15 17:41 ` [PATCH 1/2] platform/x86: asus-wmi: Add " patryk.dankow
@ 2026-09-15 19:43   ` Denis Benato
  0 siblings, 0 replies; 5+ messages in thread
From: Denis Benato @ 2026-09-15 19:43 UTC (permalink / raw)
  To: patryk.dankow, platform-driver-x86
  Cc: corentin.chary, luke, hansg, ilpo.jarvinen, linux-kernel


On 9/15/26 19:41, patryk.dankow@protonmail.com wrote:
> From: Patryk Dańków <patryk.dankow@protonmail.com>
>
> Add support for WMI device 0x0004001c and register it as the
> platform::mute LED using the audio-mute trigger.
>
> The device ID is present in the PM3406CKA DSDT and is also used
> by GHelper for controlling the same LED.
>
> Tested on ASUS ExpertBook PM3406CKA.
Hi Patryk,

Thank you for this! I haven't received the 2/2 but I saw it on lore,
please next time also send to me :)

Also I think that since this is a cross-subsystem patchset you
are supposed to send the patchset as a whole to both
lists.

Reviewed-by: Denis Benato <denis.benato@linux.dev>
> Signed-off-by: Patryk Dańków <patryk.dankow@protonmail.com>
> ---
>  drivers/platform/x86/asus-wmi.c            | 26 +++++++++++++++++++++-
>  include/linux/platform_data/x86/asus-wmi.h |  1 +
>  2 files changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
> index a65090429ca7..d7c100dc2020 100644
> --- a/drivers/platform/x86/asus-wmi.c
> +++ b/drivers/platform/x86/asus-wmi.c
> @@ -262,6 +262,7 @@ struct asus_wmi {
>  	struct led_classdev lightbar_led;
>  	int lightbar_led_wk;
>  	struct led_classdev micmute_led;
> +	struct led_classdev mute_led;
>  	struct led_classdev camera_led;
>  	struct workqueue_struct *led_workqueue;
>  	struct work_struct tpd_led_work;
> @@ -2054,6 +2055,16 @@ static int micmute_led_set(struct led_classdev *led_cdev,
>  	return err < 0 ? err : 0;
>  }
>  
> +static int mute_led_set(struct led_classdev *led_cdev,
> +			enum led_brightness brightness)
> +{
> +	int state = brightness != LED_OFF;
> +	int err;
> +
> +	err = asus_wmi_set_devstate(ASUS_WMI_DEVID_MUTE_LED, state, NULL);
> +	return err < 0 ? err : 0;
> +}
> +
>  static enum led_brightness camera_led_get(struct led_classdev *led_cdev)
>  {
>  	struct asus_wmi *asus;
> @@ -2084,6 +2095,7 @@ static void asus_wmi_led_exit(struct asus_wmi *asus)
>  	led_classdev_unregister(&asus->wlan_led);
>  	led_classdev_unregister(&asus->lightbar_led);
>  	led_classdev_unregister(&asus->micmute_led);
> +	led_classdev_unregister(&asus->mute_led);
>  	led_classdev_unregister(&asus->camera_led);
>  
>  	if (asus->led_workqueue)
> @@ -2176,7 +2188,19 @@ static int asus_wmi_led_init(struct asus_wmi *asus)
>  		asus->micmute_led.default_trigger = "audio-micmute";
>  
>  		rv = led_classdev_register(&asus->platform_device->dev,
> -						&asus->micmute_led);
> +					   &asus->micmute_led);
> +		if (rv)
> +			goto error;
> +	}
> +
> +	if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_MUTE_LED)) {
> +		asus->mute_led.name = "platform::mute";
> +		asus->mute_led.max_brightness = 1;
> +		asus->mute_led.brightness_set_blocking = mute_led_set;
> +		asus->mute_led.default_trigger = "audio-mute";
> +
> +		rv = led_classdev_register(&asus->platform_device->dev,
> +					   &asus->mute_led);
>  		if (rv)
>  			goto error;
>  	}
> diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/platform_data/x86/asus-wmi.h
> index b5ed8c83ace1..3810c4a0da23 100644
> --- a/include/linux/platform_data/x86/asus-wmi.h
> +++ b/include/linux/platform_data/x86/asus-wmi.h
> @@ -54,6 +54,7 @@
>  #define ASUS_WMI_DEVID_LED5		0x00020015
>  #define ASUS_WMI_DEVID_LED6		0x00020016
>  #define ASUS_WMI_DEVID_MICMUTE_LED		0x00040017
> +#define ASUS_WMI_DEVID_MUTE_LED	0x0004001C
>  
>  /* Disable Camera LED */
>  #define ASUS_WMI_DEVID_CAMERA_LED_NEG	0x00060078 /* 0 = on (unused) */

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/2] ALSA: hda/realtek: Add mute LED support for ASUS PM3406CKA
  2026-09-15 17:41 ` [PATCH 2/2] ALSA: hda/realtek: Add mute LED support for ASUS PM3406CKA patryk.dankow
@ 2026-09-16  7:40   ` Takashi Iwai
  0 siblings, 0 replies; 5+ messages in thread
From: Takashi Iwai @ 2026-09-16  7:40 UTC (permalink / raw)
  To: patryk.dankow
  Cc: linux-sound, perex, tiwai, zhangheng, dnaim, damien.dagorn29,
	kailang, habilerenturker, linux-kernel

On Tue, 15 Sep 2026 19:41:36 +0200,
patryk.dankow@protonmail.com wrote:
> 
> From: Patryk Dańków <patryk.dankow@protonmail.com>
> 
> Enable vmaster mute LED handling for the PM3406CKA while retaining
> the existing CS35L41 I2C fixup by chaining the new fixup to it.
> 
> Tested on ASUS ExpertBook PM3406CKA.
> 
> Signed-off-by: Patryk Dańków <patryk.dankow@protonmail.com>

I suppose both patches should be in the same tree, so feel free to
take my ack if the series go through another tree:

Reviewed-by: Takashi Iwai <tiwai@suse.de>

Or, if both should be merged through sound git tree, let me know.


thanks,

Takashi

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-09-16  7:41 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-15 17:41 [PATCH 0/2] Add ASUS ExpertBook mute LED support patryk.dankow
2026-09-15 17:41 ` [PATCH 1/2] platform/x86: asus-wmi: Add " patryk.dankow
2026-09-15 19:43   ` Denis Benato
2026-09-15 17:41 ` [PATCH 2/2] ALSA: hda/realtek: Add mute LED support for ASUS PM3406CKA patryk.dankow
2026-09-16  7:40   ` Takashi Iwai

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®