diff options
-rw-r--r-- | sound/pci/hda/patch_conexant.c | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index fc02751f22d6..ebce2fe3aec2 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 | ||
4038 | static 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 | |||
4037 | static const struct hda_codec_ops cx_auto_patch_ops = { | 4060 | static 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); |