aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/pci/hda/patch_conexant.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
index 1d69a3e0ce2c..0c8b5a1993ed 100644
--- a/sound/pci/hda/patch_conexant.c
+++ b/sound/pci/hda/patch_conexant.c
@@ -137,6 +137,7 @@ struct conexant_spec {
137 unsigned int hp_laptop:1; 137 unsigned int hp_laptop:1;
138 unsigned int asus:1; 138 unsigned int asus:1;
139 unsigned int pin_eapd_ctrls:1; 139 unsigned int pin_eapd_ctrls:1;
140 unsigned int single_adc_amp:1;
140 141
141 unsigned int adc_switching:1; 142 unsigned int adc_switching:1;
142 143
@@ -4213,6 +4214,8 @@ static int cx_auto_add_capture_volume(struct hda_codec *codec, hda_nid_t nid,
4213 int idx = get_input_connection(codec, adc_nid, nid); 4214 int idx = get_input_connection(codec, adc_nid, nid);
4214 if (idx < 0) 4215 if (idx < 0)
4215 continue; 4216 continue;
4217 if (spec->single_adc_amp)
4218 idx = 0;
4216 return cx_auto_add_volume_idx(codec, label, pfx, 4219 return cx_auto_add_volume_idx(codec, label, pfx,
4217 cidx, adc_nid, HDA_INPUT, idx); 4220 cidx, adc_nid, HDA_INPUT, idx);
4218 } 4221 }
@@ -4253,14 +4256,21 @@ static int cx_auto_build_input_controls(struct hda_codec *codec)
4253 struct hda_input_mux *imux = &spec->private_imux; 4256 struct hda_input_mux *imux = &spec->private_imux;
4254 const char *prev_label; 4257 const char *prev_label;
4255 int input_conn[HDA_MAX_NUM_INPUTS]; 4258 int input_conn[HDA_MAX_NUM_INPUTS];
4256 int i, err, cidx; 4259 int i, j, err, cidx;
4257 int multi_connection; 4260 int multi_connection;
4258 4261
4262 if (!imux->num_items)
4263 return 0;
4264
4259 multi_connection = 0; 4265 multi_connection = 0;
4260 for (i = 0; i < imux->num_items; i++) { 4266 for (i = 0; i < imux->num_items; i++) {
4261 cidx = get_input_connection(codec, spec->imux_info[i].adc, 4267 cidx = get_input_connection(codec, spec->imux_info[i].adc,
4262 spec->imux_info[i].pin); 4268 spec->imux_info[i].pin);
4263 input_conn[i] = (spec->imux_info[i].adc << 8) | cidx; 4269 if (cidx < 0)
4270 continue;
4271 input_conn[i] = spec->imux_info[i].adc;
4272 if (!spec->single_adc_amp)
4273 input_conn[i] |= cidx << 8;
4264 if (i > 0 && input_conn[i] != input_conn[0]) 4274 if (i > 0 && input_conn[i] != input_conn[0])
4265 multi_connection = 1; 4275 multi_connection = 1;
4266 } 4276 }
@@ -4289,6 +4299,15 @@ static int cx_auto_build_input_controls(struct hda_codec *codec)
4289 err = cx_auto_add_capture_volume(codec, nid, 4299 err = cx_auto_add_capture_volume(codec, nid,
4290 "Capture", "", cidx); 4300 "Capture", "", cidx);
4291 } else { 4301 } else {
4302 bool dup_found = false;
4303 for (j = 0; j < i; j++) {
4304 if (input_conn[j] == input_conn[i]) {
4305 dup_found = true;
4306 break;
4307 }
4308 }
4309 if (dup_found)
4310 continue;
4292 err = cx_auto_add_capture_volume(codec, nid, 4311 err = cx_auto_add_capture_volume(codec, nid,
4293 label, " Capture", cidx); 4312 label, " Capture", cidx);
4294 } 4313 }
@@ -4413,6 +4432,12 @@ static int patch_conexant_auto(struct hda_codec *codec)
4413 codec->spec = spec; 4432 codec->spec = spec;
4414 codec->pin_amp_workaround = 1; 4433 codec->pin_amp_workaround = 1;
4415 4434
4435 switch (codec->vendor_id) {
4436 case 0x14f15045:
4437 spec->single_adc_amp = 1;
4438 break;
4439 }
4440
4416 apply_pin_fixup(codec, cxt_fixups, cxt_pincfg_tbl); 4441 apply_pin_fixup(codec, cxt_fixups, cxt_pincfg_tbl);
4417 4442
4418 err = cx_auto_search_adcs(codec); 4443 err = cx_auto_search_adcs(codec);