[PATCH] ALSA: hda/conexant: Fix missing headphone node after reboot from Windows
Takashi Iwai
tiwai at suse.de
Tue Jun 23 12:11:52 CEST 2020
On Tue, 23 Jun 2020 08:25:10 +0200,
Takashi Iwai wrote:
>
> When Lenovo Thinkpad E495 is rebooted from Windows, the headphone
> control is lost. This seems because BIOS doesn't initialize the
> headphone node (NID 0x16) properly after the reboot from Windows, as
> Windows likely turns off the power at its exit. The node is left
> as a vendor-specific unknown node and ignored by the HD-audio parser.
>
> This patch forcibly initializes the node at the probe time, by
> overriding the widget caps and the connection list, so that the
> headphone control is detected always at probe time.
>
> BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=207741
> Cc: <stable at vger.kernel.org>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
This turned out to be not effective, the audio stream itself doesn't
work as expected.
thanks,
Takashi
> ---
> sound/pci/hda/patch_conexant.c | 24 ++++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
> index 396b5503038a..37c8add48791 100644
> --- a/sound/pci/hda/patch_conexant.c
> +++ b/sound/pci/hda/patch_conexant.c
> @@ -215,6 +215,7 @@ enum {
> CXT_FIXUP_MUTE_LED_GPIO,
> CXT_FIXUP_HEADSET_MIC,
> CXT_FIXUP_HP_MIC_NO_PRESENCE,
> + CXT_FIXUP_THINKPAD_E495,
> };
>
> /* for hda_fixup_thinkpad_acpi() */
> @@ -673,6 +674,22 @@ static void cxt_fixup_mute_led_gpio(struct hda_codec *codec,
> spec->gpio_led);
> }
>
> +static void cxt_fixup_thinkpad_e495(struct hda_codec *codec,
> + const struct hda_fixup *fix,
> + int action)
> +{
> + if (action == HDA_FIXUP_ACT_PRE_PROBE) {
> + static const hda_nid_t conns[] = { 0x10, 0x11 };
> + /* BIOS invalidates the headphone pin NID 0x16 when rebooted
> + * after Windows by some reason;
> + * forcibly restoring the whole setup
> + */
> + snd_hda_override_wcaps(codec, 0x16, 0x400581);
> + snd_hda_codec_set_pincfg(codec, 0x16, 0x03211040);
> + snd_hda_override_conn_list(codec, 0x16, ARRAY_SIZE(conns),
> + conns);
> + }
> +}
>
> /* ThinkPad X200 & co with cxt5051 */
> static const struct hda_pintbl cxt_pincfg_lenovo_x200[] = {
> @@ -846,6 +863,12 @@ static const struct hda_fixup cxt_fixups[] = {
> .chained = true,
> .chain_id = CXT_FIXUP_HEADSET_MIC,
> },
> + [CXT_FIXUP_THINKPAD_E495] = {
> + .type = HDA_FIXUP_FUNC,
> + .v.func = cxt_fixup_thinkpad_e495,
> + .chained = true,
> + .chain_id = CXT_FIXUP_THINKPAD_ACPI,
> + },
> };
>
> static const struct snd_pci_quirk cxt5045_fixups[] = {
> @@ -932,6 +955,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = {
> SND_PCI_QUIRK(0x17aa, 0x3977, "Lenovo IdeaPad U310", CXT_FIXUP_STEREO_DMIC),
> SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo G50-70", CXT_FIXUP_STEREO_DMIC),
> SND_PCI_QUIRK(0x17aa, 0x397b, "Lenovo S205", CXT_FIXUP_STEREO_DMIC),
> + SND_PCI_QUIRK(0x17aa, 0x5124, "Lenovo Thinkpad E495", CXT_FIXUP_THINKPAD_E495),
> SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", CXT_FIXUP_THINKPAD_ACPI),
> SND_PCI_QUIRK(0x1c06, 0x2011, "Lemote A1004", CXT_PINCFG_LEMOTE_A1004),
> SND_PCI_QUIRK(0x1c06, 0x2012, "Lemote A1205", CXT_PINCFG_LEMOTE_A1205),
> --
> 2.16.4
>
More information about the Alsa-devel
mailing list