In this case, there are two DACs, and DAC 0x03 is mono. In order
to make headphones and front speaker use DAC 0x02, and subwoofer use
DAC 0x03, we artificially cut the connection from nodes 0x14 and 0x15
to node 0x03, so they can only use DAC 0x02.
In addition, the 5460 and 5470 differs in the sense that 5470 also
needs a headset mic patch, whereas 5460 has individual detection for
headphone and headset mic.
I'm adding Kailang to cc on this one; hopefully he'll scream if this patch
is doing anything dangerous, such as if there's a risk to blow up the subwoofer.
In this case, there are two DACs, and DAC 0x03 is mono. In order
to make headphones and front speaker use DAC 0x02, and subwoofer use
DAC 0x03, we artificially cut the connection from nodes 0x14 and 0x15
to node 0x03, so they can only use DAC 0x02.
In addition, the 5460 and 5470 differs in the sense that 5470 also
needs a headset mic patch, whereas 5460 has individual detection for
headphone and headset mic.
BugLink: https:/ /bugs.launchpad .net/bugs/ 1211920
Signed-off-by: David Henningsson <email address hidden>
---
I'm adding Kailang to cc on this one; hopefully he'll scream if this patch
is doing anything dangerous, such as if there's a risk to blow up the subwoofer.
sound/ pci/hda/ patch_realtek. c | 43 +++++++ +++++++ +++++++ +++++++ +++++++ ------
1 file changed, 37 insertions(+), 6 deletions(-)
diff --git a/sound/ pci/hda/ patch_realtek. c b/sound/ pci/hda/ patch_realtek. c pci/hda/ patch_realtek. c pci/hda/ patch_realtek. c fixup_asus_ tx300(struct hda_codec *codec, fixup_mono_ speakers( struct hda_codec *codec, ACT_PRE_ PROBE) override_ wcaps(codec, 0x03, 0); ACT_PRE_ PROBE) { override_ conn_list( codec, 0x14, 1, conn1); override_ conn_list( codec, 0x15, 1, conn1);
index dfe4080..16c0caa 100644
--- a/sound/
+++ b/sound/
@@ -3770,10 +3770,14 @@ static void alc282_
static void alc290_
const struct hda_fixup *fix, int action)
{
- if (action == HDA_FIXUP_
- /* Remove DAC node 0x03, as it seems to be
- giving mono output */
- snd_hda_
+ if (action == HDA_FIXUP_
+ /* DAC node 0x03 is giving mono output. We therefore want to
+ make sure 0x14 (front speaker) and 0x15 (headphones) use the
+ stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
+ hda_nid_t conn1[2] = { 0x0c };
+ snd_hda_
+ snd_hda_
+ }
}
#if IS_ENABLED( CONFIG_ THINKPAD_ ACPI) FIXUP_ASUS_ TX300, FIXUP_INT_ MIC, FIXUP_MONO_ SPEAKERS, FIXUP_MONO_ SPEAKERS_ HSJACK, FIXUP_SUBWOOFER , FIXUP_SUBWOOFER _HSJACK, FIXUP_THINKPAD_ ACPI, FIXUP_DELL1_ MIC_NO_ PRESENCE, FIXUP_HEADSET_ MODE, FIXUP_LIMIT_ INT_MIC_ BOOST FIXUP_SUBWOOFER _HSJACK] = { FIXUP_MONO_ SPEAKERS_ HSJACK, FIXUP_SUBWOOFER ] = { FIXUP_MONO_ SPEAKERS, FIXUP_MONO_ SPEAKERS] = { fixup_mono_ speakers, FIXUP_MONO_ SPEAKERS_ HSJACK] = { fixup_mono_ speakers, FIXUP_DELL3_ MIC_NO_ PRESENCE, QUIRK(0x1028, 0x05cb, "Dell", ALC269_ FIXUP_DELL2_ MIC_NO_ PRESENCE) , QUIRK(0x1028, 0x05cc, "Dell X5 Precision", ALC269_ FIXUP_DELL2_ MIC_NO_ PRESENCE) , QUIRK(0x1028, 0x05cd, "Dell X5 Precision", ALC269_ FIXUP_DELL2_ MIC_NO_ PRESENCE) , QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_ FIXUP_SUBWOOFER ), QUIRK(0x1028, 0x05de, "Dell", ALC269_ FIXUP_DELL2_ MIC_NO_ PRESENCE) , QUIRK(0x1028, 0x05e0, "Dell", ALC269_ FIXUP_DELL2_ MIC_NO_ PRESENCE) , QUIRK(0x1028, 0x05e9, "Dell", ALC269_ FIXUP_DELL1_ MIC_NO_ PRESENCE) , QUIRK(0x1028, 0x0610, "Dell", ALC269_ FIXUP_DELL1_ MIC_NO_ PRESENCE) , QUIRK(0x1028, 0x0613, "Dell", ALC269_ FIXUP_DELL1_ MIC_NO_ PRESENCE) , QUIRK(0x1028, 0x0614, "Dell Inspiron 3135", ALC269_ FIXUP_DELL1_ MIC_NO_ PRESENCE) , QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_ FIXUP_MONO_ SPEAKERS) , QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_ FIXUP_SUBWOOFER _HSJACK) , QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_ FIXUP_SUBWOOFER _HSJACK) , QUIRK(0x1028, 0x061f, "Dell", ALC255_ FIXUP_DELL1_ MIC_NO_ PRESENCE) , QUIRK(0x1028, 0x0629, "Dell", ALC269_ FIXUP_DELL1_ MIC_NO_ PRESENCE) , QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_ FIXUP_MONO_ SPEAKERS) , QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_ FIXUP_MONO_ SPEAKERS_ HSJACK) , QUIRK(0x1028, 0x063e, "Dell", ALC269_ FIXUP_DELL1_ MIC_NO_ PRESENCE) , QUIRK(0x1028, 0x063f, "Dell", ALC255_ FIXUP_DELL1_ MIC_NO_ PRESENCE) , QUIRK(0x1028, 0x0640, "Dell", ALC255_ FIXUP_DELL1_ MIC_NO_ PRESENCE) ,
@@ -3913,6 +3917,9 @@ enum {
ALC282_
ALC283_
ALC290_
+ ALC290_
+ ALC290_
+ ALC290_
ALC269_
ALC255_
ALC255_
@@ -4235,9 +4242,31 @@ static const struct hda_fixup alc269_fixups[] = {
.chained = true,
.chain_id = ALC269_
},
+ [ALC290_
+ .type = HDA_FIXUP_PINS,
+ .v.pins = (const struct hda_pintbl[]) {
+ { 0x17, 0x90170112 }, /* subwoofer */
+ { }
+ },
+ .chained = true,
+ .chain_id = ALC290_
+ },
+ [ALC290_
+ .type = HDA_FIXUP_PINS,
+ .v.pins = (const struct hda_pintbl[]) {
+ { 0x17, 0x90170112 }, /* subwoofer */
+ { }
+ },
+ .chained = true,
+ .chain_id = ALC290_
+ },
[ALC290_
.type = HDA_FIXUP_FUNC,
.v.func = alc290_
+ },
+ [ALC290_
+ .type = HDA_FIXUP_FUNC,
+ .v.func = alc290_
.chained = true,
.chain_id = ALC269_
},
@@ -4282,6 +4311,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_
SND_PCI_
SND_PCI_
+ SND_PCI_
SND_PCI_
SND_PCI_
SND_PCI_
@@ -4303,10 +4333,11 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_
SND_PCI_
SND_PCI_
- SND_PCI_
+ SND_PCI_
+ SND_PCI_
SND_PCI_
SND_PCI_
- SND_PCI_
+ SND_PCI_
SND_PCI_
SND_PCI_
SND_PCI_
--
1.7.9.5