| From 05909d5c679cf7c9a8a5bc663677c066a546894f Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Fri, 31 May 2013 19:55:54 +0200 |
| Subject: ALSA: hda - Add keep_eapd_on flag to generic parser |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit 05909d5c679cf7c9a8a5bc663677c066a546894f upstream. |
| |
| VT1802 codec seems to reset EAPD of other pins in the hardware level, |
| and this was another reason of the silent headphone output on some |
| machines. As a workaround, introduce a new flag indicating to keep |
| the EPAD on to the generic parser, and set it in patch_via.c. |
| |
| Reported-by: Alex Riesen <raa.lkml@gmail.com> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/pci/hda/hda_generic.c | 2 ++ |
| sound/pci/hda/hda_generic.h | 1 + |
| sound/pci/hda/patch_via.c | 1 + |
| 3 files changed, 4 insertions(+) |
| |
| --- a/sound/pci/hda/hda_generic.c |
| +++ b/sound/pci/hda/hda_generic.c |
| @@ -772,6 +772,8 @@ static void set_pin_eapd(struct hda_code |
| return; |
| if (codec->inv_eapd) |
| enable = !enable; |
| + if (spec->keep_eapd_on && !enable) |
| + return; |
| snd_hda_codec_update_cache(codec, pin, 0, |
| AC_VERB_SET_EAPD_BTLENABLE, |
| enable ? 0x02 : 0x00); |
| --- a/sound/pci/hda/hda_generic.h |
| +++ b/sound/pci/hda/hda_generic.h |
| @@ -205,6 +205,7 @@ struct hda_gen_spec { |
| unsigned int multi_cap_vol:1; /* allow multiple capture xxx volumes */ |
| unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */ |
| unsigned int own_eapd_ctl:1; /* set EAPD by own function */ |
| + unsigned int keep_eapd_on:1; /* don't turn off EAPD automatically */ |
| unsigned int vmaster_mute_enum:1; /* add vmaster mute mode enum */ |
| unsigned int indep_hp:1; /* independent HP supported */ |
| unsigned int prefer_hp_amp:1; /* enable HP amp for speaker if any */ |
| --- a/sound/pci/hda/patch_via.c |
| +++ b/sound/pci/hda/patch_via.c |
| @@ -136,6 +136,7 @@ static struct via_spec *via_new_spec(str |
| spec->codec_type = VT1708S; |
| spec->no_pin_power_ctl = 1; |
| spec->gen.indep_hp = 1; |
| + spec->gen.keep_eapd_on = 1; |
| spec->gen.pcm_playback_hook = via_playback_pcm_hook; |
| return spec; |
| } |