ALSA: hda - Set the pin targets after deciding output config
authorTakashi Iwai <tiwai@suse.de>
Mon, 21 Jan 2013 09:49:05 +0000 (10:49 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 21 Jan 2013 10:09:03 +0000 (11:09 +0100)
Since fill_and_eval_dacs() may be called repeatedly with different
configurations, setting pinctls at each time there isn't optimal.
We can set it better only once after deciding the output configuration
in parse_output_paths().

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

index 37d7ed7af2a5c7ab8c2d98e8858372e63b8cd13b..7b739b5898180d3905644383a72d635331a7850b 100644 (file)
@@ -1352,7 +1352,6 @@ static int fill_and_eval_dacs(struct hda_codec *codec,
        struct hda_gen_spec *spec = codec->spec;
        struct auto_pin_cfg *cfg = &spec->autocfg;
        int i, err, badness;
-       unsigned int val;
 
        /* set num_dacs once to full for look_for_dac() */
        spec->multiout.num_dacs = cfg->line_outs;
@@ -1489,20 +1488,6 @@ static int fill_and_eval_dacs(struct hda_codec *codec,
                                   spec->multiout.extra_out_nid,
                                   spec->speaker_paths);
 
-       /* set initial pinctl targets */
-       if (spec->prefer_hp_amp || cfg->line_out_type == AUTO_PIN_HP_OUT)
-               val = PIN_HP;
-       else
-               val = PIN_OUT;
-       set_pin_targets(codec, cfg->line_outs, cfg->line_out_pins, val);
-       if (cfg->line_out_type != AUTO_PIN_HP_OUT)
-               set_pin_targets(codec, cfg->hp_outs, cfg->hp_pins, PIN_HP);
-       if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
-               val = spec->prefer_hp_amp ? PIN_HP : PIN_OUT;
-               set_pin_targets(codec, cfg->speaker_outs,
-                               cfg->speaker_pins, val);
-       }
-
        return badness;
 }
 
@@ -1604,6 +1589,7 @@ static int parse_output_paths(struct hda_codec *codec)
        struct hda_gen_spec *spec = codec->spec;
        struct auto_pin_cfg *cfg = &spec->autocfg;
        struct auto_pin_cfg *best_cfg;
+       unsigned int val;
        int best_badness = INT_MAX;
        int badness;
        bool fill_hardwired = true, fill_mio_first = true;
@@ -1693,6 +1679,20 @@ static int parse_output_paths(struct hda_codec *codec)
                                                HDA_OUTPUT, spec->vmaster_tlv);
        }
 
+       /* set initial pinctl targets */
+       if (spec->prefer_hp_amp || cfg->line_out_type == AUTO_PIN_HP_OUT)
+               val = PIN_HP;
+       else
+               val = PIN_OUT;
+       set_pin_targets(codec, cfg->line_outs, cfg->line_out_pins, val);
+       if (cfg->line_out_type != AUTO_PIN_HP_OUT)
+               set_pin_targets(codec, cfg->hp_outs, cfg->hp_pins, PIN_HP);
+       if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
+               val = spec->prefer_hp_amp ? PIN_HP : PIN_OUT;
+               set_pin_targets(codec, cfg->speaker_outs,
+                               cfg->speaker_pins, val);
+       }
+
        kfree(best_cfg);
        return 0;
 }