[ALSA] hda: fix Mic in as output
authorMatthew Ranostay <mranostay@embeddedalley.com>
Wed, 30 Jan 2008 13:58:38 +0000 (14:58 +0100)
committerMercurial server <hg@alsa0.alsa-project.org>
Thu, 31 Jan 2008 16:33:37 +0000 (17:33 +0100)
Some laptop has an internal analog microphone that is 'fixed'.
This patch prevents creating a 'Mic In as Output' switch for
ports that can't be outputs.

Signed-off-by: Matthew Ranostay <mranostay@embeddedalley.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
sound/pci/hda/patch_sigmatel.c

index 7c8cd59..caf48ed 100644 (file)
@@ -2283,15 +2283,23 @@ static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
        }
 
        if (spec->mic_switch) {
+               unsigned int def_conf;
                nid = cfg->input_pins[AUTO_PIN_MIC];
-               pincap = snd_hda_param_read(codec, nid,
-                                               AC_PAR_PIN_CAP);
-               if (pincap & AC_PINCAP_OUT) {
-                       err = stac92xx_add_control(spec,
-                               STAC_CTL_WIDGET_IO_SWITCH,
-                               "Mic as Output Switch", (nid << 8) | 1);
-                       if (err < 0)
-                               return err;
+               def_conf = snd_hda_codec_read(codec, nid, 0,
+                                               AC_VERB_GET_CONFIG_DEFAULT, 0);
+
+               /* some laptops have an internal analog microphone
+                * which can't be used as a output */
+               if (get_defcfg_connect(def_conf) != AC_JACK_PORT_FIXED) {
+                       pincap = snd_hda_param_read(codec, nid,
+                                                       AC_PAR_PIN_CAP);
+                       if (pincap & AC_PINCAP_OUT) {
+                               err = stac92xx_add_control(spec,
+                                       STAC_CTL_WIDGET_IO_SWITCH,
+                                       "Mic as Output Switch", (nid << 8) | 1);
+                               if (err < 0)
+                                       return err;
+                       }
                }
        }