Lines Matching +full:codec +full:- +full:0

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Universal Interface for Intel High Definition Audio Codec
32 * snd_hda_gen_spec_init - initialize hda_gen_spec struct
39 snd_array_init(&spec->kctls, sizeof(struct snd_kcontrol_new), 32); in snd_hda_gen_spec_init()
40 snd_array_init(&spec->paths, sizeof(struct nid_path), 8); in snd_hda_gen_spec_init()
41 snd_array_init(&spec->loopback_list, sizeof(struct hda_amp_list), 8); in snd_hda_gen_spec_init()
42 mutex_init(&spec->pcm_mutex); in snd_hda_gen_spec_init()
43 return 0; in snd_hda_gen_spec_init()
48 * snd_hda_gen_add_kctl - Add a new kctl_new struct from the template
62 struct snd_kcontrol_new *knew = snd_array_new(&spec->kctls); in snd_hda_gen_add_kctl()
67 knew->name = kstrdup(name, GFP_KERNEL); in snd_hda_gen_add_kctl()
68 else if (knew->name) in snd_hda_gen_add_kctl()
69 knew->name = kstrdup(knew->name, GFP_KERNEL); in snd_hda_gen_add_kctl()
70 if (!knew->name) in snd_hda_gen_add_kctl()
78 if (spec->kctls.list) { in free_kctls()
79 struct snd_kcontrol_new *kctl = spec->kctls.list; in free_kctls()
81 for (i = 0; i < spec->kctls.used; i++) in free_kctls()
84 snd_array_free(&spec->kctls); in free_kctls()
92 snd_array_free(&spec->paths); in snd_hda_gen_spec_free()
93 snd_array_free(&spec->loopback_list); in snd_hda_gen_spec_free()
95 if (spec->led_cdevs[LED_AUDIO_MUTE]) in snd_hda_gen_spec_free()
96 led_classdev_unregister(spec->led_cdevs[LED_AUDIO_MUTE]); in snd_hda_gen_spec_free()
97 if (spec->led_cdevs[LED_AUDIO_MICMUTE]) in snd_hda_gen_spec_free()
98 led_classdev_unregister(spec->led_cdevs[LED_AUDIO_MICMUTE]); in snd_hda_gen_spec_free()
105 static void parse_user_hints(struct hda_codec *codec) in parse_user_hints() argument
107 struct hda_gen_spec *spec = codec->spec; in parse_user_hints()
110 val = snd_hda_get_bool_hint(codec, "jack_detect"); in parse_user_hints()
111 if (val >= 0) in parse_user_hints()
112 codec->no_jack_detect = !val; in parse_user_hints()
113 val = snd_hda_get_bool_hint(codec, "inv_jack_detect"); in parse_user_hints()
114 if (val >= 0) in parse_user_hints()
115 codec->inv_jack_detect = !!val; in parse_user_hints()
116 val = snd_hda_get_bool_hint(codec, "trigger_sense"); in parse_user_hints()
117 if (val >= 0) in parse_user_hints()
118 codec->no_trigger_sense = !val; in parse_user_hints()
119 val = snd_hda_get_bool_hint(codec, "inv_eapd"); in parse_user_hints()
120 if (val >= 0) in parse_user_hints()
121 codec->inv_eapd = !!val; in parse_user_hints()
122 val = snd_hda_get_bool_hint(codec, "pcm_format_first"); in parse_user_hints()
123 if (val >= 0) in parse_user_hints()
124 codec->pcm_format_first = !!val; in parse_user_hints()
125 val = snd_hda_get_bool_hint(codec, "sticky_stream"); in parse_user_hints()
126 if (val >= 0) in parse_user_hints()
127 codec->no_sticky_stream = !val; in parse_user_hints()
128 val = snd_hda_get_bool_hint(codec, "spdif_status_reset"); in parse_user_hints()
129 if (val >= 0) in parse_user_hints()
130 codec->spdif_status_reset = !!val; in parse_user_hints()
131 val = snd_hda_get_bool_hint(codec, "pin_amp_workaround"); in parse_user_hints()
132 if (val >= 0) in parse_user_hints()
133 codec->pin_amp_workaround = !!val; in parse_user_hints()
134 val = snd_hda_get_bool_hint(codec, "single_adc_amp"); in parse_user_hints()
135 if (val >= 0) in parse_user_hints()
136 codec->single_adc_amp = !!val; in parse_user_hints()
137 val = snd_hda_get_bool_hint(codec, "power_save_node"); in parse_user_hints()
138 if (val >= 0) in parse_user_hints()
139 codec->power_save_node = !!val; in parse_user_hints()
141 val = snd_hda_get_bool_hint(codec, "auto_mute"); in parse_user_hints()
142 if (val >= 0) in parse_user_hints()
143 spec->suppress_auto_mute = !val; in parse_user_hints()
144 val = snd_hda_get_bool_hint(codec, "auto_mic"); in parse_user_hints()
145 if (val >= 0) in parse_user_hints()
146 spec->suppress_auto_mic = !val; in parse_user_hints()
147 val = snd_hda_get_bool_hint(codec, "line_in_auto_switch"); in parse_user_hints()
148 if (val >= 0) in parse_user_hints()
149 spec->line_in_auto_switch = !!val; in parse_user_hints()
150 val = snd_hda_get_bool_hint(codec, "auto_mute_via_amp"); in parse_user_hints()
151 if (val >= 0) in parse_user_hints()
152 spec->auto_mute_via_amp = !!val; in parse_user_hints()
153 val = snd_hda_get_bool_hint(codec, "need_dac_fix"); in parse_user_hints()
154 if (val >= 0) in parse_user_hints()
155 spec->need_dac_fix = !!val; in parse_user_hints()
156 val = snd_hda_get_bool_hint(codec, "primary_hp"); in parse_user_hints()
157 if (val >= 0) in parse_user_hints()
158 spec->no_primary_hp = !val; in parse_user_hints()
159 val = snd_hda_get_bool_hint(codec, "multi_io"); in parse_user_hints()
160 if (val >= 0) in parse_user_hints()
161 spec->no_multi_io = !val; in parse_user_hints()
162 val = snd_hda_get_bool_hint(codec, "multi_cap_vol"); in parse_user_hints()
163 if (val >= 0) in parse_user_hints()
164 spec->multi_cap_vol = !!val; in parse_user_hints()
165 val = snd_hda_get_bool_hint(codec, "inv_dmic_split"); in parse_user_hints()
166 if (val >= 0) in parse_user_hints()
167 spec->inv_dmic_split = !!val; in parse_user_hints()
168 val = snd_hda_get_bool_hint(codec, "indep_hp"); in parse_user_hints()
169 if (val >= 0) in parse_user_hints()
170 spec->indep_hp = !!val; in parse_user_hints()
171 val = snd_hda_get_bool_hint(codec, "add_stereo_mix_input"); in parse_user_hints()
172 if (val >= 0) in parse_user_hints()
173 spec->add_stereo_mix_input = !!val; in parse_user_hints()
175 val = snd_hda_get_bool_hint(codec, "add_out_jack_modes"); in parse_user_hints()
176 if (val >= 0) in parse_user_hints()
177 spec->add_jack_modes = !!val; in parse_user_hints()
178 val = snd_hda_get_bool_hint(codec, "add_in_jack_modes"); in parse_user_hints()
179 if (val >= 0) in parse_user_hints()
180 spec->add_jack_modes = !!val; in parse_user_hints()
181 val = snd_hda_get_bool_hint(codec, "add_jack_modes"); in parse_user_hints()
182 if (val >= 0) in parse_user_hints()
183 spec->add_jack_modes = !!val; in parse_user_hints()
184 val = snd_hda_get_bool_hint(codec, "power_down_unused"); in parse_user_hints()
185 if (val >= 0) in parse_user_hints()
186 spec->power_down_unused = !!val; in parse_user_hints()
187 val = snd_hda_get_bool_hint(codec, "add_hp_mic"); in parse_user_hints()
188 if (val >= 0) in parse_user_hints()
189 spec->hp_mic = !!val; in parse_user_hints()
190 val = snd_hda_get_bool_hint(codec, "hp_mic_detect"); in parse_user_hints()
191 if (val >= 0) in parse_user_hints()
192 spec->suppress_hp_mic_detect = !val; in parse_user_hints()
193 val = snd_hda_get_bool_hint(codec, "vmaster"); in parse_user_hints()
194 if (val >= 0) in parse_user_hints()
195 spec->suppress_vmaster = !val; in parse_user_hints()
197 if (!snd_hda_get_int_hint(codec, "mixer_nid", &val)) in parse_user_hints()
198 spec->mixer_nid = val; in parse_user_hints()
205 #define update_pin_ctl(codec, pin, val) \ argument
206 snd_hda_codec_write_cache(codec, pin, 0, \
210 static inline void restore_pin_ctl(struct hda_codec *codec, hda_nid_t pin) in restore_pin_ctl() argument
212 update_pin_ctl(codec, pin, snd_hda_codec_get_pin_target(codec, pin)); in restore_pin_ctl()
216 static void set_pin_target(struct hda_codec *codec, hda_nid_t pin, in set_pin_target() argument
221 val = snd_hda_correct_pin_ctl(codec, pin, val); in set_pin_target()
222 snd_hda_codec_set_pin_target(codec, pin, val); in set_pin_target()
224 update_pin_ctl(codec, pin, val); in set_pin_target()
228 static void set_pin_targets(struct hda_codec *codec, int num_pins, in set_pin_targets() argument
232 for (i = 0; i < num_pins; i++) in set_pin_targets()
233 set_pin_target(codec, pins[i], val, false); in set_pin_targets()
240 /* return the position of NID in the list, or -1 if not found */
244 for (i = 0; i < nums; i++) in find_idx_in_nid_list()
247 return -1; in find_idx_in_nid_list()
253 return find_idx_in_nid_list(nid, path->path, path->depth) >= 0; in is_nid_contained()
256 static struct nid_path *get_nid_path(struct hda_codec *codec, in get_nid_path() argument
260 struct hda_gen_spec *spec = codec->spec; in get_nid_path()
264 snd_array_for_each(&spec->paths, i, path) { in get_nid_path()
265 if (path->depth <= 0) in get_nid_path()
267 if ((!from_nid || path->path[0] == from_nid) && in get_nid_path()
268 (!to_nid || path->path[path->depth - 1] == to_nid)) { in get_nid_path()
270 (anchor_nid > 0 && is_nid_contained(path, anchor_nid)) || in get_nid_path()
271 (anchor_nid < 0 && !is_nid_contained(path, anchor_nid))) in get_nid_path()
279 * snd_hda_get_path_idx - get the index number corresponding to the path
281 * @codec: the HDA codec
287 int snd_hda_get_path_idx(struct hda_codec *codec, struct nid_path *path) in snd_hda_get_path_idx() argument
289 struct hda_gen_spec *spec = codec->spec; in snd_hda_get_path_idx()
290 struct nid_path *array = spec->paths.list; in snd_hda_get_path_idx()
293 if (!spec->paths.used) in snd_hda_get_path_idx()
294 return 0; in snd_hda_get_path_idx()
295 idx = path - array; in snd_hda_get_path_idx()
296 if (idx < 0 || idx >= spec->paths.used) in snd_hda_get_path_idx()
297 return 0; in snd_hda_get_path_idx()
303 * snd_hda_get_path_from_idx - get the path instance corresponding to the
305 * @codec: the HDA codec
308 struct nid_path *snd_hda_get_path_from_idx(struct hda_codec *codec, int idx) in snd_hda_get_path_from_idx() argument
310 struct hda_gen_spec *spec = codec->spec; in snd_hda_get_path_from_idx()
312 if (idx <= 0 || idx > spec->paths.used) in snd_hda_get_path_from_idx()
314 return snd_array_elem(&spec->paths, idx - 1); in snd_hda_get_path_from_idx()
319 static bool is_dac_already_used(struct hda_codec *codec, hda_nid_t nid) in is_dac_already_used() argument
321 struct hda_gen_spec *spec = codec->spec; in is_dac_already_used()
325 snd_array_for_each(&spec->paths, i, path) { in is_dac_already_used()
326 if (path->path[0] == nid) in is_dac_already_used()
333 static bool is_reachable_path(struct hda_codec *codec, in is_reachable_path() argument
338 return snd_hda_get_conn_index(codec, to_nid, from_nid, true) >= 0; in is_reachable_path()
342 #define AMP_VAL_COMPARE_MASK (0xffff | (1U << 18) | (0x0f << 19))
345 static bool is_ctl_used(struct hda_codec *codec, unsigned int val, int type) in is_ctl_used() argument
347 struct hda_gen_spec *spec = codec->spec; in is_ctl_used()
352 snd_array_for_each(&spec->paths, i, path) { in is_ctl_used()
353 if ((path->ctls[type] & AMP_VAL_COMPARE_MASK) == val) in is_ctl_used()
360 static bool is_ctl_associated(struct hda_codec *codec, hda_nid_t nid, in is_ctl_associated() argument
364 return is_ctl_used(codec, val, type); in is_ctl_associated()
367 static void print_nid_path(struct hda_codec *codec, in print_nid_path() argument
374 *pos = 0; in print_nid_path()
375 for (i = 0; i < path->depth; i++) in print_nid_path()
376 pos += scnprintf(pos, sizeof(buf) - (pos - buf), "%s%02x", in print_nid_path()
378 path->path[i]); in print_nid_path()
380 codec_dbg(codec, "%s path: depth=%d '%s'\n", pfx, path->depth, buf); in print_nid_path()
384 static bool __parse_nid_path(struct hda_codec *codec, in __parse_nid_path() argument
393 anchor_nid = 0; /* anchor passed */ in __parse_nid_path()
394 else if (to_nid == (hda_nid_t)(-anchor_nid)) in __parse_nid_path()
397 nums = snd_hda_get_conn_list(codec, to_nid, &conn); in __parse_nid_path()
398 for (i = 0; i < nums; i++) { in __parse_nid_path()
400 /* special case: when from_nid is 0, in __parse_nid_path()
404 get_wcaps_type(get_wcaps(codec, conn[i])) != AC_WID_AUD_OUT || in __parse_nid_path()
405 is_dac_already_used(codec, conn[i])) in __parse_nid_path()
409 if (anchor_nid <= 0) in __parse_nid_path()
414 for (i = 0; i < nums; i++) { in __parse_nid_path()
416 type = get_wcaps_type(get_wcaps(codec, conn[i])); in __parse_nid_path()
420 if (__parse_nid_path(codec, from_nid, conn[i], in __parse_nid_path()
427 path->path[path->depth] = conn[i]; in __parse_nid_path()
428 path->idx[path->depth + 1] = i; in __parse_nid_path()
429 if (nums > 1 && get_wcaps_type(get_wcaps(codec, to_nid)) != AC_WID_AUD_MIX) in __parse_nid_path()
430 path->multi[path->depth + 1] = 1; in __parse_nid_path()
431 path->depth++; in __parse_nid_path()
436 * snd_hda_parse_nid_path - parse the widget path from the given nid to
438 * @codec: the HDA codec
447 * when @from_nid is 0, try to find an empty DAC;
454 static bool snd_hda_parse_nid_path(struct hda_codec *codec, hda_nid_t from_nid, in snd_hda_parse_nid_path() argument
458 if (__parse_nid_path(codec, from_nid, to_nid, anchor_nid, path, 1)) { in snd_hda_parse_nid_path()
459 path->path[path->depth] = to_nid; in snd_hda_parse_nid_path()
460 path->depth++; in snd_hda_parse_nid_path()
467 * snd_hda_add_new_path - parse the path between the given NIDs and
469 * @codec: the HDA codec
477 snd_hda_add_new_path(struct hda_codec *codec, hda_nid_t from_nid, in snd_hda_add_new_path() argument
480 struct hda_gen_spec *spec = codec->spec; in snd_hda_add_new_path()
483 if (from_nid && to_nid && !is_reachable_path(codec, from_nid, to_nid)) in snd_hda_add_new_path()
487 path = get_nid_path(codec, from_nid, to_nid, anchor_nid); in snd_hda_add_new_path()
491 path = snd_array_new(&spec->paths); in snd_hda_add_new_path()
494 memset(path, 0, sizeof(*path)); in snd_hda_add_new_path()
495 if (snd_hda_parse_nid_path(codec, from_nid, to_nid, anchor_nid, path)) in snd_hda_add_new_path()
498 spec->paths.used--; in snd_hda_add_new_path()
504 static void invalidate_nid_path(struct hda_codec *codec, int idx) in invalidate_nid_path() argument
506 struct nid_path *path = snd_hda_get_path_from_idx(codec, idx); in invalidate_nid_path()
509 memset(path, 0, sizeof(*path)); in invalidate_nid_path()
512 /* return a DAC if paired to the given pin by codec driver */
513 static hda_nid_t get_preferred_dac(struct hda_codec *codec, hda_nid_t pin) in get_preferred_dac() argument
515 struct hda_gen_spec *spec = codec->spec; in get_preferred_dac()
516 const hda_nid_t *list = spec->preferred_dacs; in get_preferred_dac()
519 return 0; in get_preferred_dac()
523 return 0; in get_preferred_dac()
527 static hda_nid_t look_for_dac(struct hda_codec *codec, hda_nid_t pin, in look_for_dac() argument
530 struct hda_gen_spec *spec = codec->spec; in look_for_dac()
534 for (i = 0; i < spec->num_all_dacs; i++) { in look_for_dac()
535 hda_nid_t nid = spec->all_dacs[i]; in look_for_dac()
536 if (!nid || is_dac_already_used(codec, nid)) in look_for_dac()
538 cap_digital = !!(get_wcaps(codec, nid) & AC_WCAP_DIGITAL); in look_for_dac()
541 if (is_reachable_path(codec, nid, pin)) in look_for_dac()
544 return 0; in look_for_dac()
550 val &= ~(0x3U << 16); in amp_val_replace_channels()
555 static bool same_amp_caps(struct hda_codec *codec, hda_nid_t nid1, in same_amp_caps() argument
558 if (!(get_wcaps(codec, nid1) & (1 << (dir + 1)))) in same_amp_caps()
559 return !(get_wcaps(codec, nid2) & (1 << (dir + 1))); in same_amp_caps()
560 return (query_amp_caps(codec, nid1, dir) == in same_amp_caps()
561 query_amp_caps(codec, nid2, dir)); in same_amp_caps()
565 static hda_nid_t look_for_out_mute_nid(struct hda_codec *codec, in look_for_out_mute_nid() argument
570 for (i = path->depth - 1; i >= 0; i--) { in look_for_out_mute_nid()
571 if (nid_has_mute(codec, path->path[i], HDA_OUTPUT)) in look_for_out_mute_nid()
572 return path->path[i]; in look_for_out_mute_nid()
573 if (i != path->depth - 1 && i != 0 && in look_for_out_mute_nid()
574 nid_has_mute(codec, path->path[i], HDA_INPUT)) in look_for_out_mute_nid()
575 return path->path[i]; in look_for_out_mute_nid()
577 return 0; in look_for_out_mute_nid()
581 static hda_nid_t look_for_out_vol_nid(struct hda_codec *codec, in look_for_out_vol_nid() argument
584 struct hda_gen_spec *spec = codec->spec; in look_for_out_vol_nid()
587 for (i = path->depth - 1; i >= 0; i--) { in look_for_out_vol_nid()
588 hda_nid_t nid = path->path[i]; in look_for_out_vol_nid()
589 if ((spec->out_vol_mask >> nid) & 1) in look_for_out_vol_nid()
591 if (nid_has_volume(codec, nid, HDA_OUTPUT)) in look_for_out_vol_nid()
594 return 0; in look_for_out_vol_nid()
601 /* can have the amp-in capability? */
602 static bool has_amp_in(struct hda_codec *codec, struct nid_path *path, int idx) in has_amp_in() argument
604 hda_nid_t nid = path->path[idx]; in has_amp_in()
605 unsigned int caps = get_wcaps(codec, nid); in has_amp_in()
610 if (type == AC_WID_PIN && idx > 0) /* only for input pins */ in has_amp_in()
615 /* can have the amp-out capability? */
616 static bool has_amp_out(struct hda_codec *codec, struct nid_path *path, int idx) in has_amp_out() argument
618 hda_nid_t nid = path->path[idx]; in has_amp_out()
619 unsigned int caps = get_wcaps(codec, nid); in has_amp_out()
630 static bool is_active_nid(struct hda_codec *codec, hda_nid_t nid, in is_active_nid() argument
633 struct hda_gen_spec *spec = codec->spec; in is_active_nid()
634 int type = get_wcaps_type(get_wcaps(codec, nid)); in is_active_nid()
638 if (nid == codec->core.afg) in is_active_nid()
641 snd_array_for_each(&spec->paths, n, path) { in is_active_nid()
642 if (!path->active) in is_active_nid()
644 if (codec->power_save_node) { in is_active_nid()
645 if (!path->stream_enabled) in is_active_nid()
648 if (!(path->pin_enabled || path->pin_fixed) && in is_active_nid()
652 for (i = 0; i < path->depth; i++) { in is_active_nid()
653 if (path->path[i] == nid) { in is_active_nid()
654 if (dir == HDA_OUTPUT || idx == -1 || in is_active_nid()
655 path->idx[i] == idx) in is_active_nid()
665 #define is_active_nid_for_any(codec, nid) \ argument
666 is_active_nid(codec, nid, HDA_OUTPUT, -1)
669 static int get_amp_val_to_activate(struct hda_codec *codec, hda_nid_t nid, in get_amp_val_to_activate() argument
672 unsigned int val = 0; in get_amp_val_to_activate()
675 /* set to 0dB */ in get_amp_val_to_activate()
686 /* is this a stereo widget or a stereo-to-mono mix? */
687 static bool is_stereo_amps(struct hda_codec *codec, hda_nid_t nid, int dir) in is_stereo_amps() argument
689 unsigned int wcaps = get_wcaps(codec, nid); in is_stereo_amps()
696 if (snd_hda_get_num_conns(codec, nid) != 1) in is_stereo_amps()
698 if (snd_hda_get_connections(codec, nid, &conn, 1) < 0) in is_stereo_amps()
700 return !!(get_wcaps(codec, conn) & AC_WCAP_STEREO); in is_stereo_amps()
704 static void init_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx) in init_amp() argument
706 unsigned int caps = query_amp_caps(codec, nid, dir); in init_amp()
707 int val = get_amp_val_to_activate(codec, nid, dir, caps, false); in init_amp()
709 if (is_stereo_amps(codec, nid, dir)) in init_amp()
710 snd_hda_codec_amp_init_stereo(codec, nid, dir, idx, 0xff, val); in init_amp()
712 snd_hda_codec_amp_init(codec, nid, 0, dir, idx, 0xff, val); in init_amp()
716 static int update_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx, in update_amp() argument
719 if (is_stereo_amps(codec, nid, dir)) in update_amp()
720 return snd_hda_codec_amp_stereo(codec, nid, dir, idx, in update_amp()
723 return snd_hda_codec_amp_update(codec, nid, 0, dir, idx, in update_amp()
730 static unsigned int get_amp_mask_to_modify(struct hda_codec *codec, in get_amp_mask_to_modify() argument
734 unsigned int mask = 0xff; in get_amp_mask_to_modify()
737 if (is_ctl_associated(codec, nid, dir, idx, NID_PATH_MUTE_CTL)) in get_amp_mask_to_modify()
738 mask &= ~0x80; in get_amp_mask_to_modify()
741 if (is_ctl_associated(codec, nid, dir, idx, NID_PATH_VOL_CTL) || in get_amp_mask_to_modify()
742 is_ctl_associated(codec, nid, dir, idx, NID_PATH_BOOST_CTL)) in get_amp_mask_to_modify()
743 mask &= ~0x7f; in get_amp_mask_to_modify()
748 static void activate_amp(struct hda_codec *codec, hda_nid_t nid, int dir, in activate_amp() argument
754 caps = query_amp_caps(codec, nid, dir); in activate_amp()
755 val = get_amp_val_to_activate(codec, nid, dir, caps, enable); in activate_amp()
756 mask = get_amp_mask_to_modify(codec, nid, dir, idx_to_check, caps); in activate_amp()
761 update_amp(codec, nid, dir, idx, mask, val); in activate_amp()
764 static void check_and_activate_amp(struct hda_codec *codec, hda_nid_t nid, in check_and_activate_amp() argument
769 if (!enable && is_active_nid(codec, nid, dir, idx_to_check)) in check_and_activate_amp()
771 activate_amp(codec, nid, dir, idx, idx_to_check, enable); in check_and_activate_amp()
774 static void activate_amp_out(struct hda_codec *codec, struct nid_path *path, in activate_amp_out() argument
777 hda_nid_t nid = path->path[i]; in activate_amp_out()
778 init_amp(codec, nid, HDA_OUTPUT, 0); in activate_amp_out()
779 check_and_activate_amp(codec, nid, HDA_OUTPUT, 0, 0, enable); in activate_amp_out()
782 static void activate_amp_in(struct hda_codec *codec, struct nid_path *path, in activate_amp_in() argument
785 struct hda_gen_spec *spec = codec->spec; in activate_amp_in()
789 hda_nid_t nid = path->path[i]; in activate_amp_in()
791 nums = snd_hda_get_conn_list(codec, nid, &conn); in activate_amp_in()
792 if (nums < 0) in activate_amp_in()
794 type = get_wcaps_type(get_wcaps(codec, nid)); in activate_amp_in()
796 (type == AC_WID_AUD_IN && codec->single_adc_amp)) { in activate_amp_in()
798 idx = 0; in activate_amp_in()
800 idx = path->idx[i]; in activate_amp_in()
802 for (n = 0; n < nums; n++) in activate_amp_in()
803 init_amp(codec, nid, HDA_INPUT, n); in activate_amp_in()
806 * when aa-mixer is available, we need to enable the path as well in activate_amp_in()
808 for (n = 0; n < nums; n++) { in activate_amp_in()
810 if (conn[n] != spec->mixer_merge_nid) in activate_amp_in()
814 activate_amp(codec, nid, HDA_INPUT, n, n, false); in activate_amp_in()
818 check_and_activate_amp(codec, nid, HDA_INPUT, n, idx, enable); in activate_amp_in()
823 static hda_nid_t path_power_update(struct hda_codec *codec, in path_power_update() argument
827 hda_nid_t nid, changed = 0; in path_power_update()
830 for (i = 0; i < path->depth; i++) { in path_power_update()
831 nid = path->path[i]; in path_power_update()
832 if (!(get_wcaps(codec, nid) & AC_WCAP_POWER)) in path_power_update()
834 if (nid == codec->core.afg) in path_power_update()
836 if (!allow_powerdown || is_active_nid_for_any(codec, nid)) in path_power_update()
840 power = snd_hda_codec_read(codec, nid, 0, in path_power_update()
841 AC_VERB_GET_POWER_STATE, 0); in path_power_update()
843 snd_hda_codec_write(codec, nid, 0, in path_power_update()
852 #if 0 /* disabled */ in path_power_update()
854 snd_hdac_regmap_sync_node(&codec->core, nid); in path_power_update()
862 static void sync_power_state_change(struct hda_codec *codec, hda_nid_t nid) in sync_power_state_change() argument
866 snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_POWER_STATE, 0); in sync_power_state_change()
871 * snd_hda_activate_path - activate or deactivate the given path
872 * @codec: the HDA codec
877 * If @add_aamix is set, enable the input from aa-mix NID as well (if any).
879 void snd_hda_activate_path(struct hda_codec *codec, struct nid_path *path, in snd_hda_activate_path() argument
882 struct hda_gen_spec *spec = codec->spec; in snd_hda_activate_path()
885 path->active = enable; in snd_hda_activate_path()
888 if (enable && (spec->power_down_unused || codec->power_save_node)) in snd_hda_activate_path()
889 path_power_update(codec, path, codec->power_save_node); in snd_hda_activate_path()
891 for (i = path->depth - 1; i >= 0; i--) { in snd_hda_activate_path()
892 hda_nid_t nid = path->path[i]; in snd_hda_activate_path()
894 if (enable && path->multi[i]) in snd_hda_activate_path()
895 snd_hda_codec_write_cache(codec, nid, 0, in snd_hda_activate_path()
897 path->idx[i]); in snd_hda_activate_path()
898 if (has_amp_in(codec, path, i)) in snd_hda_activate_path()
899 activate_amp_in(codec, path, i, enable, add_aamix); in snd_hda_activate_path()
900 if (has_amp_out(codec, path, i)) in snd_hda_activate_path()
901 activate_amp_out(codec, path, i, enable); in snd_hda_activate_path()
907 static void path_power_down_sync(struct hda_codec *codec, struct nid_path *path) in path_power_down_sync() argument
909 struct hda_gen_spec *spec = codec->spec; in path_power_down_sync()
911 if (!(spec->power_down_unused || codec->power_save_node) || path->active) in path_power_down_sync()
913 sync_power_state_change(codec, path_power_update(codec, path, true)); in path_power_down_sync()
917 static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable) in set_pin_eapd() argument
919 struct hda_gen_spec *spec = codec->spec; in set_pin_eapd()
920 if (spec->own_eapd_ctl || in set_pin_eapd()
921 !(snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD)) in set_pin_eapd()
923 if (spec->keep_eapd_on && !enable) in set_pin_eapd()
925 if (codec->inv_eapd) in set_pin_eapd()
927 snd_hda_codec_write_cache(codec, pin, 0, in set_pin_eapd()
929 enable ? 0x02 : 0x00); in set_pin_eapd()
932 /* re-initialize the path specified by the given path index */
933 static void resume_path_from_idx(struct hda_codec *codec, int path_idx) in resume_path_from_idx() argument
935 struct nid_path *path = snd_hda_get_path_from_idx(codec, path_idx); in resume_path_from_idx()
937 snd_hda_activate_path(codec, path, path->active, false); in resume_path_from_idx()
958 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
966 .private_value = HDA_COMPOSE_AMP_VAL(0, 3, 0, 0),
973 .private_value = HDA_COMPOSE_AMP_VAL(0, 3, 0, 0),
987 knew->index = cidx; in add_control()
989 knew->subdevice = HDA_SUBDEV_AMP_FLAG; in add_control()
990 knew->private_value = val; in add_control()
1001 return -ENOMEM; in add_control_with_pfx()
1002 return 0; in add_control_with_pfx()
1006 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", 0, val)
1008 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", 0, val)
1014 static int add_vol_ctl(struct hda_codec *codec, const char *pfx, int cidx, in add_vol_ctl() argument
1019 return 0; in add_vol_ctl()
1020 val = path->ctls[NID_PATH_VOL_CTL]; in add_vol_ctl()
1022 return 0; in add_vol_ctl()
1024 return __add_pb_vol_ctrl(codec->spec, HDA_CTL_WIDGET_VOL, pfx, cidx, val); in add_vol_ctl()
1027 /* return the channel bits suitable for the given path->ctls[] */
1028 static int get_default_ch_nums(struct hda_codec *codec, struct nid_path *path, in get_default_ch_nums() argument
1033 hda_nid_t nid = get_amp_nid_(path->ctls[type]); in get_default_ch_nums()
1034 if (nid && (get_wcaps(codec, nid) & AC_WCAP_STEREO)) in get_default_ch_nums()
1040 static int add_stereo_vol(struct hda_codec *codec, const char *pfx, int cidx, in add_stereo_vol() argument
1043 int chs = get_default_ch_nums(codec, path, NID_PATH_VOL_CTL); in add_stereo_vol()
1044 return add_vol_ctl(codec, pfx, cidx, chs, path); in add_stereo_vol()
1047 /* create a mute-switch for the given mixer widget;
1048 * if it has multiple sources (e.g. DAC and loopback), create a bind-mute
1050 static int add_sw_ctl(struct hda_codec *codec, const char *pfx, int cidx, in add_sw_ctl() argument
1057 return 0; in add_sw_ctl()
1058 val = path->ctls[NID_PATH_MUTE_CTL]; in add_sw_ctl()
1060 return 0; in add_sw_ctl()
1064 int nums = snd_hda_get_num_conns(codec, nid); in add_sw_ctl()
1070 return __add_pb_sw_ctrl(codec->spec, type, pfx, cidx, val); in add_sw_ctl()
1073 static int add_stereo_sw(struct hda_codec *codec, const char *pfx, in add_stereo_sw() argument
1076 int chs = get_default_ch_nums(codec, path, NID_PATH_MUTE_CTL); in add_stereo_sw()
1077 return add_sw_ctl(codec, pfx, cidx, chs, path); in add_stereo_sw()
1084 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in sync_auto_mute_bits() local
1085 struct hda_gen_spec *spec = codec->spec; in sync_auto_mute_bits()
1087 if (spec->auto_mute_via_amp) { in sync_auto_mute_bits()
1089 bool enabled = !((spec->mute_bits >> nid) & 1); in sync_auto_mute_bits()
1090 ucontrol->value.integer.value[0] &= enabled; in sync_auto_mute_bits()
1091 ucontrol->value.integer.value[1] &= enabled; in sync_auto_mute_bits()
1106 #define AMP_VAL_IDX_MASK (0x0f<<19)
1111 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in hda_gen_bind_mute_get() local
1115 mutex_lock(&codec->control_mutex); in hda_gen_bind_mute_get()
1116 pval = kcontrol->private_value; in hda_gen_bind_mute_get()
1117 kcontrol->private_value = pval & ~AMP_VAL_IDX_MASK; /* index 0 */ in hda_gen_bind_mute_get()
1119 kcontrol->private_value = pval; in hda_gen_bind_mute_get()
1120 mutex_unlock(&codec->control_mutex); in hda_gen_bind_mute_get()
1127 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in hda_gen_bind_mute_put() local
1129 int i, indices, err = 0, change = 0; in hda_gen_bind_mute_put()
1133 mutex_lock(&codec->control_mutex); in hda_gen_bind_mute_put()
1134 pval = kcontrol->private_value; in hda_gen_bind_mute_put()
1136 for (i = 0; i < indices; i++) { in hda_gen_bind_mute_put()
1137 kcontrol->private_value = (pval & ~AMP_VAL_IDX_MASK) | in hda_gen_bind_mute_put()
1140 if (err < 0) in hda_gen_bind_mute_put()
1144 kcontrol->private_value = pval; in hda_gen_bind_mute_put()
1145 mutex_unlock(&codec->control_mutex); in hda_gen_bind_mute_put()
1146 return err < 0 ? err : change; in hda_gen_bind_mute_put()
1150 static bool path_has_mixer(struct hda_codec *codec, int path_idx, int ctl_type) in path_has_mixer() argument
1152 struct nid_path *path = snd_hda_get_path_from_idx(codec, path_idx); in path_has_mixer()
1153 return path && path->ctls[ctl_type]; in path_has_mixer()
1161 static const char *get_line_out_pfx(struct hda_codec *codec, int ch, in get_line_out_pfx() argument
1164 struct hda_gen_spec *spec = codec->spec; in get_line_out_pfx()
1165 struct auto_pin_cfg *cfg = &spec->autocfg; in get_line_out_pfx()
1167 *index = 0; in get_line_out_pfx()
1168 if (cfg->line_outs == 1 && !spec->multi_ios && in get_line_out_pfx()
1169 !codec->force_pin_prefix && in get_line_out_pfx()
1170 !cfg->hp_outs && !cfg->speaker_outs) in get_line_out_pfx()
1171 return spec->vmaster_mute.hook ? "PCM" : "Master"; in get_line_out_pfx()
1176 if (spec->multiout.num_dacs == 1 && !spec->mixer_nid && in get_line_out_pfx()
1177 !codec->force_pin_prefix && in get_line_out_pfx()
1178 !spec->multiout.hp_out_nid[0] && !spec->multiout.extra_out_nid[0]) in get_line_out_pfx()
1179 return spec->vmaster_mute.hook ? "PCM" : "Master"; in get_line_out_pfx()
1181 /* multi-io channels */ in get_line_out_pfx()
1182 if (ch >= cfg->line_outs) in get_line_out_pfx()
1185 switch (cfg->line_out_type) { in get_line_out_pfx()
1190 if (!ch && cfg->hp_outs && in get_line_out_pfx()
1191 !path_has_mixer(codec, spec->hp_paths[0], ctl_type)) in get_line_out_pfx()
1193 if (cfg->line_outs == 1) in get_line_out_pfx()
1195 if (cfg->line_outs == 2) in get_line_out_pfx()
1202 if (!ch && cfg->speaker_outs && in get_line_out_pfx()
1203 !path_has_mixer(codec, spec->speaker_paths[0], ctl_type)) in get_line_out_pfx()
1205 /* for multi-io case, only the primary out */ in get_line_out_pfx()
1206 if (ch && spec->multi_ios) in get_line_out_pfx()
1217 if (cfg->speaker_outs) in get_line_out_pfx()
1218 spk_lo_shared = !path_has_mixer(codec, in get_line_out_pfx()
1219 spec->speaker_paths[0], ctl_type); in get_line_out_pfx()
1220 if (cfg->hp_outs) in get_line_out_pfx()
1221 hp_lo_shared = !path_has_mixer(codec, spec->hp_paths[0], ctl_type); in get_line_out_pfx()
1223 return spec->vmaster_mute.hook ? "PCM" : "Master"; in get_line_out_pfx()
1232 if (cfg->line_outs == 1 && !spec->multi_ios) in get_line_out_pfx()
1250 BAD_NO_PRIMARY_DAC = 0x10000,
1252 BAD_NO_DAC = 0x4000,
1253 /* No possible multi-ios */
1254 BAD_MULTI_IO = 0x120,
1256 BAD_NO_EXTRA_DAC = 0x102,
1258 BAD_NO_EXTRA_SURR_DAC = 0x101,
1260 BAD_SHARED_SURROUND = 0x100,
1262 BAD_NO_INDEP_HP = 0x10,
1264 BAD_SHARED_CLFE = 0x10,
1266 BAD_SHARED_EXTRA_SURROUND = 0x10,
1268 BAD_SHARED_VOL = 0x10,
1278 static int assign_out_path_ctls(struct hda_codec *codec, struct nid_path *path) in assign_out_path_ctls() argument
1280 struct hda_gen_spec *spec = codec->spec; in assign_out_path_ctls()
1283 int badness = 0; in assign_out_path_ctls()
1288 if (path->ctls[NID_PATH_VOL_CTL] || in assign_out_path_ctls()
1289 path->ctls[NID_PATH_MUTE_CTL]) in assign_out_path_ctls()
1290 return 0; /* already evaluated */ in assign_out_path_ctls()
1292 nid = look_for_out_vol_nid(codec, path); in assign_out_path_ctls()
1294 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); in assign_out_path_ctls()
1295 if (spec->dac_min_mute) in assign_out_path_ctls()
1297 if (is_ctl_used(codec, val, NID_PATH_VOL_CTL)) in assign_out_path_ctls()
1300 path->ctls[NID_PATH_VOL_CTL] = val; in assign_out_path_ctls()
1303 nid = look_for_out_mute_nid(codec, path); in assign_out_path_ctls()
1305 unsigned int wid_type = get_wcaps_type(get_wcaps(codec, nid)); in assign_out_path_ctls()
1307 nid_has_mute(codec, nid, HDA_OUTPUT)) in assign_out_path_ctls()
1308 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); in assign_out_path_ctls()
1310 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT); in assign_out_path_ctls()
1311 if (is_ctl_used(codec, val, NID_PATH_MUTE_CTL)) in assign_out_path_ctls()
1314 path->ctls[NID_PATH_MUTE_CTL] = val; in assign_out_path_ctls()
1341 static hda_nid_t get_primary_out(struct hda_codec *codec, int idx) in get_primary_out() argument
1343 struct hda_gen_spec *spec = codec->spec; in get_primary_out()
1344 struct auto_pin_cfg *cfg = &spec->autocfg; in get_primary_out()
1346 if (cfg->line_outs > idx) in get_primary_out()
1347 return spec->private_dac_nids[idx]; in get_primary_out()
1348 idx -= cfg->line_outs; in get_primary_out()
1349 if (spec->multi_ios > idx) in get_primary_out()
1350 return spec->multi_io[idx].dac; in get_primary_out()
1351 return 0; in get_primary_out()
1355 static inline hda_nid_t try_dac(struct hda_codec *codec, in try_dac() argument
1358 return is_reachable_path(codec, dac, pin) ? dac : 0; in try_dac()
1362 static int try_assign_dacs(struct hda_codec *codec, int num_outs, in try_assign_dacs() argument
1367 struct hda_gen_spec *spec = codec->spec; in try_assign_dacs()
1369 int badness = 0; in try_assign_dacs()
1373 return 0; in try_assign_dacs()
1375 for (i = 0; i < num_outs; i++) { in try_assign_dacs()
1379 if (!spec->obey_preferred_dacs) { in try_assign_dacs()
1380 path = snd_hda_get_path_from_idx(codec, path_idx[i]); in try_assign_dacs()
1382 badness += assign_out_path_ctls(codec, path); in try_assign_dacs()
1387 dacs[i] = get_preferred_dac(codec, pin); in try_assign_dacs()
1389 if (is_dac_already_used(codec, dacs[i])) in try_assign_dacs()
1390 badness += bad->shared_primary; in try_assign_dacs()
1391 } else if (spec->obey_preferred_dacs) { in try_assign_dacs()
1396 dacs[i] = look_for_dac(codec, pin, false); in try_assign_dacs()
1400 if (is_reachable_path(codec, dacs[j], pin)) { in try_assign_dacs()
1401 dacs[0] = dacs[j]; in try_assign_dacs()
1402 dacs[j] = 0; in try_assign_dacs()
1403 invalidate_nid_path(codec, path_idx[j]); in try_assign_dacs()
1404 path_idx[j] = 0; in try_assign_dacs()
1412 dac = try_dac(codec, get_primary_out(codec, i), pin); in try_assign_dacs()
1414 dac = try_dac(codec, dacs[0], pin); in try_assign_dacs()
1416 dac = try_dac(codec, get_primary_out(codec, i), pin); in try_assign_dacs()
1419 badness += bad->shared_primary; in try_assign_dacs()
1421 badness += bad->shared_surr; in try_assign_dacs()
1423 badness += bad->shared_clfe; in try_assign_dacs()
1424 } else if (is_reachable_path(codec, spec->private_dac_nids[0], pin)) { in try_assign_dacs()
1425 dac = spec->private_dac_nids[0]; in try_assign_dacs()
1426 badness += bad->shared_surr_main; in try_assign_dacs()
1428 badness += bad->no_primary_dac; in try_assign_dacs()
1430 badness += bad->no_dac; in try_assign_dacs()
1434 path = snd_hda_add_new_path(codec, dac, pin, -spec->mixer_nid); in try_assign_dacs()
1435 if (!path && !i && spec->mixer_nid) { in try_assign_dacs()
1437 path = snd_hda_add_new_path(codec, dac, pin, 0); in try_assign_dacs()
1440 dac = dacs[i] = 0; in try_assign_dacs()
1441 badness += bad->no_dac; in try_assign_dacs()
1443 /* print_nid_path(codec, "output", path); */ in try_assign_dacs()
1444 path->active = true; in try_assign_dacs()
1445 path_idx[i] = snd_hda_get_path_idx(codec, path); in try_assign_dacs()
1446 badness += assign_out_path_ctls(codec, path); in try_assign_dacs()
1454 static hda_nid_t get_dac_if_single(struct hda_codec *codec, hda_nid_t pin) in get_dac_if_single() argument
1456 struct hda_gen_spec *spec = codec->spec; in get_dac_if_single()
1458 hda_nid_t nid_found = 0; in get_dac_if_single()
1460 for (i = 0; i < spec->num_all_dacs; i++) { in get_dac_if_single()
1461 hda_nid_t nid = spec->all_dacs[i]; in get_dac_if_single()
1462 if (!nid || is_dac_already_used(codec, nid)) in get_dac_if_single()
1464 if (is_reachable_path(codec, nid, pin)) { in get_dac_if_single()
1466 return 0; in get_dac_if_single()
1473 /* check whether the given pin can be a multi-io pin */
1474 static bool can_be_multiio_pin(struct hda_codec *codec, in can_be_multiio_pin() argument
1479 defcfg = snd_hda_codec_get_pincfg(codec, nid); in can_be_multiio_pin()
1484 caps = snd_hda_query_pin_caps(codec, nid); in can_be_multiio_pin()
1490 /* count the number of input pins that are capable to be multi-io */
1491 static int count_multiio_pins(struct hda_codec *codec, hda_nid_t reference_pin) in count_multiio_pins() argument
1493 struct hda_gen_spec *spec = codec->spec; in count_multiio_pins()
1494 struct auto_pin_cfg *cfg = &spec->autocfg; in count_multiio_pins()
1495 unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin); in count_multiio_pins()
1498 int num_pins = 0; in count_multiio_pins()
1500 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) { in count_multiio_pins()
1501 for (i = 0; i < cfg->num_inputs; i++) { in count_multiio_pins()
1502 if (cfg->inputs[i].type != type) in count_multiio_pins()
1504 if (can_be_multiio_pin(codec, location, in count_multiio_pins()
1505 cfg->inputs[i].pin)) in count_multiio_pins()
1513 * multi-io helper
1516 * zero if any pins are filled, non-zero if nothing found.
1520 static int fill_multi_ios(struct hda_codec *codec, in fill_multi_ios() argument
1524 struct hda_gen_spec *spec = codec->spec; in fill_multi_ios()
1525 struct auto_pin_cfg *cfg = &spec->autocfg; in fill_multi_ios()
1527 unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin); in fill_multi_ios()
1529 int badness = 0; in fill_multi_ios()
1532 old_pins = spec->multi_ios; in fill_multi_ios()
1536 num_pins = count_multiio_pins(codec, reference_pin); in fill_multi_ios()
1540 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) { in fill_multi_ios()
1541 for (i = 0; i < cfg->num_inputs; i++) { in fill_multi_ios()
1542 hda_nid_t nid = cfg->inputs[i].pin; in fill_multi_ios()
1543 hda_nid_t dac = 0; in fill_multi_ios()
1545 if (cfg->inputs[i].type != type) in fill_multi_ios()
1547 if (!can_be_multiio_pin(codec, location, nid)) in fill_multi_ios()
1549 for (j = 0; j < spec->multi_ios; j++) { in fill_multi_ios()
1550 if (nid == spec->multi_io[j].pin) in fill_multi_ios()
1553 if (j < spec->multi_ios) in fill_multi_ios()
1557 dac = get_dac_if_single(codec, nid); in fill_multi_ios()
1559 dac = look_for_dac(codec, nid, false); in fill_multi_ios()
1564 path = snd_hda_add_new_path(codec, dac, nid, in fill_multi_ios()
1565 -spec->mixer_nid); in fill_multi_ios()
1570 /* print_nid_path(codec, "multiio", path); */ in fill_multi_ios()
1571 spec->multi_io[spec->multi_ios].pin = nid; in fill_multi_ios()
1572 spec->multi_io[spec->multi_ios].dac = dac; in fill_multi_ios()
1573 spec->out_paths[cfg->line_outs + spec->multi_ios] = in fill_multi_ios()
1574 snd_hda_get_path_idx(codec, path); in fill_multi_ios()
1575 spec->multi_ios++; in fill_multi_ios()
1576 if (spec->multi_ios >= 2) in fill_multi_ios()
1583 if (old_pins == spec->multi_ios) { in fill_multi_ios()
1589 if (!hardwired && spec->multi_ios < 2) { in fill_multi_ios()
1591 spec->paths.used -= spec->multi_ios - old_pins; in fill_multi_ios()
1592 spec->multi_ios = old_pins; in fill_multi_ios()
1597 for (i = old_pins; i < spec->multi_ios; i++) { in fill_multi_ios()
1598 path = snd_hda_get_path_from_idx(codec, spec->out_paths[cfg->line_outs + i]); in fill_multi_ios()
1599 badness += assign_out_path_ctls(codec, path); in fill_multi_ios()
1606 static bool map_singles(struct hda_codec *codec, int outs, in map_singles() argument
1609 struct hda_gen_spec *spec = codec->spec; in map_singles()
1612 for (i = 0; i < outs; i++) { in map_singles()
1617 dac = get_dac_if_single(codec, pins[i]); in map_singles()
1620 path = snd_hda_add_new_path(codec, dac, pins[i], in map_singles()
1621 -spec->mixer_nid); in map_singles()
1622 if (!path && !i && spec->mixer_nid) in map_singles()
1623 path = snd_hda_add_new_path(codec, dac, pins[i], 0); in map_singles()
1627 /* print_nid_path(codec, "output", path); */ in map_singles()
1628 path->active = true; in map_singles()
1629 path_idx[i] = snd_hda_get_path_idx(codec, path); in map_singles()
1637 return spec->aamix_out_paths[0] || spec->aamix_out_paths[1] || in has_aamix_out_paths()
1638 spec->aamix_out_paths[2]; in has_aamix_out_paths()
1642 static int check_aamix_out_path(struct hda_codec *codec, int path_idx) in check_aamix_out_path() argument
1644 struct hda_gen_spec *spec = codec->spec; in check_aamix_out_path()
1648 path = snd_hda_get_path_from_idx(codec, path_idx); in check_aamix_out_path()
1649 if (!path || !path->depth || in check_aamix_out_path()
1650 is_nid_contained(path, spec->mixer_nid)) in check_aamix_out_path()
1651 return 0; in check_aamix_out_path()
1652 path_dac = path->path[0]; in check_aamix_out_path()
1653 dac = spec->private_dac_nids[0]; in check_aamix_out_path()
1654 pin = path->path[path->depth - 1]; in check_aamix_out_path()
1655 path = snd_hda_add_new_path(codec, dac, pin, spec->mixer_nid); in check_aamix_out_path()
1659 else if (spec->multiout.hp_out_nid[0]) in check_aamix_out_path()
1660 dac = spec->multiout.hp_out_nid[0]; in check_aamix_out_path()
1661 else if (spec->multiout.extra_out_nid[0]) in check_aamix_out_path()
1662 dac = spec->multiout.extra_out_nid[0]; in check_aamix_out_path()
1664 dac = 0; in check_aamix_out_path()
1666 path = snd_hda_add_new_path(codec, dac, pin, in check_aamix_out_path()
1667 spec->mixer_nid); in check_aamix_out_path()
1670 return 0; in check_aamix_out_path()
1671 /* print_nid_path(codec, "output-aamix", path); */ in check_aamix_out_path()
1672 path->active = false; /* unused as default */ in check_aamix_out_path()
1673 path->pin_fixed = true; /* static route */ in check_aamix_out_path()
1674 return snd_hda_get_path_idx(codec, path); in check_aamix_out_path()
1678 static bool indep_hp_possible(struct hda_codec *codec) in indep_hp_possible() argument
1680 struct hda_gen_spec *spec = codec->spec; in indep_hp_possible()
1681 struct auto_pin_cfg *cfg = &spec->autocfg; in indep_hp_possible()
1685 if (cfg->line_out_type == AUTO_PIN_HP_OUT) in indep_hp_possible()
1686 idx = spec->out_paths[0]; in indep_hp_possible()
1688 idx = spec->hp_paths[0]; in indep_hp_possible()
1689 path = snd_hda_get_path_from_idx(codec, idx); in indep_hp_possible()
1694 if (!spec->mixer_nid || !is_nid_contained(path, spec->mixer_nid)) in indep_hp_possible()
1698 for (i = 0; i < cfg->line_outs; i++) { in indep_hp_possible()
1699 if (spec->out_paths[i] == idx) in indep_hp_possible()
1701 path = snd_hda_get_path_from_idx(codec, spec->out_paths[i]); in indep_hp_possible()
1702 if (path && is_nid_contained(path, spec->mixer_nid)) in indep_hp_possible()
1705 for (i = 0; i < cfg->speaker_outs; i++) { in indep_hp_possible()
1706 path = snd_hda_get_path_from_idx(codec, spec->speaker_paths[i]); in indep_hp_possible()
1707 if (path && is_nid_contained(path, spec->mixer_nid)) in indep_hp_possible()
1717 static void refill_shared_dacs(struct hda_codec *codec, int num_outs, in refill_shared_dacs() argument
1723 for (i = 0; i < num_outs; i++) { in refill_shared_dacs()
1726 path = snd_hda_get_path_from_idx(codec, path_idx[i]); in refill_shared_dacs()
1729 dacs[i] = path->path[0]; in refill_shared_dacs()
1734 static int fill_and_eval_dacs(struct hda_codec *codec, in fill_and_eval_dacs() argument
1738 struct hda_gen_spec *spec = codec->spec; in fill_and_eval_dacs()
1739 struct auto_pin_cfg *cfg = &spec->autocfg; in fill_and_eval_dacs()
1743 spec->multiout.num_dacs = cfg->line_outs; in fill_and_eval_dacs()
1744 spec->multiout.dac_nids = spec->private_dac_nids; in fill_and_eval_dacs()
1745 memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids)); in fill_and_eval_dacs()
1746 memset(spec->multiout.hp_out_nid, 0, sizeof(spec->multiout.hp_out_nid)); in fill_and_eval_dacs()
1747 memset(spec->multiout.extra_out_nid, 0, sizeof(spec->multiout.extra_out_nid)); in fill_and_eval_dacs()
1748 spec->multi_ios = 0; in fill_and_eval_dacs()
1749 snd_array_free(&spec->paths); in fill_and_eval_dacs()
1752 memset(spec->out_paths, 0, sizeof(spec->out_paths)); in fill_and_eval_dacs()
1753 memset(spec->hp_paths, 0, sizeof(spec->hp_paths)); in fill_and_eval_dacs()
1754 memset(spec->speaker_paths, 0, sizeof(spec->speaker_paths)); in fill_and_eval_dacs()
1755 memset(spec->aamix_out_paths, 0, sizeof(spec->aamix_out_paths)); in fill_and_eval_dacs()
1756 memset(spec->digout_paths, 0, sizeof(spec->digout_paths)); in fill_and_eval_dacs()
1757 memset(spec->input_paths, 0, sizeof(spec->input_paths)); in fill_and_eval_dacs()
1758 memset(spec->loopback_paths, 0, sizeof(spec->loopback_paths)); in fill_and_eval_dacs()
1759 memset(&spec->digin_path, 0, sizeof(spec->digin_path)); in fill_and_eval_dacs()
1761 badness = 0; in fill_and_eval_dacs()
1763 /* fill hard-wired DACs first */ in fill_and_eval_dacs()
1767 mapped = map_singles(codec, cfg->line_outs, in fill_and_eval_dacs()
1768 cfg->line_out_pins, in fill_and_eval_dacs()
1769 spec->private_dac_nids, in fill_and_eval_dacs()
1770 spec->out_paths); in fill_and_eval_dacs()
1771 mapped |= map_singles(codec, cfg->hp_outs, in fill_and_eval_dacs()
1772 cfg->hp_pins, in fill_and_eval_dacs()
1773 spec->multiout.hp_out_nid, in fill_and_eval_dacs()
1774 spec->hp_paths); in fill_and_eval_dacs()
1775 mapped |= map_singles(codec, cfg->speaker_outs, in fill_and_eval_dacs()
1776 cfg->speaker_pins, in fill_and_eval_dacs()
1777 spec->multiout.extra_out_nid, in fill_and_eval_dacs()
1778 spec->speaker_paths); in fill_and_eval_dacs()
1779 if (!spec->no_multi_io && in fill_and_eval_dacs()
1780 fill_mio_first && cfg->line_outs == 1 && in fill_and_eval_dacs()
1781 cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { in fill_and_eval_dacs()
1782 err = fill_multi_ios(codec, cfg->line_out_pins[0], true); in fill_and_eval_dacs()
1789 badness += try_assign_dacs(codec, cfg->line_outs, cfg->line_out_pins, in fill_and_eval_dacs()
1790 spec->private_dac_nids, spec->out_paths, in fill_and_eval_dacs()
1791 spec->main_out_badness); in fill_and_eval_dacs()
1793 if (!spec->no_multi_io && fill_mio_first && in fill_and_eval_dacs()
1794 cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { in fill_and_eval_dacs()
1795 /* try to fill multi-io first */ in fill_and_eval_dacs()
1796 err = fill_multi_ios(codec, cfg->line_out_pins[0], false); in fill_and_eval_dacs()
1797 if (err < 0) in fill_and_eval_dacs()
1802 if (cfg->line_out_type != AUTO_PIN_HP_OUT) { in fill_and_eval_dacs()
1803 err = try_assign_dacs(codec, cfg->hp_outs, cfg->hp_pins, in fill_and_eval_dacs()
1804 spec->multiout.hp_out_nid, in fill_and_eval_dacs()
1805 spec->hp_paths, in fill_and_eval_dacs()
1806 spec->extra_out_badness); in fill_and_eval_dacs()
1807 if (err < 0) in fill_and_eval_dacs()
1811 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { in fill_and_eval_dacs()
1812 err = try_assign_dacs(codec, cfg->speaker_outs, in fill_and_eval_dacs()
1813 cfg->speaker_pins, in fill_and_eval_dacs()
1814 spec->multiout.extra_out_nid, in fill_and_eval_dacs()
1815 spec->speaker_paths, in fill_and_eval_dacs()
1816 spec->extra_out_badness); in fill_and_eval_dacs()
1817 if (err < 0) in fill_and_eval_dacs()
1821 if (!spec->no_multi_io && in fill_and_eval_dacs()
1822 cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { in fill_and_eval_dacs()
1823 err = fill_multi_ios(codec, cfg->line_out_pins[0], false); in fill_and_eval_dacs()
1824 if (err < 0) in fill_and_eval_dacs()
1829 if (spec->mixer_nid) { in fill_and_eval_dacs()
1830 spec->aamix_out_paths[0] = in fill_and_eval_dacs()
1831 check_aamix_out_path(codec, spec->out_paths[0]); in fill_and_eval_dacs()
1832 if (cfg->line_out_type != AUTO_PIN_HP_OUT) in fill_and_eval_dacs()
1833 spec->aamix_out_paths[1] = in fill_and_eval_dacs()
1834 check_aamix_out_path(codec, spec->hp_paths[0]); in fill_and_eval_dacs()
1835 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) in fill_and_eval_dacs()
1836 spec->aamix_out_paths[2] = in fill_and_eval_dacs()
1837 check_aamix_out_path(codec, spec->speaker_paths[0]); in fill_and_eval_dacs()
1840 if (!spec->no_multi_io && in fill_and_eval_dacs()
1841 cfg->hp_outs && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) in fill_and_eval_dacs()
1842 if (count_multiio_pins(codec, cfg->hp_pins[0]) >= 2) in fill_and_eval_dacs()
1843 spec->multi_ios = 1; /* give badness */ in fill_and_eval_dacs()
1845 /* re-count num_dacs and squash invalid entries */ in fill_and_eval_dacs()
1846 spec->multiout.num_dacs = 0; in fill_and_eval_dacs()
1847 for (i = 0; i < cfg->line_outs; i++) { in fill_and_eval_dacs()
1848 if (spec->private_dac_nids[i]) in fill_and_eval_dacs()
1849 spec->multiout.num_dacs++; in fill_and_eval_dacs()
1851 memmove(spec->private_dac_nids + i, in fill_and_eval_dacs()
1852 spec->private_dac_nids + i + 1, in fill_and_eval_dacs()
1853 sizeof(hda_nid_t) * (cfg->line_outs - i - 1)); in fill_and_eval_dacs()
1854 spec->private_dac_nids[cfg->line_outs - 1] = 0; in fill_and_eval_dacs()
1858 spec->ext_channel_count = spec->min_channel_count = in fill_and_eval_dacs()
1859 spec->multiout.num_dacs * 2; in fill_and_eval_dacs()
1861 if (spec->multi_ios == 2) { in fill_and_eval_dacs()
1862 for (i = 0; i < 2; i++) in fill_and_eval_dacs()
1863 spec->private_dac_nids[spec->multiout.num_dacs++] = in fill_and_eval_dacs()
1864 spec->multi_io[i].dac; in fill_and_eval_dacs()
1865 } else if (spec->multi_ios) { in fill_and_eval_dacs()
1866 spec->multi_ios = 0; in fill_and_eval_dacs()
1870 if (spec->indep_hp && !indep_hp_possible(codec)) in fill_and_eval_dacs()
1873 /* re-fill the shared DAC for speaker / headphone */ in fill_and_eval_dacs()
1874 if (cfg->line_out_type != AUTO_PIN_HP_OUT) in fill_and_eval_dacs()
1875 refill_shared_dacs(codec, cfg->hp_outs, in fill_and_eval_dacs()
1876 spec->multiout.hp_out_nid, in fill_and_eval_dacs()
1877 spec->hp_paths); in fill_and_eval_dacs()
1878 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) in fill_and_eval_dacs()
1879 refill_shared_dacs(codec, cfg->speaker_outs, in fill_and_eval_dacs()
1880 spec->multiout.extra_out_nid, in fill_and_eval_dacs()
1881 spec->speaker_paths); in fill_and_eval_dacs()
1890 codec_dbg(codec, fmt, ##__VA_ARGS__)
1893 do { if (0) codec_dbg(codec, fmt, ##__VA_ARGS__); } while (0)
1897 static inline void print_nid_path_idx(struct hda_codec *codec, in print_nid_path_idx() argument
1902 path = snd_hda_get_path_from_idx(codec, idx); in print_nid_path_idx()
1904 print_nid_path(codec, pfx, path); in print_nid_path_idx()
1907 static void debug_show_configs(struct hda_codec *codec, in debug_show_configs() argument
1910 struct hda_gen_spec *spec = codec->spec; in debug_show_configs()
1915 cfg->line_out_pins[0], cfg->line_out_pins[1], in debug_show_configs()
1916 cfg->line_out_pins[2], cfg->line_out_pins[3], in debug_show_configs()
1917 spec->multiout.dac_nids[0], in debug_show_configs()
1918 spec->multiout.dac_nids[1], in debug_show_configs()
1919 spec->multiout.dac_nids[2], in debug_show_configs()
1920 spec->multiout.dac_nids[3], in debug_show_configs()
1921 lo_type[cfg->line_out_type]); in debug_show_configs()
1922 for (i = 0; i < cfg->line_outs; i++) in debug_show_configs()
1923 print_nid_path_idx(codec, " out", spec->out_paths[i]); in debug_show_configs()
1924 if (spec->multi_ios > 0) in debug_show_configs()
1926 spec->multi_ios, in debug_show_configs()
1927 spec->multi_io[0].pin, spec->multi_io[1].pin, in debug_show_configs()
1928 spec->multi_io[0].dac, spec->multi_io[1].dac); in debug_show_configs()
1929 for (i = 0; i < spec->multi_ios; i++) in debug_show_configs()
1930 print_nid_path_idx(codec, " mio", in debug_show_configs()
1931 spec->out_paths[cfg->line_outs + i]); in debug_show_configs()
1932 if (cfg->hp_outs) in debug_show_configs()
1934 cfg->hp_pins[0], cfg->hp_pins[1], in debug_show_configs()
1935 cfg->hp_pins[2], cfg->hp_pins[3], in debug_show_configs()
1936 spec->multiout.hp_out_nid[0], in debug_show_configs()
1937 spec->multiout.hp_out_nid[1], in debug_show_configs()
1938 spec->multiout.hp_out_nid[2], in debug_show_configs()
1939 spec->multiout.hp_out_nid[3]); in debug_show_configs()
1940 for (i = 0; i < cfg->hp_outs; i++) in debug_show_configs()
1941 print_nid_path_idx(codec, " hp ", spec->hp_paths[i]); in debug_show_configs()
1942 if (cfg->speaker_outs) in debug_show_configs()
1944 cfg->speaker_pins[0], cfg->speaker_pins[1], in debug_show_configs()
1945 cfg->speaker_pins[2], cfg->speaker_pins[3], in debug_show_configs()
1946 spec->multiout.extra_out_nid[0], in debug_show_configs()
1947 spec->multiout.extra_out_nid[1], in debug_show_configs()
1948 spec->multiout.extra_out_nid[2], in debug_show_configs()
1949 spec->multiout.extra_out_nid[3]); in debug_show_configs()
1950 for (i = 0; i < cfg->speaker_outs; i++) in debug_show_configs()
1951 print_nid_path_idx(codec, " spk", spec->speaker_paths[i]); in debug_show_configs()
1952 for (i = 0; i < 3; i++) in debug_show_configs()
1953 print_nid_path_idx(codec, " mix", spec->aamix_out_paths[i]); in debug_show_configs()
1956 #define debug_show_configs(codec, cfg) /* NOP */ argument
1959 /* find all available DACs of the codec */
1960 static void fill_all_dac_nids(struct hda_codec *codec) in fill_all_dac_nids() argument
1962 struct hda_gen_spec *spec = codec->spec; in fill_all_dac_nids()
1965 spec->num_all_dacs = 0; in fill_all_dac_nids()
1966 memset(spec->all_dacs, 0, sizeof(spec->all_dacs)); in fill_all_dac_nids()
1967 for_each_hda_codec_node(nid, codec) { in fill_all_dac_nids()
1968 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_AUD_OUT) in fill_all_dac_nids()
1970 if (spec->num_all_dacs >= ARRAY_SIZE(spec->all_dacs)) { in fill_all_dac_nids()
1971 codec_err(codec, "Too many DACs!\n"); in fill_all_dac_nids()
1974 spec->all_dacs[spec->num_all_dacs++] = nid; in fill_all_dac_nids()
1978 static int parse_output_paths(struct hda_codec *codec) in parse_output_paths() argument
1980 struct hda_gen_spec *spec = codec->spec; in parse_output_paths()
1981 struct auto_pin_cfg *cfg = &spec->autocfg; in parse_output_paths()
1992 return -ENOMEM; in parse_output_paths()
1996 badness = fill_and_eval_dacs(codec, fill_hardwired, in parse_output_paths()
1998 if (badness < 0) { in parse_output_paths()
2002 debug_badness("==> lo_type=%d, wired=%d, mio=%d, badness=0x%x\n", in parse_output_paths()
2003 cfg->line_out_type, fill_hardwired, fill_mio_first, in parse_output_paths()
2005 debug_show_configs(codec, cfg); in parse_output_paths()
2023 if (cfg->speaker_outs > 0 && in parse_output_paths()
2024 cfg->line_out_type == AUTO_PIN_HP_OUT) { in parse_output_paths()
2025 cfg->hp_outs = cfg->line_outs; in parse_output_paths()
2026 memcpy(cfg->hp_pins, cfg->line_out_pins, in parse_output_paths()
2027 sizeof(cfg->hp_pins)); in parse_output_paths()
2028 cfg->line_outs = cfg->speaker_outs; in parse_output_paths()
2029 memcpy(cfg->line_out_pins, cfg->speaker_pins, in parse_output_paths()
2030 sizeof(cfg->speaker_pins)); in parse_output_paths()
2031 cfg->speaker_outs = 0; in parse_output_paths()
2032 memset(cfg->speaker_pins, 0, sizeof(cfg->speaker_pins)); in parse_output_paths()
2033 cfg->line_out_type = AUTO_PIN_SPEAKER_OUT; in parse_output_paths()
2037 if (cfg->hp_outs > 0 && in parse_output_paths()
2038 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) { in parse_output_paths()
2039 cfg->speaker_outs = cfg->line_outs; in parse_output_paths()
2040 memcpy(cfg->speaker_pins, cfg->line_out_pins, in parse_output_paths()
2041 sizeof(cfg->speaker_pins)); in parse_output_paths()
2042 cfg->line_outs = cfg->hp_outs; in parse_output_paths()
2043 memcpy(cfg->line_out_pins, cfg->hp_pins, in parse_output_paths()
2044 sizeof(cfg->hp_pins)); in parse_output_paths()
2045 cfg->hp_outs = 0; in parse_output_paths()
2046 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins)); in parse_output_paths()
2047 cfg->line_out_type = AUTO_PIN_HP_OUT; in parse_output_paths()
2057 fill_and_eval_dacs(codec, best_wired, best_mio); in parse_output_paths()
2060 cfg->line_out_type, best_wired, best_mio); in parse_output_paths()
2061 debug_show_configs(codec, cfg); in parse_output_paths()
2063 if (cfg->line_out_pins[0]) { in parse_output_paths()
2065 path = snd_hda_get_path_from_idx(codec, spec->out_paths[0]); in parse_output_paths()
2067 spec->vmaster_nid = look_for_out_vol_nid(codec, path); in parse_output_paths()
2068 if (spec->vmaster_nid) { in parse_output_paths()
2069 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid, in parse_output_paths()
2070 HDA_OUTPUT, spec->vmaster_tlv); in parse_output_paths()
2071 if (spec->dac_min_mute) in parse_output_paths()
2072 spec->vmaster_tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP] |= TLV_DB_SCALE_MUTE; in parse_output_paths()
2077 if (spec->prefer_hp_amp || cfg->line_out_type == AUTO_PIN_HP_OUT) in parse_output_paths()
2081 set_pin_targets(codec, cfg->line_outs, cfg->line_out_pins, val); in parse_output_paths()
2082 if (cfg->line_out_type != AUTO_PIN_HP_OUT) in parse_output_paths()
2083 set_pin_targets(codec, cfg->hp_outs, cfg->hp_pins, PIN_HP); in parse_output_paths()
2084 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { in parse_output_paths()
2085 val = spec->prefer_hp_amp ? PIN_HP : PIN_OUT; in parse_output_paths()
2086 set_pin_targets(codec, cfg->speaker_outs, in parse_output_paths()
2087 cfg->speaker_pins, val); in parse_output_paths()
2091 if (spec->indep_hp && !indep_hp_possible(codec)) in parse_output_paths()
2092 spec->indep_hp = 0; in parse_output_paths()
2095 return 0; in parse_output_paths()
2099 static int create_multi_out_ctls(struct hda_codec *codec, in create_multi_out_ctls() argument
2102 struct hda_gen_spec *spec = codec->spec; in create_multi_out_ctls()
2105 noutputs = cfg->line_outs; in create_multi_out_ctls()
2106 if (spec->multi_ios > 0 && cfg->line_outs < 3) in create_multi_out_ctls()
2107 noutputs += spec->multi_ios; in create_multi_out_ctls()
2109 for (i = 0; i < noutputs; i++) { in create_multi_out_ctls()
2114 path = snd_hda_get_path_from_idx(codec, spec->out_paths[i]); in create_multi_out_ctls()
2118 name = get_line_out_pfx(codec, i, &index, NID_PATH_VOL_CTL); in create_multi_out_ctls()
2121 err = add_vol_ctl(codec, "Center", 0, 1, path); in create_multi_out_ctls()
2122 if (err < 0) in create_multi_out_ctls()
2124 err = add_vol_ctl(codec, "LFE", 0, 2, path); in create_multi_out_ctls()
2125 if (err < 0) in create_multi_out_ctls()
2128 err = add_stereo_vol(codec, name, index, path); in create_multi_out_ctls()
2129 if (err < 0) in create_multi_out_ctls()
2133 name = get_line_out_pfx(codec, i, &index, NID_PATH_MUTE_CTL); in create_multi_out_ctls()
2135 err = add_sw_ctl(codec, "Center", 0, 1, path); in create_multi_out_ctls()
2136 if (err < 0) in create_multi_out_ctls()
2138 err = add_sw_ctl(codec, "LFE", 0, 2, path); in create_multi_out_ctls()
2139 if (err < 0) in create_multi_out_ctls()
2142 err = add_stereo_sw(codec, name, index, path); in create_multi_out_ctls()
2143 if (err < 0) in create_multi_out_ctls()
2147 return 0; in create_multi_out_ctls()
2150 static int create_extra_out(struct hda_codec *codec, int path_idx, in create_extra_out() argument
2156 path = snd_hda_get_path_from_idx(codec, path_idx); in create_extra_out()
2158 return 0; in create_extra_out()
2159 err = add_stereo_vol(codec, pfx, cidx, path); in create_extra_out()
2160 if (err < 0) in create_extra_out()
2162 err = add_stereo_sw(codec, pfx, cidx, path); in create_extra_out()
2163 if (err < 0) in create_extra_out()
2165 return 0; in create_extra_out()
2169 static int create_extra_outs(struct hda_codec *codec, int num_pins, in create_extra_outs() argument
2174 for (i = 0; i < num_pins; i++) { in create_extra_outs()
2177 int err, idx = 0; in create_extra_outs()
2189 err = create_extra_out(codec, paths[i], name, idx); in create_extra_outs()
2190 if (err < 0) in create_extra_outs()
2193 return 0; in create_extra_outs()
2196 static int create_hp_out_ctls(struct hda_codec *codec) in create_hp_out_ctls() argument
2198 struct hda_gen_spec *spec = codec->spec; in create_hp_out_ctls()
2199 return create_extra_outs(codec, spec->autocfg.hp_outs, in create_hp_out_ctls()
2200 spec->hp_paths, in create_hp_out_ctls()
2204 static int create_speaker_out_ctls(struct hda_codec *codec) in create_speaker_out_ctls() argument
2206 struct hda_gen_spec *spec = codec->spec; in create_speaker_out_ctls()
2207 return create_extra_outs(codec, spec->autocfg.speaker_outs, in create_speaker_out_ctls()
2208 spec->speaker_paths, in create_speaker_out_ctls()
2216 static void call_hp_automute(struct hda_codec *codec,
2227 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in indep_hp_get() local
2228 struct hda_gen_spec *spec = codec->spec; in indep_hp_get()
2229 ucontrol->value.enumerated.item[0] = spec->indep_hp_enabled; in indep_hp_get()
2230 return 0; in indep_hp_get()
2233 static void update_aamix_paths(struct hda_codec *codec, bool do_mix,
2240 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in indep_hp_put() local
2241 struct hda_gen_spec *spec = codec->spec; in indep_hp_put()
2242 unsigned int select = ucontrol->value.enumerated.item[0]; in indep_hp_put()
2243 int ret = 0; in indep_hp_put()
2245 mutex_lock(&spec->pcm_mutex); in indep_hp_put()
2246 if (spec->active_streams) { in indep_hp_put()
2247 ret = -EBUSY; in indep_hp_put()
2251 if (spec->indep_hp_enabled != select) { in indep_hp_put()
2253 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT) in indep_hp_put()
2254 dacp = &spec->private_dac_nids[0]; in indep_hp_put()
2256 dacp = &spec->multiout.hp_out_nid[0]; in indep_hp_put()
2259 if (spec->have_aamix_ctl) { in indep_hp_put()
2260 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT) in indep_hp_put()
2261 update_aamix_paths(codec, spec->aamix_mode, in indep_hp_put()
2262 spec->out_paths[0], in indep_hp_put()
2263 spec->aamix_out_paths[0], in indep_hp_put()
2264 spec->autocfg.line_out_type); in indep_hp_put()
2266 update_aamix_paths(codec, spec->aamix_mode, in indep_hp_put()
2267 spec->hp_paths[0], in indep_hp_put()
2268 spec->aamix_out_paths[1], in indep_hp_put()
2272 spec->indep_hp_enabled = select; in indep_hp_put()
2273 if (spec->indep_hp_enabled) in indep_hp_put()
2274 *dacp = 0; in indep_hp_put()
2276 *dacp = spec->alt_dac_nid; in indep_hp_put()
2278 call_hp_automute(codec, NULL); in indep_hp_put()
2282 mutex_unlock(&spec->pcm_mutex); in indep_hp_put()
2295 static int create_indep_hp_ctls(struct hda_codec *codec) in create_indep_hp_ctls() argument
2297 struct hda_gen_spec *spec = codec->spec; in create_indep_hp_ctls()
2300 if (!spec->indep_hp) in create_indep_hp_ctls()
2301 return 0; in create_indep_hp_ctls()
2302 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT) in create_indep_hp_ctls()
2303 dac = spec->multiout.dac_nids[0]; in create_indep_hp_ctls()
2305 dac = spec->multiout.hp_out_nid[0]; in create_indep_hp_ctls()
2307 spec->indep_hp = 0; in create_indep_hp_ctls()
2308 return 0; in create_indep_hp_ctls()
2311 spec->indep_hp_enabled = false; in create_indep_hp_ctls()
2312 spec->alt_dac_nid = dac; in create_indep_hp_ctls()
2314 return -ENOMEM; in create_indep_hp_ctls()
2315 return 0; in create_indep_hp_ctls()
2325 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in ch_mode_info() local
2326 struct hda_gen_spec *spec = codec->spec; in ch_mode_info()
2329 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; in ch_mode_info()
2330 uinfo->count = 1; in ch_mode_info()
2331 uinfo->value.enumerated.items = spec->multi_ios + 1; in ch_mode_info()
2332 if (uinfo->value.enumerated.item > spec->multi_ios) in ch_mode_info()
2333 uinfo->value.enumerated.item = spec->multi_ios; in ch_mode_info()
2334 chs = uinfo->value.enumerated.item * 2 + spec->min_channel_count; in ch_mode_info()
2335 sprintf(uinfo->value.enumerated.name, "%dch", chs); in ch_mode_info()
2336 return 0; in ch_mode_info()
2342 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in ch_mode_get() local
2343 struct hda_gen_spec *spec = codec->spec; in ch_mode_get()
2344 ucontrol->value.enumerated.item[0] = in ch_mode_get()
2345 (spec->ext_channel_count - spec->min_channel_count) / 2; in ch_mode_get()
2346 return 0; in ch_mode_get()
2350 get_multiio_path(struct hda_codec *codec, int idx) in get_multiio_path() argument
2352 struct hda_gen_spec *spec = codec->spec; in get_multiio_path()
2353 return snd_hda_get_path_from_idx(codec, in get_multiio_path()
2354 spec->out_paths[spec->autocfg.line_outs + idx]); in get_multiio_path()
2357 static void update_automute_all(struct hda_codec *codec);
2364 return !spec->have_aamix_ctl || spec->aamix_mode; in aamix_default()
2367 static int set_multi_io(struct hda_codec *codec, int idx, bool output) in set_multi_io() argument
2369 struct hda_gen_spec *spec = codec->spec; in set_multi_io()
2370 hda_nid_t nid = spec->multi_io[idx].pin; in set_multi_io()
2373 path = get_multiio_path(codec, idx); in set_multi_io()
2375 return -EINVAL; in set_multi_io()
2377 if (path->active == output) in set_multi_io()
2378 return 0; in set_multi_io()
2381 set_pin_target(codec, nid, PIN_OUT, true); in set_multi_io()
2382 snd_hda_activate_path(codec, path, true, aamix_default(spec)); in set_multi_io()
2383 set_pin_eapd(codec, nid, true); in set_multi_io()
2385 set_pin_eapd(codec, nid, false); in set_multi_io()
2386 snd_hda_activate_path(codec, path, false, aamix_default(spec)); in set_multi_io()
2387 set_pin_target(codec, nid, spec->multi_io[idx].ctl_in, true); in set_multi_io()
2388 path_power_down_sync(codec, path); in set_multi_io()
2392 update_automute_all(codec); in set_multi_io()
2394 return 0; in set_multi_io()
2400 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in ch_mode_put() local
2401 struct hda_gen_spec *spec = codec->spec; in ch_mode_put()
2404 ch = ucontrol->value.enumerated.item[0]; in ch_mode_put()
2405 if (ch < 0 || ch > spec->multi_ios) in ch_mode_put()
2406 return -EINVAL; in ch_mode_put()
2407 if (ch == (spec->ext_channel_count - spec->min_channel_count) / 2) in ch_mode_put()
2408 return 0; in ch_mode_put()
2409 spec->ext_channel_count = ch * 2 + spec->min_channel_count; in ch_mode_put()
2410 for (i = 0; i < spec->multi_ios; i++) in ch_mode_put()
2411 set_multi_io(codec, i, i < ch); in ch_mode_put()
2412 spec->multiout.max_channels = max(spec->ext_channel_count, in ch_mode_put()
2413 spec->const_channel_count); in ch_mode_put()
2414 if (spec->need_dac_fix) in ch_mode_put()
2415 spec->multiout.num_dacs = spec->multiout.max_channels / 2; in ch_mode_put()
2427 static int create_multi_channel_mode(struct hda_codec *codec) in create_multi_channel_mode() argument
2429 struct hda_gen_spec *spec = codec->spec; in create_multi_channel_mode()
2431 if (spec->multi_ios > 0) { in create_multi_channel_mode()
2433 return -ENOMEM; in create_multi_channel_mode()
2435 return 0; in create_multi_channel_mode()
2447 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in loopback_mixing_get() local
2448 struct hda_gen_spec *spec = codec->spec; in loopback_mixing_get()
2449 ucontrol->value.enumerated.item[0] = spec->aamix_mode; in loopback_mixing_get()
2450 return 0; in loopback_mixing_get()
2453 static void update_aamix_paths(struct hda_codec *codec, bool do_mix, in update_aamix_paths() argument
2457 struct hda_gen_spec *spec = codec->spec; in update_aamix_paths()
2460 nomix_path = snd_hda_get_path_from_idx(codec, nomix_path_idx); in update_aamix_paths()
2461 mix_path = snd_hda_get_path_from_idx(codec, mix_path_idx); in update_aamix_paths()
2468 if (out_type == AUTO_PIN_HP_OUT && spec->indep_hp_enabled && in update_aamix_paths()
2469 mix_path->path[0] != spec->alt_dac_nid) in update_aamix_paths()
2473 snd_hda_activate_path(codec, nomix_path, false, true); in update_aamix_paths()
2474 snd_hda_activate_path(codec, mix_path, true, true); in update_aamix_paths()
2475 path_power_down_sync(codec, nomix_path); in update_aamix_paths()
2477 snd_hda_activate_path(codec, mix_path, false, false); in update_aamix_paths()
2478 snd_hda_activate_path(codec, nomix_path, true, false); in update_aamix_paths()
2479 path_power_down_sync(codec, mix_path); in update_aamix_paths()
2483 /* re-initialize the output paths; only called from loopback_mixing_put() */
2484 static void update_output_paths(struct hda_codec *codec, int num_outs, in update_output_paths() argument
2487 struct hda_gen_spec *spec = codec->spec; in update_output_paths()
2491 for (i = 0; i < num_outs; i++) { in update_output_paths()
2492 path = snd_hda_get_path_from_idx(codec, paths[i]); in update_output_paths()
2494 snd_hda_activate_path(codec, path, path->active, in update_output_paths()
2495 spec->aamix_mode); in update_output_paths()
2502 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in loopback_mixing_put() local
2503 struct hda_gen_spec *spec = codec->spec; in loopback_mixing_put()
2504 const struct auto_pin_cfg *cfg = &spec->autocfg; in loopback_mixing_put()
2505 unsigned int val = ucontrol->value.enumerated.item[0]; in loopback_mixing_put()
2507 if (val == spec->aamix_mode) in loopback_mixing_put()
2508 return 0; in loopback_mixing_put()
2509 spec->aamix_mode = val; in loopback_mixing_put()
2511 update_aamix_paths(codec, val, spec->out_paths[0], in loopback_mixing_put()
2512 spec->aamix_out_paths[0], in loopback_mixing_put()
2513 cfg->line_out_type); in loopback_mixing_put()
2514 update_aamix_paths(codec, val, spec->hp_paths[0], in loopback_mixing_put()
2515 spec->aamix_out_paths[1], in loopback_mixing_put()
2517 update_aamix_paths(codec, val, spec->speaker_paths[0], in loopback_mixing_put()
2518 spec->aamix_out_paths[2], in loopback_mixing_put()
2521 update_output_paths(codec, cfg->line_outs, spec->out_paths); in loopback_mixing_put()
2522 if (cfg->line_out_type != AUTO_PIN_HP_OUT) in loopback_mixing_put()
2523 update_output_paths(codec, cfg->hp_outs, spec->hp_paths); in loopback_mixing_put()
2524 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) in loopback_mixing_put()
2525 update_output_paths(codec, cfg->speaker_outs, in loopback_mixing_put()
2526 spec->speaker_paths); in loopback_mixing_put()
2539 static int create_loopback_mixing_ctl(struct hda_codec *codec) in create_loopback_mixing_ctl() argument
2541 struct hda_gen_spec *spec = codec->spec; in create_loopback_mixing_ctl()
2543 if (!spec->mixer_nid) in create_loopback_mixing_ctl()
2544 return 0; in create_loopback_mixing_ctl()
2546 return -ENOMEM; in create_loopback_mixing_ctl()
2547 spec->have_aamix_ctl = 1; in create_loopback_mixing_ctl()
2548 return 0; in create_loopback_mixing_ctl()
2555 static void call_update_outputs(struct hda_codec *codec);
2557 /* for shared I/O, change the pin-control accordingly */
2558 static void update_hp_mic(struct hda_codec *codec, int adc_mux, bool force) in update_hp_mic() argument
2560 struct hda_gen_spec *spec = codec->spec; in update_hp_mic()
2565 pin = spec->hp_mic_pin; in update_hp_mic()
2566 as_mic = spec->cur_mux[adc_mux] == spec->hp_mic_mux_idx; in update_hp_mic()
2569 val = snd_hda_codec_get_pin_target(codec, pin); in update_hp_mic()
2579 val = snd_hda_get_default_vref(codec, pin); in update_hp_mic()
2580 /* if the HP pin doesn't support VREF and the codec driver gives an in update_hp_mic()
2583 if (val == AC_PINCTL_VREF_HIZ && spec->shared_mic_vref_pin) { in update_hp_mic()
2584 const hda_nid_t vref_pin = spec->shared_mic_vref_pin; in update_hp_mic()
2585 unsigned int vref_val = snd_hda_get_default_vref(codec, vref_pin); in update_hp_mic()
2587 snd_hda_set_pin_ctl_cache(codec, vref_pin, in update_hp_mic()
2588 PIN_IN | (as_mic ? vref_val : 0)); in update_hp_mic()
2591 if (!spec->hp_mic_jack_modes) { in update_hp_mic()
2596 set_pin_target(codec, pin, val, true); in update_hp_mic()
2597 call_hp_automute(codec, NULL); in update_hp_mic()
2602 static int create_hp_mic(struct hda_codec *codec) in create_hp_mic() argument
2604 struct hda_gen_spec *spec = codec->spec; in create_hp_mic()
2605 struct auto_pin_cfg *cfg = &spec->autocfg; in create_hp_mic()
2609 if (!spec->hp_mic) { in create_hp_mic()
2610 if (spec->suppress_hp_mic_detect) in create_hp_mic()
2611 return 0; in create_hp_mic()
2615 if (cfg->num_inputs > 1) in create_hp_mic()
2616 return 0; in create_hp_mic()
2617 else if (cfg->num_inputs == 1) { in create_hp_mic()
2618 defcfg = snd_hda_codec_get_pincfg(codec, cfg->inputs[0].pin); in create_hp_mic()
2620 return 0; in create_hp_mic()
2624 spec->hp_mic = 0; /* clear once */ in create_hp_mic()
2625 if (cfg->num_inputs >= AUTO_CFG_MAX_INS) in create_hp_mic()
2626 return 0; in create_hp_mic()
2628 nid = 0; in create_hp_mic()
2629 if (cfg->line_out_type == AUTO_PIN_HP_OUT && cfg->line_outs > 0) in create_hp_mic()
2630 nid = cfg->line_out_pins[0]; in create_hp_mic()
2631 else if (cfg->hp_outs > 0) in create_hp_mic()
2632 nid = cfg->hp_pins[0]; in create_hp_mic()
2634 return 0; in create_hp_mic()
2636 if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_IN)) in create_hp_mic()
2637 return 0; /* no input */ in create_hp_mic()
2639 cfg->inputs[cfg->num_inputs].pin = nid; in create_hp_mic()
2640 cfg->inputs[cfg->num_inputs].type = AUTO_PIN_MIC; in create_hp_mic()
2641 cfg->inputs[cfg->num_inputs].is_headphone_mic = 1; in create_hp_mic()
2642 cfg->num_inputs++; in create_hp_mic()
2643 spec->hp_mic = 1; in create_hp_mic()
2644 spec->hp_mic_pin = nid; in create_hp_mic()
2645 /* we can't handle auto-mic together with HP-mic */ in create_hp_mic()
2646 spec->suppress_auto_mic = 1; in create_hp_mic()
2647 codec_dbg(codec, "Enable shared I/O jack on NID 0x%x\n", nid); in create_hp_mic()
2648 return 0; in create_hp_mic()
2655 static int create_hp_mic_jack_mode(struct hda_codec *codec, hda_nid_t pin);
2670 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in out_jack_mode_get() local
2671 hda_nid_t nid = kcontrol->private_value; in out_jack_mode_get()
2672 if (snd_hda_codec_get_pin_target(codec, nid) == PIN_HP) in out_jack_mode_get()
2673 ucontrol->value.enumerated.item[0] = 1; in out_jack_mode_get()
2675 ucontrol->value.enumerated.item[0] = 0; in out_jack_mode_get()
2676 return 0; in out_jack_mode_get()
2682 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in out_jack_mode_put() local
2683 hda_nid_t nid = kcontrol->private_value; in out_jack_mode_put()
2686 val = ucontrol->value.enumerated.item[0] ? PIN_HP : PIN_OUT; in out_jack_mode_put()
2687 if (snd_hda_codec_get_pin_target(codec, nid) == val) in out_jack_mode_put()
2688 return 0; in out_jack_mode_put()
2689 snd_hda_set_pin_ctl_cache(codec, nid, val); in out_jack_mode_put()
2700 static bool find_kctl_name(struct hda_codec *codec, const char *name, int idx) in find_kctl_name() argument
2702 struct hda_gen_spec *spec = codec->spec; in find_kctl_name()
2706 snd_array_for_each(&spec->kctls, i, kctl) { in find_kctl_name()
2707 if (!strcmp(kctl->name, name) && kctl->index == idx) in find_kctl_name()
2713 static void get_jack_mode_name(struct hda_codec *codec, hda_nid_t pin, in get_jack_mode_name() argument
2716 struct hda_gen_spec *spec = codec->spec; in get_jack_mode_name()
2717 int idx = 0; in get_jack_mode_name()
2719 snd_hda_get_pin_label(codec, pin, &spec->autocfg, name, name_len, &idx); in get_jack_mode_name()
2722 for (; find_kctl_name(codec, name, idx); idx++) in get_jack_mode_name()
2726 static int get_out_jack_num_items(struct hda_codec *codec, hda_nid_t pin) in get_out_jack_num_items() argument
2728 struct hda_gen_spec *spec = codec->spec; in get_out_jack_num_items()
2729 if (spec->add_jack_modes) { in get_out_jack_num_items()
2730 unsigned int pincap = snd_hda_query_pin_caps(codec, pin); in get_out_jack_num_items()
2737 static int create_out_jack_modes(struct hda_codec *codec, int num_pins, in create_out_jack_modes() argument
2740 struct hda_gen_spec *spec = codec->spec; in create_out_jack_modes()
2743 for (i = 0; i < num_pins; i++) { in create_out_jack_modes()
2745 if (pin == spec->hp_mic_pin) in create_out_jack_modes()
2747 if (get_out_jack_num_items(codec, pin) > 1) { in create_out_jack_modes()
2750 get_jack_mode_name(codec, pin, name, sizeof(name)); in create_out_jack_modes()
2754 return -ENOMEM; in create_out_jack_modes()
2755 knew->private_value = pin; in create_out_jack_modes()
2759 return 0; in create_out_jack_modes()
2770 "Line In", "Mic 50pc Bias", "Mic 0V Bias",
2774 static unsigned int get_vref_caps(struct hda_codec *codec, hda_nid_t pin) in get_vref_caps() argument
2778 pincap = snd_hda_query_pin_caps(codec, pin); in get_vref_caps()
2785 /* convert from the enum item index to the vref ctl index (0=HIZ, 1=50%...) */
2788 unsigned int i, n = 0; in get_vref_idx()
2790 for (i = 0; i < NUM_VREFS; i++) { in get_vref_idx()
2797 return 0; in get_vref_idx()
2803 unsigned int i, n = 0; in cvt_from_vref_idx()
2805 for (i = 0; i < NUM_VREFS; i++) { in cvt_from_vref_idx()
2811 return 0; in cvt_from_vref_idx()
2817 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in in_jack_mode_info() local
2818 hda_nid_t nid = kcontrol->private_value; in in_jack_mode_info()
2819 unsigned int vref_caps = get_vref_caps(codec, nid); in in_jack_mode_info()
2824 strcpy(uinfo->value.enumerated.name, in in_jack_mode_info()
2825 vref_texts[get_vref_idx(vref_caps, uinfo->value.enumerated.item)]); in in_jack_mode_info()
2826 return 0; in in_jack_mode_info()
2832 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in in_jack_mode_get() local
2833 hda_nid_t nid = kcontrol->private_value; in in_jack_mode_get()
2834 unsigned int vref_caps = get_vref_caps(codec, nid); in in_jack_mode_get()
2837 idx = snd_hda_codec_get_pin_target(codec, nid) & AC_PINCTL_VREFEN; in in_jack_mode_get()
2838 ucontrol->value.enumerated.item[0] = cvt_from_vref_idx(vref_caps, idx); in in_jack_mode_get()
2839 return 0; in in_jack_mode_get()
2845 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in in_jack_mode_put() local
2846 hda_nid_t nid = kcontrol->private_value; in in_jack_mode_put()
2847 unsigned int vref_caps = get_vref_caps(codec, nid); in in_jack_mode_put()
2850 val = snd_hda_codec_get_pin_target(codec, nid); in in_jack_mode_put()
2852 if (idx == ucontrol->value.enumerated.item[0]) in in_jack_mode_put()
2853 return 0; in in_jack_mode_put()
2856 val |= get_vref_idx(vref_caps, ucontrol->value.enumerated.item[0]); in in_jack_mode_put()
2857 snd_hda_set_pin_ctl_cache(codec, nid, val); in in_jack_mode_put()
2868 static int get_in_jack_num_items(struct hda_codec *codec, hda_nid_t pin) in get_in_jack_num_items() argument
2870 struct hda_gen_spec *spec = codec->spec; in get_in_jack_num_items()
2871 int nitems = 0; in get_in_jack_num_items()
2872 if (spec->add_jack_modes) in get_in_jack_num_items()
2873 nitems = hweight32(get_vref_caps(codec, pin)); in get_in_jack_num_items()
2877 static int create_in_jack_mode(struct hda_codec *codec, hda_nid_t pin) in create_in_jack_mode() argument
2879 struct hda_gen_spec *spec = codec->spec; in create_in_jack_mode()
2884 if (pin == spec->hp_mic_pin) in create_in_jack_mode()
2885 return 0; /* already done in create_out_jack_mode() */ in create_in_jack_mode()
2888 defcfg = snd_hda_codec_get_pincfg(codec, pin); in create_in_jack_mode()
2890 return 0; in create_in_jack_mode()
2893 if (get_in_jack_num_items(codec, pin) <= 1) in create_in_jack_mode()
2894 return 0; in create_in_jack_mode()
2896 get_jack_mode_name(codec, pin, name, sizeof(name)); in create_in_jack_mode()
2899 return -ENOMEM; in create_in_jack_mode()
2900 knew->private_value = pin; in create_in_jack_mode()
2901 return 0; in create_in_jack_mode()
2910 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in hp_mic_jack_mode_info() local
2911 hda_nid_t nid = kcontrol->private_value; in hp_mic_jack_mode_info()
2912 int out_jacks = get_out_jack_num_items(codec, nid); in hp_mic_jack_mode_info()
2913 int in_jacks = get_in_jack_num_items(codec, nid); in hp_mic_jack_mode_info()
2917 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; in hp_mic_jack_mode_info()
2918 uinfo->count = 1; in hp_mic_jack_mode_info()
2919 uinfo->value.enumerated.items = out_jacks + in_jacks; in hp_mic_jack_mode_info()
2920 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) in hp_mic_jack_mode_info()
2921 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; in hp_mic_jack_mode_info()
2922 idx = uinfo->value.enumerated.item; in hp_mic_jack_mode_info()
2929 idx -= out_jacks; in hp_mic_jack_mode_info()
2931 unsigned int vref_caps = get_vref_caps(codec, nid); in hp_mic_jack_mode_info()
2937 strcpy(uinfo->value.enumerated.name, text); in hp_mic_jack_mode_info()
2938 return 0; in hp_mic_jack_mode_info()
2941 static int get_cur_hp_mic_jack_mode(struct hda_codec *codec, hda_nid_t nid) in get_cur_hp_mic_jack_mode() argument
2943 int out_jacks = get_out_jack_num_items(codec, nid); in get_cur_hp_mic_jack_mode()
2944 int in_jacks = get_in_jack_num_items(codec, nid); in get_cur_hp_mic_jack_mode()
2945 unsigned int val = snd_hda_codec_get_pin_target(codec, nid); in get_cur_hp_mic_jack_mode()
2946 int idx = 0; in get_cur_hp_mic_jack_mode()
2954 unsigned int vref_caps = get_vref_caps(codec, nid); in get_cur_hp_mic_jack_mode()
2965 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in hp_mic_jack_mode_get() local
2966 hda_nid_t nid = kcontrol->private_value; in hp_mic_jack_mode_get()
2967 ucontrol->value.enumerated.item[0] = in hp_mic_jack_mode_get()
2968 get_cur_hp_mic_jack_mode(codec, nid); in hp_mic_jack_mode_get()
2969 return 0; in hp_mic_jack_mode_get()
2975 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in hp_mic_jack_mode_put() local
2976 hda_nid_t nid = kcontrol->private_value; in hp_mic_jack_mode_put()
2977 int out_jacks = get_out_jack_num_items(codec, nid); in hp_mic_jack_mode_put()
2978 int in_jacks = get_in_jack_num_items(codec, nid); in hp_mic_jack_mode_put()
2981 oldval = get_cur_hp_mic_jack_mode(codec, nid); in hp_mic_jack_mode_put()
2982 idx = ucontrol->value.enumerated.item[0]; in hp_mic_jack_mode_put()
2984 return 0; in hp_mic_jack_mode_put()
2992 idx -= out_jacks; in hp_mic_jack_mode_put()
2994 unsigned int vref_caps = get_vref_caps(codec, nid); in hp_mic_jack_mode_put()
2995 val = snd_hda_codec_get_pin_target(codec, nid); in hp_mic_jack_mode_put()
2999 val = snd_hda_get_default_vref(codec, nid) | PIN_IN; in hp_mic_jack_mode_put()
3001 snd_hda_set_pin_ctl_cache(codec, nid, val); in hp_mic_jack_mode_put()
3002 call_hp_automute(codec, NULL); in hp_mic_jack_mode_put()
3014 static int create_hp_mic_jack_mode(struct hda_codec *codec, hda_nid_t pin) in create_hp_mic_jack_mode() argument
3016 struct hda_gen_spec *spec = codec->spec; in create_hp_mic_jack_mode()
3022 return -ENOMEM; in create_hp_mic_jack_mode()
3023 knew->private_value = pin; in create_hp_mic_jack_mode()
3024 spec->hp_mic_jack_modes = 1; in create_hp_mic_jack_mode()
3025 return 0; in create_hp_mic_jack_mode()
3032 /* add the powersave loopback-list entry */
3037 list = snd_array_new(&spec->loopback_list); in add_loopback_list()
3039 return -ENOMEM; in add_loopback_list()
3040 list->nid = mix; in add_loopback_list()
3041 list->dir = HDA_INPUT; in add_loopback_list()
3042 list->idx = idx; in add_loopback_list()
3043 spec->loopback.amplist = spec->loopback_list.list; in add_loopback_list()
3044 return 0; in add_loopback_list()
3050 static bool look_for_mix_leaf_ctls(struct hda_codec *codec, hda_nid_t mix_nid, in look_for_mix_leaf_ctls() argument
3058 idx = snd_hda_get_conn_index(codec, mix_nid, pin, true); in look_for_mix_leaf_ctls()
3059 if (idx < 0) in look_for_mix_leaf_ctls()
3062 *mix_val = *mute_val = 0; in look_for_mix_leaf_ctls()
3063 if (nid_has_volume(codec, mix_nid, HDA_INPUT)) in look_for_mix_leaf_ctls()
3065 if (nid_has_mute(codec, mix_nid, HDA_INPUT)) in look_for_mix_leaf_ctls()
3071 num_conns = snd_hda_get_conn_list(codec, mix_nid, &list); in look_for_mix_leaf_ctls()
3075 if (!*mix_val && nid_has_volume(codec, nid, HDA_OUTPUT) && in look_for_mix_leaf_ctls()
3076 !is_ctl_associated(codec, nid, HDA_OUTPUT, 0, NID_PATH_VOL_CTL)) in look_for_mix_leaf_ctls()
3077 *mix_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); in look_for_mix_leaf_ctls()
3078 if (!*mute_val && nid_has_mute(codec, nid, HDA_OUTPUT) && in look_for_mix_leaf_ctls()
3079 !is_ctl_associated(codec, nid, HDA_OUTPUT, 0, NID_PATH_MUTE_CTL)) in look_for_mix_leaf_ctls()
3080 *mute_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); in look_for_mix_leaf_ctls()
3086 static int new_analog_input(struct hda_codec *codec, int input_idx, in new_analog_input() argument
3090 struct hda_gen_spec *spec = codec->spec; in new_analog_input()
3095 if (!look_for_mix_leaf_ctls(codec, mix_nid, pin, &mix_val, &mute_val)) in new_analog_input()
3096 return 0; in new_analog_input()
3098 path = snd_hda_add_new_path(codec, pin, mix_nid, 0); in new_analog_input()
3100 return -EINVAL; in new_analog_input()
3101 print_nid_path(codec, "loopback", path); in new_analog_input()
3102 spec->loopback_paths[input_idx] = snd_hda_get_path_idx(codec, path); in new_analog_input()
3104 idx = path->idx[path->depth - 1]; in new_analog_input()
3107 if (err < 0) in new_analog_input()
3109 path->ctls[NID_PATH_VOL_CTL] = mix_val; in new_analog_input()
3114 if (err < 0) in new_analog_input()
3116 path->ctls[NID_PATH_MUTE_CTL] = mute_val; in new_analog_input()
3119 path->active = true; in new_analog_input()
3120 path->stream_enabled = true; /* no DAC/ADC involved */ in new_analog_input()
3122 if (err < 0) in new_analog_input()
3125 if (spec->mixer_nid != spec->mixer_merge_nid && in new_analog_input()
3126 !spec->loopback_merge_path) { in new_analog_input()
3127 path = snd_hda_add_new_path(codec, spec->mixer_nid, in new_analog_input()
3128 spec->mixer_merge_nid, 0); in new_analog_input()
3130 print_nid_path(codec, "loopback-merge", path); in new_analog_input()
3131 path->active = true; in new_analog_input()
3132 path->pin_fixed = true; /* static route */ in new_analog_input()
3133 path->stream_enabled = true; /* no DAC/ADC involved */ in new_analog_input()
3134 spec->loopback_merge_path = in new_analog_input()
3135 snd_hda_get_path_idx(codec, path); in new_analog_input()
3139 return 0; in new_analog_input()
3142 static int is_input_pin(struct hda_codec *codec, hda_nid_t nid) in is_input_pin() argument
3144 unsigned int pincap = snd_hda_query_pin_caps(codec, nid); in is_input_pin()
3145 return (pincap & AC_PINCAP_IN) != 0; in is_input_pin()
3148 /* Parse the codec tree and retrieve ADCs */
3149 static int fill_adc_nids(struct hda_codec *codec) in fill_adc_nids() argument
3151 struct hda_gen_spec *spec = codec->spec; in fill_adc_nids()
3153 hda_nid_t *adc_nids = spec->adc_nids; in fill_adc_nids()
3154 int max_nums = ARRAY_SIZE(spec->adc_nids); in fill_adc_nids()
3155 int nums = 0; in fill_adc_nids()
3157 for_each_hda_codec_node(nid, codec) { in fill_adc_nids()
3158 unsigned int caps = get_wcaps(codec, nid); in fill_adc_nids()
3167 spec->num_adc_nids = nums; in fill_adc_nids()
3170 spec->num_all_adcs = nums; in fill_adc_nids()
3171 memcpy(spec->all_adcs, spec->adc_nids, nums * sizeof(hda_nid_t)); in fill_adc_nids()
3177 * if needed, check whether dynamic ADC-switching is available
3179 static int check_dyn_adc_switch(struct hda_codec *codec) in check_dyn_adc_switch() argument
3181 struct hda_gen_spec *spec = codec->spec; in check_dyn_adc_switch()
3182 struct hda_input_mux *imux = &spec->input_mux; in check_dyn_adc_switch()
3186 nums = 0; in check_dyn_adc_switch()
3187 ok_bits = 0; in check_dyn_adc_switch()
3188 for (n = 0; n < spec->num_adc_nids; n++) { in check_dyn_adc_switch()
3189 for (i = 0; i < imux->num_items; i++) { in check_dyn_adc_switch()
3190 if (!spec->input_paths[i][n]) in check_dyn_adc_switch()
3193 if (i >= imux->num_items) { in check_dyn_adc_switch()
3200 /* check whether ADC-switch is possible */ in check_dyn_adc_switch()
3201 for (i = 0; i < imux->num_items; i++) { in check_dyn_adc_switch()
3202 for (n = 0; n < spec->num_adc_nids; n++) { in check_dyn_adc_switch()
3203 if (spec->input_paths[i][n]) { in check_dyn_adc_switch()
3204 spec->dyn_adc_idx[i] = n; in check_dyn_adc_switch()
3210 codec_dbg(codec, "enabling ADC switching\n"); in check_dyn_adc_switch()
3211 spec->dyn_adc_switch = 1; in check_dyn_adc_switch()
3212 } else if (nums != spec->num_adc_nids) { in check_dyn_adc_switch()
3214 nums = 0; in check_dyn_adc_switch()
3215 for (n = 0; n < spec->num_adc_nids; n++) { in check_dyn_adc_switch()
3219 spec->adc_nids[nums] = spec->adc_nids[n]; in check_dyn_adc_switch()
3220 for (i = 0; i < imux->num_items; i++) { in check_dyn_adc_switch()
3221 invalidate_nid_path(codec, in check_dyn_adc_switch()
3222 spec->input_paths[i][nums]); in check_dyn_adc_switch()
3223 spec->input_paths[i][nums] = in check_dyn_adc_switch()
3224 spec->input_paths[i][n]; in check_dyn_adc_switch()
3225 spec->input_paths[i][n] = 0; in check_dyn_adc_switch()
3230 spec->num_adc_nids = nums; in check_dyn_adc_switch()
3233 if (imux->num_items == 1 || in check_dyn_adc_switch()
3234 (imux->num_items == 2 && spec->hp_mic)) { in check_dyn_adc_switch()
3235 codec_dbg(codec, "reducing to a single ADC\n"); in check_dyn_adc_switch()
3236 spec->num_adc_nids = 1; /* reduce to a single ADC */ in check_dyn_adc_switch()
3240 if (!spec->dyn_adc_switch && spec->multi_cap_vol) in check_dyn_adc_switch()
3241 spec->num_adc_nids = 1; in check_dyn_adc_switch()
3243 return 0; in check_dyn_adc_switch()
3247 static int parse_capture_source(struct hda_codec *codec, hda_nid_t pin, in parse_capture_source() argument
3251 struct hda_gen_spec *spec = codec->spec; in parse_capture_source()
3252 struct hda_input_mux *imux = &spec->input_mux; in parse_capture_source()
3253 int imux_idx = imux->num_items; in parse_capture_source()
3257 for (c = 0; c < num_adcs; c++) { in parse_capture_source()
3259 hda_nid_t adc = spec->adc_nids[c]; in parse_capture_source()
3261 if (!is_reachable_path(codec, pin, adc)) in parse_capture_source()
3263 path = snd_hda_add_new_path(codec, pin, adc, anchor); in parse_capture_source()
3266 print_nid_path(codec, "input", path); in parse_capture_source()
3267 spec->input_paths[imux_idx][c] = in parse_capture_source()
3268 snd_hda_get_path_idx(codec, path); in parse_capture_source()
3271 if (spec->hp_mic_pin == pin) in parse_capture_source()
3272 spec->hp_mic_mux_idx = imux->num_items; in parse_capture_source()
3273 spec->imux_pins[imux->num_items] = pin; in parse_capture_source()
3274 snd_hda_add_imux_item(codec, imux, label, cfg_idx, NULL); in parse_capture_source()
3276 if (spec->dyn_adc_switch) in parse_capture_source()
3277 spec->dyn_adc_idx[imux_idx] = c; in parse_capture_source()
3281 return 0; in parse_capture_source()
3289 static int fill_input_pin_labels(struct hda_codec *codec) in fill_input_pin_labels() argument
3291 struct hda_gen_spec *spec = codec->spec; in fill_input_pin_labels()
3292 const struct auto_pin_cfg *cfg = &spec->autocfg; in fill_input_pin_labels()
3295 for (i = 0; i < cfg->num_inputs; i++) { in fill_input_pin_labels()
3296 hda_nid_t pin = cfg->inputs[i].pin; in fill_input_pin_labels()
3300 if (!is_input_pin(codec, pin)) in fill_input_pin_labels()
3303 label = hda_get_autocfg_input_label(codec, cfg, i); in fill_input_pin_labels()
3304 idx = 0; in fill_input_pin_labels()
3305 for (j = i - 1; j >= 0; j--) { in fill_input_pin_labels()
3306 if (spec->input_labels[j] && in fill_input_pin_labels()
3307 !strcmp(spec->input_labels[j], label)) { in fill_input_pin_labels()
3308 idx = spec->input_label_idxs[j] + 1; in fill_input_pin_labels()
3313 spec->input_labels[i] = label; in fill_input_pin_labels()
3314 spec->input_label_idxs[i] = idx; in fill_input_pin_labels()
3317 return 0; in fill_input_pin_labels()
3320 #define CFG_IDX_MIX 99 /* a dummy cfg->input idx for stereo mix */
3322 static int create_input_ctls(struct hda_codec *codec) in create_input_ctls() argument
3324 struct hda_gen_spec *spec = codec->spec; in create_input_ctls()
3325 const struct auto_pin_cfg *cfg = &spec->autocfg; in create_input_ctls()
3326 hda_nid_t mixer = spec->mixer_nid; in create_input_ctls()
3331 num_adcs = fill_adc_nids(codec); in create_input_ctls()
3332 if (num_adcs < 0) in create_input_ctls()
3333 return 0; in create_input_ctls()
3335 err = fill_input_pin_labels(codec); in create_input_ctls()
3336 if (err < 0) in create_input_ctls()
3339 for (i = 0; i < cfg->num_inputs; i++) { in create_input_ctls()
3342 pin = cfg->inputs[i].pin; in create_input_ctls()
3343 if (!is_input_pin(codec, pin)) in create_input_ctls()
3347 if (cfg->inputs[i].type == AUTO_PIN_MIC) in create_input_ctls()
3348 val |= snd_hda_get_default_vref(codec, pin); in create_input_ctls()
3349 if (pin != spec->hp_mic_pin && in create_input_ctls()
3350 !snd_hda_codec_get_pin_target(codec, pin)) in create_input_ctls()
3351 set_pin_target(codec, pin, val, false); in create_input_ctls()
3354 if (is_reachable_path(codec, pin, mixer)) { in create_input_ctls()
3355 err = new_analog_input(codec, i, pin, in create_input_ctls()
3356 spec->input_labels[i], in create_input_ctls()
3357 spec->input_label_idxs[i], in create_input_ctls()
3359 if (err < 0) in create_input_ctls()
3364 err = parse_capture_source(codec, pin, i, num_adcs, in create_input_ctls()
3365 spec->input_labels[i], -mixer); in create_input_ctls()
3366 if (err < 0) in create_input_ctls()
3369 if (spec->add_jack_modes) { in create_input_ctls()
3370 err = create_in_jack_mode(codec, pin); in create_input_ctls()
3371 if (err < 0) in create_input_ctls()
3377 if (mixer && spec->add_stereo_mix_input == HDA_HINT_STEREO_MIX_ENABLE) { in create_input_ctls()
3378 err = parse_capture_source(codec, mixer, CFG_IDX_MIX, num_adcs, in create_input_ctls()
3379 "Stereo Mix", 0); in create_input_ctls()
3380 if (err < 0) in create_input_ctls()
3383 spec->suppress_auto_mic = 1; in create_input_ctls()
3386 return 0; in create_input_ctls()
3395 static struct nid_path *get_input_path(struct hda_codec *codec, int adc_idx, int imux_idx) in get_input_path() argument
3397 struct hda_gen_spec *spec = codec->spec; in get_input_path()
3398 if (imux_idx < 0 || imux_idx >= HDA_MAX_NUM_INPUTS) { in get_input_path()
3402 if (spec->dyn_adc_switch) in get_input_path()
3403 adc_idx = spec->dyn_adc_idx[imux_idx]; in get_input_path()
3404 if (adc_idx < 0 || adc_idx >= AUTO_CFG_MAX_INS) { in get_input_path()
3408 return snd_hda_get_path_from_idx(codec, spec->input_paths[imux_idx][adc_idx]); in get_input_path()
3411 static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
3417 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in mux_enum_info() local
3418 struct hda_gen_spec *spec = codec->spec; in mux_enum_info()
3419 return snd_hda_input_mux_info(&spec->input_mux, uinfo); in mux_enum_info()
3425 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in mux_enum_get() local
3426 struct hda_gen_spec *spec = codec->spec; in mux_enum_get()
3428 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in mux_enum_get()
3430 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx]; in mux_enum_get()
3431 return 0; in mux_enum_get()
3437 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in mux_enum_put() local
3438 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in mux_enum_put()
3439 return mux_select(codec, adc_idx, in mux_enum_put()
3440 ucontrol->value.enumerated.item[0]); in mux_enum_put()
3463 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in cap_put_caller() local
3464 struct hda_gen_spec *spec = codec->spec; in cap_put_caller()
3467 int i, adc_idx, ret, err = 0; in cap_put_caller()
3469 imux = &spec->input_mux; in cap_put_caller()
3470 adc_idx = kcontrol->id.index; in cap_put_caller()
3471 mutex_lock(&codec->control_mutex); in cap_put_caller()
3472 for (i = 0; i < imux->num_items; i++) { in cap_put_caller()
3473 path = get_input_path(codec, adc_idx, i); in cap_put_caller()
3474 if (!path || !path->ctls[type]) in cap_put_caller()
3476 kcontrol->private_value = path->ctls[type]; in cap_put_caller()
3478 if (ret < 0) { in cap_put_caller()
3482 if (ret > 0) in cap_put_caller()
3485 mutex_unlock(&codec->control_mutex); in cap_put_caller()
3486 if (err >= 0 && spec->cap_sync_hook) in cap_put_caller()
3487 spec->cap_sync_hook(codec, kcontrol, ucontrol); in cap_put_caller()
3536 static int parse_capvol_in_path(struct hda_codec *codec, struct nid_path *path) in parse_capvol_in_path() argument
3541 path->ctls[NID_PATH_VOL_CTL] = path->ctls[NID_PATH_MUTE_CTL] = 0; in parse_capvol_in_path()
3542 for (depth = 0; depth < 3; depth++) { in parse_capvol_in_path()
3543 if (depth >= path->depth) in parse_capvol_in_path()
3544 return -EINVAL; in parse_capvol_in_path()
3545 i = path->depth - depth - 1; in parse_capvol_in_path()
3546 nid = path->path[i]; in parse_capvol_in_path()
3547 if (!path->ctls[NID_PATH_VOL_CTL]) { in parse_capvol_in_path()
3548 if (nid_has_volume(codec, nid, HDA_OUTPUT)) in parse_capvol_in_path()
3549 path->ctls[NID_PATH_VOL_CTL] = in parse_capvol_in_path()
3550 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); in parse_capvol_in_path()
3551 else if (nid_has_volume(codec, nid, HDA_INPUT)) { in parse_capvol_in_path()
3552 int idx = path->idx[i]; in parse_capvol_in_path()
3553 if (!depth && codec->single_adc_amp) in parse_capvol_in_path()
3554 idx = 0; in parse_capvol_in_path()
3555 path->ctls[NID_PATH_VOL_CTL] = in parse_capvol_in_path()
3559 if (!path->ctls[NID_PATH_MUTE_CTL]) { in parse_capvol_in_path()
3560 if (nid_has_mute(codec, nid, HDA_OUTPUT)) in parse_capvol_in_path()
3561 path->ctls[NID_PATH_MUTE_CTL] = in parse_capvol_in_path()
3562 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); in parse_capvol_in_path()
3563 else if (nid_has_mute(codec, nid, HDA_INPUT)) { in parse_capvol_in_path()
3564 int idx = path->idx[i]; in parse_capvol_in_path()
3565 if (!depth && codec->single_adc_amp) in parse_capvol_in_path()
3566 idx = 0; in parse_capvol_in_path()
3567 path->ctls[NID_PATH_MUTE_CTL] = in parse_capvol_in_path()
3572 return 0; in parse_capvol_in_path()
3575 static bool is_inv_dmic_pin(struct hda_codec *codec, hda_nid_t nid) in is_inv_dmic_pin() argument
3577 struct hda_gen_spec *spec = codec->spec; in is_inv_dmic_pin()
3578 struct auto_pin_cfg *cfg = &spec->autocfg; in is_inv_dmic_pin()
3582 if (!spec->inv_dmic_split) in is_inv_dmic_pin()
3584 for (i = 0; i < cfg->num_inputs; i++) { in is_inv_dmic_pin()
3585 if (cfg->inputs[i].pin != nid) in is_inv_dmic_pin()
3587 if (cfg->inputs[i].type != AUTO_PIN_MIC) in is_inv_dmic_pin()
3589 val = snd_hda_codec_get_pincfg(codec, nid); in is_inv_dmic_pin()
3599 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in cap_single_sw_put() local
3600 struct hda_gen_spec *spec = codec->spec; in cap_single_sw_put()
3604 if (ret < 0) in cap_single_sw_put()
3607 if (spec->cap_sync_hook) in cap_single_sw_put()
3608 spec->cap_sync_hook(codec, kcontrol, ucontrol); in cap_single_sw_put()
3613 static int add_single_cap_ctl(struct hda_codec *codec, const char *label, in add_single_cap_ctl() argument
3617 struct hda_gen_spec *spec = codec->spec; in add_single_cap_ctl()
3625 return 0; in add_single_cap_ctl()
3636 return -ENOMEM; in add_single_cap_ctl()
3638 knew->put = cap_single_sw_put; in add_single_cap_ctl()
3640 return 0; in add_single_cap_ctl()
3652 return -ENOMEM; in add_single_cap_ctl()
3654 knew->put = cap_single_sw_put; in add_single_cap_ctl()
3655 return 0; in add_single_cap_ctl()
3659 static int create_single_cap_vol_ctl(struct hda_codec *codec, int idx, in create_single_cap_vol_ctl() argument
3664 err = add_single_cap_ctl(codec, NULL, idx, false, vol_ctl, inv_dmic); in create_single_cap_vol_ctl()
3665 if (err < 0) in create_single_cap_vol_ctl()
3667 err = add_single_cap_ctl(codec, NULL, idx, true, sw_ctl, inv_dmic); in create_single_cap_vol_ctl()
3668 if (err < 0) in create_single_cap_vol_ctl()
3670 return 0; in create_single_cap_vol_ctl()
3674 static int create_bind_cap_vol_ctl(struct hda_codec *codec, int idx, in create_bind_cap_vol_ctl() argument
3677 struct hda_gen_spec *spec = codec->spec; in create_bind_cap_vol_ctl()
3683 return -ENOMEM; in create_bind_cap_vol_ctl()
3684 knew->index = idx; in create_bind_cap_vol_ctl()
3685 knew->private_value = vol_ctl; in create_bind_cap_vol_ctl()
3686 knew->subdevice = HDA_SUBDEV_AMP_FLAG; in create_bind_cap_vol_ctl()
3691 return -ENOMEM; in create_bind_cap_vol_ctl()
3692 knew->index = idx; in create_bind_cap_vol_ctl()
3693 knew->private_value = sw_ctl; in create_bind_cap_vol_ctl()
3694 knew->subdevice = HDA_SUBDEV_AMP_FLAG; in create_bind_cap_vol_ctl()
3696 return 0; in create_bind_cap_vol_ctl()
3700 static unsigned int get_first_cap_ctl(struct hda_codec *codec, int idx, int type) in get_first_cap_ctl() argument
3706 path = get_input_path(codec, 0, idx); in get_first_cap_ctl()
3708 return 0; in get_first_cap_ctl()
3709 ctl = path->ctls[type]; in get_first_cap_ctl()
3711 return 0; in get_first_cap_ctl()
3712 for (i = 0; i < idx - 1; i++) { in get_first_cap_ctl()
3713 path = get_input_path(codec, 0, i); in get_first_cap_ctl()
3714 if (path && path->ctls[type] == ctl) in get_first_cap_ctl()
3715 return 0; in get_first_cap_ctl()
3721 static int create_multi_cap_vol_ctl(struct hda_codec *codec) in create_multi_cap_vol_ctl() argument
3723 struct hda_gen_spec *spec = codec->spec; in create_multi_cap_vol_ctl()
3724 struct hda_input_mux *imux = &spec->input_mux; in create_multi_cap_vol_ctl()
3727 for (i = 0; i < imux->num_items; i++) { in create_multi_cap_vol_ctl()
3731 idx = imux->items[i].index; in create_multi_cap_vol_ctl()
3732 if (idx >= spec->autocfg.num_inputs) in create_multi_cap_vol_ctl()
3734 inv_dmic = is_inv_dmic_pin(codec, spec->imux_pins[i]); in create_multi_cap_vol_ctl()
3736 for (type = 0; type < 2; type++) { in create_multi_cap_vol_ctl()
3737 err = add_single_cap_ctl(codec, in create_multi_cap_vol_ctl()
3738 spec->input_labels[idx], in create_multi_cap_vol_ctl()
3739 spec->input_label_idxs[idx], in create_multi_cap_vol_ctl()
3741 get_first_cap_ctl(codec, i, type), in create_multi_cap_vol_ctl()
3743 if (err < 0) in create_multi_cap_vol_ctl()
3747 return 0; in create_multi_cap_vol_ctl()
3750 static int create_capture_mixers(struct hda_codec *codec) in create_capture_mixers() argument
3752 struct hda_gen_spec *spec = codec->spec; in create_capture_mixers()
3753 struct hda_input_mux *imux = &spec->input_mux; in create_capture_mixers()
3756 if (spec->dyn_adc_switch) in create_capture_mixers()
3759 nums = spec->num_adc_nids; in create_capture_mixers()
3761 if (!spec->auto_mic && imux->num_items > 1) { in create_capture_mixers()
3767 return -ENOMEM; in create_capture_mixers()
3768 knew->count = nums; in create_capture_mixers()
3771 for (n = 0; n < nums; n++) { in create_capture_mixers()
3773 bool multi_cap_vol = spec->multi_cap_vol; in create_capture_mixers()
3777 vol = sw = 0; in create_capture_mixers()
3778 for (i = 0; i < imux->num_items; i++) { in create_capture_mixers()
3780 path = get_input_path(codec, n, i); in create_capture_mixers()
3783 parse_capvol_in_path(codec, path); in create_capture_mixers()
3785 vol = path->ctls[NID_PATH_VOL_CTL]; in create_capture_mixers()
3786 else if (vol != path->ctls[NID_PATH_VOL_CTL]) { in create_capture_mixers()
3788 if (!same_amp_caps(codec, vol, in create_capture_mixers()
3789 path->ctls[NID_PATH_VOL_CTL], HDA_INPUT)) in create_capture_mixers()
3793 sw = path->ctls[NID_PATH_MUTE_CTL]; in create_capture_mixers()
3794 else if (sw != path->ctls[NID_PATH_MUTE_CTL]) { in create_capture_mixers()
3796 if (!same_amp_caps(codec, sw, in create_capture_mixers()
3797 path->ctls[NID_PATH_MUTE_CTL], HDA_INPUT)) in create_capture_mixers()
3800 if (is_inv_dmic_pin(codec, spec->imux_pins[i])) in create_capture_mixers()
3805 err = create_single_cap_vol_ctl(codec, n, vol, sw, in create_capture_mixers()
3808 err = create_bind_cap_vol_ctl(codec, n, vol, sw); in create_capture_mixers()
3810 err = create_multi_cap_vol_ctl(codec); in create_capture_mixers()
3811 if (err < 0) in create_capture_mixers()
3815 return 0; in create_capture_mixers()
3823 static bool check_boost_vol(struct hda_codec *codec, hda_nid_t nid, in check_boost_vol() argument
3828 if (!nid_has_volume(codec, nid, dir) || in check_boost_vol()
3829 is_ctl_associated(codec, nid, dir, idx, NID_PATH_VOL_CTL) || in check_boost_vol()
3830 is_ctl_associated(codec, nid, dir, idx, NID_PATH_BOOST_CTL)) in check_boost_vol()
3833 step = (query_amp_caps(codec, nid, dir) & AC_AMPCAP_STEP_SIZE) in check_boost_vol()
3835 if (step < 0x20) in check_boost_vol()
3841 static unsigned int look_for_boost_amp(struct hda_codec *codec, in look_for_boost_amp() argument
3844 unsigned int val = 0; in look_for_boost_amp()
3848 for (depth = 0; depth < 3; depth++) { in look_for_boost_amp()
3849 if (depth >= path->depth - 1) in look_for_boost_amp()
3851 nid = path->path[depth]; in look_for_boost_amp()
3852 if (depth && check_boost_vol(codec, nid, HDA_OUTPUT, 0)) { in look_for_boost_amp()
3853 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); in look_for_boost_amp()
3855 } else if (check_boost_vol(codec, nid, HDA_INPUT, in look_for_boost_amp()
3856 path->idx[depth])) { in look_for_boost_amp()
3857 val = HDA_COMPOSE_AMP_VAL(nid, 3, path->idx[depth], in look_for_boost_amp()
3866 static int parse_mic_boost(struct hda_codec *codec) in parse_mic_boost() argument
3868 struct hda_gen_spec *spec = codec->spec; in parse_mic_boost()
3869 struct auto_pin_cfg *cfg = &spec->autocfg; in parse_mic_boost()
3870 struct hda_input_mux *imux = &spec->input_mux; in parse_mic_boost()
3873 if (!spec->num_adc_nids) in parse_mic_boost()
3874 return 0; in parse_mic_boost()
3876 for (i = 0; i < imux->num_items; i++) { in parse_mic_boost()
3882 idx = imux->items[i].index; in parse_mic_boost()
3883 if (idx >= imux->num_items) in parse_mic_boost()
3886 /* check only line-in and mic pins */ in parse_mic_boost()
3887 if (cfg->inputs[idx].type > AUTO_PIN_LINE_IN) in parse_mic_boost()
3890 path = get_input_path(codec, 0, i); in parse_mic_boost()
3894 val = look_for_boost_amp(codec, path); in parse_mic_boost()
3900 "%s Boost Volume", spec->input_labels[idx]); in parse_mic_boost()
3902 spec->input_label_idxs[idx], val)) in parse_mic_boost()
3903 return -ENOMEM; in parse_mic_boost()
3905 path->ctls[NID_PATH_BOOST_CTL] = val; in parse_mic_boost()
3907 return 0; in parse_mic_boost()
3915 static int create_mute_led_cdev(struct hda_codec *codec, in create_mute_led_cdev() argument
3920 struct hda_gen_spec *spec = codec->spec; in create_mute_led_cdev()
3925 cdev = devm_kzalloc(&codec->core.dev, sizeof(*cdev), GFP_KERNEL); in create_mute_led_cdev()
3927 return -ENOMEM; in create_mute_led_cdev()
3929 cdev->name = micmute ? "hda::micmute" : "hda::mute"; in create_mute_led_cdev()
3930 cdev->max_brightness = 1; in create_mute_led_cdev()
3931 cdev->default_trigger = micmute ? "audio-micmute" : "audio-mute"; in create_mute_led_cdev()
3932 cdev->brightness_set_blocking = callback; in create_mute_led_cdev()
3933 cdev->brightness = ledtrig_audio_get(idx); in create_mute_led_cdev()
3934 cdev->flags = LED_CORE_SUSPENDRESUME; in create_mute_led_cdev()
3936 err = led_classdev_register(&codec->core.dev, cdev); in create_mute_led_cdev()
3937 if (err < 0) in create_mute_led_cdev()
3939 spec->led_cdevs[idx] = cdev; in create_mute_led_cdev()
3940 return 0; in create_mute_led_cdev()
3949 * snd_dha_gen_add_mute_led_cdev - Create a LED classdev and enable as vmaster mute LED
3950 * @codec: the HDA codec
3953 int snd_hda_gen_add_mute_led_cdev(struct hda_codec *codec, in snd_hda_gen_add_mute_led_cdev() argument
3957 struct hda_gen_spec *spec = codec->spec; in snd_hda_gen_add_mute_led_cdev()
3961 err = create_mute_led_cdev(codec, callback, false); in snd_hda_gen_add_mute_led_cdev()
3963 codec_warn(codec, "failed to create a mute LED cdev\n"); in snd_hda_gen_add_mute_led_cdev()
3968 if (spec->vmaster_mute.hook) in snd_hda_gen_add_mute_led_cdev()
3969 codec_err(codec, "vmaster hook already present before cdev!\n"); in snd_hda_gen_add_mute_led_cdev()
3971 spec->vmaster_mute.hook = vmaster_update_mute_led; in snd_hda_gen_add_mute_led_cdev()
3972 spec->vmaster_mute_enum = 1; in snd_hda_gen_add_mute_led_cdev()
3973 return 0; in snd_hda_gen_add_mute_led_cdev()
3987 static void call_micmute_led_update(struct hda_codec *codec) in call_micmute_led_update() argument
3989 struct hda_gen_spec *spec = codec->spec; in call_micmute_led_update()
3992 switch (spec->micmute_led.led_mode) { in call_micmute_led_update()
3997 val = 0; in call_micmute_led_update()
4000 val = !!spec->micmute_led.capture; in call_micmute_led_update()
4004 val = !spec->micmute_led.capture; in call_micmute_led_update()
4008 if (val == spec->micmute_led.led_value) in call_micmute_led_update()
4010 spec->micmute_led.led_value = val; in call_micmute_led_update()
4012 spec->micmute_led.led_value ? LED_ON : LED_OFF); in call_micmute_led_update()
4015 static void update_micmute_led(struct hda_codec *codec, in update_micmute_led() argument
4019 struct hda_gen_spec *spec = codec->spec; in update_micmute_led()
4022 if (spec->micmute_led.old_hook) in update_micmute_led()
4023 spec->micmute_led.old_hook(codec, kcontrol, ucontrol); in update_micmute_led()
4027 mask = 1U << snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); in update_micmute_led()
4028 if (!strcmp("Capture Switch", ucontrol->id.name)) { in update_micmute_led()
4030 if (ucontrol->value.integer.value[0] || in update_micmute_led()
4031 ucontrol->value.integer.value[1]) in update_micmute_led()
4032 spec->micmute_led.capture |= mask; in update_micmute_led()
4034 spec->micmute_led.capture &= ~mask; in update_micmute_led()
4035 call_micmute_led_update(codec); in update_micmute_led()
4052 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in micmute_led_mode_get() local
4053 struct hda_gen_spec *spec = codec->spec; in micmute_led_mode_get()
4055 ucontrol->value.enumerated.item[0] = spec->micmute_led.led_mode; in micmute_led_mode_get()
4056 return 0; in micmute_led_mode_get()
4062 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in micmute_led_mode_put() local
4063 struct hda_gen_spec *spec = codec->spec; in micmute_led_mode_put()
4066 mode = ucontrol->value.enumerated.item[0]; in micmute_led_mode_put()
4069 if (mode == spec->micmute_led.led_mode) in micmute_led_mode_put()
4070 return 0; in micmute_led_mode_put()
4071 spec->micmute_led.led_mode = mode; in micmute_led_mode_put()
4072 call_micmute_led_update(codec); in micmute_led_mode_put()
4078 .name = "Mic Mute-LED Mode",
4084 /* Set up the capture sync hook for controlling the mic-mute LED */
4085 static int add_micmute_led_hook(struct hda_codec *codec) in add_micmute_led_hook() argument
4087 struct hda_gen_spec *spec = codec->spec; in add_micmute_led_hook()
4089 spec->micmute_led.led_mode = MICMUTE_LED_FOLLOW_MUTE; in add_micmute_led_hook()
4090 spec->micmute_led.capture = 0; in add_micmute_led_hook()
4091 spec->micmute_led.led_value = -1; in add_micmute_led_hook()
4092 spec->micmute_led.old_hook = spec->cap_sync_hook; in add_micmute_led_hook()
4093 spec->cap_sync_hook = update_micmute_led; in add_micmute_led_hook()
4095 return -ENOMEM; in add_micmute_led_hook()
4096 return 0; in add_micmute_led_hook()
4100 * snd_dha_gen_add_micmute_led_cdev - Create a LED classdev and enable as mic-mute LED
4101 * @codec: the HDA codec
4104 * Called from the codec drivers for offering the mic mute LED controls.
4109 * LED-trigger is set up.
4111 * Returns 0 or a negative error.
4113 int snd_hda_gen_add_micmute_led_cdev(struct hda_codec *codec, in snd_hda_gen_add_micmute_led_cdev() argument
4120 err = create_mute_led_cdev(codec, callback, true); in snd_hda_gen_add_micmute_led_cdev()
4122 codec_warn(codec, "failed to create a mic-mute LED cdev\n"); in snd_hda_gen_add_micmute_led_cdev()
4127 return add_micmute_led_hook(codec); in snd_hda_gen_add_micmute_led_cdev()
4133 * parse digital I/Os and set up NIDs in BIOS auto-parse mode
4135 static void parse_digital(struct hda_codec *codec) in parse_digital() argument
4137 struct hda_gen_spec *spec = codec->spec; in parse_digital()
4143 nums = 0; in parse_digital()
4144 for (i = 0; i < spec->autocfg.dig_outs; i++) { in parse_digital()
4145 pin = spec->autocfg.dig_out_pins[i]; in parse_digital()
4146 dig_nid = look_for_dac(codec, pin, true); in parse_digital()
4149 path = snd_hda_add_new_path(codec, dig_nid, pin, 0); in parse_digital()
4152 print_nid_path(codec, "digout", path); in parse_digital()
4153 path->active = true; in parse_digital()
4154 path->pin_fixed = true; /* no jack detection */ in parse_digital()
4155 spec->digout_paths[i] = snd_hda_get_path_idx(codec, path); in parse_digital()
4156 set_pin_target(codec, pin, PIN_OUT, false); in parse_digital()
4158 spec->multiout.dig_out_nid = dig_nid; in parse_digital()
4159 spec->dig_out_type = spec->autocfg.dig_out_type[0]; in parse_digital()
4161 spec->multiout.follower_dig_outs = spec->follower_dig_outs; in parse_digital()
4162 if (nums >= ARRAY_SIZE(spec->follower_dig_outs) - 1) in parse_digital()
4164 spec->follower_dig_outs[nums - 1] = dig_nid; in parse_digital()
4169 if (spec->autocfg.dig_in_pin) { in parse_digital()
4170 pin = spec->autocfg.dig_in_pin; in parse_digital()
4171 for_each_hda_codec_node(dig_nid, codec) { in parse_digital()
4172 unsigned int wcaps = get_wcaps(codec, dig_nid); in parse_digital()
4177 path = snd_hda_add_new_path(codec, pin, dig_nid, 0); in parse_digital()
4179 print_nid_path(codec, "digin", path); in parse_digital()
4180 path->active = true; in parse_digital()
4181 path->pin_fixed = true; /* no jack */ in parse_digital()
4182 spec->dig_in_nid = dig_nid; in parse_digital()
4183 spec->digin_path = snd_hda_get_path_idx(codec, path); in parse_digital()
4184 set_pin_target(codec, pin, PIN_IN, false); in parse_digital()
4196 static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur);
4199 static int mux_select(struct hda_codec *codec, unsigned int adc_idx, in mux_select() argument
4202 struct hda_gen_spec *spec = codec->spec; in mux_select()
4206 imux = &spec->input_mux; in mux_select()
4207 if (!imux->num_items) in mux_select()
4208 return 0; in mux_select()
4210 if (idx >= imux->num_items) in mux_select()
4211 idx = imux->num_items - 1; in mux_select()
4212 if (spec->cur_mux[adc_idx] == idx) in mux_select()
4213 return 0; in mux_select()
4215 old_path = get_input_path(codec, adc_idx, spec->cur_mux[adc_idx]); in mux_select()
4217 return 0; in mux_select()
4218 if (old_path->active) in mux_select()
4219 snd_hda_activate_path(codec, old_path, false, false); in mux_select()
4221 spec->cur_mux[adc_idx] = idx; in mux_select()
4223 if (spec->hp_mic) in mux_select()
4224 update_hp_mic(codec, adc_idx, false); in mux_select()
4226 if (spec->dyn_adc_switch) in mux_select()
4227 dyn_adc_pcm_resetup(codec, idx); in mux_select()
4229 path = get_input_path(codec, adc_idx, idx); in mux_select()
4231 return 0; in mux_select()
4232 if (path->active) in mux_select()
4233 return 0; in mux_select()
4234 snd_hda_activate_path(codec, path, true, false); in mux_select()
4235 if (spec->cap_sync_hook) in mux_select()
4236 spec->cap_sync_hook(codec, NULL, NULL); in mux_select()
4237 path_power_down_sync(codec, old_path); in mux_select()
4242 * as terminals (either start- or endpoint)
4246 static hda_nid_t set_path_power(struct hda_codec *codec, hda_nid_t nid, in set_path_power() argument
4249 struct hda_gen_spec *spec = codec->spec; in set_path_power()
4250 hda_nid_t last, changed = 0; in set_path_power()
4254 snd_array_for_each(&spec->paths, n, path) { in set_path_power()
4255 if (!path->depth) in set_path_power()
4257 if (path->path[0] == nid || in set_path_power()
4258 path->path[path->depth - 1] == nid) { in set_path_power()
4259 bool pin_old = path->pin_enabled; in set_path_power()
4260 bool stream_old = path->stream_enabled; in set_path_power()
4262 if (pin_state >= 0) in set_path_power()
4263 path->pin_enabled = pin_state; in set_path_power()
4264 if (stream_state >= 0) in set_path_power()
4265 path->stream_enabled = stream_state; in set_path_power()
4266 if ((!path->pin_fixed && path->pin_enabled != pin_old) in set_path_power()
4267 || path->stream_enabled != stream_old) { in set_path_power()
4268 last = path_power_update(codec, path, true); in set_path_power()
4278 static bool detect_pin_state(struct hda_codec *codec, hda_nid_t pin) in detect_pin_state() argument
4280 if (!is_jack_detectable(codec, pin)) in detect_pin_state()
4282 return snd_hda_jack_detect_state(codec, pin) != HDA_JACK_NOT_PRESENT; in detect_pin_state()
4286 * power = 0/1 : only power up/down if it matches with the jack state,
4287 * < 0 : force power up/down to follow the jack sate
4291 static hda_nid_t set_pin_power_jack(struct hda_codec *codec, hda_nid_t pin, in set_pin_power_jack() argument
4296 if (!codec->power_save_node) in set_pin_power_jack()
4297 return 0; in set_pin_power_jack()
4299 on = detect_pin_state(codec, pin); in set_pin_power_jack()
4301 if (power >= 0 && on != power) in set_pin_power_jack()
4302 return 0; in set_pin_power_jack()
4303 return set_path_power(codec, pin, on, -1); in set_pin_power_jack()
4306 static void pin_power_callback(struct hda_codec *codec, in pin_power_callback() argument
4310 if (jack && jack->nid) in pin_power_callback()
4311 sync_power_state_change(codec, in pin_power_callback()
4312 set_pin_power_jack(codec, jack->nid, on)); in pin_power_callback()
4315 /* callback only doing power up -- called at first */
4316 static void pin_power_up_callback(struct hda_codec *codec, in pin_power_up_callback() argument
4319 pin_power_callback(codec, jack, true); in pin_power_up_callback()
4322 /* callback only doing power down -- called at last */
4323 static void pin_power_down_callback(struct hda_codec *codec, in pin_power_down_callback() argument
4326 pin_power_callback(codec, jack, false); in pin_power_down_callback()
4330 static void add_pin_power_ctls(struct hda_codec *codec, int num_pins, in add_pin_power_ctls() argument
4337 for (i = 0; i < num_pins && pins[i]; i++) { in add_pin_power_ctls()
4338 if (is_jack_detectable(codec, pins[i])) in add_pin_power_ctls()
4339 snd_hda_jack_detect_enable_callback(codec, pins[i], cb); in add_pin_power_ctls()
4341 set_path_power(codec, pins[i], true, -1); in add_pin_power_ctls()
4348 static void add_all_pin_power_ctls(struct hda_codec *codec, bool on) in add_all_pin_power_ctls() argument
4350 struct hda_gen_spec *spec = codec->spec; in add_all_pin_power_ctls()
4351 struct auto_pin_cfg *cfg = &spec->autocfg; in add_all_pin_power_ctls()
4354 if (!codec->power_save_node) in add_all_pin_power_ctls()
4356 add_pin_power_ctls(codec, cfg->line_outs, cfg->line_out_pins, on); in add_all_pin_power_ctls()
4357 if (cfg->line_out_type != AUTO_PIN_HP_OUT) in add_all_pin_power_ctls()
4358 add_pin_power_ctls(codec, cfg->hp_outs, cfg->hp_pins, on); in add_all_pin_power_ctls()
4359 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) in add_all_pin_power_ctls()
4360 add_pin_power_ctls(codec, cfg->speaker_outs, cfg->speaker_pins, on); in add_all_pin_power_ctls()
4361 for (i = 0; i < cfg->num_inputs; i++) in add_all_pin_power_ctls()
4362 add_pin_power_ctls(codec, 1, &cfg->inputs[i].pin, on); in add_all_pin_power_ctls()
4366 static void sync_pin_power_ctls(struct hda_codec *codec, int num_pins, in sync_pin_power_ctls() argument
4371 for (i = 0; i < num_pins && pins[i]; i++) in sync_pin_power_ctls()
4372 if (is_jack_detectable(codec, pins[i])) in sync_pin_power_ctls()
4373 set_pin_power_jack(codec, pins[i], -1); in sync_pin_power_ctls()
4377 static void sync_all_pin_power_ctls(struct hda_codec *codec) in sync_all_pin_power_ctls() argument
4379 struct hda_gen_spec *spec = codec->spec; in sync_all_pin_power_ctls()
4380 struct auto_pin_cfg *cfg = &spec->autocfg; in sync_all_pin_power_ctls()
4383 if (!codec->power_save_node) in sync_all_pin_power_ctls()
4385 sync_pin_power_ctls(codec, cfg->line_outs, cfg->line_out_pins); in sync_all_pin_power_ctls()
4386 if (cfg->line_out_type != AUTO_PIN_HP_OUT) in sync_all_pin_power_ctls()
4387 sync_pin_power_ctls(codec, cfg->hp_outs, cfg->hp_pins); in sync_all_pin_power_ctls()
4388 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) in sync_all_pin_power_ctls()
4389 sync_pin_power_ctls(codec, cfg->speaker_outs, cfg->speaker_pins); in sync_all_pin_power_ctls()
4390 for (i = 0; i < cfg->num_inputs; i++) in sync_all_pin_power_ctls()
4391 sync_pin_power_ctls(codec, 1, &cfg->inputs[i].pin); in sync_all_pin_power_ctls()
4395 static int add_fake_paths(struct hda_codec *codec, hda_nid_t nid, in add_fake_paths() argument
4398 struct hda_gen_spec *spec = codec->spec; in add_fake_paths()
4402 for (i = 0; i < num_pins; i++) { in add_fake_paths()
4405 if (get_nid_path(codec, nid, pins[i], 0)) in add_fake_paths()
4407 path = snd_array_new(&spec->paths); in add_fake_paths()
4409 return -ENOMEM; in add_fake_paths()
4410 memset(path, 0, sizeof(*path)); in add_fake_paths()
4411 path->depth = 2; in add_fake_paths()
4412 path->path[0] = nid; in add_fake_paths()
4413 path->path[1] = pins[i]; in add_fake_paths()
4414 path->active = true; in add_fake_paths()
4416 return 0; in add_fake_paths()
4420 static int add_fake_beep_paths(struct hda_codec *codec) in add_fake_beep_paths() argument
4422 struct hda_gen_spec *spec = codec->spec; in add_fake_beep_paths()
4423 struct auto_pin_cfg *cfg = &spec->autocfg; in add_fake_beep_paths()
4424 hda_nid_t nid = spec->beep_nid; in add_fake_beep_paths()
4427 if (!codec->power_save_node || !nid) in add_fake_beep_paths()
4428 return 0; in add_fake_beep_paths()
4429 err = add_fake_paths(codec, nid, cfg->line_outs, cfg->line_out_pins); in add_fake_beep_paths()
4430 if (err < 0) in add_fake_beep_paths()
4432 if (cfg->line_out_type != AUTO_PIN_HP_OUT) { in add_fake_beep_paths()
4433 err = add_fake_paths(codec, nid, cfg->hp_outs, cfg->hp_pins); in add_fake_beep_paths()
4434 if (err < 0) in add_fake_beep_paths()
4437 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { in add_fake_beep_paths()
4438 err = add_fake_paths(codec, nid, cfg->speaker_outs, in add_fake_beep_paths()
4439 cfg->speaker_pins); in add_fake_beep_paths()
4440 if (err < 0) in add_fake_beep_paths()
4443 return 0; in add_fake_beep_paths()
4449 set_path_power(beep->codec, beep->nid, -1, on); in beep_power_hook()
4453 * snd_hda_gen_fix_pin_power - Fix the power of the given pin widget to D0
4454 * @codec: the HDA codec
4457 int snd_hda_gen_fix_pin_power(struct hda_codec *codec, hda_nid_t pin) in snd_hda_gen_fix_pin_power() argument
4459 struct hda_gen_spec *spec = codec->spec; in snd_hda_gen_fix_pin_power()
4462 path = snd_array_new(&spec->paths); in snd_hda_gen_fix_pin_power()
4464 return -ENOMEM; in snd_hda_gen_fix_pin_power()
4465 memset(path, 0, sizeof(*path)); in snd_hda_gen_fix_pin_power()
4466 path->depth = 1; in snd_hda_gen_fix_pin_power()
4467 path->path[0] = pin; in snd_hda_gen_fix_pin_power()
4468 path->active = true; in snd_hda_gen_fix_pin_power()
4469 path->pin_fixed = true; in snd_hda_gen_fix_pin_power()
4470 path->stream_enabled = true; in snd_hda_gen_fix_pin_power()
4471 return 0; in snd_hda_gen_fix_pin_power()
4476 * Jack detections for HP auto-mute and mic-switch
4480 static bool detect_jacks(struct hda_codec *codec, int num_pins, const hda_nid_t *pins) in detect_jacks() argument
4485 for (i = 0; i < num_pins; i++) { in detect_jacks()
4490 if (snd_hda_codec_get_pin_target(codec, nid) & AC_PINCTL_IN_EN) in detect_jacks()
4492 if (snd_hda_jack_detect_state(codec, nid) == HDA_JACK_PRESENT) in detect_jacks()
4498 /* standard HP/line-out auto-mute helper */
4499 static void do_automute(struct hda_codec *codec, int num_pins, const hda_nid_t *pins, in do_automute() argument
4502 struct hda_gen_spec *spec = codec->spec; in do_automute()
4505 for (i = 0; i < num_pins; i++) { in do_automute()
4511 oldval = snd_hda_codec_get_pin_target(codec, nid); in do_automute()
4515 if (spec->auto_mute_via_amp) { in do_automute()
4519 path = snd_hda_get_path_from_idx(codec, paths[i]); in do_automute()
4522 mute_nid = get_amp_nid_(path->ctls[NID_PATH_MUTE_CTL]); in do_automute()
4526 spec->mute_bits |= (1ULL << mute_nid); in do_automute()
4528 spec->mute_bits &= ~(1ULL << mute_nid); in do_automute()
4534 if (spec->keep_vref_in_automute) in do_automute()
4537 val = 0; in do_automute()
4545 update_pin_ctl(codec, nid, val); in do_automute()
4548 set_pin_eapd(codec, nid, !mute); in do_automute()
4549 if (codec->power_save_node) { in do_automute()
4552 on = detect_pin_state(codec, nid); in do_automute()
4553 set_path_power(codec, nid, on, -1); in do_automute()
4559 * snd_hda_gen_update_outputs - Toggle outputs muting
4560 * @codec: the HDA codec
4564 void snd_hda_gen_update_outputs(struct hda_codec *codec) in snd_hda_gen_update_outputs() argument
4566 struct hda_gen_spec *spec = codec->spec; in snd_hda_gen_update_outputs()
4574 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT) in snd_hda_gen_update_outputs()
4575 paths = spec->out_paths; in snd_hda_gen_update_outputs()
4577 paths = spec->hp_paths; in snd_hda_gen_update_outputs()
4578 do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins), in snd_hda_gen_update_outputs()
4579 spec->autocfg.hp_pins, paths, spec->master_mute); in snd_hda_gen_update_outputs()
4581 if (!spec->automute_speaker) in snd_hda_gen_update_outputs()
4582 on = 0; in snd_hda_gen_update_outputs()
4584 on = spec->hp_jack_present | spec->line_jack_present; in snd_hda_gen_update_outputs()
4585 on |= spec->master_mute; in snd_hda_gen_update_outputs()
4586 spec->speaker_muted = on; in snd_hda_gen_update_outputs()
4587 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT) in snd_hda_gen_update_outputs()
4588 paths = spec->out_paths; in snd_hda_gen_update_outputs()
4590 paths = spec->speaker_paths; in snd_hda_gen_update_outputs()
4591 do_automute(codec, ARRAY_SIZE(spec->autocfg.speaker_pins), in snd_hda_gen_update_outputs()
4592 spec->autocfg.speaker_pins, paths, on); in snd_hda_gen_update_outputs()
4594 /* toggle line-out mutes if needed, too */ in snd_hda_gen_update_outputs()
4596 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0] || in snd_hda_gen_update_outputs()
4597 spec->autocfg.line_out_pins[0] == spec->autocfg.speaker_pins[0]) in snd_hda_gen_update_outputs()
4599 if (!spec->automute_lo) in snd_hda_gen_update_outputs()
4600 on = 0; in snd_hda_gen_update_outputs()
4602 on = spec->hp_jack_present; in snd_hda_gen_update_outputs()
4603 on |= spec->master_mute; in snd_hda_gen_update_outputs()
4604 spec->line_out_muted = on; in snd_hda_gen_update_outputs()
4605 paths = spec->out_paths; in snd_hda_gen_update_outputs()
4606 do_automute(codec, ARRAY_SIZE(spec->autocfg.line_out_pins), in snd_hda_gen_update_outputs()
4607 spec->autocfg.line_out_pins, paths, on); in snd_hda_gen_update_outputs()
4611 static void call_update_outputs(struct hda_codec *codec) in call_update_outputs() argument
4613 struct hda_gen_spec *spec = codec->spec; in call_update_outputs()
4614 if (spec->automute_hook) in call_update_outputs()
4615 spec->automute_hook(codec); in call_update_outputs()
4617 snd_hda_gen_update_outputs(codec); in call_update_outputs()
4619 /* sync the whole vmaster followers to reflect the new auto-mute status */ in call_update_outputs()
4620 if (spec->auto_mute_via_amp && !codec->bus->shutdown) in call_update_outputs()
4621 snd_ctl_sync_vmaster(spec->vmaster_mute.sw_kctl, false); in call_update_outputs()
4625 * snd_hda_gen_hp_automute - standard HP-automute helper
4626 * @codec: the HDA codec
4629 void snd_hda_gen_hp_automute(struct hda_codec *codec, in snd_hda_gen_hp_automute() argument
4632 struct hda_gen_spec *spec = codec->spec; in snd_hda_gen_hp_automute()
4633 hda_nid_t *pins = spec->autocfg.hp_pins; in snd_hda_gen_hp_automute()
4634 int num_pins = ARRAY_SIZE(spec->autocfg.hp_pins); in snd_hda_gen_hp_automute()
4636 /* No detection for the first HP jack during indep-HP mode */ in snd_hda_gen_hp_automute()
4637 if (spec->indep_hp_enabled) { in snd_hda_gen_hp_automute()
4639 num_pins--; in snd_hda_gen_hp_automute()
4642 spec->hp_jack_present = detect_jacks(codec, num_pins, pins); in snd_hda_gen_hp_automute()
4643 if (!spec->detect_hp || (!spec->automute_speaker && !spec->automute_lo)) in snd_hda_gen_hp_automute()
4645 call_update_outputs(codec); in snd_hda_gen_hp_automute()
4650 * snd_hda_gen_line_automute - standard line-out-automute helper
4651 * @codec: the HDA codec
4654 void snd_hda_gen_line_automute(struct hda_codec *codec, in snd_hda_gen_line_automute() argument
4657 struct hda_gen_spec *spec = codec->spec; in snd_hda_gen_line_automute()
4659 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT) in snd_hda_gen_line_automute()
4662 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0]) in snd_hda_gen_line_automute()
4665 spec->line_jack_present = in snd_hda_gen_line_automute()
4666 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins), in snd_hda_gen_line_automute()
4667 spec->autocfg.line_out_pins); in snd_hda_gen_line_automute()
4668 if (!spec->automute_speaker || !spec->detect_lo) in snd_hda_gen_line_automute()
4670 call_update_outputs(codec); in snd_hda_gen_line_automute()
4675 * snd_hda_gen_mic_autoswitch - standard mic auto-switch helper
4676 * @codec: the HDA codec
4679 void snd_hda_gen_mic_autoswitch(struct hda_codec *codec, in snd_hda_gen_mic_autoswitch() argument
4682 struct hda_gen_spec *spec = codec->spec; in snd_hda_gen_mic_autoswitch()
4685 if (!spec->auto_mic) in snd_hda_gen_mic_autoswitch()
4688 for (i = spec->am_num_entries - 1; i > 0; i--) { in snd_hda_gen_mic_autoswitch()
4689 hda_nid_t pin = spec->am_entry[i].pin; in snd_hda_gen_mic_autoswitch()
4691 if (snd_hda_codec_get_pin_target(codec, pin) & AC_PINCTL_OUT_EN) in snd_hda_gen_mic_autoswitch()
4693 if (snd_hda_jack_detect_state(codec, pin) == HDA_JACK_PRESENT) { in snd_hda_gen_mic_autoswitch()
4694 mux_select(codec, 0, spec->am_entry[i].idx); in snd_hda_gen_mic_autoswitch()
4698 mux_select(codec, 0, spec->am_entry[0].idx); in snd_hda_gen_mic_autoswitch()
4703 static void call_hp_automute(struct hda_codec *codec, in call_hp_automute() argument
4706 struct hda_gen_spec *spec = codec->spec; in call_hp_automute()
4707 if (spec->hp_automute_hook) in call_hp_automute()
4708 spec->hp_automute_hook(codec, jack); in call_hp_automute()
4710 snd_hda_gen_hp_automute(codec, jack); in call_hp_automute()
4713 static void call_line_automute(struct hda_codec *codec, in call_line_automute() argument
4716 struct hda_gen_spec *spec = codec->spec; in call_line_automute()
4717 if (spec->line_automute_hook) in call_line_automute()
4718 spec->line_automute_hook(codec, jack); in call_line_automute()
4720 snd_hda_gen_line_automute(codec, jack); in call_line_automute()
4723 static void call_mic_autoswitch(struct hda_codec *codec, in call_mic_autoswitch() argument
4726 struct hda_gen_spec *spec = codec->spec; in call_mic_autoswitch()
4727 if (spec->mic_autoswitch_hook) in call_mic_autoswitch()
4728 spec->mic_autoswitch_hook(codec, jack); in call_mic_autoswitch()
4730 snd_hda_gen_mic_autoswitch(codec, jack); in call_mic_autoswitch()
4734 static void update_automute_all(struct hda_codec *codec) in update_automute_all() argument
4736 call_hp_automute(codec, NULL); in update_automute_all()
4737 call_line_automute(codec, NULL); in update_automute_all()
4738 call_mic_autoswitch(codec, NULL); in update_automute_all()
4742 * Auto-Mute mode mixer enum support
4747 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in automute_mode_info() local
4748 struct hda_gen_spec *spec = codec->spec; in automute_mode_info()
4753 if (spec->automute_speaker_possible && spec->automute_lo_possible) in automute_mode_info()
4761 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in automute_mode_get() local
4762 struct hda_gen_spec *spec = codec->spec; in automute_mode_get()
4763 unsigned int val = 0; in automute_mode_get()
4764 if (spec->automute_speaker) in automute_mode_get()
4766 if (spec->automute_lo) in automute_mode_get()
4769 ucontrol->value.enumerated.item[0] = val; in automute_mode_get()
4770 return 0; in automute_mode_get()
4776 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in automute_mode_put() local
4777 struct hda_gen_spec *spec = codec->spec; in automute_mode_put()
4779 switch (ucontrol->value.enumerated.item[0]) { in automute_mode_put()
4780 case 0: in automute_mode_put()
4781 if (!spec->automute_speaker && !spec->automute_lo) in automute_mode_put()
4782 return 0; in automute_mode_put()
4783 spec->automute_speaker = 0; in automute_mode_put()
4784 spec->automute_lo = 0; in automute_mode_put()
4787 if (spec->automute_speaker_possible) { in automute_mode_put()
4788 if (!spec->automute_lo && spec->automute_speaker) in automute_mode_put()
4789 return 0; in automute_mode_put()
4790 spec->automute_speaker = 1; in automute_mode_put()
4791 spec->automute_lo = 0; in automute_mode_put()
4792 } else if (spec->automute_lo_possible) { in automute_mode_put()
4793 if (spec->automute_lo) in automute_mode_put()
4794 return 0; in automute_mode_put()
4795 spec->automute_lo = 1; in automute_mode_put()
4797 return -EINVAL; in automute_mode_put()
4800 if (!spec->automute_lo_possible || !spec->automute_speaker_possible) in automute_mode_put()
4801 return -EINVAL; in automute_mode_put()
4802 if (spec->automute_speaker && spec->automute_lo) in automute_mode_put()
4803 return 0; in automute_mode_put()
4804 spec->automute_speaker = 1; in automute_mode_put()
4805 spec->automute_lo = 1; in automute_mode_put()
4808 return -EINVAL; in automute_mode_put()
4810 call_update_outputs(codec); in automute_mode_put()
4816 .name = "Auto-Mute Mode",
4822 static int add_automute_mode_enum(struct hda_codec *codec) in add_automute_mode_enum() argument
4824 struct hda_gen_spec *spec = codec->spec; in add_automute_mode_enum()
4827 return -ENOMEM; in add_automute_mode_enum()
4828 return 0; in add_automute_mode_enum()
4832 * Check the availability of HP/line-out auto-mute;
4835 static int check_auto_mute_availability(struct hda_codec *codec) in check_auto_mute_availability() argument
4837 struct hda_gen_spec *spec = codec->spec; in check_auto_mute_availability()
4838 struct auto_pin_cfg *cfg = &spec->autocfg; in check_auto_mute_availability()
4839 int present = 0; in check_auto_mute_availability()
4842 if (spec->suppress_auto_mute) in check_auto_mute_availability()
4843 return 0; in check_auto_mute_availability()
4845 if (cfg->hp_pins[0]) in check_auto_mute_availability()
4847 if (cfg->line_out_pins[0]) in check_auto_mute_availability()
4849 if (cfg->speaker_pins[0]) in check_auto_mute_availability()
4852 return 0; in check_auto_mute_availability()
4854 if (!cfg->speaker_pins[0] && in check_auto_mute_availability()
4855 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) { in check_auto_mute_availability()
4856 memcpy(cfg->speaker_pins, cfg->line_out_pins, in check_auto_mute_availability()
4857 sizeof(cfg->speaker_pins)); in check_auto_mute_availability()
4858 cfg->speaker_outs = cfg->line_outs; in check_auto_mute_availability()
4861 if (!cfg->hp_pins[0] && in check_auto_mute_availability()
4862 cfg->line_out_type == AUTO_PIN_HP_OUT) { in check_auto_mute_availability()
4863 memcpy(cfg->hp_pins, cfg->line_out_pins, in check_auto_mute_availability()
4864 sizeof(cfg->hp_pins)); in check_auto_mute_availability()
4865 cfg->hp_outs = cfg->line_outs; in check_auto_mute_availability()
4868 for (i = 0; i < cfg->hp_outs; i++) { in check_auto_mute_availability()
4869 hda_nid_t nid = cfg->hp_pins[i]; in check_auto_mute_availability()
4870 if (!is_jack_detectable(codec, nid)) in check_auto_mute_availability()
4872 codec_dbg(codec, "Enable HP auto-muting on NID 0x%x\n", nid); in check_auto_mute_availability()
4873 snd_hda_jack_detect_enable_callback(codec, nid, in check_auto_mute_availability()
4875 spec->detect_hp = 1; in check_auto_mute_availability()
4878 if (cfg->line_out_type == AUTO_PIN_LINE_OUT && cfg->line_outs) { in check_auto_mute_availability()
4879 if (cfg->speaker_outs) in check_auto_mute_availability()
4880 for (i = 0; i < cfg->line_outs; i++) { in check_auto_mute_availability()
4881 hda_nid_t nid = cfg->line_out_pins[i]; in check_auto_mute_availability()
4882 if (!is_jack_detectable(codec, nid)) in check_auto_mute_availability()
4884 codec_dbg(codec, "Enable Line-Out auto-muting on NID 0x%x\n", nid); in check_auto_mute_availability()
4885 snd_hda_jack_detect_enable_callback(codec, nid, in check_auto_mute_availability()
4887 spec->detect_lo = 1; in check_auto_mute_availability()
4889 spec->automute_lo_possible = spec->detect_hp; in check_auto_mute_availability()
4892 spec->automute_speaker_possible = cfg->speaker_outs && in check_auto_mute_availability()
4893 (spec->detect_hp || spec->detect_lo); in check_auto_mute_availability()
4895 spec->automute_lo = spec->automute_lo_possible; in check_auto_mute_availability()
4896 spec->automute_speaker = spec->automute_speaker_possible; in check_auto_mute_availability()
4898 if (spec->automute_speaker_possible || spec->automute_lo_possible) { in check_auto_mute_availability()
4900 err = add_automute_mode_enum(codec); in check_auto_mute_availability()
4901 if (err < 0) in check_auto_mute_availability()
4904 return 0; in check_auto_mute_availability()
4907 /* check whether all auto-mic pins are valid; setup indices if OK */
4908 static bool auto_mic_check_imux(struct hda_codec *codec) in auto_mic_check_imux() argument
4910 struct hda_gen_spec *spec = codec->spec; in auto_mic_check_imux()
4914 imux = &spec->input_mux; in auto_mic_check_imux()
4915 for (i = 0; i < spec->am_num_entries; i++) { in auto_mic_check_imux()
4916 spec->am_entry[i].idx = in auto_mic_check_imux()
4917 find_idx_in_nid_list(spec->am_entry[i].pin, in auto_mic_check_imux()
4918 spec->imux_pins, imux->num_items); in auto_mic_check_imux()
4919 if (spec->am_entry[i].idx < 0) in auto_mic_check_imux()
4924 for (i = 1; i < spec->am_num_entries; i++) in auto_mic_check_imux()
4925 snd_hda_jack_detect_enable_callback(codec, in auto_mic_check_imux()
4926 spec->am_entry[i].pin, in auto_mic_check_imux()
4935 return (int)(a->attr - b->attr); in compare_attr()
4939 * Check the availability of auto-mic switch;
4942 static int check_auto_mic_availability(struct hda_codec *codec) in check_auto_mic_availability() argument
4944 struct hda_gen_spec *spec = codec->spec; in check_auto_mic_availability()
4945 struct auto_pin_cfg *cfg = &spec->autocfg; in check_auto_mic_availability()
4949 if (spec->suppress_auto_mic) in check_auto_mic_availability()
4950 return 0; in check_auto_mic_availability()
4952 types = 0; in check_auto_mic_availability()
4953 num_pins = 0; in check_auto_mic_availability()
4954 for (i = 0; i < cfg->num_inputs; i++) { in check_auto_mic_availability()
4955 hda_nid_t nid = cfg->inputs[i].pin; in check_auto_mic_availability()
4957 attr = snd_hda_codec_get_pincfg(codec, nid); in check_auto_mic_availability()
4960 return 0; /* already occupied */ in check_auto_mic_availability()
4963 if (cfg->inputs[i].type != AUTO_PIN_MIC) in check_auto_mic_availability()
4964 return 0; /* invalid type */ in check_auto_mic_availability()
4967 return 0; /* invalid entry */ in check_auto_mic_availability()
4969 if (cfg->inputs[i].type > AUTO_PIN_LINE_IN) in check_auto_mic_availability()
4970 return 0; /* invalid type */ in check_auto_mic_availability()
4971 if (!spec->line_in_auto_switch && in check_auto_mic_availability()
4972 cfg->inputs[i].type != AUTO_PIN_MIC) in check_auto_mic_availability()
4973 return 0; /* only mic is allowed */ in check_auto_mic_availability()
4974 if (!is_jack_detectable(codec, nid)) in check_auto_mic_availability()
4975 return 0; /* no unsol support */ in check_auto_mic_availability()
4979 return 0; in check_auto_mic_availability()
4981 spec->am_entry[num_pins].pin = nid; in check_auto_mic_availability()
4982 spec->am_entry[num_pins].attr = attr; in check_auto_mic_availability()
4987 return 0; in check_auto_mic_availability()
4989 spec->am_num_entries = num_pins; in check_auto_mic_availability()
4993 sort(spec->am_entry, num_pins, sizeof(spec->am_entry[0]), in check_auto_mic_availability()
4996 if (!auto_mic_check_imux(codec)) in check_auto_mic_availability()
4997 return 0; in check_auto_mic_availability()
4999 spec->auto_mic = 1; in check_auto_mic_availability()
5000 spec->num_adc_nids = 1; in check_auto_mic_availability()
5001 spec->cur_mux[0] = spec->am_entry[0].idx; in check_auto_mic_availability()
5002 codec_dbg(codec, "Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n", in check_auto_mic_availability()
5003 spec->am_entry[0].pin, in check_auto_mic_availability()
5004 spec->am_entry[1].pin, in check_auto_mic_availability()
5005 spec->am_entry[2].pin); in check_auto_mic_availability()
5007 return 0; in check_auto_mic_availability()
5011 * snd_hda_gen_path_power_filter - power_filter hook to make inactive widgets
5013 * @codec: the HDA codec
5017 unsigned int snd_hda_gen_path_power_filter(struct hda_codec *codec, in snd_hda_gen_path_power_filter() argument
5021 struct hda_gen_spec *spec = codec->spec; in snd_hda_gen_path_power_filter()
5023 if (!spec->power_down_unused && !codec->power_save_node) in snd_hda_gen_path_power_filter()
5025 if (power_state != AC_PWRST_D0 || nid == codec->core.afg) in snd_hda_gen_path_power_filter()
5027 if (get_wcaps_type(get_wcaps(codec, nid)) >= AC_WID_POWER) in snd_hda_gen_path_power_filter()
5029 if (is_active_nid_for_any(codec, nid)) in snd_hda_gen_path_power_filter()
5036 static void mute_all_mixer_nid(struct hda_codec *codec, hda_nid_t mix) in mute_all_mixer_nid() argument
5042 nums = snd_hda_get_conn_list(codec, mix, &conn); in mute_all_mixer_nid()
5043 has_amp = nid_has_mute(codec, mix, HDA_INPUT); in mute_all_mixer_nid()
5044 for (i = 0; i < nums; i++) { in mute_all_mixer_nid()
5046 update_amp(codec, mix, HDA_INPUT, i, in mute_all_mixer_nid()
5047 0xff, HDA_AMP_MUTE); in mute_all_mixer_nid()
5048 else if (nid_has_volume(codec, conn[i], HDA_OUTPUT)) in mute_all_mixer_nid()
5049 update_amp(codec, conn[i], HDA_OUTPUT, 0, in mute_all_mixer_nid()
5050 0xff, HDA_AMP_MUTE); in mute_all_mixer_nid()
5055 * snd_hda_gen_stream_pm - Stream power management callback
5056 * @codec: the HDA codec
5062 void snd_hda_gen_stream_pm(struct hda_codec *codec, hda_nid_t nid, bool on) in snd_hda_gen_stream_pm() argument
5064 if (codec->power_save_node) in snd_hda_gen_stream_pm()
5065 set_path_power(codec, nid, -1, on); in snd_hda_gen_stream_pm()
5070 * snd_hda_gen_parse_auto_config - Parse the given BIOS configuration and
5072 * @codec: the HDA codec
5075 * return 1 if successful, 0 if the proper config is not found,
5078 int snd_hda_gen_parse_auto_config(struct hda_codec *codec, in snd_hda_gen_parse_auto_config() argument
5081 struct hda_gen_spec *spec = codec->spec; in snd_hda_gen_parse_auto_config()
5084 parse_user_hints(codec); in snd_hda_gen_parse_auto_config()
5086 if (spec->mixer_nid && !spec->mixer_merge_nid) in snd_hda_gen_parse_auto_config()
5087 spec->mixer_merge_nid = spec->mixer_nid; in snd_hda_gen_parse_auto_config()
5089 if (cfg != &spec->autocfg) { in snd_hda_gen_parse_auto_config()
5090 spec->autocfg = *cfg; in snd_hda_gen_parse_auto_config()
5091 cfg = &spec->autocfg; in snd_hda_gen_parse_auto_config()
5094 if (!spec->main_out_badness) in snd_hda_gen_parse_auto_config()
5095 spec->main_out_badness = &hda_main_out_badness; in snd_hda_gen_parse_auto_config()
5096 if (!spec->extra_out_badness) in snd_hda_gen_parse_auto_config()
5097 spec->extra_out_badness = &hda_extra_out_badness; in snd_hda_gen_parse_auto_config()
5099 fill_all_dac_nids(codec); in snd_hda_gen_parse_auto_config()
5101 if (!cfg->line_outs) { in snd_hda_gen_parse_auto_config()
5102 if (cfg->dig_outs || cfg->dig_in_pin) { in snd_hda_gen_parse_auto_config()
5103 spec->multiout.max_channels = 2; in snd_hda_gen_parse_auto_config()
5104 spec->no_analog = 1; in snd_hda_gen_parse_auto_config()
5107 if (!cfg->num_inputs && !cfg->dig_in_pin) in snd_hda_gen_parse_auto_config()
5108 return 0; /* can't find valid BIOS pin config */ in snd_hda_gen_parse_auto_config()
5111 if (!spec->no_primary_hp && in snd_hda_gen_parse_auto_config()
5112 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT && in snd_hda_gen_parse_auto_config()
5113 cfg->line_outs <= cfg->hp_outs) { in snd_hda_gen_parse_auto_config()
5115 cfg->speaker_outs = cfg->line_outs; in snd_hda_gen_parse_auto_config()
5116 memcpy(cfg->speaker_pins, cfg->line_out_pins, in snd_hda_gen_parse_auto_config()
5117 sizeof(cfg->speaker_pins)); in snd_hda_gen_parse_auto_config()
5118 cfg->line_outs = cfg->hp_outs; in snd_hda_gen_parse_auto_config()
5119 memcpy(cfg->line_out_pins, cfg->hp_pins, sizeof(cfg->hp_pins)); in snd_hda_gen_parse_auto_config()
5120 cfg->hp_outs = 0; in snd_hda_gen_parse_auto_config()
5121 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins)); in snd_hda_gen_parse_auto_config()
5122 cfg->line_out_type = AUTO_PIN_HP_OUT; in snd_hda_gen_parse_auto_config()
5125 err = parse_output_paths(codec); in snd_hda_gen_parse_auto_config()
5126 if (err < 0) in snd_hda_gen_parse_auto_config()
5128 err = create_multi_channel_mode(codec); in snd_hda_gen_parse_auto_config()
5129 if (err < 0) in snd_hda_gen_parse_auto_config()
5131 err = create_multi_out_ctls(codec, cfg); in snd_hda_gen_parse_auto_config()
5132 if (err < 0) in snd_hda_gen_parse_auto_config()
5134 err = create_hp_out_ctls(codec); in snd_hda_gen_parse_auto_config()
5135 if (err < 0) in snd_hda_gen_parse_auto_config()
5137 err = create_speaker_out_ctls(codec); in snd_hda_gen_parse_auto_config()
5138 if (err < 0) in snd_hda_gen_parse_auto_config()
5140 err = create_indep_hp_ctls(codec); in snd_hda_gen_parse_auto_config()
5141 if (err < 0) in snd_hda_gen_parse_auto_config()
5143 err = create_loopback_mixing_ctl(codec); in snd_hda_gen_parse_auto_config()
5144 if (err < 0) in snd_hda_gen_parse_auto_config()
5146 err = create_hp_mic(codec); in snd_hda_gen_parse_auto_config()
5147 if (err < 0) in snd_hda_gen_parse_auto_config()
5149 err = create_input_ctls(codec); in snd_hda_gen_parse_auto_config()
5150 if (err < 0) in snd_hda_gen_parse_auto_config()
5153 /* add power-down pin callbacks at first */ in snd_hda_gen_parse_auto_config()
5154 add_all_pin_power_ctls(codec, false); in snd_hda_gen_parse_auto_config()
5156 spec->const_channel_count = spec->ext_channel_count; in snd_hda_gen_parse_auto_config()
5158 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) in snd_hda_gen_parse_auto_config()
5159 spec->const_channel_count = max(spec->const_channel_count, in snd_hda_gen_parse_auto_config()
5160 cfg->speaker_outs * 2); in snd_hda_gen_parse_auto_config()
5161 if (cfg->line_out_type != AUTO_PIN_HP_OUT) in snd_hda_gen_parse_auto_config()
5162 spec->const_channel_count = max(spec->const_channel_count, in snd_hda_gen_parse_auto_config()
5163 cfg->hp_outs * 2); in snd_hda_gen_parse_auto_config()
5164 spec->multiout.max_channels = max(spec->ext_channel_count, in snd_hda_gen_parse_auto_config()
5165 spec->const_channel_count); in snd_hda_gen_parse_auto_config()
5167 err = check_auto_mute_availability(codec); in snd_hda_gen_parse_auto_config()
5168 if (err < 0) in snd_hda_gen_parse_auto_config()
5171 err = check_dyn_adc_switch(codec); in snd_hda_gen_parse_auto_config()
5172 if (err < 0) in snd_hda_gen_parse_auto_config()
5175 err = check_auto_mic_availability(codec); in snd_hda_gen_parse_auto_config()
5176 if (err < 0) in snd_hda_gen_parse_auto_config()
5180 if (!spec->auto_mic && spec->mixer_nid && in snd_hda_gen_parse_auto_config()
5181 spec->add_stereo_mix_input == HDA_HINT_STEREO_MIX_AUTO && in snd_hda_gen_parse_auto_config()
5182 spec->input_mux.num_items > 1) { in snd_hda_gen_parse_auto_config()
5183 err = parse_capture_source(codec, spec->mixer_nid, in snd_hda_gen_parse_auto_config()
5184 CFG_IDX_MIX, spec->num_all_adcs, in snd_hda_gen_parse_auto_config()
5185 "Stereo Mix", 0); in snd_hda_gen_parse_auto_config()
5186 if (err < 0) in snd_hda_gen_parse_auto_config()
5191 err = create_capture_mixers(codec); in snd_hda_gen_parse_auto_config()
5192 if (err < 0) in snd_hda_gen_parse_auto_config()
5195 err = parse_mic_boost(codec); in snd_hda_gen_parse_auto_config()
5196 if (err < 0) in snd_hda_gen_parse_auto_config()
5202 if (spec->hp_mic_pin && in snd_hda_gen_parse_auto_config()
5203 (spec->auto_mic || spec->input_mux.num_items == 1 || in snd_hda_gen_parse_auto_config()
5204 spec->add_jack_modes)) { in snd_hda_gen_parse_auto_config()
5205 err = create_hp_mic_jack_mode(codec, spec->hp_mic_pin); in snd_hda_gen_parse_auto_config()
5206 if (err < 0) in snd_hda_gen_parse_auto_config()
5210 if (spec->add_jack_modes) { in snd_hda_gen_parse_auto_config()
5211 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { in snd_hda_gen_parse_auto_config()
5212 err = create_out_jack_modes(codec, cfg->line_outs, in snd_hda_gen_parse_auto_config()
5213 cfg->line_out_pins); in snd_hda_gen_parse_auto_config()
5214 if (err < 0) in snd_hda_gen_parse_auto_config()
5217 if (cfg->line_out_type != AUTO_PIN_HP_OUT) { in snd_hda_gen_parse_auto_config()
5218 err = create_out_jack_modes(codec, cfg->hp_outs, in snd_hda_gen_parse_auto_config()
5219 cfg->hp_pins); in snd_hda_gen_parse_auto_config()
5220 if (err < 0) in snd_hda_gen_parse_auto_config()
5225 /* add power-up pin callbacks at last */ in snd_hda_gen_parse_auto_config()
5226 add_all_pin_power_ctls(codec, true); in snd_hda_gen_parse_auto_config()
5229 if (spec->mixer_nid) in snd_hda_gen_parse_auto_config()
5230 mute_all_mixer_nid(codec, spec->mixer_nid); in snd_hda_gen_parse_auto_config()
5233 parse_digital(codec); in snd_hda_gen_parse_auto_config()
5235 if (spec->power_down_unused || codec->power_save_node) { in snd_hda_gen_parse_auto_config()
5236 if (!codec->power_filter) in snd_hda_gen_parse_auto_config()
5237 codec->power_filter = snd_hda_gen_path_power_filter; in snd_hda_gen_parse_auto_config()
5238 if (!codec->patch_ops.stream_pm) in snd_hda_gen_parse_auto_config()
5239 codec->patch_ops.stream_pm = snd_hda_gen_stream_pm; in snd_hda_gen_parse_auto_config()
5242 if (!spec->no_analog && spec->beep_nid) { in snd_hda_gen_parse_auto_config()
5243 err = snd_hda_attach_beep_device(codec, spec->beep_nid); in snd_hda_gen_parse_auto_config()
5244 if (err < 0) in snd_hda_gen_parse_auto_config()
5246 if (codec->beep && codec->power_save_node) { in snd_hda_gen_parse_auto_config()
5247 err = add_fake_beep_paths(codec); in snd_hda_gen_parse_auto_config()
5248 if (err < 0) in snd_hda_gen_parse_auto_config()
5250 codec->beep->power_hook = beep_power_hook; in snd_hda_gen_parse_auto_config()
5275 * snd_hda_gen_build_controls - Build controls from the parsed results
5276 * @codec: the HDA codec
5280 int snd_hda_gen_build_controls(struct hda_codec *codec) in snd_hda_gen_build_controls() argument
5282 struct hda_gen_spec *spec = codec->spec; in snd_hda_gen_build_controls()
5285 if (spec->kctls.used) { in snd_hda_gen_build_controls()
5286 err = snd_hda_add_new_ctls(codec, spec->kctls.list); in snd_hda_gen_build_controls()
5287 if (err < 0) in snd_hda_gen_build_controls()
5291 if (spec->multiout.dig_out_nid) { in snd_hda_gen_build_controls()
5292 err = snd_hda_create_dig_out_ctls(codec, in snd_hda_gen_build_controls()
5293 spec->multiout.dig_out_nid, in snd_hda_gen_build_controls()
5294 spec->multiout.dig_out_nid, in snd_hda_gen_build_controls()
5295 spec->pcm_rec[1]->pcm_type); in snd_hda_gen_build_controls()
5296 if (err < 0) in snd_hda_gen_build_controls()
5298 if (!spec->no_analog) { in snd_hda_gen_build_controls()
5299 err = snd_hda_create_spdif_share_sw(codec, in snd_hda_gen_build_controls()
5300 &spec->multiout); in snd_hda_gen_build_controls()
5301 if (err < 0) in snd_hda_gen_build_controls()
5303 spec->multiout.share_spdif = 1; in snd_hda_gen_build_controls()
5306 if (spec->dig_in_nid) { in snd_hda_gen_build_controls()
5307 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid); in snd_hda_gen_build_controls()
5308 if (err < 0) in snd_hda_gen_build_controls()
5313 if (!spec->no_analog && !spec->suppress_vmaster && in snd_hda_gen_build_controls()
5314 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { in snd_hda_gen_build_controls()
5315 err = snd_hda_add_vmaster(codec, "Master Playback Volume", in snd_hda_gen_build_controls()
5316 spec->vmaster_tlv, follower_pfxs, in snd_hda_gen_build_controls()
5318 if (err < 0) in snd_hda_gen_build_controls()
5321 if (!spec->no_analog && !spec->suppress_vmaster && in snd_hda_gen_build_controls()
5322 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) { in snd_hda_gen_build_controls()
5323 err = __snd_hda_add_vmaster(codec, "Master Playback Switch", in snd_hda_gen_build_controls()
5326 true, &spec->vmaster_mute.sw_kctl); in snd_hda_gen_build_controls()
5327 if (err < 0) in snd_hda_gen_build_controls()
5329 if (spec->vmaster_mute.hook) { in snd_hda_gen_build_controls()
5330 snd_hda_add_vmaster_hook(codec, &spec->vmaster_mute, in snd_hda_gen_build_controls()
5331 spec->vmaster_mute_enum); in snd_hda_gen_build_controls()
5332 snd_hda_sync_vmaster_hook(&spec->vmaster_mute); in snd_hda_gen_build_controls()
5338 err = snd_hda_jack_add_kctls(codec, &spec->autocfg); in snd_hda_gen_build_controls()
5339 if (err < 0) in snd_hda_gen_build_controls()
5342 return 0; in snd_hda_gen_build_controls()
5352 struct hda_codec *codec, in call_pcm_playback_hook() argument
5356 struct hda_gen_spec *spec = codec->spec; in call_pcm_playback_hook()
5357 if (spec->pcm_playback_hook) in call_pcm_playback_hook()
5358 spec->pcm_playback_hook(hinfo, codec, substream, action); in call_pcm_playback_hook()
5362 struct hda_codec *codec, in call_pcm_capture_hook() argument
5366 struct hda_gen_spec *spec = codec->spec; in call_pcm_capture_hook()
5367 if (spec->pcm_capture_hook) in call_pcm_capture_hook()
5368 spec->pcm_capture_hook(hinfo, codec, substream, action); in call_pcm_capture_hook()
5375 struct hda_codec *codec, in playback_pcm_open() argument
5378 struct hda_gen_spec *spec = codec->spec; in playback_pcm_open()
5381 mutex_lock(&spec->pcm_mutex); in playback_pcm_open()
5382 err = snd_hda_multi_out_analog_open(codec, in playback_pcm_open()
5383 &spec->multiout, substream, in playback_pcm_open()
5386 spec->active_streams |= 1 << STREAM_MULTI_OUT; in playback_pcm_open()
5387 call_pcm_playback_hook(hinfo, codec, substream, in playback_pcm_open()
5390 mutex_unlock(&spec->pcm_mutex); in playback_pcm_open()
5395 struct hda_codec *codec, in playback_pcm_prepare() argument
5400 struct hda_gen_spec *spec = codec->spec; in playback_pcm_prepare()
5403 err = snd_hda_multi_out_analog_prepare(codec, &spec->multiout, in playback_pcm_prepare()
5406 call_pcm_playback_hook(hinfo, codec, substream, in playback_pcm_prepare()
5412 struct hda_codec *codec, in playback_pcm_cleanup() argument
5415 struct hda_gen_spec *spec = codec->spec; in playback_pcm_cleanup()
5418 err = snd_hda_multi_out_analog_cleanup(codec, &spec->multiout); in playback_pcm_cleanup()
5420 call_pcm_playback_hook(hinfo, codec, substream, in playback_pcm_cleanup()
5426 struct hda_codec *codec, in playback_pcm_close() argument
5429 struct hda_gen_spec *spec = codec->spec; in playback_pcm_close()
5430 mutex_lock(&spec->pcm_mutex); in playback_pcm_close()
5431 spec->active_streams &= ~(1 << STREAM_MULTI_OUT); in playback_pcm_close()
5432 call_pcm_playback_hook(hinfo, codec, substream, in playback_pcm_close()
5434 mutex_unlock(&spec->pcm_mutex); in playback_pcm_close()
5435 return 0; in playback_pcm_close()
5439 struct hda_codec *codec, in capture_pcm_open() argument
5442 call_pcm_capture_hook(hinfo, codec, substream, HDA_GEN_PCM_ACT_OPEN); in capture_pcm_open()
5443 return 0; in capture_pcm_open()
5447 struct hda_codec *codec, in capture_pcm_prepare() argument
5452 snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format); in capture_pcm_prepare()
5453 call_pcm_capture_hook(hinfo, codec, substream, in capture_pcm_prepare()
5455 return 0; in capture_pcm_prepare()
5459 struct hda_codec *codec, in capture_pcm_cleanup() argument
5462 snd_hda_codec_cleanup_stream(codec, hinfo->nid); in capture_pcm_cleanup()
5463 call_pcm_capture_hook(hinfo, codec, substream, in capture_pcm_cleanup()
5465 return 0; in capture_pcm_cleanup()
5469 struct hda_codec *codec, in capture_pcm_close() argument
5472 call_pcm_capture_hook(hinfo, codec, substream, HDA_GEN_PCM_ACT_CLOSE); in capture_pcm_close()
5473 return 0; in capture_pcm_close()
5477 struct hda_codec *codec, in alt_playback_pcm_open() argument
5480 struct hda_gen_spec *spec = codec->spec; in alt_playback_pcm_open()
5481 int err = 0; in alt_playback_pcm_open()
5483 mutex_lock(&spec->pcm_mutex); in alt_playback_pcm_open()
5484 if (spec->indep_hp && !spec->indep_hp_enabled) in alt_playback_pcm_open()
5485 err = -EBUSY; in alt_playback_pcm_open()
5487 spec->active_streams |= 1 << STREAM_INDEP_HP; in alt_playback_pcm_open()
5488 call_pcm_playback_hook(hinfo, codec, substream, in alt_playback_pcm_open()
5490 mutex_unlock(&spec->pcm_mutex); in alt_playback_pcm_open()
5495 struct hda_codec *codec, in alt_playback_pcm_close() argument
5498 struct hda_gen_spec *spec = codec->spec; in alt_playback_pcm_close()
5499 mutex_lock(&spec->pcm_mutex); in alt_playback_pcm_close()
5500 spec->active_streams &= ~(1 << STREAM_INDEP_HP); in alt_playback_pcm_close()
5501 call_pcm_playback_hook(hinfo, codec, substream, in alt_playback_pcm_close()
5503 mutex_unlock(&spec->pcm_mutex); in alt_playback_pcm_close()
5504 return 0; in alt_playback_pcm_close()
5508 struct hda_codec *codec, in alt_playback_pcm_prepare() argument
5513 snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format); in alt_playback_pcm_prepare()
5514 call_pcm_playback_hook(hinfo, codec, substream, in alt_playback_pcm_prepare()
5516 return 0; in alt_playback_pcm_prepare()
5520 struct hda_codec *codec, in alt_playback_pcm_cleanup() argument
5523 snd_hda_codec_cleanup_stream(codec, hinfo->nid); in alt_playback_pcm_cleanup()
5524 call_pcm_playback_hook(hinfo, codec, substream, in alt_playback_pcm_cleanup()
5526 return 0; in alt_playback_pcm_cleanup()
5533 struct hda_codec *codec, in dig_playback_pcm_open() argument
5536 struct hda_gen_spec *spec = codec->spec; in dig_playback_pcm_open()
5537 return snd_hda_multi_out_dig_open(codec, &spec->multiout); in dig_playback_pcm_open()
5541 struct hda_codec *codec, in dig_playback_pcm_prepare() argument
5546 struct hda_gen_spec *spec = codec->spec; in dig_playback_pcm_prepare()
5547 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout, in dig_playback_pcm_prepare()
5552 struct hda_codec *codec, in dig_playback_pcm_cleanup() argument
5555 struct hda_gen_spec *spec = codec->spec; in dig_playback_pcm_cleanup()
5556 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout); in dig_playback_pcm_cleanup()
5560 struct hda_codec *codec, in dig_playback_pcm_close() argument
5563 struct hda_gen_spec *spec = codec->spec; in dig_playback_pcm_close()
5564 return snd_hda_multi_out_dig_close(codec, &spec->multiout); in dig_playback_pcm_close()
5574 struct hda_codec *codec, in alt_capture_pcm_prepare() argument
5579 struct hda_gen_spec *spec = codec->spec; in alt_capture_pcm_prepare()
5581 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1], in alt_capture_pcm_prepare()
5582 stream_tag, 0, format); in alt_capture_pcm_prepare()
5583 call_pcm_capture_hook(hinfo, codec, substream, in alt_capture_pcm_prepare()
5585 return 0; in alt_capture_pcm_prepare()
5589 struct hda_codec *codec, in alt_capture_pcm_cleanup() argument
5592 struct hda_gen_spec *spec = codec->spec; in alt_capture_pcm_cleanup()
5594 snd_hda_codec_cleanup_stream(codec, in alt_capture_pcm_cleanup()
5595 spec->adc_nids[substream->number + 1]); in alt_capture_pcm_cleanup()
5596 call_pcm_capture_hook(hinfo, codec, substream, in alt_capture_pcm_cleanup()
5598 return 0; in alt_capture_pcm_cleanup()
5677 .substreams = 0,
5678 .channels_min = 0,
5679 .channels_max = 0,
5685 static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur) in dyn_adc_pcm_resetup() argument
5687 struct hda_gen_spec *spec = codec->spec; in dyn_adc_pcm_resetup()
5688 hda_nid_t new_adc = spec->adc_nids[spec->dyn_adc_idx[cur]]; in dyn_adc_pcm_resetup()
5690 if (spec->cur_adc && spec->cur_adc != new_adc) { in dyn_adc_pcm_resetup()
5692 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1); in dyn_adc_pcm_resetup()
5693 spec->cur_adc = new_adc; in dyn_adc_pcm_resetup()
5694 snd_hda_codec_setup_stream(codec, new_adc, in dyn_adc_pcm_resetup()
5695 spec->cur_adc_stream_tag, 0, in dyn_adc_pcm_resetup()
5696 spec->cur_adc_format); in dyn_adc_pcm_resetup()
5702 /* analog capture with dynamic dual-adc changes */
5704 struct hda_codec *codec, in dyn_adc_capture_pcm_prepare() argument
5709 struct hda_gen_spec *spec = codec->spec; in dyn_adc_capture_pcm_prepare()
5710 spec->cur_adc = spec->adc_nids[spec->dyn_adc_idx[spec->cur_mux[0]]]; in dyn_adc_capture_pcm_prepare()
5711 spec->cur_adc_stream_tag = stream_tag; in dyn_adc_capture_pcm_prepare()
5712 spec->cur_adc_format = format; in dyn_adc_capture_pcm_prepare()
5713 snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format); in dyn_adc_capture_pcm_prepare()
5714 call_pcm_capture_hook(hinfo, codec, substream, HDA_GEN_PCM_ACT_PREPARE); in dyn_adc_capture_pcm_prepare()
5715 return 0; in dyn_adc_capture_pcm_prepare()
5719 struct hda_codec *codec, in dyn_adc_capture_pcm_cleanup() argument
5722 struct hda_gen_spec *spec = codec->spec; in dyn_adc_capture_pcm_cleanup()
5723 snd_hda_codec_cleanup_stream(codec, spec->cur_adc); in dyn_adc_capture_pcm_cleanup()
5724 spec->cur_adc = 0; in dyn_adc_capture_pcm_cleanup()
5725 call_pcm_capture_hook(hinfo, codec, substream, HDA_GEN_PCM_ACT_CLEANUP); in dyn_adc_capture_pcm_cleanup()
5726 return 0; in dyn_adc_capture_pcm_cleanup()
5733 .nid = 0, /* fill later */
5749 /* drop non-alnum chars after a space */ in fill_pcm_stream_name()
5752 *p = 0; in fill_pcm_stream_name()
5759 /* copy PCM stream info from @default_str, and override non-NULL entries
5769 str->nid = nid; in setup_pcm_stream()
5771 if (spec_str->substreams) in setup_pcm_stream()
5772 str->substreams = spec_str->substreams; in setup_pcm_stream()
5773 if (spec_str->channels_min) in setup_pcm_stream()
5774 str->channels_min = spec_str->channels_min; in setup_pcm_stream()
5775 if (spec_str->channels_max) in setup_pcm_stream()
5776 str->channels_max = spec_str->channels_max; in setup_pcm_stream()
5777 if (spec_str->rates) in setup_pcm_stream()
5778 str->rates = spec_str->rates; in setup_pcm_stream()
5779 if (spec_str->formats) in setup_pcm_stream()
5780 str->formats = spec_str->formats; in setup_pcm_stream()
5781 if (spec_str->maxbps) in setup_pcm_stream()
5782 str->maxbps = spec_str->maxbps; in setup_pcm_stream()
5787 * snd_hda_gen_build_pcms - build PCM streams based on the parsed results
5788 * @codec: the HDA codec
5792 int snd_hda_gen_build_pcms(struct hda_codec *codec) in snd_hda_gen_build_pcms() argument
5794 struct hda_gen_spec *spec = codec->spec; in snd_hda_gen_build_pcms()
5798 if (spec->no_analog) in snd_hda_gen_build_pcms()
5801 fill_pcm_stream_name(spec->stream_name_analog, in snd_hda_gen_build_pcms()
5802 sizeof(spec->stream_name_analog), in snd_hda_gen_build_pcms()
5803 " Analog", codec->core.chip_name); in snd_hda_gen_build_pcms()
5804 info = snd_hda_codec_pcm_new(codec, "%s", spec->stream_name_analog); in snd_hda_gen_build_pcms()
5806 return -ENOMEM; in snd_hda_gen_build_pcms()
5807 spec->pcm_rec[0] = info; in snd_hda_gen_build_pcms()
5809 if (spec->multiout.num_dacs > 0) { in snd_hda_gen_build_pcms()
5810 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_PLAYBACK], in snd_hda_gen_build_pcms()
5812 spec->stream_analog_playback, in snd_hda_gen_build_pcms()
5813 spec->multiout.dac_nids[0]); in snd_hda_gen_build_pcms()
5814 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = in snd_hda_gen_build_pcms()
5815 spec->multiout.max_channels; in snd_hda_gen_build_pcms()
5816 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT && in snd_hda_gen_build_pcms()
5817 spec->autocfg.line_outs == 2) in snd_hda_gen_build_pcms()
5818 info->stream[SNDRV_PCM_STREAM_PLAYBACK].chmap = in snd_hda_gen_build_pcms()
5821 if (spec->num_adc_nids) { in snd_hda_gen_build_pcms()
5822 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_CAPTURE], in snd_hda_gen_build_pcms()
5823 (spec->dyn_adc_switch ? in snd_hda_gen_build_pcms()
5825 spec->stream_analog_capture, in snd_hda_gen_build_pcms()
5826 spec->adc_nids[0]); in snd_hda_gen_build_pcms()
5831 if (spec->multiout.dig_out_nid || spec->dig_in_nid) { in snd_hda_gen_build_pcms()
5832 fill_pcm_stream_name(spec->stream_name_digital, in snd_hda_gen_build_pcms()
5833 sizeof(spec->stream_name_digital), in snd_hda_gen_build_pcms()
5834 " Digital", codec->core.chip_name); in snd_hda_gen_build_pcms()
5835 info = snd_hda_codec_pcm_new(codec, "%s", in snd_hda_gen_build_pcms()
5836 spec->stream_name_digital); in snd_hda_gen_build_pcms()
5838 return -ENOMEM; in snd_hda_gen_build_pcms()
5839 codec->follower_dig_outs = spec->multiout.follower_dig_outs; in snd_hda_gen_build_pcms()
5840 spec->pcm_rec[1] = info; in snd_hda_gen_build_pcms()
5841 if (spec->dig_out_type) in snd_hda_gen_build_pcms()
5842 info->pcm_type = spec->dig_out_type; in snd_hda_gen_build_pcms()
5844 info->pcm_type = HDA_PCM_TYPE_SPDIF; in snd_hda_gen_build_pcms()
5845 if (spec->multiout.dig_out_nid) in snd_hda_gen_build_pcms()
5846 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_PLAYBACK], in snd_hda_gen_build_pcms()
5848 spec->stream_digital_playback, in snd_hda_gen_build_pcms()
5849 spec->multiout.dig_out_nid); in snd_hda_gen_build_pcms()
5850 if (spec->dig_in_nid) in snd_hda_gen_build_pcms()
5851 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_CAPTURE], in snd_hda_gen_build_pcms()
5853 spec->stream_digital_capture, in snd_hda_gen_build_pcms()
5854 spec->dig_in_nid); in snd_hda_gen_build_pcms()
5857 if (spec->no_analog) in snd_hda_gen_build_pcms()
5858 return 0; in snd_hda_gen_build_pcms()
5861 * model, configure a second analog capture-only PCM. in snd_hda_gen_build_pcms()
5863 have_multi_adcs = (spec->num_adc_nids > 1) && in snd_hda_gen_build_pcms()
5864 !spec->dyn_adc_switch && !spec->auto_mic; in snd_hda_gen_build_pcms()
5866 if (spec->alt_dac_nid || have_multi_adcs) { in snd_hda_gen_build_pcms()
5867 fill_pcm_stream_name(spec->stream_name_alt_analog, in snd_hda_gen_build_pcms()
5868 sizeof(spec->stream_name_alt_analog), in snd_hda_gen_build_pcms()
5869 " Alt Analog", codec->core.chip_name); in snd_hda_gen_build_pcms()
5870 info = snd_hda_codec_pcm_new(codec, "%s", in snd_hda_gen_build_pcms()
5871 spec->stream_name_alt_analog); in snd_hda_gen_build_pcms()
5873 return -ENOMEM; in snd_hda_gen_build_pcms()
5874 spec->pcm_rec[2] = info; in snd_hda_gen_build_pcms()
5875 if (spec->alt_dac_nid) in snd_hda_gen_build_pcms()
5876 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_PLAYBACK], in snd_hda_gen_build_pcms()
5878 spec->stream_analog_alt_playback, in snd_hda_gen_build_pcms()
5879 spec->alt_dac_nid); in snd_hda_gen_build_pcms()
5881 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_PLAYBACK], in snd_hda_gen_build_pcms()
5882 &pcm_null_stream, NULL, 0); in snd_hda_gen_build_pcms()
5884 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_CAPTURE], in snd_hda_gen_build_pcms()
5886 spec->stream_analog_alt_capture, in snd_hda_gen_build_pcms()
5887 spec->adc_nids[1]); in snd_hda_gen_build_pcms()
5888 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = in snd_hda_gen_build_pcms()
5889 spec->num_adc_nids - 1; in snd_hda_gen_build_pcms()
5891 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_CAPTURE], in snd_hda_gen_build_pcms()
5892 &pcm_null_stream, NULL, 0); in snd_hda_gen_build_pcms()
5896 return 0; in snd_hda_gen_build_pcms()
5902 * Standard auto-parser initializations
5906 static void set_output_and_unmute(struct hda_codec *codec, int path_idx) in set_output_and_unmute() argument
5911 path = snd_hda_get_path_from_idx(codec, path_idx); in set_output_and_unmute()
5912 if (!path || !path->depth) in set_output_and_unmute()
5914 pin = path->path[path->depth - 1]; in set_output_and_unmute()
5915 restore_pin_ctl(codec, pin); in set_output_and_unmute()
5916 snd_hda_activate_path(codec, path, path->active, in set_output_and_unmute()
5917 aamix_default(codec->spec)); in set_output_and_unmute()
5918 set_pin_eapd(codec, pin, path->active); in set_output_and_unmute()
5922 static void init_multi_out(struct hda_codec *codec) in init_multi_out() argument
5924 struct hda_gen_spec *spec = codec->spec; in init_multi_out()
5927 for (i = 0; i < spec->autocfg.line_outs; i++) in init_multi_out()
5928 set_output_and_unmute(codec, spec->out_paths[i]); in init_multi_out()
5932 static void __init_extra_out(struct hda_codec *codec, int num_outs, int *paths) in __init_extra_out() argument
5936 for (i = 0; i < num_outs; i++) in __init_extra_out()
5937 set_output_and_unmute(codec, paths[i]); in __init_extra_out()
5941 static void init_extra_out(struct hda_codec *codec) in init_extra_out() argument
5943 struct hda_gen_spec *spec = codec->spec; in init_extra_out()
5945 if (spec->autocfg.line_out_type != AUTO_PIN_HP_OUT) in init_extra_out()
5946 __init_extra_out(codec, spec->autocfg.hp_outs, spec->hp_paths); in init_extra_out()
5947 if (spec->autocfg.line_out_type != AUTO_PIN_SPEAKER_OUT) in init_extra_out()
5948 __init_extra_out(codec, spec->autocfg.speaker_outs, in init_extra_out()
5949 spec->speaker_paths); in init_extra_out()
5952 /* initialize multi-io paths */
5953 static void init_multi_io(struct hda_codec *codec) in init_multi_io() argument
5955 struct hda_gen_spec *spec = codec->spec; in init_multi_io()
5958 for (i = 0; i < spec->multi_ios; i++) { in init_multi_io()
5959 hda_nid_t pin = spec->multi_io[i].pin; in init_multi_io()
5961 path = get_multiio_path(codec, i); in init_multi_io()
5964 if (!spec->multi_io[i].ctl_in) in init_multi_io()
5965 spec->multi_io[i].ctl_in = in init_multi_io()
5966 snd_hda_codec_get_pin_target(codec, pin); in init_multi_io()
5967 snd_hda_activate_path(codec, path, path->active, in init_multi_io()
5972 static void init_aamix_paths(struct hda_codec *codec) in init_aamix_paths() argument
5974 struct hda_gen_spec *spec = codec->spec; in init_aamix_paths()
5976 if (!spec->have_aamix_ctl) in init_aamix_paths()
5980 update_aamix_paths(codec, spec->aamix_mode, spec->out_paths[0], in init_aamix_paths()
5981 spec->aamix_out_paths[0], in init_aamix_paths()
5982 spec->autocfg.line_out_type); in init_aamix_paths()
5983 update_aamix_paths(codec, spec->aamix_mode, spec->hp_paths[0], in init_aamix_paths()
5984 spec->aamix_out_paths[1], in init_aamix_paths()
5986 update_aamix_paths(codec, spec->aamix_mode, spec->speaker_paths[0], in init_aamix_paths()
5987 spec->aamix_out_paths[2], in init_aamix_paths()
5992 static void init_analog_input(struct hda_codec *codec) in init_analog_input() argument
5994 struct hda_gen_spec *spec = codec->spec; in init_analog_input()
5995 struct auto_pin_cfg *cfg = &spec->autocfg; in init_analog_input()
5998 for (i = 0; i < cfg->num_inputs; i++) { in init_analog_input()
5999 hda_nid_t nid = cfg->inputs[i].pin; in init_analog_input()
6000 if (is_input_pin(codec, nid)) in init_analog_input()
6001 restore_pin_ctl(codec, nid); in init_analog_input()
6004 if (spec->mixer_nid) { in init_analog_input()
6005 resume_path_from_idx(codec, spec->loopback_paths[i]); in init_analog_input()
6006 resume_path_from_idx(codec, spec->loopback_merge_path); in init_analog_input()
6012 static void init_input_src(struct hda_codec *codec) in init_input_src() argument
6014 struct hda_gen_spec *spec = codec->spec; in init_input_src()
6015 struct hda_input_mux *imux = &spec->input_mux; in init_input_src()
6019 if (spec->dyn_adc_switch) in init_input_src()
6022 nums = spec->num_adc_nids; in init_input_src()
6024 for (c = 0; c < nums; c++) { in init_input_src()
6025 for (i = 0; i < imux->num_items; i++) { in init_input_src()
6026 path = get_input_path(codec, c, i); in init_input_src()
6028 bool active = path->active; in init_input_src()
6029 if (i == spec->cur_mux[c]) in init_input_src()
6031 snd_hda_activate_path(codec, path, active, false); in init_input_src()
6034 if (spec->hp_mic) in init_input_src()
6035 update_hp_mic(codec, c, true); in init_input_src()
6038 if (spec->cap_sync_hook) in init_input_src()
6039 spec->cap_sync_hook(codec, NULL, NULL); in init_input_src()
6043 static void init_digital(struct hda_codec *codec) in init_digital() argument
6045 struct hda_gen_spec *spec = codec->spec; in init_digital()
6049 for (i = 0; i < spec->autocfg.dig_outs; i++) in init_digital()
6050 set_output_and_unmute(codec, spec->digout_paths[i]); in init_digital()
6051 pin = spec->autocfg.dig_in_pin; in init_digital()
6053 restore_pin_ctl(codec, pin); in init_digital()
6054 resume_path_from_idx(codec, spec->digin_path); in init_digital()
6058 /* clear unsol-event tags on unused pins; Conexant codecs seem to leave
6061 static void clear_unsol_on_unused_pins(struct hda_codec *codec) in clear_unsol_on_unused_pins() argument
6066 snd_array_for_each(&codec->init_pins, i, pin) { in clear_unsol_on_unused_pins()
6067 hda_nid_t nid = pin->nid; in clear_unsol_on_unused_pins()
6068 if (is_jack_detectable(codec, nid) && in clear_unsol_on_unused_pins()
6069 !snd_hda_jack_tbl_get(codec, nid)) in clear_unsol_on_unused_pins()
6070 snd_hda_codec_write_cache(codec, nid, 0, in clear_unsol_on_unused_pins()
6071 AC_VERB_SET_UNSOLICITED_ENABLE, 0); in clear_unsol_on_unused_pins()
6076 * snd_hda_gen_init - initialize the generic spec
6077 * @codec: the HDA codec
6081 int snd_hda_gen_init(struct hda_codec *codec) in snd_hda_gen_init() argument
6083 struct hda_gen_spec *spec = codec->spec; in snd_hda_gen_init()
6085 if (spec->init_hook) in snd_hda_gen_init()
6086 spec->init_hook(codec); in snd_hda_gen_init()
6088 if (!spec->skip_verbs) in snd_hda_gen_init()
6089 snd_hda_apply_verbs(codec); in snd_hda_gen_init()
6091 init_multi_out(codec); in snd_hda_gen_init()
6092 init_extra_out(codec); in snd_hda_gen_init()
6093 init_multi_io(codec); in snd_hda_gen_init()
6094 init_aamix_paths(codec); in snd_hda_gen_init()
6095 init_analog_input(codec); in snd_hda_gen_init()
6096 init_input_src(codec); in snd_hda_gen_init()
6097 init_digital(codec); in snd_hda_gen_init()
6099 clear_unsol_on_unused_pins(codec); in snd_hda_gen_init()
6101 sync_all_pin_power_ctls(codec); in snd_hda_gen_init()
6103 /* call init functions of standard auto-mute helpers */ in snd_hda_gen_init()
6104 update_automute_all(codec); in snd_hda_gen_init()
6106 snd_hda_regmap_sync(codec); in snd_hda_gen_init()
6108 if (spec->vmaster_mute.sw_kctl && spec->vmaster_mute.hook) in snd_hda_gen_init()
6109 snd_hda_sync_vmaster_hook(&spec->vmaster_mute); in snd_hda_gen_init()
6111 hda_call_check_power_status(codec, 0x01); in snd_hda_gen_init()
6112 return 0; in snd_hda_gen_init()
6117 * snd_hda_gen_free - free the generic spec
6118 * @codec: the HDA codec
6122 void snd_hda_gen_free(struct hda_codec *codec) in snd_hda_gen_free() argument
6124 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_FREE); in snd_hda_gen_free()
6125 snd_hda_gen_spec_free(codec->spec); in snd_hda_gen_free()
6126 kfree(codec->spec); in snd_hda_gen_free()
6127 codec->spec = NULL; in snd_hda_gen_free()
6132 * snd_hda_gen_reboot_notify - Make codec enter D3 before rebooting
6133 * @codec: the HDA codec
6137 void snd_hda_gen_reboot_notify(struct hda_codec *codec) in snd_hda_gen_reboot_notify() argument
6139 /* Make the codec enter D3 to avoid spurious noises from the internal in snd_hda_gen_reboot_notify()
6142 snd_hda_codec_set_power_to_all(codec, codec->core.afg, AC_PWRST_D3); in snd_hda_gen_reboot_notify()
6143 snd_hda_codec_write(codec, codec->core.afg, 0, in snd_hda_gen_reboot_notify()
6151 * snd_hda_gen_check_power_status - check the loopback power save state
6152 * @codec: the HDA codec
6157 int snd_hda_gen_check_power_status(struct hda_codec *codec, hda_nid_t nid) in snd_hda_gen_check_power_status() argument
6159 struct hda_gen_spec *spec = codec->spec; in snd_hda_gen_check_power_status()
6160 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid); in snd_hda_gen_check_power_status()
6167 * the generic codec support
6183 * snd_hda_parse_generic_codec - Generic codec parser
6184 * @codec: the HDA codec
6186 static int snd_hda_parse_generic_codec(struct hda_codec *codec) in snd_hda_parse_generic_codec() argument
6193 return -ENOMEM; in snd_hda_parse_generic_codec()
6195 codec->spec = spec; in snd_hda_parse_generic_codec()
6197 err = snd_hda_parse_pin_defcfg(codec, &spec->autocfg, NULL, 0); in snd_hda_parse_generic_codec()
6198 if (err < 0) in snd_hda_parse_generic_codec()
6201 err = snd_hda_gen_parse_auto_config(codec, &spec->autocfg); in snd_hda_parse_generic_codec()
6202 if (err < 0) in snd_hda_parse_generic_codec()
6205 codec->patch_ops = generic_patch_ops; in snd_hda_parse_generic_codec()
6206 return 0; in snd_hda_parse_generic_codec()
6209 snd_hda_gen_free(codec); in snd_hda_parse_generic_codec()
6226 MODULE_DESCRIPTION("Generic HD-audio codec parser");