ALSA: hda - Preserve input pin-ctl bits in HP-automute for VIA codec
authorTakashi Iwai <tiwai@suse.de>
Mon, 11 Jul 2011 09:36:44 +0000 (11:36 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 11 Jul 2011 09:36:44 +0000 (11:36 +0200)
For smart51 pins, we need to preserve the input pin-control bits at
auto-mute controls instead of overwriting zero or pin-out-only.
Otherwise the VREF won't be set properly when smart51 is disabled
again.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/patch_via.c

index 27de53fb331e6d7b5ef286eb3b7949da2317d7a7..77df2bedfb81f6f2f7c2d84d67b41ffc407d2165 100644 (file)
@@ -1509,10 +1509,18 @@ static void toggle_output_mutes(struct hda_codec *codec, int num_pins,
                                hda_nid_t *pins, bool mute)
 {
        int i;
-       for (i = 0; i < num_pins; i++)
+       for (i = 0; i < num_pins; i++) {
+               unsigned int parm = snd_hda_codec_read(codec, pins[i], 0,
+                                         AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
+               if (parm & AC_PINCTL_IN_EN)
+                       continue;
+               if (mute)
+                       parm &= ~AC_PINCTL_OUT_EN;
+               else
+                       parm |= AC_PINCTL_OUT_EN;
                snd_hda_codec_write(codec, pins[i], 0,
-                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
-                                   mute ? 0 : PIN_OUT);
+                                   AC_VERB_SET_PIN_WIDGET_CONTROL, parm);
+       }
 }
 
 /* mute internal speaker if line-out is plugged */