[PATCH 4/4] ALSA: hda/realtek: Add quirk for Lenovo Yoga Slim 7 Carbon 14ACN6
From: Ilya Pavlukhin
Date: Sun Sep 20 2026 - 05:29:39 EST
The bass speakers of the Lenovo Yoga Slim 7 Carbon 14ACN6 (82L0) are
driven by two CS35L41 amplifiers, fed over I2S by the ALC287. The codec
only clocks the I2S bus while pin 0x17 is enabled, but the BIOS reports
the pin as unconnected (0x411111f0). The amplifiers then never see a
clock and fail to power up:
cs35l41-hda i2c-CLSA0102:00-cs35l41-hda.0: Enable(1) failed: -110
Configure pin 0x17 as a speaker and keep it on DAC 0x02 together with
pin 0x14: with DAC 0x06 the path is powered down during stereo
playback, which stops the clock again. Then bind the two CS35L41
amplifiers.
The PCI SSID of this machine is 17aa:0000, so match on the codec SSID.
Link: https://bugzilla.kernel.org/show_bug.cgi?id=215632
Assisted-by: Claude Opus 5
Signed-off-by: Ilya Pavlukhin <i.pavluhin@xxxxx>
---
sound/hda/codecs/realtek/alc269.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/sound/hda/codecs/realtek/alc269.c b/sound/hda/codecs/realtek/alc269.c
index 8f55c3c00..7856c92df 100644
--- a/sound/hda/codecs/realtek/alc269.c
+++ b/sound/hda/codecs/realtek/alc269.c
@@ -3448,6 +3448,28 @@ static void alc287_fixup_legion_16ithg6_speakers(struct hda_codec *cdc, const st
comp_generic_fixup(cdc, action, "i2c", "CLSA0101", "-%s:00-cs35l41-hda.%d", 2);
}
+static void alc287_fixup_yoga_slim7_carbon_speakers(struct hda_codec *cdc,
+ const struct hda_fixup *fix, int action)
+{
+ /*
+ * The bass speakers are driven by two CS35L41 amps fed over I2S. The codec only
+ * clocks the I2S bus while pin 0x17 is enabled, but the BIOS marks it unconnected.
+ * Keep the pin on DAC 0x02 with the other speakers: DAC 0x06 gets powered down
+ * with stereo streams, which stops the clock and the amps fail to power up.
+ */
+ static const struct hda_pintbl pincfgs[] = {
+ { 0x17, 0x90170121 },
+ { }
+ };
+ static const hda_nid_t conn[] = { 0x02 };
+
+ if (action == HDA_FIXUP_ACT_PRE_PROBE) {
+ snd_hda_apply_pincfgs(cdc, pincfgs);
+ snd_hda_override_conn_list(cdc, 0x17, ARRAY_SIZE(conn), conn);
+ }
+ comp_generic_fixup(cdc, action, "i2c", "CLSA0102", "-%s:00-cs35l41-hda.%d", 2);
+}
+
static void alc285_fixup_asus_ga403u(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
{
/*
@@ -4328,6 +4350,7 @@ enum {
ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,
ALC295_FIXUP_FRAMEWORK_LAPTOP_LIMIT_INT_MIC_BOOST,
ALC287_FIXUP_LEGION_16ITHG6,
+ ALC287_FIXUP_YOGA_SLIM7_CARBON_SPEAKERS,
ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN,
ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN,
@@ -6690,6 +6713,10 @@ static const struct hda_fixup alc269_fixups[] = {
.type = HDA_FIXUP_FUNC,
.v.func = alc287_fixup_legion_16ithg6_speakers,
},
+ [ALC287_FIXUP_YOGA_SLIM7_CARBON_SPEAKERS] = {
+ .type = HDA_FIXUP_FUNC,
+ .v.func = alc287_fixup_yoga_slim7_carbon_speakers,
+ },
[ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK] = {
.type = HDA_FIXUP_VERBS,
.v.verbs = (const struct hda_verb[]) {
@@ -8182,6 +8209,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6),
+ HDA_CODEC_QUIRK(0x17aa, 0x3856, "Lenovo Yoga Slim 7 Carbon 14ACN6", ALC287_FIXUP_YOGA_SLIM7_CARBON_SPEAKERS),
SND_PCI_QUIRK(0x17aa, 0x3862, "Lenovo IdeaPad Slim 3 15ABR8", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
SND_PCI_QUIRK(0x17aa, 0x3865, "Lenovo 13X", ALC287_FIXUP_CS35L41_I2C_2),
SND_PCI_QUIRK(0x17aa, 0x3866, "Lenovo 13X", ALC287_FIXUP_CS35L41_I2C_2),
--
2.43.0