[PATCH 1/3] ALSA: hda/realtek: Use AW88399 I2C fixup chain on Legion machines
Aaron Ma <[email protected]> Sat, 1 Aug 2026 14:06:28 +0800
| Newsgroups | gmane.linux.sound,gmane.linux.kernel |
|---|---|
| Message-ID | <[email protected]> |
Six Lenovo Legion codec SSIDs use an ALC287 with two AW88399 amplifiers registered through AWDZ8399. Bind them to ALC287_FIXUP_AW88399_I2C_2 and chain the existing microphone, headset, jack, and DAC-routing fixups. Disable auto-mic switching to preserve explicit internal-mic selection. Drop the dedicated Legion fixup and its redundant 0x1d override. Firmware already marks 0x1d as an unused modem-line pin, which the parser ignores; overriding it only produces a legacy SKU warning. Retain the existing Lenovo routing for quad-speaker output. Signed-off-by: Aaron Ma <[email protected]> --- sound/hda/codecs/realtek/alc269.c | 62 +++++++++++++------------------ 1 file changed, 26 insertions(+), 36 deletions(-) diff --git a/sound/hda/codecs/realtek/alc269.c b/sound/hda/codecs/realtek/alc269.c index f7877127e0e49..2e3f7f1b52782 100644 --- a/sound/hda/codecs/realtek/alc269.c +++ b/sound/hda/codecs/realtek/alc269.c @@ -3270,32 +3270,14 @@ static void find_cirrus_companion_amps(struct hda_codec *cdc) static void aw88399_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action) { + struct alc_spec *spec = cdc->spec; + + if (action == HDA_FIXUP_ACT_PRE_PROBE) + spec->gen.suppress_auto_mic = 1; + comp_generic_fixup(cdc, action, "i2c", "AWDZ8399", "-%s:00-aw88399-hda.%d", 2); } -static void alc287_fixup_legion_16iax10h_aw88399(struct hda_codec *codec, - const struct hda_fixup *fix, int action) -{ - static const struct hda_pintbl pincfgs[] = { - { 0x1d, 0x411111f0 }, /* unused bogus pin */ - { } - }; - - /* - * Force DAC 0x02 for the bass speaker 0x17, as the default 0x06 lacks volume controls. - */ - static const hda_nid_t conn[] = { 0x02 }; - - alc269_fixup_limit_int_mic_boost(codec, fix, action); - - switch (action) { - case HDA_FIXUP_ACT_PRE_PROBE: - snd_hda_apply_pincfgs(codec, pincfgs); - snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); - break; - } -} - static void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action) { comp_generic_fixup(cdc, action, "i2c", "CSC3551", "-%s:00-cs35l41-hda.%d", 2); @@ -4267,7 +4249,8 @@ enum { ALC274_FIXUP_HP_89E9_GPIO, ALC274_FIXUP_HP_VERBS, ALC287_FIXUP_AW88399_I2C_2, - ALC287_FIXUP_LENOVO_LEGION_AW88399, + ALC287_FIXUP_AW88399_LIMIT_INT_MIC_BOOST, + ALC287_FIXUP_AW88399_HEADSET_MIC, }; /* A special fixup for Lenovo C940 and Yoga Duet 7; @@ -6967,12 +6950,20 @@ static const struct hda_fixup alc269_fixups[] = { [ALC287_FIXUP_AW88399_I2C_2] = { .type = HDA_FIXUP_FUNC, .v.func = aw88399_fixup_i2c_two, - }, - [ALC287_FIXUP_LENOVO_LEGION_AW88399] = { - .type = HDA_FIXUP_FUNC, - .v.func = alc287_fixup_legion_16iax10h_aw88399, .chained = true, - .chain_id = ALC287_FIXUP_AW88399_I2C_2, + .chain_id = ALC287_FIXUP_AW88399_LIMIT_INT_MIC_BOOST, + }, + [ALC287_FIXUP_AW88399_LIMIT_INT_MIC_BOOST] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc269_fixup_limit_int_mic_boost, + .chained = true, + .chain_id = ALC287_FIXUP_AW88399_HEADSET_MIC, + }, + [ALC287_FIXUP_AW88399_HEADSET_MIC] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc_fixup_headset_mode_no_hp_mic, + .chained = true, + .chain_id = ALC287_FIXUP_LENOVO_XPAD_HEADSET_JACK, }, }; @@ -8037,8 +8028,8 @@ static const struct hda_quirk alc269_fixup_tbl[] = { /* Legion R9000P ADR10 shares PCI SSID 17aa:38bb with Yoga S780-14.5 Air AMD quad AAC; * use codec SSID to distinguish them */ - HDA_CODEC_QUIRK(0x17aa, 0x3927, "Legion R9000P ADR10", ALC287_FIXUP_LENOVO_LEGION_AW88399), - HDA_CODEC_QUIRK(0x17aa, 0x3928, "Legion R9000P ADR10", ALC287_FIXUP_LENOVO_LEGION_AW88399), + HDA_CODEC_QUIRK(0x17aa, 0x3927, "Legion R9000P ADR10", ALC287_FIXUP_AW88399_I2C_2), + HDA_CODEC_QUIRK(0x17aa, 0x3928, "Legion R9000P ADR10", ALC287_FIXUP_AW88399_I2C_2), SND_PCI_QUIRK(0x17aa, 0x38bb, "Yoga S780-14.5 Air AMD quad AAC", ALC287_FIXUP_TAS2781_I2C), SND_PCI_QUIRK(0x17aa, 0x38be, "Yoga S980-14.5 proX YC Dual", ALC287_FIXUP_TAS2781_I2C), SND_PCI_QUIRK(0x17aa, 0x38bf, "Yoga S980-14.5 proX LX Dual", ALC287_FIXUP_TAS2781_I2C), @@ -8066,8 +8057,8 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x17aa, 0x38fc, "Lenovo Yoga Pro 7 15ASH11", ALC287_FIXUP_LENOVO_YOGA_PRO7), SND_PCI_QUIRK(0x17aa, 0x38fd, "ThinkBook plus Gen5 Hybrid", ALC287_FIXUP_TAS2781_I2C), SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), - HDA_CODEC_QUIRK(0x17aa, 0x3906, "Legion Pro 7i 16IAX10H / Y9000P IAX10", ALC287_FIXUP_LENOVO_LEGION_AW88399), - HDA_CODEC_QUIRK(0x17aa, 0x3907, "Legion Pro 7i 16IAX10H / Y9000P IAX10", ALC287_FIXUP_LENOVO_LEGION_AW88399), + HDA_CODEC_QUIRK(0x17aa, 0x3906, "Legion Pro 7i 16IAX10H / Y9000P IAX10", ALC287_FIXUP_AW88399_I2C_2), + HDA_CODEC_QUIRK(0x17aa, 0x3907, "Legion Pro 7i 16IAX10H / Y9000P IAX10", ALC287_FIXUP_AW88399_I2C_2), SND_PCI_QUIRK(0x17aa, 0x390d, "Lenovo Yoga Pro 7 14ASP10", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN), SND_PCI_QUIRK(0x17aa, 0x3911, "Lenovo Yoga Pro 7 14IAH10", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN), SND_PCI_QUIRK(0x17aa, 0x3912, "Lenovo Xiaoxin 14 GT", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN), @@ -8077,8 +8068,8 @@ static const struct hda_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x17aa, 0x3920, "Yoga S990-16 pro Quad VECO Quad", ALC287_FIXUP_TXNW2781_I2C), SND_PCI_QUIRK(0x17aa, 0x3929, "Thinkbook 13x Gen 5", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), SND_PCI_QUIRK(0x17aa, 0x392b, "Thinkbook 13x Gen 5", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), - HDA_CODEC_QUIRK(0x17aa, 0x3938, "Legion Pro 7 16AFR10H", ALC287_FIXUP_LENOVO_LEGION_AW88399), - HDA_CODEC_QUIRK(0x17aa, 0x3939, "Legion Pro 7 16AFR10H", ALC287_FIXUP_LENOVO_LEGION_AW88399), + HDA_CODEC_QUIRK(0x17aa, 0x3938, "Legion Pro 7 16AFR10H", ALC287_FIXUP_AW88399_I2C_2), + HDA_CODEC_QUIRK(0x17aa, 0x3939, "Legion Pro 7 16AFR10H", ALC287_FIXUP_AW88399_I2C_2), SND_PCI_QUIRK(0x17aa, 0x393e, "Lenovo ThinkBook 14 G8+ IPH", ALC287_FIXUP_LENOVO_XPAD_HEADSET_JACK), HDA_CODEC_QUIRK(0x17aa, 0x394c, "Lenovo Yoga Slim 7 14AGP11", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN), SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), @@ -8383,7 +8374,6 @@ static const struct hda_model_fixup alc269_fixup_models[] = { {.id = ALC2XX_FIXUP_HEADSET_MIC, .name = "alc2xx-fixup-headset-mic"}, {.id = ALC245_FIXUP_BASS_HP_DAC, .name = "alc245-fixup-bass-hp-dac"}, {.id = ALC256_FIXUP_HONOR_MRB_XXX_M1020_AUDIO, .name = "alc256-honor-mrb-xxx-m1020-audio"}, - {.id = ALC287_FIXUP_LENOVO_LEGION_AW88399, .name = "alc287-lenovo-legion-aw88399"}, {} }; #define ALC225_STANDARD_PINS \ -- 2.53.0