Lines Matching +full:dmic +full:- +full:sample +full:- +full:rate

23  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
47 /* extra amp-initialization sequence types */
72 hda_nid_t pin; /* multi-io widget pin NID */
74 unsigned int ctl_in; /* cached input-pin control value */
109 struct hda_multi_out multiout; /* playback set-up
114 hda_nid_t slave_dig_outs[3]; /* optional - for auto-parsing */
121 hda_nid_t dig_in_nid; /* digital-in NID; optional */
122 hda_nid_t mixer_nid; /* analog-mixer NID */
126 /* capture setup for dynamic dual-adc switch */
159 int int_mic_idx, ext_mic_idx, dock_mic_idx; /* for auto-mic */
175 unsigned int auto_mic_valid_imux:1; /* valid imux for auto-mic */
179 unsigned int detect_lo:1; /* Line-out detection enabled */
190 unsigned int shared_mic_hp:1; /* HP/Mic-in sharing */
192 /* auto-mute control */
210 /* fix-up list */
215 /* multi-io */
248 struct alc_spec *spec = codec->spec; in alc_mux_enum_info()
249 unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id); in alc_mux_enum_info()
250 if (mux_idx >= spec->num_mux_defs) in alc_mux_enum_info()
252 if (!spec->input_mux[mux_idx].num_items && mux_idx > 0) in alc_mux_enum_info()
254 return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo); in alc_mux_enum_info()
261 struct alc_spec *spec = codec->spec; in alc_mux_enum_get()
262 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in alc_mux_enum_get()
264 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx]; in alc_mux_enum_get()
270 struct alc_spec *spec = codec->spec; in alc_dyn_adc_pcm_resetup()
271 hda_nid_t new_adc = spec->adc_nids[spec->dyn_adc_idx[cur]]; in alc_dyn_adc_pcm_resetup()
273 if (spec->cur_adc && spec->cur_adc != new_adc) { in alc_dyn_adc_pcm_resetup()
275 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1); in alc_dyn_adc_pcm_resetup()
276 spec->cur_adc = new_adc; in alc_dyn_adc_pcm_resetup()
278 spec->cur_adc_stream_tag, 0, in alc_dyn_adc_pcm_resetup()
279 spec->cur_adc_format); in alc_dyn_adc_pcm_resetup()
287 return spec->capsrc_nids ? in get_capsrc()
288 spec->capsrc_nids[idx] : spec->adc_nids[idx]; in get_capsrc()
297 struct alc_spec *spec = codec->spec; in alc_mux_select()
303 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx; in alc_mux_select()
304 imux = &spec->input_mux[mux_idx]; in alc_mux_select()
305 if (!imux->num_items && mux_idx > 0) in alc_mux_select()
306 imux = &spec->input_mux[0]; in alc_mux_select()
307 if (!imux->num_items) in alc_mux_select()
310 if (idx >= imux->num_items) in alc_mux_select()
311 idx = imux->num_items - 1; in alc_mux_select()
312 if (spec->cur_mux[adc_idx] == idx && !force) in alc_mux_select()
314 spec->cur_mux[adc_idx] = idx; in alc_mux_select()
316 /* for shared I/O, change the pin-control accordingly */ in alc_mux_select()
317 if (spec->shared_mic_hp) { in alc_mux_select()
321 snd_hda_codec_write(codec, spec->autocfg.inputs[1].pin, 0, in alc_mux_select()
323 spec->cur_mux[adc_idx] ? in alc_mux_select()
325 spec->automute_speaker = !spec->cur_mux[adc_idx]; in alc_mux_select()
329 if (spec->dyn_adc_switch) { in alc_mux_select()
331 adc_idx = spec->dyn_adc_idx[idx]; in alc_mux_select()
343 /* Matrix-mixer style (e.g. ALC882) */ in alc_mux_select()
344 int active = imux->items[idx].index; in alc_mux_select()
354 imux->items[idx].index); in alc_mux_select()
363 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in alc_mux_enum_put()
365 ucontrol->value.enumerated.item[0], false); in alc_mux_enum_put()
369 * set up the input pin config (depending on the given auto-pin type)
403 if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers))) in add_mixer()
405 spec->mixers[spec->num_mixers++] = mix; in add_mixer()
410 if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs))) in add_verb()
412 spec->init_verbs[spec->num_init_verbs++] = verb; in add_verb()
447 struct alc_spec *spec = codec->spec; in alc_fix_pll()
450 if (!spec->pll_nid) in alc_fix_pll()
452 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX, in alc_fix_pll()
453 spec->pll_coef_idx); in alc_fix_pll()
454 val = snd_hda_codec_read(codec, spec->pll_nid, 0, in alc_fix_pll()
456 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX, in alc_fix_pll()
457 spec->pll_coef_idx); in alc_fix_pll()
458 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF, in alc_fix_pll()
459 val & ~(1 << spec->pll_coef_bit)); in alc_fix_pll()
465 struct alc_spec *spec = codec->spec; in alc_fix_pll_init()
466 spec->pll_nid = nid; in alc_fix_pll_init()
467 spec->pll_coef_idx = coef_idx; in alc_fix_pll_init()
468 spec->pll_coef_bit = coef_bit; in alc_fix_pll_init()
473 * Jack detections for HP auto-mute and mic-switch
490 /* standard HP/line-out auto-mute helper */
494 struct alc_spec *spec = codec->spec; in do_automute()
504 switch (spec->automute_mode) { in do_automute()
509 if (spec->keep_vref_in_automute) { in do_automute()
525 nid = spec->automute_mixer_nid[i]; in do_automute()
540 struct alc_spec *spec = codec->spec; in update_outputs()
547 if (!spec->shared_mic_hp) /* don't change HP-pin when shared with mic */ in update_outputs()
548 do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins), in update_outputs()
549 spec->autocfg.hp_pins, spec->master_mute, true); in update_outputs()
551 if (!spec->automute_speaker) in update_outputs()
554 on = spec->hp_jack_present | spec->line_jack_present; in update_outputs()
555 on |= spec->master_mute; in update_outputs()
556 do_automute(codec, ARRAY_SIZE(spec->autocfg.speaker_pins), in update_outputs()
557 spec->autocfg.speaker_pins, on, false); in update_outputs()
559 /* toggle line-out mutes if needed, too */ in update_outputs()
561 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0] || in update_outputs()
562 spec->autocfg.line_out_pins[0] == spec->autocfg.speaker_pins[0]) in update_outputs()
564 if (!spec->automute_lo) in update_outputs()
567 on = spec->hp_jack_present; in update_outputs()
568 on |= spec->master_mute; in update_outputs()
569 do_automute(codec, ARRAY_SIZE(spec->autocfg.line_out_pins), in update_outputs()
570 spec->autocfg.line_out_pins, on, false); in update_outputs()
575 struct alc_spec *spec = codec->spec; in call_update_outputs()
576 if (spec->automute_hook) in call_update_outputs()
577 spec->automute_hook(codec); in call_update_outputs()
582 /* standard HP-automute helper */
585 struct alc_spec *spec = codec->spec; in alc_hp_automute()
587 spec->hp_jack_present = in alc_hp_automute()
588 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.hp_pins), in alc_hp_automute()
589 spec->autocfg.hp_pins); in alc_hp_automute()
590 if (!spec->detect_hp || (!spec->automute_speaker && !spec->automute_lo)) in alc_hp_automute()
595 /* standard line-out-automute helper */
598 struct alc_spec *spec = codec->spec; in alc_line_automute()
601 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0]) in alc_line_automute()
604 spec->line_jack_present = in alc_line_automute()
605 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins), in alc_line_automute()
606 spec->autocfg.line_out_pins); in alc_line_automute()
607 if (!spec->automute_speaker || !spec->detect_lo) in alc_line_automute()
615 /* standard mic auto-switch helper */
618 struct alc_spec *spec = codec->spec; in alc_mic_automute()
619 hda_nid_t *pins = spec->imux_pins; in alc_mic_automute()
621 if (!spec->auto_mic || !spec->auto_mic_valid_imux) in alc_mic_automute()
623 if (snd_BUG_ON(!spec->adc_nids)) in alc_mic_automute()
625 if (snd_BUG_ON(spec->int_mic_idx < 0 || spec->ext_mic_idx < 0)) in alc_mic_automute()
628 if (snd_hda_jack_detect(codec, pins[spec->ext_mic_idx])) in alc_mic_automute()
629 alc_mux_select(codec, 0, spec->ext_mic_idx, false); in alc_mic_automute()
630 else if (spec->dock_mic_idx >= 0 && in alc_mic_automute()
631 snd_hda_jack_detect(codec, pins[spec->dock_mic_idx])) in alc_mic_automute()
632 alc_mux_select(codec, 0, spec->dock_mic_idx, false); in alc_mic_automute()
634 alc_mux_select(codec, 0, spec->int_mic_idx, false); in alc_mic_automute()
657 if (codec->vendor_id == 0x10ec0880) in alc_sku_unsol_event()
665 /* call init functions of standard auto-mute helpers */
682 /* alc888S-VC */ in alc888_coef_init()
686 /* alc888-VB */ in alc888_coef_init()
725 * just turning off EPAD and a little pause for avoiding pop-noise
750 switch (codec->vendor_id) { in alc_auto_init_amp()
794 * Auto-Mute mode mixer enum support
800 struct alc_spec *spec = codec->spec; in alc_automute_mode_info()
809 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; in alc_automute_mode_info()
810 uinfo->count = 1; in alc_automute_mode_info()
811 if (spec->automute_speaker_possible && spec->automute_lo_possible) { in alc_automute_mode_info()
812 uinfo->value.enumerated.items = 3; in alc_automute_mode_info()
815 uinfo->value.enumerated.items = 2; in alc_automute_mode_info()
818 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) in alc_automute_mode_info()
819 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; in alc_automute_mode_info()
820 strcpy(uinfo->value.enumerated.name, in alc_automute_mode_info()
821 texts[uinfo->value.enumerated.item]); in alc_automute_mode_info()
829 struct alc_spec *spec = codec->spec; in alc_automute_mode_get()
831 if (spec->automute_speaker) in alc_automute_mode_get()
833 if (spec->automute_lo) in alc_automute_mode_get()
836 ucontrol->value.enumerated.item[0] = val; in alc_automute_mode_get()
844 struct alc_spec *spec = codec->spec; in alc_automute_mode_put()
846 switch (ucontrol->value.enumerated.item[0]) { in alc_automute_mode_put()
848 if (!spec->automute_speaker && !spec->automute_lo) in alc_automute_mode_put()
850 spec->automute_speaker = 0; in alc_automute_mode_put()
851 spec->automute_lo = 0; in alc_automute_mode_put()
854 if (spec->automute_speaker_possible) { in alc_automute_mode_put()
855 if (!spec->automute_lo && spec->automute_speaker) in alc_automute_mode_put()
857 spec->automute_speaker = 1; in alc_automute_mode_put()
858 spec->automute_lo = 0; in alc_automute_mode_put()
859 } else if (spec->automute_lo_possible) { in alc_automute_mode_put()
860 if (spec->automute_lo) in alc_automute_mode_put()
862 spec->automute_lo = 1; in alc_automute_mode_put()
864 return -EINVAL; in alc_automute_mode_put()
867 if (!spec->automute_lo_possible || !spec->automute_speaker_possible) in alc_automute_mode_put()
868 return -EINVAL; in alc_automute_mode_put()
869 if (spec->automute_speaker && spec->automute_lo) in alc_automute_mode_put()
871 spec->automute_speaker = 1; in alc_automute_mode_put()
872 spec->automute_lo = 1; in alc_automute_mode_put()
875 return -EINVAL; in alc_automute_mode_put()
883 .name = "Auto-Mute Mode",
891 snd_array_init(&spec->kctls, sizeof(struct snd_kcontrol_new), 32); in alc_kcontrol_new()
892 return snd_array_new(&spec->kctls); in alc_kcontrol_new()
897 struct alc_spec *spec = codec->spec; in alc_add_automute_mode_enum()
902 return -ENOMEM; in alc_add_automute_mode_enum()
904 knew->name = kstrdup("Auto-Mute Mode", GFP_KERNEL); in alc_add_automute_mode_enum()
905 if (!knew->name) in alc_add_automute_mode_enum()
906 return -ENOMEM; in alc_add_automute_mode_enum()
911 * Check the availability of HP/line-out auto-mute;
916 struct alc_spec *spec = codec->spec; in alc_init_automute()
917 struct auto_pin_cfg *cfg = &spec->autocfg; in alc_init_automute()
921 if (cfg->hp_pins[0]) in alc_init_automute()
923 if (cfg->line_out_pins[0]) in alc_init_automute()
925 if (cfg->speaker_pins[0]) in alc_init_automute()
930 if (!cfg->speaker_pins[0] && in alc_init_automute()
931 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) { in alc_init_automute()
932 memcpy(cfg->speaker_pins, cfg->line_out_pins, in alc_init_automute()
933 sizeof(cfg->speaker_pins)); in alc_init_automute()
934 cfg->speaker_outs = cfg->line_outs; in alc_init_automute()
937 if (!cfg->hp_pins[0] && in alc_init_automute()
938 cfg->line_out_type == AUTO_PIN_HP_OUT) { in alc_init_automute()
939 memcpy(cfg->hp_pins, cfg->line_out_pins, in alc_init_automute()
940 sizeof(cfg->hp_pins)); in alc_init_automute()
941 cfg->hp_outs = cfg->line_outs; in alc_init_automute()
944 spec->automute_mode = ALC_AUTOMUTE_PIN; in alc_init_automute()
946 for (i = 0; i < cfg->hp_outs; i++) { in alc_init_automute()
947 hda_nid_t nid = cfg->hp_pins[i]; in alc_init_automute()
950 snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n", in alc_init_automute()
953 spec->detect_hp = 1; in alc_init_automute()
956 if (cfg->line_out_type == AUTO_PIN_LINE_OUT && cfg->line_outs) { in alc_init_automute()
957 if (cfg->speaker_outs) in alc_init_automute()
958 for (i = 0; i < cfg->line_outs; i++) { in alc_init_automute()
959 hda_nid_t nid = cfg->line_out_pins[i]; in alc_init_automute()
962 snd_printdd("realtek: Enable Line-Out " in alc_init_automute()
963 "auto-muting on NID 0x%x\n", nid); in alc_init_automute()
966 spec->detect_lo = 1; in alc_init_automute()
968 spec->automute_lo_possible = spec->detect_hp; in alc_init_automute()
971 spec->automute_speaker_possible = cfg->speaker_outs && in alc_init_automute()
972 (spec->detect_hp || spec->detect_lo); in alc_init_automute()
974 spec->automute_lo = spec->automute_lo_possible; in alc_init_automute()
975 spec->automute_speaker = spec->automute_speaker_possible; in alc_init_automute()
977 if (spec->automute_speaker_possible || spec->automute_lo_possible) { in alc_init_automute()
980 spec->unsol_event = alc_sku_unsol_event; in alc_init_automute()
984 /* return the position of NID in the list, or -1 if not found */
991 return -1; in find_idx_in_nid_list()
994 /* check whether dynamic ADC-switching is available */
997 struct alc_spec *spec = codec->spec; in alc_check_dyn_adc_switch()
998 struct hda_input_mux *imux = &spec->private_imux[0]; in alc_check_dyn_adc_switch()
1002 if (imux != spec->input_mux) /* no dynamic imux? */ in alc_check_dyn_adc_switch()
1005 for (n = 0; n < spec->num_adc_nids; n++) { in alc_check_dyn_adc_switch()
1006 cap = spec->private_capsrc_nids[n]; in alc_check_dyn_adc_switch()
1007 for (i = 0; i < imux->num_items; i++) { in alc_check_dyn_adc_switch()
1008 pin = spec->imux_pins[i]; in alc_check_dyn_adc_switch()
1014 if (i >= imux->num_items) in alc_check_dyn_adc_switch()
1015 return true; /* no ADC-switch is needed */ in alc_check_dyn_adc_switch()
1018 for (i = 0; i < imux->num_items; i++) { in alc_check_dyn_adc_switch()
1019 pin = spec->imux_pins[i]; in alc_check_dyn_adc_switch()
1020 for (n = 0; n < spec->num_adc_nids; n++) { in alc_check_dyn_adc_switch()
1021 cap = spec->private_capsrc_nids[n]; in alc_check_dyn_adc_switch()
1024 imux->items[i].index = idx; in alc_check_dyn_adc_switch()
1025 spec->dyn_adc_idx[i] = n; in alc_check_dyn_adc_switch()
1032 spec->dyn_adc_switch = 1; in alc_check_dyn_adc_switch()
1036 /* rebuild imux for matching with the given auto-mic pins (if not yet) */
1039 struct alc_spec *spec = codec->spec; in alc_rebuild_imux_for_auto_mic()
1046 if (!spec->auto_mic) in alc_rebuild_imux_for_auto_mic()
1048 imux = &spec->private_imux[0]; in alc_rebuild_imux_for_auto_mic()
1049 if (spec->input_mux == imux) in alc_rebuild_imux_for_auto_mic()
1051 spec->imux_pins[0] = spec->ext_mic_pin; in alc_rebuild_imux_for_auto_mic()
1052 spec->imux_pins[1] = spec->int_mic_pin; in alc_rebuild_imux_for_auto_mic()
1053 spec->imux_pins[2] = spec->dock_mic_pin; in alc_rebuild_imux_for_auto_mic()
1055 strcpy(imux->items[i].label, texts[i]); in alc_rebuild_imux_for_auto_mic()
1056 if (spec->imux_pins[i]) { in alc_rebuild_imux_for_auto_mic()
1057 hda_nid_t pin = spec->imux_pins[i]; in alc_rebuild_imux_for_auto_mic()
1059 for (c = 0; c < spec->num_adc_nids; c++) { in alc_rebuild_imux_for_auto_mic()
1063 imux->items[i].index = idx; in alc_rebuild_imux_for_auto_mic()
1067 imux->num_items = i + 1; in alc_rebuild_imux_for_auto_mic()
1070 spec->num_mux_defs = 1; in alc_rebuild_imux_for_auto_mic()
1071 spec->input_mux = imux; in alc_rebuild_imux_for_auto_mic()
1075 /* check whether all auto-mic pins are valid; setup indices if OK */
1078 struct alc_spec *spec = codec->spec; in alc_auto_mic_check_imux()
1081 if (!spec->auto_mic) in alc_auto_mic_check_imux()
1083 if (spec->auto_mic_valid_imux) in alc_auto_mic_check_imux()
1088 spec->auto_mic = 0; in alc_auto_mic_check_imux()
1092 imux = spec->input_mux; in alc_auto_mic_check_imux()
1093 spec->ext_mic_idx = find_idx_in_nid_list(spec->ext_mic_pin, in alc_auto_mic_check_imux()
1094 spec->imux_pins, imux->num_items); in alc_auto_mic_check_imux()
1095 spec->int_mic_idx = find_idx_in_nid_list(spec->int_mic_pin, in alc_auto_mic_check_imux()
1096 spec->imux_pins, imux->num_items); in alc_auto_mic_check_imux()
1097 spec->dock_mic_idx = find_idx_in_nid_list(spec->dock_mic_pin, in alc_auto_mic_check_imux()
1098 spec->imux_pins, imux->num_items); in alc_auto_mic_check_imux()
1099 if (spec->ext_mic_idx < 0 || spec->int_mic_idx < 0) { in alc_auto_mic_check_imux()
1100 spec->auto_mic = 0; in alc_auto_mic_check_imux()
1104 snd_hda_jack_detect_enable(codec, spec->ext_mic_pin, ALC_MIC_EVENT); in alc_auto_mic_check_imux()
1105 if (spec->dock_mic_pin) in alc_auto_mic_check_imux()
1106 snd_hda_jack_detect_enable(codec, spec->dock_mic_pin, in alc_auto_mic_check_imux()
1109 spec->auto_mic_valid_imux = 1; in alc_auto_mic_check_imux()
1110 spec->auto_mic = 1; in alc_auto_mic_check_imux()
1115 * Check the availability of auto-mic switch;
1120 struct alc_spec *spec = codec->spec; in alc_init_auto_mic()
1121 struct auto_pin_cfg *cfg = &spec->autocfg; in alc_init_auto_mic()
1125 if (spec->shared_mic_hp) in alc_init_auto_mic()
1126 return; /* no auto-mic for the shared I/O */ in alc_init_auto_mic()
1128 spec->ext_mic_idx = spec->int_mic_idx = spec->dock_mic_idx = -1; in alc_init_auto_mic()
1131 for (i = 0; i < cfg->num_inputs; i++) { in alc_init_auto_mic()
1132 hda_nid_t nid = cfg->inputs[i].pin; in alc_init_auto_mic()
1139 if (cfg->inputs[i].type != AUTO_PIN_MIC) in alc_init_auto_mic()
1148 if (cfg->inputs[i].type > AUTO_PIN_LINE_IN) in alc_init_auto_mic()
1155 if (cfg->inputs[i].type != AUTO_PIN_MIC) in alc_init_auto_mic()
1173 spec->ext_mic_pin = ext; in alc_init_auto_mic()
1174 spec->int_mic_pin = fixed; in alc_init_auto_mic()
1175 spec->dock_mic_pin = dock; in alc_init_auto_mic()
1177 spec->auto_mic = 1; in alc_init_auto_mic()
1181 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n", in alc_init_auto_mic()
1183 spec->unsol_event = alc_sku_unsol_event; in alc_init_auto_mic()
1186 /* check the availabilities of auto-mute and auto-mic switches */
1197 /* Could be any non-zero and even value. When used as fixup, tells
1206 struct alc_spec *spec = codec->spec; in alc_auto_parse_customize_define()
1208 spec->cdefine.enable_pcbeep = 1; /* assume always enabled */ in alc_auto_parse_customize_define()
1210 if (spec->cdefine.fixup) { in alc_auto_parse_customize_define()
1211 ass = spec->cdefine.sku_cfg; in alc_auto_parse_customize_define()
1213 return -1; in alc_auto_parse_customize_define()
1217 ass = codec->subsystem_id & 0xffff; in alc_auto_parse_customize_define()
1218 if (ass != codec->bus->pci->subsystem_device && (ass & 1)) in alc_auto_parse_customize_define()
1222 if (codec->vendor_id == 0x10ec0260) in alc_auto_parse_customize_define()
1228 codec->chip_name, ass); in alc_auto_parse_customize_define()
1229 return -1; in alc_auto_parse_customize_define()
1239 return -1; in alc_auto_parse_customize_define()
1241 spec->cdefine.port_connectivity = ass >> 30; in alc_auto_parse_customize_define()
1242 spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20; in alc_auto_parse_customize_define()
1243 spec->cdefine.check_sum = (ass >> 16) & 0xf; in alc_auto_parse_customize_define()
1244 spec->cdefine.customization = ass >> 8; in alc_auto_parse_customize_define()
1246 spec->cdefine.sku_cfg = ass; in alc_auto_parse_customize_define()
1247 spec->cdefine.external_amp = (ass & 0x38) >> 3; in alc_auto_parse_customize_define()
1248 spec->cdefine.platform_type = (ass & 0x4) >> 2; in alc_auto_parse_customize_define()
1249 spec->cdefine.swap = (ass & 0x2) >> 1; in alc_auto_parse_customize_define()
1250 spec->cdefine.override = ass & 0x1; in alc_auto_parse_customize_define()
1253 nid, spec->cdefine.sku_cfg); in alc_auto_parse_customize_define()
1255 spec->cdefine.port_connectivity); in alc_auto_parse_customize_define()
1256 snd_printd("SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep); in alc_auto_parse_customize_define()
1257 snd_printd("SKU: check_sum=0x%08x\n", spec->cdefine.check_sum); in alc_auto_parse_customize_define()
1258 snd_printd("SKU: customization=0x%08x\n", spec->cdefine.customization); in alc_auto_parse_customize_define()
1259 snd_printd("SKU: external_amp=0x%x\n", spec->cdefine.external_amp); in alc_auto_parse_customize_define()
1260 snd_printd("SKU: platform_type=0x%x\n", spec->cdefine.platform_type); in alc_auto_parse_customize_define()
1261 snd_printd("SKU: swap=0x%x\n", spec->cdefine.swap); in alc_auto_parse_customize_define()
1262 snd_printd("SKU: override=0x%x\n", spec->cdefine.override); in alc_auto_parse_customize_define()
1273 /* check subsystem ID and set up device-specific initialization;
1276 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1280 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1288 struct alc_spec *spec = codec->spec; in alc_subsystem_id()
1290 if (spec->cdefine.fixup) { in alc_subsystem_id()
1291 ass = spec->cdefine.sku_cfg; in alc_subsystem_id()
1297 ass = codec->subsystem_id & 0xffff; in alc_subsystem_id()
1298 if ((ass != codec->bus->pci->subsystem_device) && (ass & 1)) in alc_subsystem_id()
1311 if (codec->vendor_id == 0x10ec0260) in alc_subsystem_id()
1332 ass & 0xffff, codec->vendor_id); in alc_subsystem_id()
1336 * 2 : 0 --> Desktop, 1 --> Laptop in alc_subsystem_id()
1343 spec->init_amp = ALC_INIT_GPIO1; in alc_subsystem_id()
1346 spec->init_amp = ALC_INIT_GPIO2; in alc_subsystem_id()
1349 spec->init_amp = ALC_INIT_GPIO3; in alc_subsystem_id()
1353 spec->init_amp = ALC_INIT_DEFAULT; in alc_subsystem_id()
1364 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered in alc_subsystem_id()
1366 * 15 : 1 --> enable the function "Mute internal speaker in alc_subsystem_id()
1369 if (!spec->autocfg.hp_pins[0] && in alc_subsystem_id()
1370 !(spec->autocfg.line_out_pins[0] && in alc_subsystem_id()
1371 spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)) { in alc_subsystem_id()
1384 if (found_in_nid_list(nid, spec->autocfg.line_out_pins, in alc_subsystem_id()
1385 spec->autocfg.line_outs)) in alc_subsystem_id()
1387 spec->autocfg.hp_pins[0] = nid; in alc_subsystem_id()
1392 /* Check the validity of ALC subsystem-id
1393 * ports contains an array of 4 pin NIDs for port-A, E, D and I */
1397 struct alc_spec *spec = codec->spec; in alc_ssid_check()
1400 spec->init_amp = ALC_INIT_DEFAULT; in alc_ssid_check()
1405 * Fix-up pin default configurations and add default verbs
1448 struct alc_spec *spec = codec->spec; in alc_apply_fixup()
1449 int id = spec->fixup_id; in alc_apply_fixup()
1451 const char *modelname = spec->fixup_name; in alc_apply_fixup()
1455 if (!spec->fixup_list) in alc_apply_fixup()
1459 const struct alc_fixup *fix = spec->fixup_list + id; in alc_apply_fixup()
1462 switch (fix->type) { in alc_apply_fixup()
1464 if (action != ALC_FIXUP_ACT_PRE_PROBE || !fix->v.sku) in alc_apply_fixup()
1468 codec->chip_name, modelname); in alc_apply_fixup()
1469 spec->cdefine.sku_cfg = fix->v.sku; in alc_apply_fixup()
1470 spec->cdefine.fixup = 1; in alc_apply_fixup()
1473 cfg = fix->v.pins; in alc_apply_fixup()
1478 codec->chip_name, modelname); in alc_apply_fixup()
1479 for (; cfg->nid; cfg++) in alc_apply_fixup()
1480 snd_hda_codec_set_pincfg(codec, cfg->nid, in alc_apply_fixup()
1481 cfg->val); in alc_apply_fixup()
1484 if (action != ALC_FIXUP_ACT_PROBE || !fix->v.verbs) in alc_apply_fixup()
1487 "Apply fix-verbs for %s\n", in alc_apply_fixup()
1488 codec->chip_name, modelname); in alc_apply_fixup()
1489 add_verb(codec->spec, fix->v.verbs); in alc_apply_fixup()
1492 if (!fix->v.func) in alc_apply_fixup()
1495 "Apply fix-func for %s\n", in alc_apply_fixup()
1496 codec->chip_name, modelname); in alc_apply_fixup()
1497 fix->v.func(codec, fix, action); in alc_apply_fixup()
1502 codec->chip_name, fix->type); in alc_apply_fixup()
1505 if (!fix->chained) in alc_apply_fixup()
1509 id = fix->chain_id; in alc_apply_fixup()
1518 struct alc_spec *spec = codec->spec; in alc_pick_fixup()
1520 int id = -1; in alc_pick_fixup()
1523 if (codec->modelname && models) { in alc_pick_fixup()
1524 while (models->name) { in alc_pick_fixup()
1525 if (!strcmp(codec->modelname, models->name)) { in alc_pick_fixup()
1526 id = models->id; in alc_pick_fixup()
1527 name = models->name; in alc_pick_fixup()
1534 q = snd_pci_quirk_lookup(codec->bus->pci, quirk); in alc_pick_fixup()
1536 id = q->value; in alc_pick_fixup()
1538 name = q->name; in alc_pick_fixup()
1543 for (q = quirk; q->subvendor; q++) { in alc_pick_fixup()
1545 q->subdevice | (q->subvendor << 16); in alc_pick_fixup()
1546 if (vendorid == codec->subsystem_id) { in alc_pick_fixup()
1547 id = q->value; in alc_pick_fixup()
1549 name = q->name; in alc_pick_fixup()
1556 spec->fixup_id = id; in alc_pick_fixup()
1558 spec->fixup_list = fixlist; in alc_pick_fixup()
1559 spec->fixup_name = name; in alc_pick_fixup()
1589 struct alc_spec *spec = codec->spec; in alc_get_coef0()
1590 if (!spec->coef0) in alc_get_coef0()
1591 spec->coef0 = alc_read_coef_idx(codec, 0); in alc_get_coef0()
1592 return spec->coef0; in alc_get_coef0()
1602 struct alc_spec *spec = codec->spec; in alc_auto_init_digital()
1606 for (i = 0; i < spec->autocfg.dig_outs; i++) { in alc_auto_init_digital()
1607 pin = spec->autocfg.dig_out_pins[i]; in alc_auto_init_digital()
1613 dac = spec->multiout.dig_out_nid; in alc_auto_init_digital()
1615 dac = spec->slave_dig_outs[i - 1]; in alc_auto_init_digital()
1622 pin = spec->autocfg.dig_in_pin; in alc_auto_init_digital()
1629 /* parse digital I/Os and set up NIDs in BIOS auto-parse mode */
1632 struct alc_spec *spec = codec->spec; in alc_auto_parse_digital()
1638 for (i = 0; i < spec->autocfg.dig_outs; i++) { in alc_auto_parse_digital()
1641 spec->autocfg.dig_out_pins[i], in alc_auto_parse_digital()
1645 dig_nid = conn[0]; /* assume the first element is audio-out */ in alc_auto_parse_digital()
1647 spec->multiout.dig_out_nid = dig_nid; in alc_auto_parse_digital()
1648 spec->dig_out_type = spec->autocfg.dig_out_type[0]; in alc_auto_parse_digital()
1650 spec->multiout.slave_dig_outs = spec->slave_dig_outs; in alc_auto_parse_digital()
1651 if (nums >= ARRAY_SIZE(spec->slave_dig_outs) - 1) in alc_auto_parse_digital()
1653 spec->slave_dig_outs[nums - 1] = dig_nid; in alc_auto_parse_digital()
1658 if (spec->autocfg.dig_in_pin) { in alc_auto_parse_digital()
1659 dig_nid = codec->start_nid; in alc_auto_parse_digital()
1660 for (i = 0; i < codec->num_nodes; i++, dig_nid++) { in alc_auto_parse_digital()
1669 spec->autocfg.dig_in_pin); in alc_auto_parse_digital()
1671 spec->dig_in_nid = dig_nid; in alc_auto_parse_digital()
1685 struct alc_spec *spec = codec->spec; in alc_cap_vol_info()
1689 mutex_lock(&codec->control_mutex); in alc_cap_vol_info()
1690 if (spec->vol_in_capsrc) in alc_cap_vol_info()
1691 val = HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[0], 3, 0, HDA_OUTPUT); in alc_cap_vol_info()
1693 val = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0, HDA_INPUT); in alc_cap_vol_info()
1694 kcontrol->private_value = val; in alc_cap_vol_info()
1696 mutex_unlock(&codec->control_mutex); in alc_cap_vol_info()
1704 struct alc_spec *spec = codec->spec; in alc_cap_vol_tlv()
1708 mutex_lock(&codec->control_mutex); in alc_cap_vol_tlv()
1709 if (spec->vol_in_capsrc) in alc_cap_vol_tlv()
1710 val = HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[0], 3, 0, HDA_OUTPUT); in alc_cap_vol_tlv()
1712 val = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0, HDA_INPUT); in alc_cap_vol_tlv()
1713 kcontrol->private_value = val; in alc_cap_vol_tlv()
1715 mutex_unlock(&codec->control_mutex); in alc_cap_vol_tlv()
1727 struct alc_spec *spec = codec->spec; in alc_cap_getput_caller()
1730 mutex_lock(&codec->control_mutex); in alc_cap_getput_caller()
1731 if (check_adc_switch && spec->dyn_adc_switch) { in alc_cap_getput_caller()
1732 for (i = 0; i < spec->num_adc_nids; i++) { in alc_cap_getput_caller()
1733 kcontrol->private_value = in alc_cap_getput_caller()
1734 HDA_COMPOSE_AMP_VAL(spec->adc_nids[i], in alc_cap_getput_caller()
1741 i = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in alc_cap_getput_caller()
1742 if (spec->vol_in_capsrc) in alc_cap_getput_caller()
1743 kcontrol->private_value = in alc_cap_getput_caller()
1744 HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[i], in alc_cap_getput_caller()
1747 kcontrol->private_value = in alc_cap_getput_caller()
1748 HDA_COMPOSE_AMP_VAL(spec->adc_nids[i], in alc_cap_getput_caller()
1753 mutex_unlock(&codec->control_mutex); in alc_cap_getput_caller()
1887 #define NID_MAPPING (-1)
1909 struct alc_spec *spec = codec->spec; in __alc_build_controls()
1916 for (i = 0; i < spec->num_mixers; i++) { in __alc_build_controls()
1917 err = snd_hda_add_new_ctls(codec, spec->mixers[i]); in __alc_build_controls()
1921 if (spec->cap_mixer) { in __alc_build_controls()
1922 err = snd_hda_add_new_ctls(codec, spec->cap_mixer); in __alc_build_controls()
1926 if (spec->multiout.dig_out_nid) { in __alc_build_controls()
1928 spec->multiout.dig_out_nid, in __alc_build_controls()
1929 spec->multiout.dig_out_nid); in __alc_build_controls()
1932 if (!spec->no_analog) { in __alc_build_controls()
1934 &spec->multiout); in __alc_build_controls()
1937 spec->multiout.share_spdif = 1; in __alc_build_controls()
1940 if (spec->dig_in_nid) { in __alc_build_controls()
1941 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid); in __alc_build_controls()
1948 if (spec->beep_amp) { in __alc_build_controls()
1950 for (knew = alc_beep_mixer; knew->name; knew++) { in __alc_build_controls()
1954 return -ENOMEM; in __alc_build_controls()
1955 kctl->private_value = spec->beep_amp; in __alc_build_controls()
1964 if (!spec->no_analog && in __alc_build_controls()
1967 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid, in __alc_build_controls()
1974 if (!spec->no_analog && in __alc_build_controls()
1983 if (spec->capsrc_nids || spec->adc_nids) { in __alc_build_controls()
1987 for (i = 0; kctl && i < kctl->count; i++) { in __alc_build_controls()
1994 if (spec->cap_mixer && spec->adc_nids) { in __alc_build_controls()
1995 const char *kname = kctl ? kctl->id.name : NULL; in __alc_build_controls()
1996 for (knew = spec->cap_mixer; knew->name; knew++) { in __alc_build_controls()
1997 if (kname && strcmp(knew->name, kname) == 0) in __alc_build_controls()
1999 kctl = snd_hda_find_mixer_ctl(codec, knew->name); in __alc_build_controls()
2000 for (i = 0; kctl && i < kctl->count; i++) { in __alc_build_controls()
2002 spec->adc_nids[i]); in __alc_build_controls()
2009 /* other nid->control mapping */ in __alc_build_controls()
2010 for (i = 0; i < spec->num_mixers; i++) { in __alc_build_controls()
2011 for (knew = spec->mixers[i]; knew->name; knew++) { in __alc_build_controls()
2012 if (knew->iface != NID_MAPPING) in __alc_build_controls()
2014 kctl = snd_hda_find_mixer_ctl(codec, knew->name); in __alc_build_controls()
2017 u = knew->subdevice; in __alc_build_controls()
2024 nid = spec->autocfg.speaker_pins[nid]; in __alc_build_controls()
2027 nid = spec->autocfg.line_out_pins[nid]; in __alc_build_controls()
2030 nid = spec->autocfg.hp_pins[nid]; in __alc_build_controls()
2039 u = knew->private_value; in __alc_build_controls()
2058 struct alc_spec *spec = codec->spec; in alc_build_controls()
2062 return snd_hda_jack_add_kctls(codec, &spec->autocfg); in alc_build_controls()
2075 struct alc_spec *spec = codec->spec; in alc_init()
2078 if (codec->vendor_id == 0x10ec0269) in alc_init()
2082 alc_auto_init_amp(codec, spec->init_amp); in alc_init()
2084 for (i = 0; i < spec->num_init_verbs; i++) in alc_init()
2085 snd_hda_sequence_write(codec, spec->init_verbs[i]); in alc_init()
2088 if (spec->init_hook) in alc_init()
2089 spec->init_hook(codec); in alc_init()
2101 struct alc_spec *spec = codec->spec; in alc_unsol_event()
2103 if (spec->unsol_event) in alc_unsol_event()
2104 spec->unsol_event(codec, res); in alc_unsol_event()
2110 struct alc_spec *spec = codec->spec; in alc_check_power_status()
2111 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid); in alc_check_power_status()
2122 struct alc_spec *spec = codec->spec; in alc_playback_pcm_open()
2123 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream, in alc_playback_pcm_open()
2133 struct alc_spec *spec = codec->spec; in alc_playback_pcm_prepare()
2134 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, in alc_playback_pcm_prepare()
2142 struct alc_spec *spec = codec->spec; in alc_playback_pcm_cleanup()
2143 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout); in alc_playback_pcm_cleanup()
2153 struct alc_spec *spec = codec->spec; in alc_dig_playback_pcm_open()
2154 return snd_hda_multi_out_dig_open(codec, &spec->multiout); in alc_dig_playback_pcm_open()
2163 struct alc_spec *spec = codec->spec; in alc_dig_playback_pcm_prepare()
2164 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout, in alc_dig_playback_pcm_prepare()
2172 struct alc_spec *spec = codec->spec; in alc_dig_playback_pcm_cleanup()
2173 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout); in alc_dig_playback_pcm_cleanup()
2180 struct alc_spec *spec = codec->spec; in alc_dig_playback_pcm_close()
2181 return snd_hda_multi_out_dig_close(codec, &spec->multiout); in alc_dig_playback_pcm_close()
2193 struct alc_spec *spec = codec->spec; in alc_alt_capture_pcm_prepare()
2195 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1], in alc_alt_capture_pcm_prepare()
2204 struct alc_spec *spec = codec->spec; in alc_alt_capture_pcm_cleanup()
2207 spec->adc_nids[substream->number + 1]); in alc_alt_capture_pcm_cleanup()
2211 /* analog capture with dynamic dual-adc changes */
2218 struct alc_spec *spec = codec->spec; in dyn_adc_capture_pcm_prepare()
2219 spec->cur_adc = spec->adc_nids[spec->dyn_adc_idx[spec->cur_mux[0]]]; in dyn_adc_capture_pcm_prepare()
2220 spec->cur_adc_stream_tag = stream_tag; in dyn_adc_capture_pcm_prepare()
2221 spec->cur_adc_format = format; in dyn_adc_capture_pcm_prepare()
2222 snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format); in dyn_adc_capture_pcm_prepare()
2230 struct alc_spec *spec = codec->spec; in dyn_adc_capture_pcm_cleanup()
2231 snd_hda_codec_cleanup_stream(codec, spec->cur_adc); in dyn_adc_capture_pcm_cleanup()
2232 spec->cur_adc = 0; in dyn_adc_capture_pcm_cleanup()
2315 struct alc_spec *spec = codec->spec; in alc_build_pcms()
2316 struct hda_pcm *info = spec->pcm_rec; in alc_build_pcms()
2321 codec->num_pcms = 1; in alc_build_pcms()
2322 codec->pcm_info = info; in alc_build_pcms()
2324 if (spec->no_analog) in alc_build_pcms()
2327 snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog), in alc_build_pcms()
2328 "%s Analog", codec->chip_name); in alc_build_pcms()
2329 info->name = spec->stream_name_analog; in alc_build_pcms()
2331 if (spec->multiout.num_dacs > 0) { in alc_build_pcms()
2332 p = spec->stream_analog_playback; in alc_build_pcms()
2335 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p; in alc_build_pcms()
2336 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0]; in alc_build_pcms()
2338 if (spec->adc_nids) { in alc_build_pcms()
2339 p = spec->stream_analog_capture; in alc_build_pcms()
2341 if (spec->dyn_adc_switch) in alc_build_pcms()
2346 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p; in alc_build_pcms()
2347 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0]; in alc_build_pcms()
2350 if (spec->channel_mode) { in alc_build_pcms()
2351 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0; in alc_build_pcms()
2352 for (i = 0; i < spec->num_channel_mode; i++) { in alc_build_pcms()
2353 if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) { in alc_build_pcms()
2354 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels; in alc_build_pcms()
2361 if (spec->multiout.dig_out_nid || spec->dig_in_nid) { in alc_build_pcms()
2362 snprintf(spec->stream_name_digital, in alc_build_pcms()
2363 sizeof(spec->stream_name_digital), in alc_build_pcms()
2364 "%s Digital", codec->chip_name); in alc_build_pcms()
2365 codec->num_pcms = 2; in alc_build_pcms()
2366 codec->slave_dig_outs = spec->multiout.slave_dig_outs; in alc_build_pcms()
2367 info = spec->pcm_rec + 1; in alc_build_pcms()
2368 info->name = spec->stream_name_digital; in alc_build_pcms()
2369 if (spec->dig_out_type) in alc_build_pcms()
2370 info->pcm_type = spec->dig_out_type; in alc_build_pcms()
2372 info->pcm_type = HDA_PCM_TYPE_SPDIF; in alc_build_pcms()
2373 if (spec->multiout.dig_out_nid) { in alc_build_pcms()
2374 p = spec->stream_digital_playback; in alc_build_pcms()
2377 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p; in alc_build_pcms()
2378 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid; in alc_build_pcms()
2380 if (spec->dig_in_nid) { in alc_build_pcms()
2381 p = spec->stream_digital_capture; in alc_build_pcms()
2384 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p; in alc_build_pcms()
2385 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid; in alc_build_pcms()
2388 codec->spdif_status_reset = 1; in alc_build_pcms()
2391 if (spec->no_analog) in alc_build_pcms()
2395 * model, configure a second analog capture-only PCM. in alc_build_pcms()
2397 have_multi_adcs = (spec->num_adc_nids > 1) && in alc_build_pcms()
2398 !spec->dyn_adc_switch && !spec->auto_mic && in alc_build_pcms()
2399 (!spec->input_mux || spec->input_mux->num_items > 1); in alc_build_pcms()
2401 if (spec->alt_dac_nid || have_multi_adcs) { in alc_build_pcms()
2402 codec->num_pcms = 3; in alc_build_pcms()
2403 info = spec->pcm_rec + 2; in alc_build_pcms()
2404 info->name = spec->stream_name_analog; in alc_build_pcms()
2405 if (spec->alt_dac_nid) { in alc_build_pcms()
2406 p = spec->stream_analog_alt_playback; in alc_build_pcms()
2409 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p; in alc_build_pcms()
2410 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = in alc_build_pcms()
2411 spec->alt_dac_nid; in alc_build_pcms()
2413 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = in alc_build_pcms()
2415 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0; in alc_build_pcms()
2418 p = spec->stream_analog_alt_capture; in alc_build_pcms()
2421 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p; in alc_build_pcms()
2422 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = in alc_build_pcms()
2423 spec->adc_nids[1]; in alc_build_pcms()
2424 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = in alc_build_pcms()
2425 spec->num_adc_nids - 1; in alc_build_pcms()
2427 info->stream[SNDRV_PCM_STREAM_CAPTURE] = in alc_build_pcms()
2429 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0; in alc_build_pcms()
2438 struct alc_spec *spec = codec->spec; in alc_shutup()
2440 if (spec && spec->shutup) in alc_shutup()
2441 spec->shutup(codec); in alc_shutup()
2447 struct alc_spec *spec = codec->spec; in alc_free_kctls()
2449 if (spec->kctls.list) { in alc_free_kctls()
2450 struct snd_kcontrol_new *kctl = spec->kctls.list; in alc_free_kctls()
2452 for (i = 0; i < spec->kctls.used; i++) in alc_free_kctls()
2455 snd_array_free(&spec->kctls); in alc_free_kctls()
2460 struct alc_spec *spec = codec->spec; in alc_free_bind_ctls()
2461 if (spec->bind_ctls.list) { in alc_free_bind_ctls()
2462 struct hda_bind_ctls **ctl = spec->bind_ctls.list; in alc_free_bind_ctls()
2464 for (i = 0; i < spec->bind_ctls.used; i++) in alc_free_bind_ctls()
2467 snd_array_free(&spec->bind_ctls); in alc_free_bind_ctls()
2472 struct alc_spec *spec = codec->spec; in alc_free()
2492 struct alc_spec *spec = codec->spec; in alc_suspend()
2494 if (spec && spec->power_hook) in alc_suspend()
2495 spec->power_hook(codec); in alc_suspend()
2504 codec->patch_ops.init(codec); in alc_resume()
2533 kfree(codec->chip_name); in alc_codec_rename()
2534 codec->chip_name = kstrdup(name, GFP_KERNEL); in alc_codec_rename()
2535 if (!codec->chip_name) { in alc_codec_rename()
2537 return -ENOMEM; in alc_codec_rename()
2560 { 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
2561 { 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
2574 for (p = rename_tbl; p->vendor_id; p++) { in alc_codec_rename_from_preset()
2575 if (p->vendor_id != codec->vendor_id) in alc_codec_rename_from_preset()
2577 if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits) in alc_codec_rename_from_preset()
2578 return alc_codec_rename(codec, p->name); in alc_codec_rename_from_preset()
2610 return -ENOMEM; in add_control()
2612 knew->name = kstrdup(name, GFP_KERNEL); in add_control()
2613 if (!knew->name) in add_control()
2614 return -ENOMEM; in add_control()
2615 knew->index = cidx; in add_control()
2617 knew->subdevice = HDA_SUBDEV_AMP_FLAG; in add_control()
2618 knew->private_value = val; in add_control()
2647 struct auto_pin_cfg *cfg = &spec->autocfg; in alc_get_line_out_pfx()
2650 if (cfg->line_outs == 1 && !spec->multi_ios && in alc_get_line_out_pfx()
2651 !cfg->hp_outs && !cfg->speaker_outs && can_be_master) in alc_get_line_out_pfx()
2654 switch (cfg->line_out_type) { in alc_get_line_out_pfx()
2656 if (cfg->line_outs == 1) in alc_get_line_out_pfx()
2658 if (cfg->line_outs == 2) in alc_get_line_out_pfx()
2662 /* for multi-io case, only the primary out */ in alc_get_line_out_pfx()
2663 if (ch && spec->multi_ios) in alc_get_line_out_pfx()
2668 if (cfg->line_outs == 1 && !spec->multi_ios) in alc_get_line_out_pfx()
2705 struct alc_spec *spec = codec->spec; in alc_auto_fill_adc_caps()
2707 hda_nid_t *adc_nids = spec->private_adc_nids; in alc_auto_fill_adc_caps()
2708 hda_nid_t *cap_nids = spec->private_capsrc_nids; in alc_auto_fill_adc_caps()
2709 int max_nums = ARRAY_SIZE(spec->private_adc_nids); in alc_auto_fill_adc_caps()
2712 if (spec->shared_mic_hp) in alc_auto_fill_adc_caps()
2715 nid = codec->start_nid; in alc_auto_fill_adc_caps()
2716 for (i = 0; i < codec->num_nodes; i++, nid++) { in alc_auto_fill_adc_caps()
2747 spec->adc_nids = spec->private_adc_nids; in alc_auto_fill_adc_caps()
2748 spec->capsrc_nids = spec->private_capsrc_nids; in alc_auto_fill_adc_caps()
2749 spec->num_adc_nids = nums; in alc_auto_fill_adc_caps()
2756 struct alc_spec *spec = codec->spec; in alc_auto_create_input_ctls()
2757 const struct auto_pin_cfg *cfg = &spec->autocfg; in alc_auto_create_input_ctls()
2758 hda_nid_t mixer = spec->mixer_nid; in alc_auto_create_input_ctls()
2759 struct hda_input_mux *imux = &spec->private_imux[0]; in alc_auto_create_input_ctls()
2768 for (i = 0; i < cfg->num_inputs; i++) { in alc_auto_create_input_ctls()
2772 pin = cfg->inputs[i].pin; in alc_auto_create_input_ctls()
2777 if (spec->shared_mic_hp && !strcmp(label, "Misc")) in alc_auto_create_input_ctls()
2800 spec->imux_pins[imux->num_items] = pin; in alc_auto_create_input_ctls()
2807 spec->num_mux_defs = 1; in alc_auto_create_input_ctls()
2808 spec->input_mux = imux; in alc_auto_create_input_ctls()
2816 struct alc_spec *spec = codec->spec; in alc_auto_create_shared_input()
2817 struct auto_pin_cfg *cfg = &spec->autocfg; in alc_auto_create_shared_input()
2822 if (cfg->num_inputs != 1) in alc_auto_create_shared_input()
2824 defcfg = snd_hda_codec_get_pincfg(codec, cfg->inputs[0].pin); in alc_auto_create_shared_input()
2828 if (cfg->hp_outs == 1 && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) in alc_auto_create_shared_input()
2829 nid = cfg->hp_pins[0]; /* OK, we have a single HP-out */ in alc_auto_create_shared_input()
2830 else if (cfg->line_outs == 1 && cfg->line_out_type == AUTO_PIN_HP_OUT) in alc_auto_create_shared_input()
2831 nid = cfg->line_out_pins[0]; /* OK, we have a single line-out */ in alc_auto_create_shared_input()
2838 cfg->inputs[1].pin = nid; in alc_auto_create_shared_input()
2839 cfg->inputs[1].type = AUTO_PIN_MIC; in alc_auto_create_shared_input()
2840 cfg->num_inputs = 2; in alc_auto_create_shared_input()
2841 spec->shared_mic_hp = 1; in alc_auto_create_shared_input()
2867 struct alc_spec *spec = codec->spec; in alc_auto_init_analog_input()
2868 struct auto_pin_cfg *cfg = &spec->autocfg; in alc_auto_init_analog_input()
2871 for (i = 0; i < cfg->num_inputs; i++) { in alc_auto_init_analog_input()
2872 hda_nid_t nid = cfg->inputs[i].pin; in alc_auto_init_analog_input()
2874 alc_set_input_pin(codec, nid, cfg->inputs[i].type); in alc_auto_init_analog_input()
2883 if (spec->mixer_nid) { in alc_auto_init_analog_input()
2884 int nums = snd_hda_get_conn_list(codec, spec->mixer_nid, NULL); in alc_auto_init_analog_input()
2886 snd_hda_codec_write(codec, spec->mixer_nid, 0, in alc_auto_init_analog_input()
2960 struct alc_spec *spec = codec->spec; in alc_auto_look_for_dac()
2970 if (found_in_nid_list(nid, spec->multiout.dac_nids, in alc_auto_look_for_dac()
2971 ARRAY_SIZE(spec->private_dac_nids))) in alc_auto_look_for_dac()
2973 if (found_in_nid_list(nid, spec->multiout.hp_out_nid, in alc_auto_look_for_dac()
2974 ARRAY_SIZE(spec->multiout.hp_out_nid))) in alc_auto_look_for_dac()
2976 if (found_in_nid_list(nid, spec->multiout.extra_out_nid, in alc_auto_look_for_dac()
2977 ARRAY_SIZE(spec->multiout.extra_out_nid))) in alc_auto_look_for_dac()
3038 struct alc_spec *spec = codec->spec; in alc_auto_fill_dac_nids()
3039 struct auto_pin_cfg *cfg = &spec->autocfg; in alc_auto_fill_dac_nids()
3047 spec->multiout.num_dacs = cfg->line_outs; in alc_auto_fill_dac_nids()
3048 spec->multiout.hp_out_nid[0] = 0; in alc_auto_fill_dac_nids()
3049 spec->multiout.extra_out_nid[0] = 0; in alc_auto_fill_dac_nids()
3050 memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids)); in alc_auto_fill_dac_nids()
3051 spec->multiout.dac_nids = spec->private_dac_nids; in alc_auto_fill_dac_nids()
3052 spec->multi_ios = 0; in alc_auto_fill_dac_nids()
3054 /* fill hard-wired DACs first */ in alc_auto_fill_dac_nids()
3056 for (i = 0; i < cfg->line_outs; i++) in alc_auto_fill_dac_nids()
3057 spec->private_dac_nids[i] = in alc_auto_fill_dac_nids()
3058 get_dac_if_single(codec, cfg->line_out_pins[i]); in alc_auto_fill_dac_nids()
3059 if (cfg->hp_outs) in alc_auto_fill_dac_nids()
3060 spec->multiout.hp_out_nid[0] = in alc_auto_fill_dac_nids()
3061 get_dac_if_single(codec, cfg->hp_pins[0]); in alc_auto_fill_dac_nids()
3062 if (cfg->speaker_outs) in alc_auto_fill_dac_nids()
3063 spec->multiout.extra_out_nid[0] = in alc_auto_fill_dac_nids()
3064 get_dac_if_single(codec, cfg->speaker_pins[0]); in alc_auto_fill_dac_nids()
3067 for (i = 0; i < cfg->line_outs; i++) { in alc_auto_fill_dac_nids()
3068 hda_nid_t pin = cfg->line_out_pins[i]; in alc_auto_fill_dac_nids()
3069 if (spec->private_dac_nids[i]) in alc_auto_fill_dac_nids()
3071 spec->private_dac_nids[i] = alc_auto_look_for_dac(codec, pin); in alc_auto_fill_dac_nids()
3072 if (!spec->private_dac_nids[i] && !redone) { in alc_auto_fill_dac_nids()
3073 /* if we can't find primary DACs, re-probe without in alc_auto_fill_dac_nids()
3074 * checking the hard-wired DACs in alc_auto_fill_dac_nids()
3081 /* re-count num_dacs and squash invalid entries */ in alc_auto_fill_dac_nids()
3082 spec->multiout.num_dacs = 0; in alc_auto_fill_dac_nids()
3083 for (i = 0; i < cfg->line_outs; i++) { in alc_auto_fill_dac_nids()
3084 if (spec->private_dac_nids[i]) in alc_auto_fill_dac_nids()
3085 spec->multiout.num_dacs++; in alc_auto_fill_dac_nids()
3087 memmove(spec->private_dac_nids + i, in alc_auto_fill_dac_nids()
3088 spec->private_dac_nids + i + 1, in alc_auto_fill_dac_nids()
3089 sizeof(hda_nid_t) * (cfg->line_outs - i - 1)); in alc_auto_fill_dac_nids()
3090 spec->private_dac_nids[cfg->line_outs - 1] = 0; in alc_auto_fill_dac_nids()
3094 if (cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { in alc_auto_fill_dac_nids()
3095 /* try to fill multi-io first */ in alc_auto_fill_dac_nids()
3096 defcfg = snd_hda_codec_get_pincfg(codec, cfg->line_out_pins[0]); in alc_auto_fill_dac_nids()
3101 spec->multi_ios = num_pins; in alc_auto_fill_dac_nids()
3102 spec->ext_channel_count = 2; in alc_auto_fill_dac_nids()
3103 spec->multiout.num_dacs = num_pins + 1; in alc_auto_fill_dac_nids()
3107 if (cfg->line_out_type != AUTO_PIN_HP_OUT) in alc_auto_fill_dac_nids()
3108 alc_auto_fill_extra_dacs(codec, cfg->hp_outs, cfg->hp_pins, in alc_auto_fill_dac_nids()
3109 spec->multiout.hp_out_nid); in alc_auto_fill_dac_nids()
3110 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { in alc_auto_fill_dac_nids()
3111 int err = alc_auto_fill_extra_dacs(codec, cfg->speaker_outs, in alc_auto_fill_dac_nids()
3112 cfg->speaker_pins, in alc_auto_fill_dac_nids()
3113 spec->multiout.extra_out_nid); in alc_auto_fill_dac_nids()
3117 if (!err && cfg->speaker_outs > 0 && in alc_auto_fill_dac_nids()
3118 cfg->line_out_type == AUTO_PIN_HP_OUT) { in alc_auto_fill_dac_nids()
3119 cfg->hp_outs = cfg->line_outs; in alc_auto_fill_dac_nids()
3120 memcpy(cfg->hp_pins, cfg->line_out_pins, in alc_auto_fill_dac_nids()
3121 sizeof(cfg->hp_pins)); in alc_auto_fill_dac_nids()
3122 cfg->line_outs = cfg->speaker_outs; in alc_auto_fill_dac_nids()
3123 memcpy(cfg->line_out_pins, cfg->speaker_pins, in alc_auto_fill_dac_nids()
3124 sizeof(cfg->speaker_pins)); in alc_auto_fill_dac_nids()
3125 cfg->speaker_outs = 0; in alc_auto_fill_dac_nids()
3126 memset(cfg->speaker_pins, 0, sizeof(cfg->speaker_pins)); in alc_auto_fill_dac_nids()
3127 cfg->line_out_type = AUTO_PIN_SPEAKER_OUT; in alc_auto_fill_dac_nids()
3133 if (!spec->multi_ios && in alc_auto_fill_dac_nids()
3134 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT && in alc_auto_fill_dac_nids()
3135 cfg->hp_outs) { in alc_auto_fill_dac_nids()
3136 /* try multi-ios with HP + inputs */ in alc_auto_fill_dac_nids()
3137 defcfg = snd_hda_codec_get_pincfg(codec, cfg->hp_pins[0]); in alc_auto_fill_dac_nids()
3142 spec->multi_ios = num_pins; in alc_auto_fill_dac_nids()
3143 spec->ext_channel_count = 2; in alc_auto_fill_dac_nids()
3144 spec->multiout.num_dacs = num_pins + 1; in alc_auto_fill_dac_nids()
3148 if (cfg->line_out_pins[0]) in alc_auto_fill_dac_nids()
3149 spec->vmaster_nid = in alc_auto_fill_dac_nids()
3150 alc_look_for_out_vol_nid(codec, cfg->line_out_pins[0], in alc_auto_fill_dac_nids()
3151 spec->multiout.dac_nids[0]); in alc_auto_fill_dac_nids()
3174 struct alc_spec *spec = codec->spec; in alc_auto_add_vol_ctl()
3179 if (is_ctl_used(spec->vol_ctls, val) && chs != 2) /* exclude LFE */ in alc_auto_add_vol_ctl()
3181 mark_ctl_usage(spec->vol_ctls, val); in alc_auto_add_vol_ctl()
3182 return __add_pb_vol_ctrl(codec->spec, ALC_CTL_WIDGET_VOL, pfx, cidx, in alc_auto_add_vol_ctl()
3196 /* create a mute-switch for the given mixer widget;
3197 * if it has multiple sources (e.g. DAC and loopback), create a bind-mute
3203 struct alc_spec *spec = codec->spec; in alc_auto_add_sw_ctl()
3220 if (is_ctl_used(spec->sw_ctls, val) && chs != 2) /* exclude LFE */ in alc_auto_add_sw_ctl()
3222 mark_ctl_usage(spec->sw_ctls, val); in alc_auto_add_sw_ctl()
3223 return __add_pb_sw_ctrl(codec->spec, type, pfx, cidx, val); in alc_auto_add_sw_ctl()
3265 struct alc_spec *spec = codec->spec; in alc_auto_create_multi_out_ctls()
3268 noutputs = cfg->line_outs; in alc_auto_create_multi_out_ctls()
3269 if (spec->multi_ios > 0 && cfg->line_outs < 3) in alc_auto_create_multi_out_ctls()
3270 noutputs += spec->multi_ios; in alc_auto_create_multi_out_ctls()
3278 dac = spec->multiout.dac_nids[i]; in alc_auto_create_multi_out_ctls()
3281 if (i >= cfg->line_outs) in alc_auto_create_multi_out_ctls()
3282 pin = spec->multi_io[i - 1].pin; in alc_auto_create_multi_out_ctls()
3284 pin = cfg->line_out_pins[i]; in alc_auto_create_multi_out_ctls()
3319 struct alc_spec *spec = codec->spec; in alc_auto_create_extra_out()
3330 if (is_ctl_used(spec->sw_ctls, val)) in alc_auto_create_extra_out()
3332 mark_ctl_usage(spec->sw_ctls, val); in alc_auto_create_extra_out()
3351 struct alc_spec *spec = codec->spec; in new_bind_ctl()
3353 snd_array_init(&spec->bind_ctls, sizeof(ctl), 8); in new_bind_ctl()
3354 ctlp = snd_array_new(&spec->bind_ctls); in new_bind_ctl()
3360 ctl->ops = ops; in new_bind_ctl()
3370 struct alc_spec *spec = codec->spec; in alc_auto_create_extra_outs()
3381 dac = spec->multiout.dac_nids[0]; in alc_auto_create_extra_outs()
3385 if (dacs[num_pins - 1]) { in alc_auto_create_extra_outs()
3386 /* OK, we have a multi-output system with individual volumes */ in alc_auto_create_extra_outs()
3403 /* Let's create a bind-controls */ in alc_auto_create_extra_outs()
3406 return -ENOMEM; in alc_auto_create_extra_outs()
3410 ctl->values[n++] = in alc_auto_create_extra_outs()
3422 return -ENOMEM; in alc_auto_create_extra_outs()
3430 ctl->values[n++] = in alc_auto_create_extra_outs()
3444 struct alc_spec *spec = codec->spec; in alc_auto_create_hp_out()
3445 return alc_auto_create_extra_outs(codec, spec->autocfg.hp_outs, in alc_auto_create_hp_out()
3446 spec->autocfg.hp_pins, in alc_auto_create_hp_out()
3447 spec->multiout.hp_out_nid, in alc_auto_create_hp_out()
3453 struct alc_spec *spec = codec->spec; in alc_auto_create_speaker_out()
3454 return alc_auto_create_extra_outs(codec, spec->autocfg.speaker_outs, in alc_auto_create_speaker_out()
3455 spec->autocfg.speaker_pins, in alc_auto_create_speaker_out()
3456 spec->multiout.extra_out_nid, in alc_auto_create_speaker_out()
3505 struct alc_spec *spec = codec->spec; in alc_auto_init_multi_out()
3506 int pin_type = get_pin_type(spec->autocfg.line_out_type); in alc_auto_init_multi_out()
3510 hda_nid_t nid = spec->autocfg.line_out_pins[i]; in alc_auto_init_multi_out()
3513 spec->multiout.dac_nids[i]); in alc_auto_init_multi_out()
3519 struct alc_spec *spec = codec->spec; in alc_auto_init_extra_out()
3523 for (i = 0; i < spec->autocfg.hp_outs; i++) { in alc_auto_init_extra_out()
3524 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT) in alc_auto_init_extra_out()
3526 pin = spec->autocfg.hp_pins[i]; in alc_auto_init_extra_out()
3529 dac = spec->multiout.hp_out_nid[i]; in alc_auto_init_extra_out()
3531 if (i > 0 && spec->multiout.hp_out_nid[0]) in alc_auto_init_extra_out()
3532 dac = spec->multiout.hp_out_nid[0]; in alc_auto_init_extra_out()
3534 dac = spec->multiout.dac_nids[0]; in alc_auto_init_extra_out()
3538 for (i = 0; i < spec->autocfg.speaker_outs; i++) { in alc_auto_init_extra_out()
3539 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT) in alc_auto_init_extra_out()
3541 pin = spec->autocfg.speaker_pins[i]; in alc_auto_init_extra_out()
3544 dac = spec->multiout.extra_out_nid[i]; in alc_auto_init_extra_out()
3546 if (i > 0 && spec->multiout.extra_out_nid[0]) in alc_auto_init_extra_out()
3547 dac = spec->multiout.extra_out_nid[0]; in alc_auto_init_extra_out()
3549 dac = spec->multiout.dac_nids[0]; in alc_auto_init_extra_out()
3556 * multi-io helper
3562 struct alc_spec *spec = codec->spec; in alc_auto_fill_multi_ios()
3563 struct auto_pin_cfg *cfg = &spec->autocfg; in alc_auto_fill_multi_ios()
3564 hda_nid_t prime_dac = spec->private_dac_nids[0]; in alc_auto_fill_multi_ios()
3567 dacs = spec->multiout.num_dacs; in alc_auto_fill_multi_ios()
3568 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) { in alc_auto_fill_multi_ios()
3569 for (i = 0; i < cfg->num_inputs; i++) { in alc_auto_fill_multi_ios()
3570 hda_nid_t nid = cfg->inputs[i].pin; in alc_auto_fill_multi_ios()
3573 if (cfg->inputs[i].type != type) in alc_auto_fill_multi_ios()
3584 dac = spec->private_dac_nids[offset + num_pins]; in alc_auto_fill_multi_ios()
3592 spec->multi_io[num_pins].pin = nid; in alc_auto_fill_multi_ios()
3593 spec->multi_io[num_pins].dac = dac; in alc_auto_fill_multi_ios()
3595 spec->private_dac_nids[spec->multiout.num_dacs++] = dac; in alc_auto_fill_multi_ios()
3598 spec->multiout.num_dacs = dacs; in alc_auto_fill_multi_ios()
3601 memset(spec->private_dac_nids + dacs, 0, in alc_auto_fill_multi_ios()
3602 sizeof(hda_nid_t) * (AUTO_CFG_MAX_OUTS - dacs)); in alc_auto_fill_multi_ios()
3603 spec->private_dac_nids[0] = prime_dac; in alc_auto_fill_multi_ios()
3613 struct alc_spec *spec = codec->spec; in alc_auto_ch_mode_info()
3615 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; in alc_auto_ch_mode_info()
3616 uinfo->count = 1; in alc_auto_ch_mode_info()
3617 uinfo->value.enumerated.items = spec->multi_ios + 1; in alc_auto_ch_mode_info()
3618 if (uinfo->value.enumerated.item > spec->multi_ios) in alc_auto_ch_mode_info()
3619 uinfo->value.enumerated.item = spec->multi_ios; in alc_auto_ch_mode_info()
3620 sprintf(uinfo->value.enumerated.name, "%dch", in alc_auto_ch_mode_info()
3621 (uinfo->value.enumerated.item + 1) * 2); in alc_auto_ch_mode_info()
3629 struct alc_spec *spec = codec->spec; in alc_auto_ch_mode_get()
3630 ucontrol->value.enumerated.item[0] = (spec->ext_channel_count - 1) / 2; in alc_auto_ch_mode_get()
3636 struct alc_spec *spec = codec->spec; in alc_set_multi_io()
3637 hda_nid_t nid = spec->multi_io[idx].pin; in alc_set_multi_io()
3639 if (!spec->multi_io[idx].ctl_in) in alc_set_multi_io()
3640 spec->multi_io[idx].ctl_in = in alc_set_multi_io()
3650 alc_auto_select_dac(codec, nid, spec->multi_io[idx].dac); in alc_set_multi_io()
3657 spec->multi_io[idx].ctl_in); in alc_set_multi_io()
3666 struct alc_spec *spec = codec->spec; in alc_auto_ch_mode_put()
3669 ch = ucontrol->value.enumerated.item[0]; in alc_auto_ch_mode_put()
3670 if (ch < 0 || ch > spec->multi_ios) in alc_auto_ch_mode_put()
3671 return -EINVAL; in alc_auto_ch_mode_put()
3672 if (ch == (spec->ext_channel_count - 1) / 2) in alc_auto_ch_mode_put()
3674 spec->ext_channel_count = (ch + 1) * 2; in alc_auto_ch_mode_put()
3675 for (i = 0; i < spec->multi_ios; i++) in alc_auto_ch_mode_put()
3677 spec->multiout.max_channels = spec->ext_channel_count; in alc_auto_ch_mode_put()
3678 if (spec->need_dac_fix && !spec->const_channel_count) in alc_auto_ch_mode_put()
3679 spec->multiout.num_dacs = spec->multiout.max_channels / 2; in alc_auto_ch_mode_put()
3693 struct alc_spec *spec = codec->spec; in alc_auto_add_multi_channel_mode()
3695 if (spec->multi_ios > 0) { in alc_auto_add_multi_channel_mode()
3700 return -ENOMEM; in alc_auto_add_multi_channel_mode()
3702 knew->name = kstrdup("Channel Mode", GFP_KERNEL); in alc_auto_add_multi_channel_mode()
3703 if (!knew->name) in alc_auto_add_multi_channel_mode()
3704 return -ENOMEM; in alc_auto_add_multi_channel_mode()
3714 struct alc_spec *spec = codec->spec; in alc_remove_invalid_adc_nids()
3716 hda_nid_t adc_nids[ARRAY_SIZE(spec->private_adc_nids)]; in alc_remove_invalid_adc_nids()
3717 hda_nid_t capsrc_nids[ARRAY_SIZE(spec->private_adc_nids)]; in alc_remove_invalid_adc_nids()
3720 imux = spec->input_mux; in alc_remove_invalid_adc_nids()
3723 if (spec->dyn_adc_switch) in alc_remove_invalid_adc_nids()
3727 for (n = 0; n < spec->num_adc_nids; n++) { in alc_remove_invalid_adc_nids()
3728 hda_nid_t cap = spec->private_capsrc_nids[n]; in alc_remove_invalid_adc_nids()
3730 for (i = 0; i < imux->num_items; i++) { in alc_remove_invalid_adc_nids()
3731 hda_nid_t pin = spec->imux_pins[i]; in alc_remove_invalid_adc_nids()
3735 } else if (num_conns <= imux->items[i].index) in alc_remove_invalid_adc_nids()
3738 if (i >= imux->num_items) { in alc_remove_invalid_adc_nids()
3739 adc_nids[nums] = spec->private_adc_nids[n]; in alc_remove_invalid_adc_nids()
3744 /* check whether ADC-switch is possible */ in alc_remove_invalid_adc_nids()
3748 codec->chip_name, spec->private_adc_nids[0]); in alc_remove_invalid_adc_nids()
3749 spec->num_adc_nids = 1; in alc_remove_invalid_adc_nids()
3750 spec->auto_mic = 0; in alc_remove_invalid_adc_nids()
3753 } else if (nums != spec->num_adc_nids) { in alc_remove_invalid_adc_nids()
3754 memcpy(spec->private_adc_nids, adc_nids, in alc_remove_invalid_adc_nids()
3756 memcpy(spec->private_capsrc_nids, capsrc_nids, in alc_remove_invalid_adc_nids()
3758 spec->num_adc_nids = nums; in alc_remove_invalid_adc_nids()
3761 if (spec->auto_mic) in alc_remove_invalid_adc_nids()
3762 alc_auto_mic_check_imux(codec); /* check auto-mic setups */ in alc_remove_invalid_adc_nids()
3763 else if (spec->input_mux->num_items == 1) in alc_remove_invalid_adc_nids()
3764 spec->num_adc_nids = 1; /* reduce to a single ADC */ in alc_remove_invalid_adc_nids()
3772 struct alc_spec *spec = codec->spec; in alc_auto_init_adc()
3775 nid = spec->adc_nids[adc_idx]; in alc_auto_init_adc()
3783 if (!spec->capsrc_nids) in alc_auto_init_adc()
3785 nid = spec->capsrc_nids[adc_idx]; in alc_auto_init_adc()
3794 struct alc_spec *spec = codec->spec; in alc_auto_init_input_src()
3797 for (c = 0; c < spec->num_adc_nids; c++) in alc_auto_init_input_src()
3799 if (spec->dyn_adc_switch) in alc_auto_init_input_src()
3802 nums = spec->num_adc_nids; in alc_auto_init_input_src()
3804 alc_mux_select(codec, c, spec->cur_mux[c], true); in alc_auto_init_input_src()
3810 struct alc_spec *spec = codec->spec; in alc_auto_add_mic_boost()
3811 struct auto_pin_cfg *cfg = &spec->autocfg; in alc_auto_add_mic_boost()
3817 for (i = 0; i < cfg->num_inputs; i++) { in alc_auto_add_mic_boost()
3818 if (cfg->inputs[i].type > AUTO_PIN_MIC) in alc_auto_add_mic_boost()
3820 nid = cfg->inputs[i].pin; in alc_auto_add_mic_boost()
3826 if (spec->shared_mic_hp && !strcmp(label, "Misc")) in alc_auto_add_mic_boost()
3862 struct alc_spec *spec = codec->spec; in init_capsrc_for_pin()
3867 for (i = 0; i < spec->num_adc_nids; i++) { in init_capsrc_for_pin()
3877 return -1; /* not found */ in init_capsrc_for_pin()
3883 struct alc_spec *spec = codec->spec; in alc_init_special_input_src()
3886 for (i = 0; i < spec->autocfg.num_inputs; i++) in alc_init_special_input_src()
3887 init_capsrc_for_pin(codec, spec->autocfg.inputs[i].pin); in alc_init_special_input_src()
3893 struct alc_spec *spec = codec->spec; in set_capture_mixer()
3904 if (!nid_has_volume(codec, spec->adc_nids[0], HDA_INPUT)) { in set_capture_mixer()
3905 if (!spec->capsrc_nids) in set_capture_mixer()
3907 if (!nid_has_volume(codec, spec->capsrc_nids[0], HDA_OUTPUT)) in set_capture_mixer()
3909 spec->vol_in_capsrc = 1; in set_capture_mixer()
3912 if (spec->num_adc_nids > 0) { in set_capture_mixer()
3916 if (spec->input_mux && spec->input_mux->num_items > 1) in set_capture_mixer()
3918 if (spec->auto_mic) { in set_capture_mixer()
3921 } else if (spec->dyn_adc_switch) in set_capture_mixer()
3924 if (spec->num_adc_nids > 3) in set_capture_mixer()
3925 spec->num_adc_nids = 3; in set_capture_mixer()
3926 else if (!spec->num_adc_nids) in set_capture_mixer()
3928 num_adcs = spec->num_adc_nids; in set_capture_mixer()
3930 spec->cap_mixer = caps[mux][num_adcs - 1]; in set_capture_mixer()
3935 * standard auto-parser initializations
3939 struct alc_spec *spec = codec->spec; in alc_auto_init_std()
3945 if (spec->unsol_event) in alc_auto_init_std()
3950 * Digital-beep handlers
3954 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
3967 struct alc_spec *spec = codec->spec; in has_cdefine_beep()
3969 q = snd_pci_quirk_lookup(codec->bus->pci, beep_white_list); in has_cdefine_beep()
3971 return q->value; in has_cdefine_beep()
3972 return spec->cdefine.enable_pcbeep; in has_cdefine_beep()
3987 struct alc_spec *spec = codec->spec; in alc_parse_auto_config()
3988 struct auto_pin_cfg *cfg = &spec->autocfg; in alc_parse_auto_config()
3992 spec->parse_flags); in alc_parse_auto_config()
3995 if (!cfg->line_outs) { in alc_parse_auto_config()
3996 if (cfg->dig_outs || cfg->dig_in_pin) { in alc_parse_auto_config()
3997 spec->multiout.max_channels = 2; in alc_parse_auto_config()
3998 spec->no_analog = 1; in alc_parse_auto_config()
4004 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT && in alc_parse_auto_config()
4005 cfg->line_outs <= cfg->hp_outs) { in alc_parse_auto_config()
4007 cfg->speaker_outs = cfg->line_outs; in alc_parse_auto_config()
4008 memcpy(cfg->speaker_pins, cfg->line_out_pins, in alc_parse_auto_config()
4009 sizeof(cfg->speaker_pins)); in alc_parse_auto_config()
4010 cfg->line_outs = cfg->hp_outs; in alc_parse_auto_config()
4011 memcpy(cfg->line_out_pins, cfg->hp_pins, sizeof(cfg->hp_pins)); in alc_parse_auto_config()
4012 cfg->hp_outs = 0; in alc_parse_auto_config()
4013 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins)); in alc_parse_auto_config()
4014 cfg->line_out_type = AUTO_PIN_HP_OUT; in alc_parse_auto_config()
4039 spec->multiout.max_channels = spec->multiout.num_dacs * 2; in alc_parse_auto_config()
4044 if (!spec->no_analog) in alc_parse_auto_config()
4050 if (!spec->no_analog) { in alc_parse_auto_config()
4057 if (spec->kctls.list) in alc_parse_auto_config()
4058 add_mixer(spec, spec->kctls.list); in alc_parse_auto_config()
4082 * ALC880 fix-ups
4122 #define alc_board_config(codec, nums, models, tbl) -1
4123 #define alc_board_codec_sid_config(codec, nums, models, tbl) -1
4142 return -ENOMEM; in patch_alc880()
4144 codec->spec = spec; in patch_alc880()
4146 spec->mixer_nid = 0x0b; in patch_alc880()
4147 spec->need_dac_fix = 1; in patch_alc880()
4152 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", in patch_alc880()
4153 codec->chip_name); in patch_alc880()
4171 "from BIOS. Using 3-stack mode...\n"); in patch_alc880()
4178 spec->vmaster_nid = 0x0c; in patch_alc880()
4182 if (!spec->no_analog && !spec->adc_nids) { in patch_alc880()
4188 if (!spec->no_analog && !spec->cap_mixer) in patch_alc880()
4191 if (!spec->no_analog) { in patch_alc880()
4200 codec->patch_ops = alc_patch_ops; in patch_alc880()
4202 spec->init_hook = alc_auto_init_std; in patch_alc880()
4204 codec->patch_ops.build_controls = __alc_build_controls; in patch_alc880()
4206 if (!spec->loopback.amplist) in patch_alc880()
4207 spec->loopback.amplist = alc880_loopbacks; in patch_alc880()
4274 return -ENOMEM; in patch_alc260()
4276 codec->spec = spec; in patch_alc260()
4278 spec->mixer_nid = 0x07; in patch_alc260()
4283 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", in patch_alc260()
4284 codec->chip_name); in patch_alc260()
4310 spec->vmaster_nid = 0x08; in patch_alc260()
4313 if (!spec->no_analog && !spec->adc_nids) { in patch_alc260()
4319 if (!spec->no_analog && !spec->cap_mixer) in patch_alc260()
4322 if (!spec->no_analog) { in patch_alc260()
4331 codec->patch_ops = alc_patch_ops; in patch_alc260()
4333 spec->init_hook = alc_auto_init_std; in patch_alc260()
4335 codec->patch_ops.build_controls = __alc_build_controls; in patch_alc260()
4336 spec->shutup = alc_eapd_shutup; in patch_alc260()
4338 if (!spec->loopback.amplist) in patch_alc260()
4339 spec->loopback.amplist = alc260_loopbacks; in patch_alc260()
4356 * 6-channel independent captures.
4358 * In addition, an independent DAC for the multi-playback (not used in this
4398 /* toggle speaker-output according to the hp-jack state */
4403 gpiostate = snd_hda_codec_read(codec, codec->afg, 0, in alc882_gpio_mute()
4411 gpiomask = snd_hda_codec_read(codec, codec->afg, 0, in alc882_gpio_mute()
4415 gpiodir = snd_hda_codec_read(codec, codec->afg, 0, in alc882_gpio_mute()
4420 snd_hda_codec_write(codec, codec->afg, 0, in alc882_gpio_mute()
4422 snd_hda_codec_write(codec, codec->afg, 0, in alc882_gpio_mute()
4427 snd_hda_codec_write(codec, codec->afg, 0, in alc882_gpio_mute()
4589 /* setting bits 1-5 disables DAC nids 0x02-0x06
4598 /* DMIC fix
4647 SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
4665 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3", ALC889_FIXUP_CD),
4666 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
4698 return -ENOMEM; in patch_alc882()
4700 codec->spec = spec; in patch_alc882()
4702 spec->mixer_nid = 0x0b; in patch_alc882()
4704 switch (codec->vendor_id) { in patch_alc882()
4725 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", in patch_alc882()
4726 codec->chip_name); in patch_alc882()
4746 spec->vmaster_nid = 0x0c; in patch_alc882()
4749 if (!spec->no_analog && !spec->adc_nids) { in patch_alc882()
4755 if (!spec->no_analog && !spec->cap_mixer) in patch_alc882()
4758 if (!spec->no_analog && has_cdefine_beep(codec)) { in patch_alc882()
4767 codec->patch_ops = alc_patch_ops; in patch_alc882()
4769 spec->init_hook = alc_auto_init_std; in patch_alc882()
4771 codec->patch_ops.build_controls = __alc_build_controls; in patch_alc882()
4774 if (!spec->loopback.amplist) in patch_alc882()
4775 spec->loopback.amplist = alc882_loopbacks; in patch_alc882()
4867 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
4885 return -ENOMEM; in patch_alc262()
4887 codec->spec = spec; in patch_alc262()
4889 spec->mixer_nid = 0x0b; in patch_alc262()
4892 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is in patch_alc262()
4893 * under-run in patch_alc262()
4915 if (!spec->no_analog && !spec->adc_nids) { in patch_alc262()
4921 if (!spec->no_analog && !spec->cap_mixer) in patch_alc262()
4924 if (!spec->no_analog && has_cdefine_beep(codec)) { in patch_alc262()
4933 codec->patch_ops = alc_patch_ops; in patch_alc262()
4934 spec->init_hook = alc_auto_init_std; in patch_alc262()
4935 spec->shutup = alc_eapd_shutup; in patch_alc262()
4938 if (!spec->loopback.amplist) in patch_alc262()
4939 spec->loopback.amplist = alc262_loopbacks; in patch_alc262()
4982 struct alc_spec *spec = codec->spec; in alc268_parse_auto_config()
4985 if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d) { in alc268_parse_auto_config()
5002 return -ENOMEM; in patch_alc268()
5004 codec->spec = spec; in patch_alc268()
5006 /* ALC268 has no aa-loopback mixer */ in patch_alc268()
5014 for (i = 0; i < spec->num_mixers; i++) { in patch_alc268()
5015 if (spec->mixers[i] == alc268_beep_mixer) { in patch_alc268()
5034 if (!spec->no_analog && !spec->adc_nids) { in patch_alc268()
5040 if (!spec->no_analog && !spec->cap_mixer) in patch_alc268()
5043 codec->patch_ops = alc_patch_ops; in patch_alc268()
5044 spec->init_hook = alc_auto_init_std; in patch_alc268()
5045 spec->shutup = alc_eapd_shutup; in patch_alc268()
5065 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
5078 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
5085 switch (codec->subsystem_id) { in alc269_mic2_for_mute_led()
5094 /* update mute-LED according to the speaker mute state */ in alc269_mic2_mute_check_ps()
5111 /* different alc269-variants */
5126 struct alc_spec *spec = codec->spec; in alc269_parse_auto_config()
5127 const hda_nid_t *ssids = spec->codec_variant == ALC269_TYPE_ALC269VA ? in alc269_parse_auto_config()
5161 codec->patch_ops.init(codec); in alc269_resume()
5199 if (strcmp(codec->chip_name, "ALC271X")) in alc271_fixup_dmic()
5209 struct alc_spec *spec = codec->spec; in alc269_fixup_pcm_44k()
5215 * fix the sample rate of analog I/O to 44.1kHz in alc269_fixup_pcm_44k()
5217 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback; in alc269_fixup_pcm_44k()
5218 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture; in alc269_fixup_pcm_44k()
5228 /* The digital-mic unit sends PDM (differential signal) instead of in alc269_fixup_stereo_dmic()
5230 * Below is a workaround specific to ALC269 to control the dmic in alc269_fixup_stereo_dmic()
5255 struct alc_spec *spec = codec->spec; in alc269_fixup_quanta_mute()
5258 spec->automute_hook = alc269_quanta_automute; in alc269_fixup_quanta_mute()
5351 { 0x1a, 0x2101103f }, /* dock line-out */
5352 { 0x1b, 0x23a11040 }, /* dock mic-in */
5364 { 0x19, 0x99a3092f }, /* int-mic */
5371 { 0x12, 0x99a3092f }, /* int-mic */
5383 { 0x19, 0x99a3092f }, /* int-mic */
5391 { 0x12, 0x99a3092f }, /* int-mic */
5475 {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
5476 {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
5483 struct alc_spec *spec = codec->spec; in alc269_fill_coef()
5486 if (spec->codec_variant != ALC269_TYPE_ALC269VB) in alc269_fill_coef()
5536 return -ENOMEM; in patch_alc269()
5538 codec->spec = spec; in patch_alc269()
5540 spec->mixer_nid = 0x0b; in patch_alc269()
5548 if (codec->vendor_id == 0x10ec0269) { in patch_alc269()
5549 spec->codec_variant = ALC269_TYPE_ALC269VA; in patch_alc269()
5552 if (codec->bus->pci->subsystem_vendor == 0x1025 && in patch_alc269()
5553 spec->cdefine.platform_type == 1) in patch_alc269()
5555 spec->codec_variant = ALC269_TYPE_ALC269VB; in patch_alc269()
5558 if (codec->bus->pci->subsystem_vendor == 0x17aa && in patch_alc269()
5559 codec->bus->pci->subsystem_device == 0x21f3) in patch_alc269()
5561 spec->codec_variant = ALC269_TYPE_ALC269VC; in patch_alc269()
5580 if (!spec->no_analog && !spec->adc_nids) { in patch_alc269()
5586 if (!spec->no_analog && !spec->cap_mixer) in patch_alc269()
5589 if (!spec->no_analog && has_cdefine_beep(codec)) { in patch_alc269()
5598 codec->patch_ops = alc_patch_ops; in patch_alc269()
5600 codec->patch_ops.resume = alc269_resume; in patch_alc269()
5602 spec->init_hook = alc_auto_init_std; in patch_alc269()
5603 spec->shutup = alc269_shutup; in patch_alc269()
5606 if (!spec->loopback.amplist) in patch_alc269()
5607 spec->loopback.amplist = alc269_loopbacks; in patch_alc269()
5609 codec->patch_ops.check_power_status = alc269_mic2_mute_check_ps; in patch_alc269()
5651 struct alc_spec *spec = codec->spec; in alc861_fixup_asus_amp_vref_0f()
5663 spec->keep_vref_in_automute = 1; in alc861_fixup_asus_amp_vref_0f()
5698 return -ENOMEM; in patch_alc861()
5700 codec->spec = spec; in patch_alc861()
5702 spec->mixer_nid = 0x15; in patch_alc861()
5712 if (!spec->no_analog && !spec->adc_nids) { in patch_alc861()
5718 if (!spec->no_analog && !spec->cap_mixer) in patch_alc861()
5721 if (!spec->no_analog) { in patch_alc861()
5730 codec->patch_ops = alc_patch_ops; in patch_alc861()
5731 spec->init_hook = alc_auto_init_std; in patch_alc861()
5733 spec->power_hook = alc_power_eapd; in patch_alc861()
5734 if (!spec->loopback.amplist) in patch_alc861()
5735 spec->loopback.amplist = alc861_loopbacks; in patch_alc861()
5746 * ALC861-VD support
5797 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
5798 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
5817 return -ENOMEM; in patch_alc861vd()
5819 codec->spec = spec; in patch_alc861vd()
5821 spec->mixer_nid = 0x0b; in patch_alc861vd()
5831 if (codec->vendor_id == 0x10ec0660) { in patch_alc861vd()
5836 if (!spec->no_analog && !spec->adc_nids) { in patch_alc861vd()
5842 if (!spec->no_analog && !spec->cap_mixer) in patch_alc861vd()
5845 if (!spec->no_analog) { in patch_alc861vd()
5854 codec->patch_ops = alc_patch_ops; in patch_alc861vd()
5856 spec->init_hook = alc_auto_init_std; in patch_alc861vd()
5857 spec->shutup = alc_eapd_shutup; in patch_alc861vd()
5859 if (!spec->loopback.amplist) in patch_alc861vd()
5860 spec->loopback.amplist = alc861vd_loopbacks; in patch_alc861vd()
5876 * 6-channel independent captures.
5878 * In addition, an independent DAC for the multi-playback (not used in this
5896 if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 || in alc662_parse_auto_config()
5897 codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670) in alc662_parse_auto_config()
5979 { 0x19, 0x99a3092f }, /* int-mic */
5991 { 0x19, 0x99a3092f }, /* int-mic */
6004 { 0x19, 0x99a3094f }, /* int-mic */
6017 { 0x19, 0x99a3094f }, /* int-mic */
6031 { 0x19, 0x99a3094f }, /* int-mic */
6043 { 0x19, 0x99a3094f }, /* int-mic */
6056 { 0x19, 0x99a3094f }, /* int-mic */
6068 { 0x12, 0x99a30970 }, /* int-mic */
6154 {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
6155 {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
6156 {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
6157 {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
6158 {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
6159 {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
6160 {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
6161 {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
6175 return -ENOMEM; in patch_alc662()
6177 codec->spec = spec; in patch_alc662()
6179 spec->mixer_nid = 0x0b; in patch_alc662()
6182 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; in patch_alc662()
6193 codec->bus->pci->subsystem_vendor == 0x1025 && in patch_alc662()
6194 spec->cdefine.platform_type == 1) { in patch_alc662()
6207 if (!spec->no_analog && !spec->adc_nids) { in patch_alc662()
6213 if (!spec->no_analog && !spec->cap_mixer) in patch_alc662()
6216 if (!spec->no_analog && has_cdefine_beep(codec)) { in patch_alc662()
6220 switch (codec->vendor_id) { in patch_alc662()
6237 codec->patch_ops = alc_patch_ops; in patch_alc662()
6238 spec->init_hook = alc_auto_init_std; in patch_alc662()
6239 spec->shutup = alc_eapd_shutup; in patch_alc662()
6242 if (!spec->loopback.amplist) in patch_alc662()
6243 spec->loopback.amplist = alc662_loopbacks; in patch_alc662()
6271 return -ENOMEM; in patch_alc680()
6273 codec->spec = spec; in patch_alc680()
6275 /* ALC680 has no aa-loopback mixer */ in patch_alc680()
6284 if (!spec->no_analog && !spec->cap_mixer) in patch_alc680()
6287 codec->patch_ops = alc_patch_ops; in patch_alc680()
6288 spec->init_hook = alc_auto_init_std; in patch_alc680()
6309 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
6311 { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
6340 MODULE_ALIAS("snd-hda-codec-id:10ec*");
6343 MODULE_DESCRIPTION("Realtek HD-audio codec");