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 | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index 990a79e..27b5e02 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -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; }