|
@@ -137,6 +137,7 @@ struct conexant_spec {
|
|
unsigned int hp_laptop:1;
|
|
unsigned int hp_laptop:1;
|
|
unsigned int asus:1;
|
|
unsigned int asus:1;
|
|
unsigned int pin_eapd_ctrls:1;
|
|
unsigned int pin_eapd_ctrls:1;
|
|
|
|
+ unsigned int single_adc_amp:1;
|
|
|
|
|
|
unsigned int adc_switching:1;
|
|
unsigned int adc_switching:1;
|
|
|
|
|
|
@@ -4213,6 +4214,8 @@ static int cx_auto_add_capture_volume(struct hda_codec *codec, hda_nid_t nid,
|
|
int idx = get_input_connection(codec, adc_nid, nid);
|
|
int idx = get_input_connection(codec, adc_nid, nid);
|
|
if (idx < 0)
|
|
if (idx < 0)
|
|
continue;
|
|
continue;
|
|
|
|
+ if (spec->single_adc_amp)
|
|
|
|
+ idx = 0;
|
|
return cx_auto_add_volume_idx(codec, label, pfx,
|
|
return cx_auto_add_volume_idx(codec, label, pfx,
|
|
cidx, adc_nid, HDA_INPUT, idx);
|
|
cidx, adc_nid, HDA_INPUT, idx);
|
|
}
|
|
}
|
|
@@ -4253,14 +4256,21 @@ static int cx_auto_build_input_controls(struct hda_codec *codec)
|
|
struct hda_input_mux *imux = &spec->private_imux;
|
|
struct hda_input_mux *imux = &spec->private_imux;
|
|
const char *prev_label;
|
|
const char *prev_label;
|
|
int input_conn[HDA_MAX_NUM_INPUTS];
|
|
int input_conn[HDA_MAX_NUM_INPUTS];
|
|
- int i, err, cidx;
|
|
|
|
|
|
+ int i, j, err, cidx;
|
|
int multi_connection;
|
|
int multi_connection;
|
|
|
|
|
|
|
|
+ if (!imux->num_items)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
multi_connection = 0;
|
|
multi_connection = 0;
|
|
for (i = 0; i < imux->num_items; i++) {
|
|
for (i = 0; i < imux->num_items; i++) {
|
|
cidx = get_input_connection(codec, spec->imux_info[i].adc,
|
|
cidx = get_input_connection(codec, spec->imux_info[i].adc,
|
|
spec->imux_info[i].pin);
|
|
spec->imux_info[i].pin);
|
|
- input_conn[i] = (spec->imux_info[i].adc << 8) | cidx;
|
|
|
|
|
|
+ if (cidx < 0)
|
|
|
|
+ continue;
|
|
|
|
+ input_conn[i] = spec->imux_info[i].adc;
|
|
|
|
+ if (!spec->single_adc_amp)
|
|
|
|
+ input_conn[i] |= cidx << 8;
|
|
if (i > 0 && input_conn[i] != input_conn[0])
|
|
if (i > 0 && input_conn[i] != input_conn[0])
|
|
multi_connection = 1;
|
|
multi_connection = 1;
|
|
}
|
|
}
|
|
@@ -4289,6 +4299,15 @@ static int cx_auto_build_input_controls(struct hda_codec *codec)
|
|
err = cx_auto_add_capture_volume(codec, nid,
|
|
err = cx_auto_add_capture_volume(codec, nid,
|
|
"Capture", "", cidx);
|
|
"Capture", "", cidx);
|
|
} else {
|
|
} else {
|
|
|
|
+ bool dup_found = false;
|
|
|
|
+ for (j = 0; j < i; j++) {
|
|
|
|
+ if (input_conn[j] == input_conn[i]) {
|
|
|
|
+ dup_found = true;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (dup_found)
|
|
|
|
+ continue;
|
|
err = cx_auto_add_capture_volume(codec, nid,
|
|
err = cx_auto_add_capture_volume(codec, nid,
|
|
label, " Capture", cidx);
|
|
label, " Capture", cidx);
|
|
}
|
|
}
|
|
@@ -4413,6 +4432,12 @@ static int patch_conexant_auto(struct hda_codec *codec)
|
|
codec->spec = spec;
|
|
codec->spec = spec;
|
|
codec->pin_amp_workaround = 1;
|
|
codec->pin_amp_workaround = 1;
|
|
|
|
|
|
|
|
+ switch (codec->vendor_id) {
|
|
|
|
+ case 0x14f15045:
|
|
|
|
+ spec->single_adc_amp = 1;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
apply_pin_fixup(codec, cxt_fixups, cxt_pincfg_tbl);
|
|
apply_pin_fixup(codec, cxt_fixups, cxt_pincfg_tbl);
|
|
|
|
|
|
err = cx_auto_search_adcs(codec);
|
|
err = cx_auto_search_adcs(codec);
|