diff options
-rw-r--r-- | sound/pci/hda/hda_codec.c | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index b703e25b6241..de3325e79087 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -5066,6 +5066,16 @@ const char *hda_get_autocfg_input_label(struct hda_codec *codec, | |||
5066 | } | 5066 | } |
5067 | EXPORT_SYMBOL_HDA(hda_get_autocfg_input_label); | 5067 | EXPORT_SYMBOL_HDA(hda_get_autocfg_input_label); |
5068 | 5068 | ||
5069 | /* return the position of NID in the list, or -1 if not found */ | ||
5070 | static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums) | ||
5071 | { | ||
5072 | int i; | ||
5073 | for (i = 0; i < nums; i++) | ||
5074 | if (list[i] == nid) | ||
5075 | return i; | ||
5076 | return -1; | ||
5077 | } | ||
5078 | |||
5069 | /* get a unique suffix or an index number */ | 5079 | /* get a unique suffix or an index number */ |
5070 | static const char *check_output_sfx(hda_nid_t nid, const hda_nid_t *pins, | 5080 | static const char *check_output_sfx(hda_nid_t nid, const hda_nid_t *pins, |
5071 | int num_pins, int *indexp) | 5081 | int num_pins, int *indexp) |
@@ -5075,19 +5085,17 @@ static const char *check_output_sfx(hda_nid_t nid, const hda_nid_t *pins, | |||
5075 | }; | 5085 | }; |
5076 | int i; | 5086 | int i; |
5077 | 5087 | ||
5078 | for (i = 0; i < num_pins; i++) { | 5088 | i = find_idx_in_nid_list(nid, pins, num_pins); |
5079 | if (pins[i] == nid) { | 5089 | if (i < 0) |
5080 | if (num_pins == 1) | 5090 | return NULL; |
5081 | return ""; | 5091 | if (num_pins == 1) |
5082 | if (num_pins > ARRAY_SIZE(channel_sfx)) { | 5092 | return ""; |
5083 | if (indexp) | 5093 | if (num_pins > ARRAY_SIZE(channel_sfx)) { |
5084 | *indexp = i; | 5094 | if (indexp) |
5085 | return ""; | 5095 | *indexp = i; |
5086 | } | 5096 | return ""; |
5087 | return channel_sfx[i]; | ||
5088 | } | ||
5089 | } | 5097 | } |
5090 | return NULL; | 5098 | return channel_sfx[i]; |
5091 | } | 5099 | } |
5092 | 5100 | ||
5093 | static int fill_audio_out_name(struct hda_codec *codec, hda_nid_t nid, | 5101 | static int fill_audio_out_name(struct hda_codec *codec, hda_nid_t nid, |
@@ -5116,13 +5124,16 @@ static int fill_audio_out_name(struct hda_codec *codec, hda_nid_t nid, | |||
5116 | sfx = check_output_sfx(nid, cfg->line_out_pins, cfg->line_outs, | 5124 | sfx = check_output_sfx(nid, cfg->line_out_pins, cfg->line_outs, |
5117 | indexp); | 5125 | indexp); |
5118 | if (!sfx) | 5126 | if (!sfx) |
5119 | sfx = check_output_sfx(nid, cfg->hp_pins, cfg->hp_outs, | ||
5120 | indexp); | ||
5121 | if (!sfx) | ||
5122 | sfx = check_output_sfx(nid, cfg->speaker_pins, cfg->speaker_outs, | 5127 | sfx = check_output_sfx(nid, cfg->speaker_pins, cfg->speaker_outs, |
5123 | indexp); | 5128 | indexp); |
5124 | if (!sfx) | 5129 | if (!sfx) { |
5130 | /* don't add channel suffix for Headphone controls */ | ||
5131 | int idx = find_idx_in_nid_list(nid, cfg->hp_pins, | ||
5132 | cfg->hp_outs); | ||
5133 | if (idx >= 0) | ||
5134 | *indexp = idx; | ||
5125 | sfx = ""; | 5135 | sfx = ""; |
5136 | } | ||
5126 | } | 5137 | } |
5127 | snprintf(label, maxlen, "%s%s%s", pfx, name, sfx); | 5138 | snprintf(label, maxlen, "%s%s%s", pfx, name, sfx); |
5128 | return 1; | 5139 | return 1; |
@@ -5171,11 +5182,10 @@ int snd_hda_get_pin_label(struct hda_codec *codec, hda_nid_t nid, | |||
5171 | else | 5182 | else |
5172 | name = "SPDIF"; | 5183 | name = "SPDIF"; |
5173 | if (cfg && indexp) { | 5184 | if (cfg && indexp) { |
5174 | for (i = 0; i < cfg->dig_outs; i++) | 5185 | i = find_idx_in_nid_list(nid, cfg->dig_out_pins, |
5175 | if (cfg->dig_out_pins[i] == nid) { | 5186 | cfg->dig_outs); |
5176 | *indexp = i; | 5187 | if (i >= 0) |
5177 | break; | 5188 | *indexp = i; |
5178 | } | ||
5179 | } | 5189 | } |
5180 | break; | 5190 | break; |
5181 | default: | 5191 | default: |