[PATCH] ALSA: hda/realtek: Fix internal mic capture on ASUS ROG Flow Z13 GZ302EA

From: Alex James

Date: Fri Oct 09 2026 - 17:19:59 EST


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@xxxxxxxxx>
Signed-off-by: aic0d3r <funforfreeapps@xxxxxxxxx>
---
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),