diff -rupN archlinux-linux/0005-ALSA-hda-realtek-Add-quirk-for-Lenovo-Yoga-9-14IAP7.patch archlinux-linux-patched/0005-ALSA-hda-realtek-Add-quirk-for-Lenovo-Yoga-9-14IAP7.patch
--- archlinux-linux/0005-ALSA-hda-realtek-Add-quirk-for-Lenovo-Yoga-9-14IAP7.patch 1970-01-01 02:00:00.000000000 +0200
+++ archlinux-linux-patched/0005-ALSA-hda-realtek-Add-quirk-for-Lenovo-Yoga-9-14IAP7.patch 2022-07-11 15:39:59.227560590 +0300
@@ -0,0 +1,171 @@
+From 5af8557e99de1d5bc459f22e13c88736ea565f5a Mon Sep 17 00:00:00 2001
+From: Philipp Jungkamp
+Date: Mon, 13 Jun 2022 22:17:42 +0200
+Subject: [PATCH 5/7] ALSA: hda/realtek: Add quirk for Lenovo Yoga 9 14IAP7
+
+The Lenovo Yoga 9 14IAP7 it set up similarly to the Thinkpad X1 7th and 8th
+Gen. It also has the speakers attached to NID 0x14 and the bass speakers to
+NID 0x17, but here the codec misreports the NID 0x17 as unconnected.
+
+The bass speakers need additional hda verbs to activate. The coeffs from the
+Ideapad S740 (alc285_fixup_ideapad_coef) will activate the left bass speaker
+but not the right one. Sniffing the hda verbs from a Windows VM leads to a
+verb sequence which is similar to the one used for the Yoga 7 14ITL05.
+
+The pincfg and hda verbs will get the bass speakers working but the generic
+driver will connect them to NID 0x06 which has no volume control. So a
+a fix for the connection list and preferred connections is required to gain
+volume control. In contrast to aforementioned Thinkpads this device works
+with both DACs 0x02 and 0x03 a volume mixers, but DAC 0x02 should be preferred
+for a unified volume of speakers and bass and leave DAC 0x03 to the headphones.
+
+BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=208555
+Signed-off-by: Philipp Jungkamp
+---
+ sound/pci/hda/patch_realtek.c | 108 ++++++++++++++++++++++++++++++++++
+ 1 file changed, 108 insertions(+)
+
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 323c74a04268..7d4db82c8662 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -6826,6 +6826,43 @@ static void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec,
+ }
+ }
+
++static void alc287_fixup_yoga9_iap7_bass_spk_pin(struct hda_codec *codec,
++ const struct hda_fixup *fix, int action)
++{
++ /*
++ * The Pin Complex 0x17 for the bass speakers is wrongly reported as
++ * unconnected.
++ */
++ static const struct hda_pintbl pincfgs[] = {
++ { 0x17, 0x90170121 },
++ { }
++ };
++ /*
++ * Avoid DAC 0x06 and 0x08, as they have no volume controls.
++ * DAC 0x02 and 0x03 would be fine.
++ */
++ static const hda_nid_t conn[] = { 0x02, 0x03 };
++ /*
++ * Prefer both speakerbar (0x14) and bass speakers (0x17) connected to DAC 0x02.
++ * Headphones (0x21) are connected to DAC 0x03.
++ */
++ static const hda_nid_t preferred_pairs[] = {
++ 0x14, 0x02,
++ 0x17, 0x02,
++ 0x21, 0x03,
++ 0
++ };
++ struct alc_spec *spec = codec->spec;
++
++ 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);
++ spec->gen.preferred_dacs = preferred_pairs;
++ break;
++ }
++}
++
+ enum {
+ ALC269_FIXUP_GPIO2,
+ ALC269_FIXUP_SONY_VAIO,
+@@ -7060,6 +7097,8 @@ enum {
+ ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED,
+ ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,
+ ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,
++ ALC287_FIXUP_YOGA9_IAP7_BASS_SPK,
++ ALC287_FIXUP_YOGA9_IAP7_BASS_SPK_PIN,
+ };
+
+ static const struct hda_fixup alc269_fixups[] = {
+@@ -8871,6 +8910,74 @@ static const struct hda_fixup alc269_fixups[] = {
+ .chained = true,
+ .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
+ },
++ [ALC287_FIXUP_YOGA9_IAP7_BASS_SPK] = {
++ .type = HDA_FIXUP_VERBS,
++ .v.verbs = (const struct hda_verb[]) {
++ // enable left speaker
++ { 0x20, 0x500, 0x24 },
++ { 0x20, 0x400, 0x41 },
++
++ { 0x20, 0x500, 0x26 },
++ { 0x20, 0x400, 0xc },
++ { 0x20, 0x400, 0x0 },
++ { 0x20, 0x400, 0x1a },
++ { 0x20, 0x4b0, 0x20 },
++
++ { 0x20, 0x500, 0x26 },
++ { 0x20, 0x400, 0xf },
++ { 0x20, 0x400, 0x0 },
++ { 0x20, 0x400, 0x42 },
++ { 0x20, 0x4b0, 0x20 },
++
++ { 0x20, 0x500, 0x26 },
++ { 0x20, 0x400, 0x10 },
++ { 0x20, 0x400, 0x0 },
++ { 0x20, 0x400, 0x40 },
++ { 0x20, 0x4b0, 0x20 },
++
++ { 0x20, 0x500, 0x26 },
++ { 0x20, 0x400, 0x2 },
++ { 0x20, 0x400, 0x0 },
++ { 0x20, 0x400, 0x0 },
++ { 0x20, 0x4b0, 0x20 },
++
++ // enable righ speaker
++ { 0x20, 0x500, 0x24 },
++ { 0x20, 0x400, 0x46 },
++
++ { 0x20, 0x500, 0x26 },
++ { 0x20, 0x400, 0xc },
++ { 0x20, 0x400, 0x0 },
++ { 0x20, 0x400, 0x2a },
++ { 0x20, 0x4b0, 0x20 },
++
++ { 0x20, 0x500, 0x26 },
++ { 0x20, 0x400, 0xf },
++ { 0x20, 0x400, 0x0 },
++ { 0x20, 0x400, 0x46 },
++ { 0x20, 0x4b0, 0x20 },
++
++ { 0x20, 0x500, 0x26 },
++ { 0x20, 0x400, 0x10 },
++ { 0x20, 0x400, 0x0 },
++ { 0x20, 0x400, 0x44 },
++ { 0x20, 0x4b0, 0x20 },
++
++ { 0x20, 0x500, 0x26 },
++ { 0x20, 0x400, 0x2 },
++ { 0x20, 0x400, 0x0 },
++ { 0x20, 0x400, 0x0 },
++ { 0x20, 0x4b0, 0x20 },
++
++ { },
++ },
++ },
++ [ALC287_FIXUP_YOGA9_IAP7_BASS_SPK_PIN] = {
++ .type = HDA_FIXUP_FUNC,
++ .v.func = alc287_fixup_yoga9_iap7_bass_spk_pin,
++ .chained = true,
++ .chain_id = ALC287_FIXUP_YOGA9_IAP7_BASS_SPK,
++ },
+ };
+
+ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+@@ -9310,6 +9417,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+ SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
+ SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
+ SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
+ SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga DuetITL 2021", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
++ SND_PCI_QUIRK(0x17aa, 0x3801, "Yoga 9 14IAP7", ALC287_FIXUP_YOGA9_IAP7_BASS_SPK_PIN),
+ SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
+ SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940", ALC298_FIXUP_LENOVO_SPK_VOLUME),
+ SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
+--
+2.37.0
+
diff -rupN archlinux-linux/sound/pci/hda/patch_realtek.c archlinux-linux-patched/sound/pci/hda/patch_realtek.c
--- archlinux-linux/sound/pci/hda/patch_realtek.c 2022-07-11 15:28:37.271990657 +0300
+++ archlinux-linux-patched/sound/pci/hda/patch_realtek.c 2022-07-11 15:41:28.415122403 +0300
@@ -6839,6 +6839,43 @@ static void alc_fixup_dell4_mic_no_prese
}
}
+static void alc287_fixup_yoga9_iap7_bass_spk_pin(struct hda_codec *codec,
+ const struct hda_fixup *fix, int action)
+{
+ /*
+ * The Pin Complex 0x17 for the bass speakers is wrongly reported as
+ * unconnected.
+ */
+ static const struct hda_pintbl pincfgs[] = {
+ { 0x17, 0x90170121 },
+ { }
+ };
+ /*
+ * Avoid DAC 0x06 and 0x08, as they have no volume controls.
+ * DAC 0x02 and 0x03 would be fine.
+ */
+ static const hda_nid_t conn[] = { 0x02, 0x03 };
+ /*
+ * Prefer both speakerbar (0x14) and bass speakers (0x17) connected to DAC 0x02.
+ * Headphones (0x21) are connected to DAC 0x03.
+ */
+ static const hda_nid_t preferred_pairs[] = {
+ 0x14, 0x02,
+ 0x17, 0x02,
+ 0x21, 0x03,
+ 0
+ };
+ struct alc_spec *spec = codec->spec;
+
+ 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);
+ spec->gen.preferred_dacs = preferred_pairs;
+ break;
+ }
+}
+
enum {
ALC269_FIXUP_GPIO2,
ALC269_FIXUP_SONY_VAIO,
@@ -7074,6 +7111,8 @@ enum {
ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED,
ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,
ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,
+ ALC287_FIXUP_YOGA9_IAP7_BASS_SPK,
+ ALC287_FIXUP_YOGA9_IAP7_BASS_SPK_PIN,
};
/* A special fixup for Lenovo C940 and Yoga Duet 7;
@@ -8906,6 +8945,74 @@ static const struct hda_fixup alc269_fix
.chained = true,
.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
},
+ [ALC287_FIXUP_YOGA9_IAP7_BASS_SPK] = {
+ .type = HDA_FIXUP_VERBS,
+ .v.verbs = (const struct hda_verb[]) {
+ // enable left speaker
+ { 0x20, 0x500, 0x24 },
+ { 0x20, 0x400, 0x41 },
+
+ { 0x20, 0x500, 0x26 },
+ { 0x20, 0x400, 0xc },
+ { 0x20, 0x400, 0x0 },
+ { 0x20, 0x400, 0x1a },
+ { 0x20, 0x4b0, 0x20 },
+
+ { 0x20, 0x500, 0x26 },
+ { 0x20, 0x400, 0xf },
+ { 0x20, 0x400, 0x0 },
+ { 0x20, 0x400, 0x42 },
+ { 0x20, 0x4b0, 0x20 },
+
+ { 0x20, 0x500, 0x26 },
+ { 0x20, 0x400, 0x10 },
+ { 0x20, 0x400, 0x0 },
+ { 0x20, 0x400, 0x40 },
+ { 0x20, 0x4b0, 0x20 },
+
+ { 0x20, 0x500, 0x26 },
+ { 0x20, 0x400, 0x2 },
+ { 0x20, 0x400, 0x0 },
+ { 0x20, 0x400, 0x0 },
+ { 0x20, 0x4b0, 0x20 },
+
+ // enable righ speaker
+ { 0x20, 0x500, 0x24 },
+ { 0x20, 0x400, 0x46 },
+
+ { 0x20, 0x500, 0x26 },
+ { 0x20, 0x400, 0xc },
+ { 0x20, 0x400, 0x0 },
+ { 0x20, 0x400, 0x2a },
+ { 0x20, 0x4b0, 0x20 },
+
+ { 0x20, 0x500, 0x26 },
+ { 0x20, 0x400, 0xf },
+ { 0x20, 0x400, 0x0 },
+ { 0x20, 0x400, 0x46 },
+ { 0x20, 0x4b0, 0x20 },
+
+ { 0x20, 0x500, 0x26 },
+ { 0x20, 0x400, 0x10 },
+ { 0x20, 0x400, 0x0 },
+ { 0x20, 0x400, 0x44 },
+ { 0x20, 0x4b0, 0x20 },
+
+ { 0x20, 0x500, 0x26 },
+ { 0x20, 0x400, 0x2 },
+ { 0x20, 0x400, 0x0 },
+ { 0x20, 0x400, 0x0 },
+ { 0x20, 0x4b0, 0x20 },
+
+ { },
+ },
+ },
+ [ALC287_FIXUP_YOGA9_IAP7_BASS_SPK_PIN] = {
+ .type = HDA_FIXUP_FUNC,
+ .v.func = alc287_fixup_yoga9_iap7_bass_spk_pin,
+ .chained = true,
+ .chain_id = ALC287_FIXUP_YOGA9_IAP7_BASS_SPK,
+ },
};
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -9349,6 +9456,7 @@ static const struct snd_pci_quirk alc269
SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga DuetITL 2021", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
+ SND_PCI_QUIRK(0x17aa, 0x3801, "Yoga 9 14IAP7", ALC287_FIXUP_YOGA9_IAP7_BASS_SPK_PIN),
SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7),
SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),