From patchwork Fri Jul 29 14:17:22 2022
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Patchwork-Submitter: Philipp Jungkamp
X-Patchwork-Id: 12933846
Return-Path:
X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on
aws-us-west-2-korg-lkml-1.web.codeaurora.org
Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by smtp.lore.kernel.org (Postfix) with ESMTPS id C9A60C00144
for ; Mon, 1 Aug 2022 14:45:04 +0000 (UTC)
Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201])
(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))
(No client certificate requested)
by alsa0.perex.cz (Postfix) with ESMTPS id 2D0F584A;
Mon, 1 Aug 2022 16:44:12 +0200 (CEST)
DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 2D0F584A
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org;
s=default; t=1659365102;
bh=KQfM3IIeO8JaA83zurWqxinCFxU2tyANd04g1TA0ang=;
h=From:To:Subject:Date:Cc:List-Id:List-Unsubscribe:List-Archive:
List-Post:List-Help:List-Subscribe:From;
b=YWmD4/2BTr+EopS6qFnjxUcAP+q6rM+GqlVaMi9jcVoJLPQXMa4op5D9okm2cvMad
KYGd0povknZKh/6o1IYq5+Vb/hssvFRvTDdWcZKVqmBhF4Dq9xHZxp7Is4/3yig/kN
IxNc/4awGVBrxybLOYKZPpKMsZHUq+v1zeS1uTiU=
Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1])
by alsa1.perex.cz (Postfix) with ESMTP id B50A7F8013D;
Mon, 1 Aug 2022 16:44:11 +0200 (CEST)
Received: by alsa1.perex.cz (Postfix, from userid 50401)
id D1824F8049C; Fri, 29 Jul 2022 16:17:34 +0200 (CEST)
Received: from mout.gmx.net (mout.gmx.net [212.227.17.21])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by alsa1.perex.cz (Postfix) with ESMTPS id 27AF6F8015B
for ; Fri, 29 Jul 2022 16:17:31 +0200 (CEST)
DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 27AF6F8015B
Authentication-Results: alsa1.perex.cz;
dkim=pass (1024-bit key) header.d=gmx.net header.i=@gmx.net
header.b="lNEQybRO"
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net;
s=badeba3b8450; t=1659104250;
bh=KQfM3IIeO8JaA83zurWqxinCFxU2tyANd04g1TA0ang=;
h=X-UI-Sender-Class:From:To:Cc:Subject:Date;
b=lNEQybRO2rpJobXOhxy0bgWU38hkg2uh45dVc4NJ0lH/dLVsgWlX4UmJfskpQ/mb+
zvQr4WCbput7Au4juuCWulxWcuVKHOdsIyWS8hL3KZjh3WZLKb8rOTK10rJ1I40Uj1
mIHgf49dxos0YpLtKpWccR1t9/bXxYo/BWWTRG+U=
X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c
Received: from yoga9.fritz.box ([93.238.92.22]) by mail.gmx.net (mrgmx104
[212.227.17.168]) with ESMTPSA (Nemesis) id 1N1wpt-1nJVcB0Npp-012K3O; Fri, 29
Jul 2022 16:17:30 +0200
From: Philipp Jungkamp
To: tiwai@suse.com,
perex@perex.cz
Subject: [PATCH] ALSA: hda/realtek: Add quirk for Lenovo Yoga9 14IAP7
Date: Fri, 29 Jul 2022 16:17:22 +0200
Message-Id: <20220729141722.566771-1-p.jungkamp@gmx.net>
X-Mailer: git-send-email 2.37.1
MIME-Version: 1.0
X-Provags-ID: V03:K1:212fBHz6O0Q9c4py/HsFh+bhj/U/coYId2FeMJ8JEtyH1eiBNvY
hRkB+xxuUwDCePWPnrWYS54KSSjHEP+S6FyUDCbhoaVTk9IBUXfaPBMQLNQ5aEqBxS0TlTO
+SfNQE2GASiOQpO91K3+rTDEgaCeokvIHbt1IUpef7Z/ONcUhEsAqXETO/IqpZciNLcR/yB
QTP1nWZrGBtg4QhVuE0dw==
X-UI-Out-Filterresults: notjunk:1;V03:K0:H7GLwSxZSv0=:wfqvczXYi+AtXD6fdpiwXR
HVIdeF/3Yfff1/WicywureHYKjrA935GRYVTH/LNT0j44NgJaOqvmD9sd96pE2bgEeWKyrAyQ
nTanNZmNp8AvcqvuqgHfHRUAM28Xhg2dDRC7PJT+egb8E7Ey5BEdVnzFKURQnRFjs+ijsHzNa
u2gL0d7vf1w1lq5VyWMRxQULxDI6Cng7c9skuyTEcG5UN5BqRShcp0C6Hj61+GodB/3RJlb8x
e5UWNSvbLaYPHuu8m221+BST8oY8i6QFb9iQeY3PpoAQG2aY2FZizc4B5sSnSALFB9CJPwJNy
XShfuev1HX2LFTIYHBICFsyWqq7trx7hl6PUvAsoupIZiVd8QRW3oGCnjEld2HXzmCo/lNUee
4HuSkcp87wda0Kvsc/kLGnTko4Env8TGdCGwUzD5u/kJ9ZtiZQ/z98XY/r84eKiuq7hLVEM5W
pytBh8SdpFa3j60PGjfk0WFhyg1fOzV+wEkBhr3l75HUS2VM4q+QBXJD8hbihTy09YIX5RH7Q
Wc02DMOCV5SdnnCRaElrrITXwT7xddGKrLlcMNoRRGphqfSnf9X//Pxc3QOL/Q9/rQ6nA7AK4
O4gzvp44zbCXT3kJof0UHDbhFyQ3G/JRVWgAyZmxVlDa/HEvyQDicWnGt0rV5aSauqk1buLLc
5McA7YgaJ/k3Zp9dxBuf8B07cCvAz5lP7HFQHnapiLFoKNFiW/+XAjYw9yqHs7dynIpLeE9gp
y/PplCcEEVUbmuYI5aFgXdaqXLDwDO9t7SDRoIP2BAX6xLrDYNpcEd/Q1F0O/nSrL8ZqYMNqL
zY58EtipiMRIKAQZzz3ucJ4+LSX2Dwu4qrZrg49TXE1PlRJPkZUyLBppdE2PtfMCDTwX0lFu5
zj29Uq4pBdKAOQNGR7o2fh1Xn6428Qw6COleZw5z98La+SwGmAvGsWw3VmKGmLmnh9N+zstgU
N7SYgYIwyvmVVShqWSk4gtFCF3bdzAJL6087MHnJSfEFwKIX1oQ8FM/ZPTrznXib7u35L+ohx
JMILv9XtTzdVWMXwsYEiJyCLUaVwQQXAnD/RM7DIMRsOERiIG96PME4TTbWWFWZq2/uPOgXHJ
pcl+bNAakw1kVWG9SQGBBhaFTC+AyTuUi1YBwfQ7SGUoWrMN76KQVbZFQ==
X-Mailman-Approved-At: Mon, 01 Aug 2022 16:44:10 +0200
Cc: alsa-devel@alsa-project.org, Philipp Jungkamp
X-BeenThere: alsa-devel@alsa-project.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: "Alsa-devel mailing list for ALSA developers -
http://www.alsa-project.org"
List-Unsubscribe:
,
List-Archive:
List-Post:
List-Help:
List-Subscribe:
,
Errors-To: alsa-devel-bounces@alsa-project.org
Sender: "Alsa-devel"
The Lenovo Yoga 9 14IAP7 is 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 pincfg and hda verbs connect and activate the bass speaker
amplifiers, but the generic driver will connect them to NID 0x06 which
has no volume control. Set connection list/preferred connections is
required to gain volume control.
BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=208555
Signed-off-by: Philipp Jungkamp
---
sound/pci/hda/patch_realtek.c | 109 ++++++++++++++++++++++++++++++++++
1 file changed, 109 insertions(+)
--
2.37.1
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 2f55bc43bfa9..fe1a4212dbc3 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -6787,6 +6787,43 @@ static void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec,
}
}
+static void alc287_fixup_yoga9_14iap7_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,
@@ -7023,6 +7060,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_14IAP7_BASS_SPK,
+ ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN,
};
/* A special fixup for Lenovo C940 and Yoga Duet 7;
@@ -8865,6 +8904,74 @@ static const struct hda_fixup alc269_fixups[] = {
.chained = true,
.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
},
+ [ALC287_FIXUP_YOGA9_14IAP7_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_14IAP7_BASS_SPK_PIN] = {
+ .type = HDA_FIXUP_FUNC,
+ .v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,
+ .chained = true,
+ .chain_id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
+ },
};
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -9315,6 +9422,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, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga DuetITL 2021", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
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),
@@ -9560,6 +9668,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
{.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
{.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
{.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
+ {.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"},
{.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},
{.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"},
{.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"},