aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2012-07-25 07:54:55 -0400
committerTakashi Iwai <tiwai@suse.de>2012-07-25 07:55:49 -0400
commit6162552b0de6ba80937c3dd53e084967851cd199 (patch)
tree385dd2142fc3b206e839a2132288e251a43051e1 /sound/pci
parentc1b623d9e4117d18d244e9b7fb30d2c27aeaf074 (diff)
ALSA: hda - Fix invalid D3 of headphone DAC on VT202x codecs
We've got a bug report about the silent output from the headphone on a mobo with VT2021, and spotted out that this was because of the wrong D3 state on the DAC for the headphone output. The bug is triggered by the incomplete check for this DAC in set_widgets_power_state_vt1718S(). It checks only the connectivity of the primary output (0x27) but doesn't consider the path from the headphone pin (0x28). Now this patch fixes the problem by checking both pins for DAC 0x0b. Cc: <stable@vger.kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci')
-rw-r--r--sound/pci/hda/patch_via.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c
index 90645560ed39..80d90cb42853 100644
--- a/sound/pci/hda/patch_via.c
+++ b/sound/pci/hda/patch_via.c
@@ -3226,7 +3226,7 @@ static void set_widgets_power_state_vt1718S(struct hda_codec *codec)
3226{ 3226{
3227 struct via_spec *spec = codec->spec; 3227 struct via_spec *spec = codec->spec;
3228 int imux_is_smixer; 3228 int imux_is_smixer;
3229 unsigned int parm; 3229 unsigned int parm, parm2;
3230 /* MUX6 (1eh) = stereo mixer */ 3230 /* MUX6 (1eh) = stereo mixer */
3231 imux_is_smixer = 3231 imux_is_smixer =
3232 snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5; 3232 snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5;
@@ -3249,7 +3249,7 @@ static void set_widgets_power_state_vt1718S(struct hda_codec *codec)
3249 parm = AC_PWRST_D3; 3249 parm = AC_PWRST_D3;
3250 set_pin_power_state(codec, 0x27, &parm); 3250 set_pin_power_state(codec, 0x27, &parm);
3251 update_power_state(codec, 0x1a, parm); 3251 update_power_state(codec, 0x1a, parm);
3252 update_power_state(codec, 0xb, parm); 3252 parm2 = parm; /* for pin 0x0b */
3253 3253
3254 /* PW2 (26h), AOW2 (ah) */ 3254 /* PW2 (26h), AOW2 (ah) */
3255 parm = AC_PWRST_D3; 3255 parm = AC_PWRST_D3;
@@ -3264,6 +3264,9 @@ static void set_widgets_power_state_vt1718S(struct hda_codec *codec)
3264 if (!spec->hp_independent_mode) /* check for redirected HP */ 3264 if (!spec->hp_independent_mode) /* check for redirected HP */
3265 set_pin_power_state(codec, 0x28, &parm); 3265 set_pin_power_state(codec, 0x28, &parm);
3266 update_power_state(codec, 0x8, parm); 3266 update_power_state(codec, 0x8, parm);
3267 if (!spec->hp_independent_mode && parm2 != AC_PWRST_D3)
3268 parm = parm2;
3269 update_power_state(codec, 0xb, parm);
3267 /* MW9 (21h), Mw2 (1ah), AOW0 (8h) */ 3270 /* MW9 (21h), Mw2 (1ah), AOW0 (8h) */
3268 update_power_state(codec, 0x21, imux_is_smixer ? AC_PWRST_D0 : parm); 3271 update_power_state(codec, 0x21, imux_is_smixer ? AC_PWRST_D0 : parm);
3269 3272