diff options
-rw-r--r-- | sound/pci/hda/hda_generic.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index 1b8fd4d6cae9..3f9439c39311 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c | |||
@@ -757,23 +757,26 @@ enum { | |||
757 | BAD_SHARED_VOL = 0x10, | 757 | BAD_SHARED_VOL = 0x10, |
758 | }; | 758 | }; |
759 | 759 | ||
760 | /* look for widgets in the path between the given NIDs appropriate for | 760 | /* look for widgets in the given path which are appropriate for |
761 | * volume and mute controls, and assign the values to ctls[]. | 761 | * volume and mute controls, and assign the values to ctls[]. |
762 | * | 762 | * |
763 | * When no appropriate widget is found in the path, the badness value | 763 | * When no appropriate widget is found in the path, the badness value |
764 | * is incremented depending on the situation. The function returns the | 764 | * is incremented depending on the situation. The function returns the |
765 | * total badness for both volume and mute controls. | 765 | * total badness for both volume and mute controls. |
766 | */ | 766 | */ |
767 | static int assign_out_path_ctls(struct hda_codec *codec, hda_nid_t pin, | 767 | static int assign_out_path_ctls(struct hda_codec *codec, struct nid_path *path) |
768 | hda_nid_t dac) | ||
769 | { | 768 | { |
770 | struct nid_path *path = snd_hda_get_nid_path(codec, dac, pin); | ||
771 | hda_nid_t nid; | 769 | hda_nid_t nid; |
772 | unsigned int val; | 770 | unsigned int val; |
773 | int badness = 0; | 771 | int badness = 0; |
774 | 772 | ||
775 | if (!path) | 773 | if (!path) |
776 | return BAD_SHARED_VOL * 2; | 774 | return BAD_SHARED_VOL * 2; |
775 | |||
776 | if (path->ctls[NID_PATH_VOL_CTL] || | ||
777 | path->ctls[NID_PATH_MUTE_CTL]) | ||
778 | return 0; /* already evaluated */ | ||
779 | |||
777 | nid = look_for_out_vol_nid(codec, path); | 780 | nid = look_for_out_vol_nid(codec, path); |
778 | if (nid) { | 781 | if (nid) { |
779 | val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); | 782 | 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, | |||
866 | struct nid_path *path; | 869 | struct nid_path *path; |
867 | hda_nid_t pin = pins[i]; | 870 | hda_nid_t pin = pins[i]; |
868 | 871 | ||
869 | if (dacs[i]) { | 872 | path = snd_hda_get_path_from_idx(codec, path_idx[i]); |
870 | badness += assign_out_path_ctls(codec, pin, dacs[i]); | 873 | if (path) { |
874 | badness += assign_out_path_ctls(codec, path); | ||
871 | continue; | 875 | continue; |
872 | } | 876 | } |
873 | 877 | ||
@@ -916,9 +920,8 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs, | |||
916 | print_nid_path("output", path); | 920 | print_nid_path("output", path); |
917 | path->active = true; | 921 | path->active = true; |
918 | path_idx[i] = snd_hda_get_path_idx(codec, path); | 922 | path_idx[i] = snd_hda_get_path_idx(codec, path); |
923 | badness += assign_out_path_ctls(codec, path); | ||
919 | } | 924 | } |
920 | if (dac) | ||
921 | badness += assign_out_path_ctls(codec, pin, dac); | ||
922 | } | 925 | } |
923 | 926 | ||
924 | return badness; | 927 | return badness; |
@@ -1001,6 +1004,7 @@ static int fill_multi_ios(struct hda_codec *codec, | |||
1001 | unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin); | 1004 | unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin); |
1002 | unsigned int location = get_defcfg_location(defcfg); | 1005 | unsigned int location = get_defcfg_location(defcfg); |
1003 | int badness = 0; | 1006 | int badness = 0; |
1007 | struct nid_path *path; | ||
1004 | 1008 | ||
1005 | old_pins = spec->multi_ios; | 1009 | old_pins = spec->multi_ios; |
1006 | if (old_pins >= 2) | 1010 | if (old_pins >= 2) |
@@ -1012,7 +1016,6 @@ static int fill_multi_ios(struct hda_codec *codec, | |||
1012 | 1016 | ||
1013 | for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) { | 1017 | for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) { |
1014 | for (i = 0; i < cfg->num_inputs; i++) { | 1018 | for (i = 0; i < cfg->num_inputs; i++) { |
1015 | struct nid_path *path; | ||
1016 | hda_nid_t nid = cfg->inputs[i].pin; | 1019 | hda_nid_t nid = cfg->inputs[i].pin; |
1017 | hda_nid_t dac = 0; | 1020 | hda_nid_t dac = 0; |
1018 | 1021 | ||
@@ -1067,9 +1070,10 @@ static int fill_multi_ios(struct hda_codec *codec, | |||
1067 | } | 1070 | } |
1068 | 1071 | ||
1069 | /* assign volume and mute controls */ | 1072 | /* assign volume and mute controls */ |
1070 | for (i = old_pins; i < spec->multi_ios; i++) | 1073 | for (i = old_pins; i < spec->multi_ios; i++) { |
1071 | badness += assign_out_path_ctls(codec, spec->multi_io[i].pin, | 1074 | path = snd_hda_get_path_from_idx(codec, spec->out_paths[cfg->line_outs + i]); |
1072 | spec->multi_io[i].dac); | 1075 | badness += assign_out_path_ctls(codec, path); |
1076 | } | ||
1073 | 1077 | ||
1074 | return badness; | 1078 | return badness; |
1075 | } | 1079 | } |