ALSA: hda - Fix capture source widgets on ALC codecs

On some Realtek codecs like ALC882 or ALC883, the capture source is
no mux but sum widget. We have to initialize all channels properly
for this type, otherwise noises may come in from the unused route.

The patch assures to mute unused routes, and unmute the currently
selected route.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Tested-by: Daniel J Blueman <daniel.blueman@gmail.com>

+45
+45
sound/pci/hda/patch_realtek.c
··· 6437 } 6438 } 6439 6440 /* add mic boosts if needed */ 6441 static int alc_auto_add_mic_boost(struct hda_codec *codec) 6442 { ··· 6524 alc882_auto_init_multi_out(codec); 6525 alc882_auto_init_hp_out(codec); 6526 alc882_auto_init_analog_input(codec); 6527 if (spec->unsol_event) 6528 alc_sku_automute(codec); 6529 } ··· 8319 } 8320 } 8321 8322 /* almost identical with ALC880 parser... */ 8323 static int alc883_parse_auto_config(struct hda_codec *codec) 8324 { ··· 8351 alc883_auto_init_multi_out(codec); 8352 alc883_auto_init_hp_out(codec); 8353 alc883_auto_init_analog_input(codec); 8354 if (spec->unsol_event) 8355 alc_sku_automute(codec); 8356 } ··· 9700 #define alc262_auto_init_multi_out alc882_auto_init_multi_out 9701 #define alc262_auto_init_hp_out alc882_auto_init_hp_out 9702 #define alc262_auto_init_analog_input alc882_auto_init_analog_input 9703 9704 9705 /* init callback for auto-configuration model -- overriding the default init */ ··· 9710 alc262_auto_init_multi_out(codec); 9711 alc262_auto_init_hp_out(codec); 9712 alc262_auto_init_analog_input(codec); 9713 if (spec->unsol_event) 9714 alc_sku_automute(codec); 9715 } ··· 13369 } 13370 } 13371 13372 #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02) 13373 #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) 13374 ··· 13553 alc861vd_auto_init_multi_out(codec); 13554 alc861vd_auto_init_hp_out(codec); 13555 alc861vd_auto_init_analog_input(codec); 13556 if (spec->unsol_event) 13557 alc_sku_automute(codec); 13558 } ··· 14719 } 14720 } 14721 14722 static int alc662_parse_auto_config(struct hda_codec *codec) 14723 { 14724 struct alc_spec *spec = codec->spec; ··· 14777 alc662_auto_init_multi_out(codec); 14778 alc662_auto_init_hp_out(codec); 14779 alc662_auto_init_analog_input(codec); 14780 if (spec->unsol_event) 14781 alc_sku_automute(codec); 14782 }
··· 6437 } 6438 } 6439 6440 + static void alc882_auto_init_input_src(struct hda_codec *codec) 6441 + { 6442 + struct alc_spec *spec = codec->spec; 6443 + const struct hda_input_mux *imux = spec->input_mux; 6444 + int c; 6445 + 6446 + for (c = 0; c < spec->num_adc_nids; c++) { 6447 + hda_nid_t conn_list[HDA_MAX_NUM_INPUTS]; 6448 + hda_nid_t nid = spec->capsrc_nids[c]; 6449 + int conns, mute, idx, item; 6450 + 6451 + conns = snd_hda_get_connections(codec, nid, conn_list, 6452 + ARRAY_SIZE(conn_list)); 6453 + if (conns < 0) 6454 + continue; 6455 + for (idx = 0; idx < conns; idx++) { 6456 + /* if the current connection is the selected one, 6457 + * unmute it as default - otherwise mute it 6458 + */ 6459 + mute = AMP_IN_MUTE(idx); 6460 + for (item = 0; item < imux->num_items; item++) { 6461 + if (imux->items[item].index == idx) { 6462 + if (spec->cur_mux[c] == item) 6463 + mute = AMP_IN_UNMUTE(idx); 6464 + break; 6465 + } 6466 + } 6467 + snd_hda_codec_write(codec, nid, 0, 6468 + AC_VERB_SET_AMP_GAIN_MUTE, mute); 6469 + } 6470 + } 6471 + } 6472 + 6473 /* add mic boosts if needed */ 6474 static int alc_auto_add_mic_boost(struct hda_codec *codec) 6475 { ··· 6491 alc882_auto_init_multi_out(codec); 6492 alc882_auto_init_hp_out(codec); 6493 alc882_auto_init_analog_input(codec); 6494 + alc882_auto_init_input_src(codec); 6495 if (spec->unsol_event) 6496 alc_sku_automute(codec); 6497 } ··· 8285 } 8286 } 8287 8288 + #define alc883_auto_init_input_src alc882_auto_init_input_src 8289 + 8290 /* almost identical with ALC880 parser... */ 8291 static int alc883_parse_auto_config(struct hda_codec *codec) 8292 { ··· 8315 alc883_auto_init_multi_out(codec); 8316 alc883_auto_init_hp_out(codec); 8317 alc883_auto_init_analog_input(codec); 8318 + alc883_auto_init_input_src(codec); 8319 if (spec->unsol_event) 8320 alc_sku_automute(codec); 8321 } ··· 9663 #define alc262_auto_init_multi_out alc882_auto_init_multi_out 9664 #define alc262_auto_init_hp_out alc882_auto_init_hp_out 9665 #define alc262_auto_init_analog_input alc882_auto_init_analog_input 9666 + #define alc262_auto_init_input_src alc882_auto_init_input_src 9667 9668 9669 /* init callback for auto-configuration model -- overriding the default init */ ··· 9672 alc262_auto_init_multi_out(codec); 9673 alc262_auto_init_hp_out(codec); 9674 alc262_auto_init_analog_input(codec); 9675 + alc262_auto_init_input_src(codec); 9676 if (spec->unsol_event) 9677 alc_sku_automute(codec); 9678 } ··· 13330 } 13331 } 13332 13333 + #define alc861vd_auto_init_input_src alc882_auto_init_input_src 13334 + 13335 #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02) 13336 #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) 13337 ··· 13512 alc861vd_auto_init_multi_out(codec); 13513 alc861vd_auto_init_hp_out(codec); 13514 alc861vd_auto_init_analog_input(codec); 13515 + alc861vd_auto_init_input_src(codec); 13516 if (spec->unsol_event) 13517 alc_sku_automute(codec); 13518 } ··· 14677 } 14678 } 14679 14680 + #define alc662_auto_init_input_src alc882_auto_init_input_src 14681 + 14682 static int alc662_parse_auto_config(struct hda_codec *codec) 14683 { 14684 struct alc_spec *spec = codec->spec; ··· 14733 alc662_auto_init_multi_out(codec); 14734 alc662_auto_init_hp_out(codec); 14735 alc662_auto_init_analog_input(codec); 14736 + alc662_auto_init_input_src(codec); 14737 if (spec->unsol_event) 14738 alc_sku_automute(codec); 14739 }