ALSA: hda - Use direct path reference in assign_out_path_ctls()
authorTakashi Iwai <tiwai@suse.de>
Mon, 7 Jan 2013 14:11:44 +0000 (15:11 +0100)
committerTakashi Iwai <tiwai@suse.de>
Sat, 12 Jan 2013 07:44:03 +0000 (08:44 +0100)
Instead of looking through paths with the dac -> pin connection at
each time, just pass the already parsed path index to
assign_out_path_ctls().  This simplifies the code a bit.

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

index 1b8fd4d..3f9439c 100644 (file)
@@ -757,23 +757,26 @@ enum {
        BAD_SHARED_VOL = 0x10,
 };
 
-/* look for widgets in the path between the given NIDs appropriate for
+/* look for widgets in the given path which are appropriate for
  * volume and mute controls, and assign the values to ctls[].
  *
  * When no appropriate widget is found in the path, the badness value
  * is incremented depending on the situation.  The function returns the
  * total badness for both volume and mute controls.
  */
-static int assign_out_path_ctls(struct hda_codec *codec, hda_nid_t pin,
-                               hda_nid_t dac)
+static int assign_out_path_ctls(struct hda_codec *codec, struct nid_path *path)
 {
-       struct nid_path *path = snd_hda_get_nid_path(codec, dac, pin);
        hda_nid_t nid;
        unsigned int val;
        int badness = 0;
 
        if (!path)
                return BAD_SHARED_VOL * 2;
+
+       if (path->ctls[NID_PATH_VOL_CTL] ||
+           path->ctls[NID_PATH_MUTE_CTL])
+               return 0; /* already evaluated */
+
        nid = look_for_out_vol_nid(codec, path);
        if (nid) {
                val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
@@ -866,8 +869,9 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs,
                struct nid_path *path;
                hda_nid_t pin = pins[i];
 
-               if (dacs[i]) {
-                       badness += assign_out_path_ctls(codec, pin, dacs[i]);
+               path = snd_hda_get_path_from_idx(codec, path_idx[i]);
+               if (path) {
+                       badness += assign_out_path_ctls(codec, path);
                        continue;
                }
 
@@ -916,9 +920,8 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs,
                        print_nid_path("output", path);
                        path->active = true;
                        path_idx[i] = snd_hda_get_path_idx(codec, path);
+                       badness += assign_out_path_ctls(codec, path);
                }
-               if (dac)
-                       badness += assign_out_path_ctls(codec, pin, dac);
        }
 
        return badness;
@@ -1001,6 +1004,7 @@ static int fill_multi_ios(struct hda_codec *codec,
        unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin);
        unsigned int location = get_defcfg_location(defcfg);
        int badness = 0;
+       struct nid_path *path;
 
        old_pins = spec->multi_ios;
        if (old_pins >= 2)
@@ -1012,7 +1016,6 @@ static int fill_multi_ios(struct hda_codec *codec,
 
        for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
                for (i = 0; i < cfg->num_inputs; i++) {
-                       struct nid_path *path;
                        hda_nid_t nid = cfg->inputs[i].pin;
                        hda_nid_t dac = 0;
 
@@ -1067,9 +1070,10 @@ static int fill_multi_ios(struct hda_codec *codec,
        }
 
        /* assign volume and mute controls */
-       for (i = old_pins; i < spec->multi_ios; i++)
-               badness += assign_out_path_ctls(codec, spec->multi_io[i].pin,
-                                               spec->multi_io[i].dac);
+       for (i = old_pins; i < spec->multi_ios; i++) {
+               path = snd_hda_get_path_from_idx(codec, spec->out_paths[cfg->line_outs + i]);
+               badness += assign_out_path_ctls(codec, path);
+       }
 
        return badness;
 }