diff options
| -rw-r--r-- | sound/pci/hda/patch_conexant.c | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 5616444a8ed7..7696d05b9356 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
| @@ -3372,18 +3372,26 @@ static int fill_cx_auto_dacs(struct hda_codec *codec, hda_nid_t *dacs) | |||
| 3372 | /* fill pin_dac_pair list from the pin and dac list */ | 3372 | /* fill pin_dac_pair list from the pin and dac list */ |
| 3373 | static int fill_dacs_for_pins(struct hda_codec *codec, hda_nid_t *pins, | 3373 | static int fill_dacs_for_pins(struct hda_codec *codec, hda_nid_t *pins, |
| 3374 | int num_pins, hda_nid_t *dacs, int *rest, | 3374 | int num_pins, hda_nid_t *dacs, int *rest, |
| 3375 | struct pin_dac_pair *filled, int type) | 3375 | struct pin_dac_pair *filled, int nums, |
| 3376 | int type) | ||
| 3376 | { | 3377 | { |
| 3377 | int i, nums; | 3378 | int i, start = nums; |
| 3378 | 3379 | ||
| 3379 | nums = 0; | 3380 | for (i = 0; i < num_pins; i++, nums++) { |
| 3380 | for (i = 0; i < num_pins; i++) { | ||
| 3381 | filled[nums].pin = pins[i]; | 3381 | filled[nums].pin = pins[i]; |
| 3382 | filled[nums].type = type; | 3382 | filled[nums].type = type; |
| 3383 | filled[nums].dac = get_unassigned_dac(codec, pins[i], dacs, rest); | 3383 | filled[nums].dac = get_unassigned_dac(codec, pins[i], dacs, rest); |
| 3384 | if (!filled[nums].dac && i > 0 && filled[0].dac) | 3384 | if (filled[nums].dac) |
| 3385 | continue; | ||
| 3386 | if (filled[start].dac && get_connection_index(codec, pins[i], filled[start].dac) >= 0) { | ||
| 3387 | filled[nums].dac = filled[start].dac | DAC_SLAVE_FLAG; | ||
| 3388 | continue; | ||
| 3389 | } | ||
| 3390 | if (filled[0].dac && get_connection_index(codec, pins[i], filled[0].dac) >= 0) { | ||
| 3385 | filled[nums].dac = filled[0].dac | DAC_SLAVE_FLAG; | 3391 | filled[nums].dac = filled[0].dac | DAC_SLAVE_FLAG; |
| 3386 | nums++; | 3392 | continue; |
| 3393 | } | ||
| 3394 | snd_printdd("Failed to find a DAC for pin 0x%x", pins[i]); | ||
| 3387 | } | 3395 | } |
| 3388 | return nums; | 3396 | return nums; |
| 3389 | } | 3397 | } |
| @@ -3399,14 +3407,14 @@ static void cx_auto_parse_output(struct hda_codec *codec) | |||
| 3399 | rest = fill_cx_auto_dacs(codec, dacs); | 3407 | rest = fill_cx_auto_dacs(codec, dacs); |
| 3400 | /* parse all analog output pins */ | 3408 | /* parse all analog output pins */ |
| 3401 | nums = fill_dacs_for_pins(codec, cfg->line_out_pins, cfg->line_outs, | 3409 | nums = fill_dacs_for_pins(codec, cfg->line_out_pins, cfg->line_outs, |
| 3402 | dacs, &rest, spec->dac_info, | 3410 | dacs, &rest, spec->dac_info, 0, |
| 3403 | AUTO_PIN_LINE_OUT); | 3411 | AUTO_PIN_LINE_OUT); |
| 3404 | nums += fill_dacs_for_pins(codec, cfg->hp_pins, cfg->hp_outs, | 3412 | nums = fill_dacs_for_pins(codec, cfg->hp_pins, cfg->hp_outs, |
| 3405 | dacs, &rest, spec->dac_info + nums, | 3413 | dacs, &rest, spec->dac_info, nums, |
| 3406 | AUTO_PIN_HP_OUT); | 3414 | AUTO_PIN_HP_OUT); |
| 3407 | nums += fill_dacs_for_pins(codec, cfg->speaker_pins, cfg->speaker_outs, | 3415 | nums = fill_dacs_for_pins(codec, cfg->speaker_pins, cfg->speaker_outs, |
| 3408 | dacs, &rest, spec->dac_info + nums, | 3416 | dacs, &rest, spec->dac_info, nums, |
| 3409 | AUTO_PIN_SPEAKER_OUT); | 3417 | AUTO_PIN_SPEAKER_OUT); |
| 3410 | spec->dac_info_filled = nums; | 3418 | spec->dac_info_filled = nums; |
| 3411 | /* fill multiout struct */ | 3419 | /* fill multiout struct */ |
| 3412 | for (i = 0; i < nums; i++) { | 3420 | for (i = 0; i < nums; i++) { |
| @@ -4173,9 +4181,11 @@ static int try_add_pb_volume(struct hda_codec *codec, hda_nid_t dac, | |||
| 4173 | hda_nid_t pin, const char *name, int idx) | 4181 | hda_nid_t pin, const char *name, int idx) |
| 4174 | { | 4182 | { |
| 4175 | unsigned int caps; | 4183 | unsigned int caps; |
| 4176 | caps = query_amp_caps(codec, dac, HDA_OUTPUT); | 4184 | if (dac && !(dac & DAC_SLAVE_FLAG)) { |
| 4177 | if (caps & AC_AMPCAP_NUM_STEPS) | 4185 | caps = query_amp_caps(codec, dac, HDA_OUTPUT); |
| 4178 | return cx_auto_add_pb_volume(codec, dac, name, idx); | 4186 | if (caps & AC_AMPCAP_NUM_STEPS) |
| 4187 | return cx_auto_add_pb_volume(codec, dac, name, idx); | ||
| 4188 | } | ||
| 4179 | caps = query_amp_caps(codec, pin, HDA_OUTPUT); | 4189 | caps = query_amp_caps(codec, pin, HDA_OUTPUT); |
| 4180 | if (caps & AC_AMPCAP_NUM_STEPS) | 4190 | if (caps & AC_AMPCAP_NUM_STEPS) |
| 4181 | return cx_auto_add_pb_volume(codec, pin, name, idx); | 4191 | return cx_auto_add_pb_volume(codec, pin, name, idx); |
| @@ -4198,8 +4208,6 @@ static int cx_auto_build_output_controls(struct hda_codec *codec) | |||
| 4198 | const char *label; | 4208 | const char *label; |
| 4199 | int idx, type; | 4209 | int idx, type; |
| 4200 | hda_nid_t dac = spec->dac_info[i].dac; | 4210 | hda_nid_t dac = spec->dac_info[i].dac; |
| 4201 | if (!dac || (dac & DAC_SLAVE_FLAG)) | ||
| 4202 | continue; | ||
| 4203 | type = spec->dac_info[i].type; | 4211 | type = spec->dac_info[i].type; |
| 4204 | if (type == AUTO_PIN_LINE_OUT) | 4212 | if (type == AUTO_PIN_LINE_OUT) |
| 4205 | type = spec->autocfg.line_out_type; | 4213 | type = spec->autocfg.line_out_type; |
