| From dd6dd6e3c791db7fdbc5433ec7e450717aa3a0ce Mon Sep 17 00:00:00 2001 |
| From: Werner Sembach <wse@tuxedocomputers.com> |
| Date: Wed, 6 Oct 2021 15:04:15 +0200 |
| Subject: ALSA: hda/realtek: Add quirk for TongFang PHxTxX1 |
| |
| From: Werner Sembach <wse@tuxedocomputers.com> |
| |
| commit dd6dd6e3c791db7fdbc5433ec7e450717aa3a0ce upstream. |
| |
| This applies a SND_PCI_QUIRK(...) to the TongFang PHxTxX1 barebone. This |
| fixes the issue of the internal Microphone not working after booting |
| another OS. |
| |
| When booting a certain another OS this barebone keeps some coeff settings |
| even after a cold shutdown. These coeffs prevent the microphone detection |
| from working in Linux, making the Laptop think that there is always an |
| external microphone plugged-in and therefore preventing the use of the |
| internal one. |
| |
| The relevant indexes and values where gathered by naively diff-ing and |
| reading a working and a non-working coeff dump. |
| |
| Signed-off-by: Werner Sembach <wse@tuxedocomputers.com> |
| Cc: <stable@vger.kernel.org> |
| Link: https://lore.kernel.org/r/20211006130415.538243-1-wse@tuxedocomputers.com |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| sound/pci/hda/patch_realtek.c | 26 +++++++++++++++++++++++++- |
| 1 file changed, 25 insertions(+), 1 deletion(-) |
| |
| --- a/sound/pci/hda/patch_realtek.c |
| +++ b/sound/pci/hda/patch_realtek.c |
| @@ -6399,6 +6399,24 @@ static void alc287_fixup_legion_15imhg05 |
| /* for alc285_fixup_ideapad_s740_coef() */ |
| #include "ideapad_s740_helper.c" |
| |
| +static void alc256_fixup_tongfang_reset_persistent_settings(struct hda_codec *codec, |
| + const struct hda_fixup *fix, |
| + int action) |
| +{ |
| + /* |
| + * A certain other OS sets these coeffs to different values. On at least one TongFang |
| + * barebone these settings might survive even a cold reboot. So to restore a clean slate the |
| + * values are explicitly reset to default here. Without this, the external microphone is |
| + * always in a plugged-in state, while the internal microphone is always in an unplugged |
| + * state, breaking the ability to use the internal microphone. |
| + */ |
| + alc_write_coef_idx(codec, 0x24, 0x0000); |
| + alc_write_coef_idx(codec, 0x26, 0x0000); |
| + alc_write_coef_idx(codec, 0x29, 0x3000); |
| + alc_write_coef_idx(codec, 0x37, 0xfe05); |
| + alc_write_coef_idx(codec, 0x45, 0x5089); |
| +} |
| + |
| enum { |
| ALC269_FIXUP_GPIO2, |
| ALC269_FIXUP_SONY_VAIO, |
| @@ -6612,7 +6630,8 @@ enum { |
| ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS, |
| ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE, |
| ALC287_FIXUP_YOGA7_14ITL_SPEAKERS, |
| - ALC287_FIXUP_13S_GEN2_SPEAKERS |
| + ALC287_FIXUP_13S_GEN2_SPEAKERS, |
| + ALC256_FIXUP_TONGFANG_RESET_PERSISTENT_SETTINGS, |
| }; |
| |
| static const struct hda_fixup alc269_fixups[] = { |
| @@ -8304,6 +8323,10 @@ static const struct hda_fixup alc269_fix |
| .chained = true, |
| .chain_id = ALC269_FIXUP_HEADSET_MODE, |
| }, |
| + [ALC256_FIXUP_TONGFANG_RESET_PERSISTENT_SETTINGS] = { |
| + .type = HDA_FIXUP_FUNC, |
| + .v.func = alc256_fixup_tongfang_reset_persistent_settings, |
| + }, |
| }; |
| |
| static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
| @@ -8733,6 +8756,7 @@ static const struct snd_pci_quirk alc269 |
| SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */ |
| SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802), |
| SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X), |
| + SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_TONGFANG_RESET_PERSISTENT_SETTINGS), |
| SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC), |
| SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE), |
| SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC), |