mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] ALSA: hda/realtek: Fix internal mic capture on ASUS ROG Flow Z13 GZ302EA
@ 2026-10-09 21:19 Alex James
  2026-10-10  8:03 ` Takashi Iwai
  0 siblings, 1 reply; 2+ messages in thread
From: Alex James @ 2026-10-09 21:19 UTC (permalink / raw)
  To: alsa-devel; +Cc: Takashi Iwai, Jaroslav Kysela, linux-kernel

The ASUS ROG Flow Z13 GZ302EA (Realtek ALC294, SSID 1043:1fb3) exposes
two fixed internal mic pins, 0x12 (0x90a60140) and 0x13 (0x90a60130), as
capture sources "Internal Mic" and "Internal Mic 1". The input mux
defaults to 0x12, but on this model 0x12 is defective: its right channel
rails to -32768 and the left channel carries heavy noise, so out of the
box the internal microphone records loud noise/hum.
Pin 0x13 captures clean audio on both channels (at lower level). The
mic array is not reachable through the AMD ACP70/PDM path either: forcing
it on via ACPI _WOV=1 creates the dmic-codec device but all samples rail
at -32768, so HDA is the only usable capture path.
The existing quirk for this SSID only initializes the two CS35L41 I2C
smart amps (speakers). Disable the broken 0x12 pin via pincfg so that
0x13 becomes the sole "Internal Mic" capture source, and keep the CS35L41
initialization by chaining it in a new fixup.
Measured on a GZ302EA (arecord, 48 kHz S16LE, identical gain):
  pin 0x12: L 47% clipped samples, R 15% clipped (railed noise)
  pin 0x13: <0.3% clipped, hum components below -65 dBFS
The fix was validated on the target hardware without building a kernel
by applying the same pincfg override (0x12 -> 0x40000000) through a
boot-time HDA patch firmware (snd-hda-intel patch=). With the override
the codec parser drops pin 0x12 entirely: the card comes up with a single
"Internal Mic" (0x13), the Capture Source mux control disappears (single
input is hardwired), and capture is clean and stable across boot,
suspend/resume, and PipeWire/WirePlumber route re-applies. Note that a
runtime hda-verb override alone is not sufficient because the bus driver
builds its pin cache at codec registration.
Also observed on this SSID while testing: repeated
"ALC294: Invalid fixup type 2016568172" messages in dmesg during probe
with the current quirk; likely unrelated but worth a look.
Link: https://github.com/CachyOS/linux-cachyos/issues/880
Tested-by: aic0d3r <funforfreeapps@gmail.com>
Signed-off-by: aic0d3r <funforfreeapps@gmail.com>
---
 sound/hda/codecs/realtek/alc269.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/sound/hda/codecs/realtek/alc269.c
b/sound/hda/codecs/realtek/alc269.c
index be54825..20b5c82 100644
--- a/sound/hda/codecs/realtek/alc269.c
+++ b/sound/hda/codecs/realtek/alc269.c
@@ -4219,6 +4219,8 @@ enum {
  ALC294_FIXUP_ASUS_ALLY,
  ALC294_FIXUP_ASUS_ALLY_PINS,
  ALC294_FIXUP_ASUS_ALLY_VERBS,
+ ALC294_FIXUP_ASUS_GZ302EA,
+ ALC294_FIXUP_ASUS_GZ302EA_PINS,
  ALC294_FIXUP_ASUS_HPE,
  ALC294_FIXUP_ASUS_COEF_1B,
  ALC294_FIXUP_ASUS_GX502_HP,
@@ -5889,6 +5891,19 @@ static const struct hda_fixup alc269_fixups[] = {
  .chained = true,
  .chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
  },
+ [ALC294_FIXUP_ASUS_GZ302EA] = {
+ .type = HDA_FIXUP_FUNC,
+ .v.func = cs35l41_fixup_i2c_two,
+ .chained = true,
+ .chain_id = ALC294_FIXUP_ASUS_GZ302EA_PINS
+ },
+ [ALC294_FIXUP_ASUS_GZ302EA_PINS] = {
+ .type = HDA_FIXUP_PINS,
+ .v.pins = (const struct hda_pintbl[]) {
+ { 0x12, 0x40000000 },
+ { }
+ },
+ },
  [ALC294_FIXUP_ASUS_HPE] = {
  .type = HDA_FIXUP_VERBS,
  .v.verbs = (const struct hda_verb[]) {
@@ -7937,7 +7952,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
  SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2),
  SND_PCI_QUIRK(0x1043, 0x1f63, "ASUS P5405CSA", ALC245_FIXUP_CS35L41_SPI_2),
  SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401),
- SND_PCI_QUIRK(0x1043, 0x1fb3, "ASUS ROG Flow Z13 GZ302EA",
ALC287_FIXUP_CS35L41_I2C_2),
+ SND_PCI_QUIRK(0x1043, 0x1fb3, "ASUS ROG Flow Z13 GZ302EA",
ALC294_FIXUP_ASUS_GZ302EA),
  SND_PCI_QUIRK(0x1043, 0x3011, "ASUS B5605CVA", ALC245_FIXUP_CS35L41_SPI_2),
  SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
  SND_PCI_QUIRK(0x1043, 0x3061, "ASUS B3405CCA",
ALC294_FIXUP_ASUS_CS35L41_SPI_2),

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

* Re: [PATCH] ALSA: hda/realtek: Fix internal mic capture on ASUS ROG Flow Z13 GZ302EA
  2026-10-09 21:19 [PATCH] ALSA: hda/realtek: Fix internal mic capture on ASUS ROG Flow Z13 GZ302EA Alex James
@ 2026-10-10  8:03 ` Takashi Iwai
  0 siblings, 0 replies; 2+ messages in thread
From: Takashi Iwai @ 2026-10-10  8:03 UTC (permalink / raw)
  To: Alex James; +Cc: alsa-devel, Takashi Iwai, Jaroslav Kysela, linux-kernel

On Fri, 09 Oct 2026 23:19:39 +0200,
Alex James wrote:
> 
> The ASUS ROG Flow Z13 GZ302EA (Realtek ALC294, SSID 1043:1fb3) exposes
> two fixed internal mic pins, 0x12 (0x90a60140) and 0x13 (0x90a60130), as
> capture sources "Internal Mic" and "Internal Mic 1". The input mux
> defaults to 0x12, but on this model 0x12 is defective: its right channel
> rails to -32768 and the left channel carries heavy noise, so out of the
> box the internal microphone records loud noise/hum.
> Pin 0x13 captures clean audio on both channels (at lower level). The
> mic array is not reachable through the AMD ACP70/PDM path either: forcing
> it on via ACPI _WOV=1 creates the dmic-codec device but all samples rail
> at -32768, so HDA is the only usable capture path.
> The existing quirk for this SSID only initializes the two CS35L41 I2C
> smart amps (speakers). Disable the broken 0x12 pin via pincfg so that
> 0x13 becomes the sole "Internal Mic" capture source, and keep the CS35L41
> initialization by chaining it in a new fixup.
> Measured on a GZ302EA (arecord, 48 kHz S16LE, identical gain):
>   pin 0x12: L 47% clipped samples, R 15% clipped (railed noise)
>   pin 0x13: <0.3% clipped, hum components below -65 dBFS
> The fix was validated on the target hardware without building a kernel
> by applying the same pincfg override (0x12 -> 0x40000000) through a
> boot-time HDA patch firmware (snd-hda-intel patch=). With the override
> the codec parser drops pin 0x12 entirely: the card comes up with a single
> "Internal Mic" (0x13), the Capture Source mux control disappears (single
> input is hardwired), and capture is clean and stable across boot,
> suspend/resume, and PipeWire/WirePlumber route re-applies. Note that a
> runtime hda-verb override alone is not sufficient because the bus driver
> builds its pin cache at codec registration.
> Also observed on this SSID while testing: repeated
> "ALC294: Invalid fixup type 2016568172" messages in dmesg during probe
> with the current quirk; likely unrelated but worth a look.
> Link: https://github.com/CachyOS/linux-cachyos/issues/880
> Tested-by: aic0d3r <funforfreeapps@gmail.com>
> Signed-off-by: aic0d3r <funforfreeapps@gmail.com>

The blank lines and the white spaces seem broken, possibly due to your
mailer, so the patch can't be applied correctly.  Also, the
Signed-off-by tag has to be a real name (or a known identity) as it's
a legal requirement.  Yet better would be to align From tag with
Signed-off-by, too.

Could you resubmit with proper blank lines and keeping the tabs/spaces
as well as Signed-off-by/From tag corrections?


thanks,

Takashi

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

end of thread, other threads:[~2026-10-10  8:03 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-09 21:19 [PATCH] ALSA: hda/realtek: Fix internal mic capture on ASUS ROG Flow Z13 GZ302EA Alex James
2026-10-10  8:03 ` 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®