Commit c0621669 authored by Athaariq Ardhiansyah's avatar Athaariq Ardhiansyah Committed by Takashi Iwai

ALSA: hda/realtek: fix ALC285 issues on HP Envy x360 laptops

Realtek codec on HP Envy laptop series are heavily modified by vendor.
Therefore, need intervention to make it work properly. The patch fixes:

- B&O soundbar speakers (between lid and keyboard) activation
- Enable LED on mute button
- Add missing process coefficient which affects the output amplifier
- Volume control synchronization between B&O soundbar and side speakers
- Unmute headset output on several HP Envy models
- Auto-enable headset mic when plugged

This patch was tested on HP Envy x360 13-AR0107AU with Realtek ALC285

The only unsolved problem is output amplifier of all built-in speakers
is too weak, which causes volume of built-in speakers cannot be loud
as vendor's proprietary driver due to missing _DSD parameter in the
firmware. The solution is currently on research. Expected to has another
patch in the future.

Potential fix to related issues, need test before close those issues:

- https://bugzilla.kernel.org/show_bug.cgi?id=189331
- https://bugzilla.kernel.org/show_bug.cgi?id=216632
- https://bugzilla.kernel.org/show_bug.cgi?id=216311
- https://bugzilla.kernel.org/show_bug.cgi?id=213507Signed-off-by: default avatarAthaariq Ardhiansyah <foss@athaariq.my.id>
Message-ID: <20240310140249.3695-1-foss@athaariq.my.id>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 14b9e4ab
...@@ -6695,6 +6695,60 @@ static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec, ...@@ -6695,6 +6695,60 @@ static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
} }
} }
static void alc285_fixup_hp_envy_x360(struct hda_codec *codec,
const struct hda_fixup *fix,
int action)
{
static const struct coef_fw coefs[] = {
WRITE_COEF(0x08, 0x6a0c), WRITE_COEF(0x0d, 0xa023),
WRITE_COEF(0x10, 0x0320), WRITE_COEF(0x1a, 0x8c03),
WRITE_COEF(0x25, 0x1800), WRITE_COEF(0x26, 0x003a),
WRITE_COEF(0x28, 0x1dfe), WRITE_COEF(0x29, 0xb014),
WRITE_COEF(0x2b, 0x1dfe), WRITE_COEF(0x37, 0xfe15),
WRITE_COEF(0x38, 0x7909), WRITE_COEF(0x45, 0xd489),
WRITE_COEF(0x46, 0x00f4), WRITE_COEF(0x4a, 0x21e0),
WRITE_COEF(0x66, 0x03f0), WRITE_COEF(0x67, 0x1000),
WRITE_COEF(0x6e, 0x1005), { }
};
static const struct hda_pintbl pincfgs[] = {
{ 0x12, 0xb7a60130 }, /* Internal microphone*/
{ 0x14, 0x90170150 }, /* B&O soundbar speakers */
{ 0x17, 0x90170153 }, /* Side speakers */
{ 0x19, 0x03a11040 }, /* Headset microphone */
{ }
};
switch (action) {
case HDA_FIXUP_ACT_PRE_PROBE:
snd_hda_apply_pincfgs(codec, pincfgs);
/* Fixes volume control problem for side speakers */
alc295_fixup_disable_dac3(codec, fix, action);
/* Fixes no sound from headset speaker */
snd_hda_codec_amp_stereo(codec, 0x21, HDA_OUTPUT, 0, -1, 0);
/* Auto-enable headset mic when plugged */
snd_hda_jack_set_gating_jack(codec, 0x19, 0x21);
/* Headset mic volume enhancement */
snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREF50);
break;
case HDA_FIXUP_ACT_INIT:
alc_process_coef_fw(codec, coefs);
break;
case HDA_FIXUP_ACT_BUILD:
rename_ctl(codec, "Bass Speaker Playback Volume",
"B&O-Tuned Playback Volume");
rename_ctl(codec, "Front Playback Switch",
"B&O Soundbar Playback Switch");
rename_ctl(codec, "Bass Speaker Playback Switch",
"Side Speaker Playback Switch");
break;
}
}
/* for hda_fixup_thinkpad_acpi() */ /* for hda_fixup_thinkpad_acpi() */
#include "thinkpad_helper.c" #include "thinkpad_helper.c"
...@@ -7136,6 +7190,7 @@ enum { ...@@ -7136,6 +7190,7 @@ enum {
ALC280_FIXUP_HP_9480M, ALC280_FIXUP_HP_9480M,
ALC245_FIXUP_HP_X360_AMP, ALC245_FIXUP_HP_X360_AMP,
ALC285_FIXUP_HP_SPECTRE_X360_EB1, ALC285_FIXUP_HP_SPECTRE_X360_EB1,
ALC285_FIXUP_HP_ENVY_X360,
ALC288_FIXUP_DELL_HEADSET_MODE, ALC288_FIXUP_DELL_HEADSET_MODE,
ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
ALC288_FIXUP_DELL_XPS_13, ALC288_FIXUP_DELL_XPS_13,
...@@ -9113,6 +9168,12 @@ static const struct hda_fixup alc269_fixups[] = { ...@@ -9113,6 +9168,12 @@ static const struct hda_fixup alc269_fixups[] = {
.type = HDA_FIXUP_FUNC, .type = HDA_FIXUP_FUNC,
.v.func = alc285_fixup_hp_spectre_x360_eb1 .v.func = alc285_fixup_hp_spectre_x360_eb1
}, },
[ALC285_FIXUP_HP_ENVY_X360] = {
.type = HDA_FIXUP_FUNC,
.v.func = alc285_fixup_hp_envy_x360,
.chained = true,
.chain_id = ALC285_FIXUP_HP_GPIO_AMP_INIT,
},
[ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = { [ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = {
.type = HDA_FIXUP_FUNC, .type = HDA_FIXUP_FUNC,
.v.func = alc285_fixup_ideapad_s740_coef, .v.func = alc285_fixup_ideapad_s740_coef,
...@@ -9707,6 +9768,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { ...@@ -9707,6 +9768,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3), SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360), SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
SND_PCI_QUIRK(0x103c, 0x8537, "HP ProBook 440 G6", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), SND_PCI_QUIRK(0x103c, 0x8537, "HP ProBook 440 G6", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
SND_PCI_QUIRK(0x103c, 0x85de, "HP Envy x360 13-ar0xxx", ALC285_FIXUP_HP_ENVY_X360),
SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT), SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),
SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT), SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED), SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
...@@ -10446,6 +10508,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = { ...@@ -10446,6 +10508,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
{.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"}, {.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
{.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"}, {.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 = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
{.id = ALC285_FIXUP_HP_ENVY_X360, .name = "alc285-hp-envy-x360"},
{.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"}, {.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 = 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 = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment