ALSA: hda - Avoid auto-mute or auto-mic of retasked jacks
authorTakashi Iwai <tiwai@suse.de>
Thu, 10 Jan 2013 08:45:13 +0000 (09:45 +0100)
committerTakashi Iwai <tiwai@suse.de>
Sat, 12 Jan 2013 07:44:30 +0000 (08:44 +0100)
When a jack is retasked as a different direction (e.g. a mic jack is
used as a CLFE output), such a jack shouldn't be counted as the target
for the automatic jack switching.  Skip the automute or the autoswitch
when the current pinctl direction is different from what we suppose.

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

index e786f103cb2b12bdea25a15b129a2bc24639cc54..2020faf9e412cd04e9cd898cb867f82c8c21fa00 100644 (file)
@@ -2773,6 +2773,9 @@ static bool detect_jacks(struct hda_codec *codec, int num_pins, hda_nid_t *pins)
                hda_nid_t nid = pins[i];
                if (!nid)
                        break;
+               /* don't detect pins retasked as inputs */
+               if (snd_hda_codec_get_pin_target(codec, nid) & AC_PINCTL_IN_EN)
+                       continue;
                present |= snd_hda_jack_detect(codec, nid);
        }
        return present;
@@ -2899,7 +2902,11 @@ void snd_hda_gen_mic_autoswitch(struct hda_codec *codec, struct hda_jack_tbl *ja
                return;
 
        for (i = spec->am_num_entries - 1; i > 0; i--) {
-               if (snd_hda_jack_detect(codec, spec->am_entry[i].pin)) {
+               hda_nid_t pin = spec->am_entry[i].pin;
+               /* don't detect pins retasked as outputs */
+               if (snd_hda_codec_get_pin_target(codec, pin) & AC_PINCTL_OUT_EN)
+                       continue;
+               if (snd_hda_jack_detect(codec, pin)) {
                        mux_select(codec, 0, spec->am_entry[i].idx);
                        return;
                }