aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/pci/hda/patch_conexant.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
index fc02751f22d..ebce2fe3aec 100644
--- a/sound/pci/hda/patch_conexant.c
+++ b/sound/pci/hda/patch_conexant.c
@@ -110,6 +110,7 @@ struct conexant_spec {
110 struct hda_input_mux private_imux; 110 struct hda_input_mux private_imux;
111 hda_nid_t imux_adcs[HDA_MAX_NUM_INPUTS]; 111 hda_nid_t imux_adcs[HDA_MAX_NUM_INPUTS];
112 hda_nid_t imux_pins[HDA_MAX_NUM_INPUTS]; 112 hda_nid_t imux_pins[HDA_MAX_NUM_INPUTS];
113 hda_nid_t private_adc_nids[HDA_MAX_NUM_INPUTS];
113 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS]; 114 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
114 struct pin_dac_pair dac_info[8]; 115 struct pin_dac_pair dac_info[8];
115 int dac_info_filled; 116 int dac_info_filled;
@@ -4034,6 +4035,28 @@ static int cx_auto_build_controls(struct hda_codec *codec)
4034 return conexant_build_controls(codec); 4035 return conexant_build_controls(codec);
4035} 4036}
4036 4037
4038static int cx_auto_search_adcs(struct hda_codec *codec)
4039{
4040 struct conexant_spec *spec = codec->spec;
4041 hda_nid_t nid, end_nid;
4042
4043 end_nid = codec->start_nid + codec->num_nodes;
4044 for (nid = codec->start_nid; nid < end_nid; nid++) {
4045 unsigned int caps = get_wcaps(codec, nid);
4046 if (get_wcaps_type(caps) != AC_WID_AUD_IN)
4047 continue;
4048 if (caps & AC_WCAP_DIGITAL)
4049 continue;
4050 if (snd_BUG_ON(spec->num_adc_nids >=
4051 ARRAY_SIZE(spec->private_adc_nids)))
4052 break;
4053 spec->private_adc_nids[spec->num_adc_nids++] = nid;
4054 }
4055 spec->adc_nids = spec->private_adc_nids;
4056 return 0;
4057}
4058
4059
4037static const struct hda_codec_ops cx_auto_patch_ops = { 4060static const struct hda_codec_ops cx_auto_patch_ops = {
4038 .build_controls = cx_auto_build_controls, 4061 .build_controls = cx_auto_build_controls,
4039 .build_pcms = conexant_build_pcms, 4062 .build_pcms = conexant_build_pcms,
@@ -4058,29 +4081,18 @@ static int patch_conexant_auto(struct hda_codec *codec)
4058 if (!spec) 4081 if (!spec)
4059 return -ENOMEM; 4082 return -ENOMEM;
4060 codec->spec = spec; 4083 codec->spec = spec;
4084 err = cx_auto_search_adcs(codec);
4085 if (err < 0)
4086 return err;
4061 switch (codec->vendor_id) { 4087 switch (codec->vendor_id) {
4062 case 0x14f15051: 4088 case 0x14f15051:
4063 codec->pin_amp_workaround = 1; 4089 codec->pin_amp_workaround = 1;
4064 spec->adc_nids = cxt5051_adc_nids;
4065 spec->num_adc_nids = ARRAY_SIZE(cxt5051_adc_nids);
4066 spec->capsrc_nids = spec->adc_nids;
4067 break; 4090 break;
4068 case 0x14f15045: 4091 case 0x14f15045:
4069 codec->pin_amp_workaround = 1; 4092 codec->pin_amp_workaround = 1;
4070 spec->adc_nids = cxt5045_adc_nids;
4071 spec->num_adc_nids = ARRAY_SIZE(cxt5045_adc_nids);
4072 spec->capsrc_nids = spec->adc_nids;
4073 break; 4093 break;
4074 case 0x14f15047: 4094 case 0x14f15047:
4075 codec->pin_amp_workaround = 1; 4095 codec->pin_amp_workaround = 1;
4076 spec->adc_nids = cxt5047_adc_nids;
4077 spec->num_adc_nids = ARRAY_SIZE(cxt5047_adc_nids);
4078 spec->capsrc_nids = cxt5047_capsrc_nids;
4079 break;
4080 default:
4081 spec->adc_nids = cx_auto_adc_nids;
4082 spec->num_adc_nids = ARRAY_SIZE(cx_auto_adc_nids);
4083 spec->capsrc_nids = spec->adc_nids;
4084 break; 4096 break;
4085 } 4097 }
4086 err = cx_auto_parse_auto_config(codec); 4098 err = cx_auto_parse_auto_config(codec);