ALSA: hda - Move the call of snd_hda_parse_pin_defcfg() from snd_hda_gen_parse_auto_c...
authorTakashi Iwai <tiwai@suse.de>
Wed, 19 Dec 2012 13:41:21 +0000 (14:41 +0100)
committerTakashi Iwai <tiwai@suse.de>
Sat, 12 Jan 2013 07:30:58 +0000 (08:30 +0100)
In some cases, we want to manipulate the auto_pin_cfg table before
passing to snd_hda_gen_parse_auto_config() (e.g. Realtek SSID check
code fiddles with the headphone pin).   Also passing ignore_pins just
for snd_hda_parse_pin_defcfg() isn't good.

In this patch, snd_hda_gen_parse_auto_config() is changed to receive
the auto_pin_cfg table to be parsed.  The passed auto_pin_cfg table
must have been initialized (typically by calling
snd_hda_gen_parse_auto_config()) beforehand by the caller.

Also together with this change, spec->parse_flags is also removed.
Since this was referred only at the place calling
snd_hda_parse_pin_defcfg(), no longer needed to be kept in spec.

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

index 49e968c..e512cab 100644 (file)
@@ -2785,21 +2785,23 @@ static int check_auto_mic_availability(struct hda_codec *codec)
 }
 
 
-/* parse the BIOS configuration and set up the hda_gen_spec */
-/* return 1 if successful, 0 if the proper config is not found,
+/*
+ * Parse the given BIOS configuration and set up the hda_gen_spec
+ *
+ * return 1 if successful, 0 if the proper config is not found,
  * or a negative error code
  */
 int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
-                                 const hda_nid_t *ignore_nids)
+                                 struct auto_pin_cfg *cfg)
 {
        struct hda_gen_spec *spec = codec->spec;
-       struct auto_pin_cfg *cfg = &spec->autocfg;
        int err;
 
-       err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
-                                      spec->parse_flags);
-       if (err < 0)
-               return err;
+       if (cfg != &spec->autocfg) {
+               spec->autocfg = *cfg;
+               cfg = &spec->autocfg;
+       }
+
        if (!cfg->line_outs) {
                if (cfg->dig_outs || cfg->dig_in_pin) {
                        spec->multiout.max_channels = 2;
@@ -3586,7 +3588,11 @@ int snd_hda_parse_generic_codec(struct hda_codec *codec)
        snd_hda_gen_spec_init(spec);
        codec->spec = spec;
 
-       err = snd_hda_gen_parse_auto_config(codec, NULL);
+       err = snd_hda_parse_pin_defcfg(codec, &spec->autocfg, NULL, 0);
+       if (err < 0)
+               return err;
+
+       err = snd_hda_gen_parse_auto_config(codec, &spec->autocfg);
        if (err < 0)
                goto error;
 
index d71e86d..1a3b404 100644 (file)
@@ -152,8 +152,6 @@ struct hda_gen_spec {
        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 parse_flags; /* passed to snd_hda_parse_pin_defcfg() */
-
        /* for virtual master */
        hda_nid_t vmaster_nid;
        struct hda_vmaster_mute_hook vmaster_mute;
@@ -197,7 +195,7 @@ snd_hda_gen_add_kctl(struct hda_gen_spec *spec, const char *name,
                     const struct snd_kcontrol_new *temp);
 
 int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
-                                 const hda_nid_t *ignore_nids);
+                                 struct auto_pin_cfg *cfg);
 int snd_hda_gen_build_controls(struct hda_codec *codec);
 int snd_hda_gen_build_pcms(struct hda_codec *codec);