Re: [PATCH v2] ALSA: hda/conexant: fix FEVM FA880 PRO internal mic mux
From: 周Ocean
Date: Sun May 31 2026 - 00:02:20 EST
Hi Takashi,
Thanks for your quick reply and professional guidance!
Here is the original topology of Conexant CX20632 (SSID 2014:8004) on
FEVM FA880 PRO:
- Node 0x14 [Audio Input] (Analog Capture)
Connection: 4
0x1a 0x1b 0x1d 0x1e* (Note: 0x1e is selected by default)
- Node 0x1e [Pin Complex] (Internal Mic)
Pin Default 0x95a60120: [Fixed] Mic at Int Top
Connection: None (It's a digital/fixed mic pin)
- Node 0x1a [Pin Complex] (Front Mic): Pin Default 0x02a1103e
- Node 0x1b [Pin Complex] (Rear Mic): Pin Default 0x01a13030
Regarding the kernel crash, I encountered a kernel Oops in
try_assign_dacs() during the auto-config stage on the newer
7.0.10-cachyos kernel. I suspect it might be triggered when loading my
out-of-tree custom DKMS module, or due to changes in how
try_assign_dacs() interacts with this specific topology on the new
kernel. (Fortunately, the system works perfectly fine on the 6.18-lts
kernel with my custom module).
In the older kernel (like 6.18), the auto-parser didn't crash but
would incorrectly route Node 0x14 away from Node 0x1e after probing,
disabling the internal microphone. That was why my previous patch
forced index 0x03 on Node 0x14 in HDA_FIXUP_ACT_INIT.
Since you mentioned correcting the routes before parsing, should we
override the connection list of Node 0x14 to restrict it during
HDA_FIXUP_ACT_PRE_PROBE, or override the pin default configuration via
HDA_FIXUP_PINS to fix this properly?
I would really appreciate your advice on how we should construct the
fixup gracefully!
Thanks again,
Ocean
Takashi Iwai <tiwai@xxxxxxx> 于2026年5月29日周五 17:05写道:
>
> On Fri, 29 May 2026 06:11:47 +0200,
> ocean wrote:
> >
> > From: Ocean Zhou <51983215+ocean-sudo@xxxxxxxxxxxxxxxxxxxxxxxx>
> >
> > FEVM FA880 PRO mini PC uses Conexant CX20632 codec. The internal
> > microphone is connected to pin 0x1e. In order to make it work,
> > we need to force ADC 0x14 connection to 0x1e (connection index 3).
> >
> > This patch adds a new quirk CXT_FIXUP_CX20632_INTMIC to force
> > the connection selection on initialization, and applies it
> > for the SSID 2014:8004.
> >
> > Signed-off-by: Ocean Zhou <51983215+ocean-sudo@xxxxxxxxxxxxxxxxxxxxxxxx>
>
> If a hard-wire is needed, usually we correct the routes before
> parsing (e.g. correcting the connection list), so that the parser
> would wire via the expected route.
>
> How does the original topology look like and how it should be changed?
>
>
> thanks,
>
> Takashi
>
> > ---
> > sound/pci/hda/patch_conexant.c | 22 ++++++++++++++++++++++
> > 1 file changed, 22 insertions(+)
> >
> > diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
> > index 2d4094be83ab..5e2279267104 100644
> > --- a/sound/pci/hda/patch_conexant.c
> > +++ b/sound/pci/hda/patch_conexant.c
> > @@ -300,6 +300,7 @@ enum {
> > CXT_PINCFG_SWS_JS201D,
> > CXT_PINCFG_TOP_SPEAKER,
> > CXT_FIXUP_HP_A_U,
> > + CXT_FIXUP_CX20632_INTMIC,
> > };
> >
> > /* for hda_fixup_thinkpad_acpi() */
> > @@ -343,6 +344,15 @@ static void cxt5066_increase_mic_boost(struct hda_codec *codec,
> > (0 << AC_AMPCAP_MUTE_SHIFT));
> > }
> >
> > +static void cxt_fixup_cx20632_intmic(struct hda_codec *codec,
> > + const struct hda_fixup *fix, int action)
> > +{
> > + if (action != HDA_FIXUP_ACT_INIT)
> > + return;
> > +
> > + /* Force ADC 0x14 to internal mic pin 0x1e (conn index 3). */
> > + snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_CONNECT_SEL, 0x03);
> > +}
> > +
> > static void cxt_update_headset_mode(struct hda_codec *codec)
> > {
> > /* The verbs used in this function were tested on a Conexant CX20751/2 codec. */
> > @@ -1035,6 +1045,10 @@ static const struct hda_fixup cxt_fixups[] = {
> > .type = HDA_FIXUP_FUNC,
> > .v.func = cxt_fixup_hp_a_u,
> > },
> > + [CXT_FIXUP_CX20632_INTMIC] = {
> > + .type = HDA_FIXUP_FUNC,
> > + .v.func = cxt_fixup_cx20632_intmic,
> > + },
> > };
> >
> > static const struct hda_quirk cxt5045_fixups[] = {
> > @@ -1140,6 +1154,7 @@ static const struct hda_quirk cxt5066_fixups[] = {
> > SND_PCI_QUIRK(0x1c06, 0x2011, "Lemote A1004", CXT_PINCFG_LEMOTE_A1004),
> > SND_PCI_QUIRK(0x1c06, 0x2012, "Lemote A1205", CXT_PINCFG_LEMOTE_A1205),
> > SND_PCI_QUIRK(0x1d05, 0x3012, "MECHREVO Wujie 15X Pro", CXT_FIXUP_HEADSET_MIC),
> > + SND_PCI_QUIRK(0x2014, 0x8004, "FEVM FA880 PRO", CXT_FIXUP_CX20632_INTMIC),
> > HDA_CODEC_QUIRK(0x2782, 0x12c3, "Sirius Gen1", CXT_PINCFG_TOP_SPEAKER),
> > HDA_CODEC_QUIRK(0x2782, 0x12c5, "Sirius Gen2", CXT_PINCFG_TOP_SPEAKER),
> > {}
> > @@ -1165,6 +1180,7 @@ static const struct hda_model_fixup cxt5066_fixup_models[] = {
> > { .id = CXT_PINCFG_TOP_SPEAKER, .name = "sirius-top-speaker" },
> > { .id = CXT_FIXUP_HP_A_U, .name = "HP-U-support" },
> > + { .id = CXT_FIXUP_CX20632_INTMIC, .name = "cx20632-intmic" },
> > {}
> > };
> >