2 * Universal Interface for Intel High Definition Audio Codec
4 * Generic widget tree parser
6 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
8 * This driver is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This driver is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include <linux/init.h>
24 #include <linux/slab.h>
25 #include <linux/export.h>
26 #include <linux/sort.h>
27 #include <linux/delay.h>
28 #include <linux/ctype.h>
29 #include <linux/string.h>
30 #include <linux/bitops.h>
31 #include <sound/core.h>
32 #include <sound/jack.h>
33 #include "hda_codec.h"
34 #include "hda_local.h"
35 #include "hda_auto_parser.h"
37 #include "hda_generic.h"
40 /* initialize hda_gen_spec struct */
41 int snd_hda_gen_spec_init(struct hda_gen_spec *spec)
43 snd_array_init(&spec->kctls, sizeof(struct snd_kcontrol_new), 32);
44 snd_array_init(&spec->paths, sizeof(struct nid_path), 8);
45 mutex_init(&spec->pcm_mutex);
48 EXPORT_SYMBOL_HDA(snd_hda_gen_spec_init);
50 struct snd_kcontrol_new *
51 snd_hda_gen_add_kctl(struct hda_gen_spec *spec, const char *name,
52 const struct snd_kcontrol_new *temp)
54 struct snd_kcontrol_new *knew = snd_array_new(&spec->kctls);
59 knew->name = kstrdup(name, GFP_KERNEL);
61 knew->name = kstrdup(knew->name, GFP_KERNEL);
66 EXPORT_SYMBOL_HDA(snd_hda_gen_add_kctl);
68 static void free_kctls(struct hda_gen_spec *spec)
70 if (spec->kctls.list) {
71 struct snd_kcontrol_new *kctl = spec->kctls.list;
73 for (i = 0; i < spec->kctls.used; i++)
76 snd_array_free(&spec->kctls);
79 void snd_hda_gen_spec_free(struct hda_gen_spec *spec)
84 snd_array_free(&spec->paths);
86 EXPORT_SYMBOL_HDA(snd_hda_gen_spec_free);
91 static void parse_user_hints(struct hda_codec *codec)
93 struct hda_gen_spec *spec = codec->spec;
96 val = snd_hda_get_bool_hint(codec, "jack_detect");
98 codec->no_jack_detect = !val;
99 val = snd_hda_get_bool_hint(codec, "inv_jack_detect");
101 codec->inv_jack_detect = !!val;
102 val = snd_hda_get_bool_hint(codec, "trigger_sense");
104 codec->no_trigger_sense = !val;
105 val = snd_hda_get_bool_hint(codec, "inv_eapd");
107 codec->inv_eapd = !!val;
108 val = snd_hda_get_bool_hint(codec, "pcm_format_first");
110 codec->pcm_format_first = !!val;
111 val = snd_hda_get_bool_hint(codec, "sticky_stream");
113 codec->no_sticky_stream = !val;
114 val = snd_hda_get_bool_hint(codec, "spdif_status_reset");
116 codec->spdif_status_reset = !!val;
117 val = snd_hda_get_bool_hint(codec, "pin_amp_workaround");
119 codec->pin_amp_workaround = !!val;
120 val = snd_hda_get_bool_hint(codec, "single_adc_amp");
122 codec->single_adc_amp = !!val;
124 val = snd_hda_get_bool_hint(codec, "auto_mute");
126 spec->suppress_auto_mute = !val;
127 val = snd_hda_get_bool_hint(codec, "auto_mic");
129 spec->suppress_auto_mic = !val;
130 val = snd_hda_get_bool_hint(codec, "line_in_auto_switch");
132 spec->line_in_auto_switch = !!val;
133 val = snd_hda_get_bool_hint(codec, "need_dac_fix");
135 spec->need_dac_fix = !!val;
136 val = snd_hda_get_bool_hint(codec, "primary_hp");
138 spec->no_primary_hp = !val;
139 val = snd_hda_get_bool_hint(codec, "multi_cap_vol");
141 spec->multi_cap_vol = !!val;
142 val = snd_hda_get_bool_hint(codec, "inv_dmic_split");
144 spec->inv_dmic_split = !!val;
145 val = snd_hda_get_bool_hint(codec, "indep_hp");
147 spec->indep_hp = !!val;
148 val = snd_hda_get_bool_hint(codec, "add_stereo_mix_input");
150 spec->add_stereo_mix_input = !!val;
151 val = snd_hda_get_bool_hint(codec, "add_out_jack_modes");
153 spec->add_out_jack_modes = !!val;
154 val = snd_hda_get_bool_hint(codec, "add_in_jack_modes");
156 spec->add_in_jack_modes = !!val;
157 val = snd_hda_get_bool_hint(codec, "power_down_unused");
159 spec->power_down_unused = !!val;
161 if (!snd_hda_get_int_hint(codec, "mixer_nid", &val))
162 spec->mixer_nid = val;
166 * pin control value accesses
169 #define update_pin_ctl(codec, pin, val) \
170 snd_hda_codec_update_cache(codec, pin, 0, \
171 AC_VERB_SET_PIN_WIDGET_CONTROL, val)
173 /* restore the pinctl based on the cached value */
174 static inline void restore_pin_ctl(struct hda_codec *codec, hda_nid_t pin)
176 update_pin_ctl(codec, pin, snd_hda_codec_get_pin_target(codec, pin));
179 /* set the pinctl target value and write it if requested */
180 static void set_pin_target(struct hda_codec *codec, hda_nid_t pin,
181 unsigned int val, bool do_write)
185 val = snd_hda_correct_pin_ctl(codec, pin, val);
186 snd_hda_codec_set_pin_target(codec, pin, val);
188 update_pin_ctl(codec, pin, val);
191 /* set pinctl target values for all given pins */
192 static void set_pin_targets(struct hda_codec *codec, int num_pins,
193 hda_nid_t *pins, unsigned int val)
196 for (i = 0; i < num_pins; i++)
197 set_pin_target(codec, pins[i], val, false);
204 /* return the position of NID in the list, or -1 if not found */
205 static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
208 for (i = 0; i < nums; i++)
214 /* return true if the given NID is contained in the path */
215 static bool is_nid_contained(struct nid_path *path, hda_nid_t nid)
217 return find_idx_in_nid_list(nid, path->path, path->depth) >= 0;
220 static struct nid_path *get_nid_path(struct hda_codec *codec,
221 hda_nid_t from_nid, hda_nid_t to_nid,
224 struct hda_gen_spec *spec = codec->spec;
227 for (i = 0; i < spec->paths.used; i++) {
228 struct nid_path *path = snd_array_elem(&spec->paths, i);
229 if (path->depth <= 0)
231 if ((!from_nid || path->path[0] == from_nid) &&
232 (!to_nid || path->path[path->depth - 1] == to_nid)) {
234 (anchor_nid > 0 && is_nid_contained(path, anchor_nid)) ||
235 (anchor_nid < 0 && !is_nid_contained(path, anchor_nid)))
242 /* get the path between the given NIDs;
243 * passing 0 to either @pin or @dac behaves as a wildcard
245 struct nid_path *snd_hda_get_nid_path(struct hda_codec *codec,
246 hda_nid_t from_nid, hda_nid_t to_nid)
248 return get_nid_path(codec, from_nid, to_nid, 0);
250 EXPORT_SYMBOL_HDA(snd_hda_get_nid_path);
252 /* get the index number corresponding to the path instance;
253 * the index starts from 1, for easier checking the invalid value
255 int snd_hda_get_path_idx(struct hda_codec *codec, struct nid_path *path)
257 struct hda_gen_spec *spec = codec->spec;
258 struct nid_path *array = spec->paths.list;
261 if (!spec->paths.used)
264 if (idx < 0 || idx >= spec->paths.used)
268 EXPORT_SYMBOL_HDA(snd_hda_get_path_idx);
270 /* get the path instance corresponding to the given index number */
271 struct nid_path *snd_hda_get_path_from_idx(struct hda_codec *codec, int idx)
273 struct hda_gen_spec *spec = codec->spec;
275 if (idx <= 0 || idx > spec->paths.used)
277 return snd_array_elem(&spec->paths, idx - 1);
279 EXPORT_SYMBOL_HDA(snd_hda_get_path_from_idx);
281 /* check whether the given DAC is already found in any existing paths */
282 static bool is_dac_already_used(struct hda_codec *codec, hda_nid_t nid)
284 struct hda_gen_spec *spec = codec->spec;
287 for (i = 0; i < spec->paths.used; i++) {
288 struct nid_path *path = snd_array_elem(&spec->paths, i);
289 if (path->path[0] == nid)
295 /* check whether the given two widgets can be connected */
296 static bool is_reachable_path(struct hda_codec *codec,
297 hda_nid_t from_nid, hda_nid_t to_nid)
299 if (!from_nid || !to_nid)
301 return snd_hda_get_conn_index(codec, to_nid, from_nid, true) >= 0;
304 /* nid, dir and idx */
305 #define AMP_VAL_COMPARE_MASK (0xffff | (1U << 18) | (0x0f << 19))
307 /* check whether the given ctl is already assigned in any path elements */
308 static bool is_ctl_used(struct hda_codec *codec, unsigned int val, int type)
310 struct hda_gen_spec *spec = codec->spec;
313 val &= AMP_VAL_COMPARE_MASK;
314 for (i = 0; i < spec->paths.used; i++) {
315 struct nid_path *path = snd_array_elem(&spec->paths, i);
316 if ((path->ctls[type] & AMP_VAL_COMPARE_MASK) == val)
322 /* check whether a control with the given (nid, dir, idx) was assigned */
323 static bool is_ctl_associated(struct hda_codec *codec, hda_nid_t nid,
324 int dir, int idx, int type)
326 unsigned int val = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
327 return is_ctl_used(codec, val, type);
330 static void print_nid_path(const char *pfx, struct nid_path *path)
337 for (i = 0; i < path->depth; i++) {
339 sprintf(tmp, ":%02x", path->path[i]);
340 strlcat(buf, tmp, sizeof(buf));
342 snd_printdd("%s path: depth=%d %s\n", pfx, path->depth, buf);
345 /* called recursively */
346 static bool __parse_nid_path(struct hda_codec *codec,
347 hda_nid_t from_nid, hda_nid_t to_nid,
348 int anchor_nid, struct nid_path *path,
351 const hda_nid_t *conn;
354 if (to_nid == anchor_nid)
355 anchor_nid = 0; /* anchor passed */
356 else if (to_nid == (hda_nid_t)(-anchor_nid))
357 return false; /* hit the exclusive nid */
359 nums = snd_hda_get_conn_list(codec, to_nid, &conn);
360 for (i = 0; i < nums; i++) {
361 if (conn[i] != from_nid) {
362 /* special case: when from_nid is 0,
363 * try to find an empty DAC
366 get_wcaps_type(get_wcaps(codec, conn[i])) != AC_WID_AUD_OUT ||
367 is_dac_already_used(codec, conn[i]))
370 /* anchor is not requested or already passed? */
374 if (depth >= MAX_NID_PATH_DEPTH)
376 for (i = 0; i < nums; i++) {
378 type = get_wcaps_type(get_wcaps(codec, conn[i]));
379 if (type == AC_WID_AUD_OUT || type == AC_WID_AUD_IN ||
382 if (__parse_nid_path(codec, from_nid, conn[i],
383 anchor_nid, path, depth + 1))
389 path->path[path->depth] = conn[i];
390 path->idx[path->depth + 1] = i;
391 if (nums > 1 && get_wcaps_type(get_wcaps(codec, to_nid)) != AC_WID_AUD_MIX)
392 path->multi[path->depth + 1] = 1;
397 /* parse the widget path from the given nid to the target nid;
398 * when @from_nid is 0, try to find an empty DAC;
399 * when @anchor_nid is set to a positive value, only paths through the widget
400 * with the given value are evaluated.
401 * when @anchor_nid is set to a negative value, paths through the widget
402 * with the negative of given value are excluded, only other paths are chosen.
403 * when @anchor_nid is zero, no special handling about path selection.
405 bool snd_hda_parse_nid_path(struct hda_codec *codec, hda_nid_t from_nid,
406 hda_nid_t to_nid, int anchor_nid,
407 struct nid_path *path)
409 if (__parse_nid_path(codec, from_nid, to_nid, anchor_nid, path, 1)) {
410 path->path[path->depth] = to_nid;
416 EXPORT_SYMBOL_HDA(snd_hda_parse_nid_path);
419 * parse the path between the given NIDs and add to the path list.
420 * if no valid path is found, return NULL
423 snd_hda_add_new_path(struct hda_codec *codec, hda_nid_t from_nid,
424 hda_nid_t to_nid, int anchor_nid)
426 struct hda_gen_spec *spec = codec->spec;
427 struct nid_path *path;
429 if (from_nid && to_nid && !is_reachable_path(codec, from_nid, to_nid))
432 /* check whether the path has been already added */
433 path = get_nid_path(codec, from_nid, to_nid, anchor_nid);
437 path = snd_array_new(&spec->paths);
440 memset(path, 0, sizeof(*path));
441 if (snd_hda_parse_nid_path(codec, from_nid, to_nid, anchor_nid, path))
447 EXPORT_SYMBOL_HDA(snd_hda_add_new_path);
449 /* clear the given path as invalid so that it won't be picked up later */
450 static void invalidate_nid_path(struct hda_codec *codec, int idx)
452 struct nid_path *path = snd_hda_get_path_from_idx(codec, idx);
455 memset(path, 0, sizeof(*path));
458 /* look for an empty DAC slot */
459 static hda_nid_t look_for_dac(struct hda_codec *codec, hda_nid_t pin,
462 struct hda_gen_spec *spec = codec->spec;
466 for (i = 0; i < spec->num_all_dacs; i++) {
467 hda_nid_t nid = spec->all_dacs[i];
468 if (!nid || is_dac_already_used(codec, nid))
470 cap_digital = !!(get_wcaps(codec, nid) & AC_WCAP_DIGITAL);
471 if (is_digital != cap_digital)
473 if (is_reachable_path(codec, nid, pin))
479 /* replace the channels in the composed amp value with the given number */
480 static unsigned int amp_val_replace_channels(unsigned int val, unsigned int chs)
482 val &= ~(0x3U << 16);
487 /* check whether the widget has the given amp capability for the direction */
488 static bool check_amp_caps(struct hda_codec *codec, hda_nid_t nid,
489 int dir, unsigned int bits)
493 if (get_wcaps(codec, nid) & (1 << (dir + 1)))
494 if (query_amp_caps(codec, nid, dir) & bits)
499 static bool same_amp_caps(struct hda_codec *codec, hda_nid_t nid1,
500 hda_nid_t nid2, int dir)
502 if (!(get_wcaps(codec, nid1) & (1 << (dir + 1))))
503 return !(get_wcaps(codec, nid2) & (1 << (dir + 1)));
504 return (query_amp_caps(codec, nid1, dir) ==
505 query_amp_caps(codec, nid2, dir));
508 #define nid_has_mute(codec, nid, dir) \
509 check_amp_caps(codec, nid, dir, AC_AMPCAP_MUTE)
510 #define nid_has_volume(codec, nid, dir) \
511 check_amp_caps(codec, nid, dir, AC_AMPCAP_NUM_STEPS)
513 /* look for a widget suitable for assigning a mute switch in the path */
514 static hda_nid_t look_for_out_mute_nid(struct hda_codec *codec,
515 struct nid_path *path)
519 for (i = path->depth - 1; i >= 0; i--) {
520 if (nid_has_mute(codec, path->path[i], HDA_OUTPUT))
521 return path->path[i];
522 if (i != path->depth - 1 && i != 0 &&
523 nid_has_mute(codec, path->path[i], HDA_INPUT))
524 return path->path[i];
529 /* look for a widget suitable for assigning a volume ctl in the path */
530 static hda_nid_t look_for_out_vol_nid(struct hda_codec *codec,
531 struct nid_path *path)
535 for (i = path->depth - 1; i >= 0; i--) {
536 if (nid_has_volume(codec, path->path[i], HDA_OUTPUT))
537 return path->path[i];
543 * path activation / deactivation
546 /* can have the amp-in capability? */
547 static bool has_amp_in(struct hda_codec *codec, struct nid_path *path, int idx)
549 hda_nid_t nid = path->path[idx];
550 unsigned int caps = get_wcaps(codec, nid);
551 unsigned int type = get_wcaps_type(caps);
553 if (!(caps & AC_WCAP_IN_AMP))
555 if (type == AC_WID_PIN && idx > 0) /* only for input pins */
560 /* can have the amp-out capability? */
561 static bool has_amp_out(struct hda_codec *codec, struct nid_path *path, int idx)
563 hda_nid_t nid = path->path[idx];
564 unsigned int caps = get_wcaps(codec, nid);
565 unsigned int type = get_wcaps_type(caps);
567 if (!(caps & AC_WCAP_OUT_AMP))
569 if (type == AC_WID_PIN && !idx) /* only for output pins */
574 /* check whether the given (nid,dir,idx) is active */
575 static bool is_active_nid(struct hda_codec *codec, hda_nid_t nid,
576 unsigned int dir, unsigned int idx)
578 struct hda_gen_spec *spec = codec->spec;
581 for (n = 0; n < spec->paths.used; n++) {
582 struct nid_path *path = snd_array_elem(&spec->paths, n);
585 for (i = 0; i < path->depth; i++) {
586 if (path->path[i] == nid) {
587 if (dir == HDA_OUTPUT || path->idx[i] == idx)
596 /* get the default amp value for the target state */
597 static int get_amp_val_to_activate(struct hda_codec *codec, hda_nid_t nid,
598 int dir, unsigned int caps, bool enable)
600 unsigned int val = 0;
602 if (caps & AC_AMPCAP_NUM_STEPS) {
605 val = (caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT;
607 if (caps & AC_AMPCAP_MUTE) {
614 /* initialize the amp value (only at the first time) */
615 static void init_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx)
617 unsigned int caps = query_amp_caps(codec, nid, dir);
618 int val = get_amp_val_to_activate(codec, nid, dir, caps, false);
619 snd_hda_codec_amp_init_stereo(codec, nid, dir, idx, 0xff, val);
622 /* calculate amp value mask we can modify;
623 * if the given amp is controlled by mixers, don't touch it
625 static unsigned int get_amp_mask_to_modify(struct hda_codec *codec,
626 hda_nid_t nid, int dir, int idx,
629 unsigned int mask = 0xff;
631 if (caps & AC_AMPCAP_MUTE) {
632 if (is_ctl_associated(codec, nid, dir, idx, NID_PATH_MUTE_CTL))
635 if (caps & AC_AMPCAP_NUM_STEPS) {
636 if (is_ctl_associated(codec, nid, dir, idx, NID_PATH_VOL_CTL) ||
637 is_ctl_associated(codec, nid, dir, idx, NID_PATH_BOOST_CTL))
643 static void activate_amp(struct hda_codec *codec, hda_nid_t nid, int dir,
644 int idx, int idx_to_check, bool enable)
647 unsigned int mask, val;
649 if (!enable && is_active_nid(codec, nid, dir, idx_to_check))
652 caps = query_amp_caps(codec, nid, dir);
653 val = get_amp_val_to_activate(codec, nid, dir, caps, enable);
654 mask = get_amp_mask_to_modify(codec, nid, dir, idx_to_check, caps);
659 snd_hda_codec_amp_stereo(codec, nid, dir, idx, mask, val);
662 static void activate_amp_out(struct hda_codec *codec, struct nid_path *path,
665 hda_nid_t nid = path->path[i];
666 init_amp(codec, nid, HDA_OUTPUT, 0);
667 activate_amp(codec, nid, HDA_OUTPUT, 0, 0, enable);
670 static void activate_amp_in(struct hda_codec *codec, struct nid_path *path,
671 int i, bool enable, bool add_aamix)
673 struct hda_gen_spec *spec = codec->spec;
674 const hda_nid_t *conn;
677 hda_nid_t nid = path->path[i];
679 nums = snd_hda_get_conn_list(codec, nid, &conn);
680 type = get_wcaps_type(get_wcaps(codec, nid));
681 if (type == AC_WID_PIN ||
682 (type == AC_WID_AUD_IN && codec->single_adc_amp)) {
688 for (n = 0; n < nums; n++)
689 init_amp(codec, nid, HDA_INPUT, n);
691 /* here is a little bit tricky in comparison with activate_amp_out();
692 * when aa-mixer is available, we need to enable the path as well
694 for (n = 0; n < nums; n++) {
695 if (n != idx && (!add_aamix || conn[n] != spec->mixer_merge_nid))
697 activate_amp(codec, nid, HDA_INPUT, n, idx, enable);
701 /* activate or deactivate the given path
702 * if @add_aamix is set, enable the input from aa-mix NID as well (if any)
704 void snd_hda_activate_path(struct hda_codec *codec, struct nid_path *path,
705 bool enable, bool add_aamix)
707 struct hda_gen_spec *spec = codec->spec;
711 path->active = false;
713 for (i = path->depth - 1; i >= 0; i--) {
714 hda_nid_t nid = path->path[i];
715 if (enable && spec->power_down_unused) {
716 /* make sure the widget is powered up */
717 if (!snd_hda_check_power_state(codec, nid, AC_PWRST_D0))
718 snd_hda_codec_write(codec, nid, 0,
719 AC_VERB_SET_POWER_STATE,
722 if (enable && path->multi[i])
723 snd_hda_codec_write_cache(codec, nid, 0,
724 AC_VERB_SET_CONNECT_SEL,
726 if (has_amp_in(codec, path, i))
727 activate_amp_in(codec, path, i, enable, add_aamix);
728 if (has_amp_out(codec, path, i))
729 activate_amp_out(codec, path, i, enable);
735 EXPORT_SYMBOL_HDA(snd_hda_activate_path);
737 /* if the given path is inactive, put widgets into D3 (only if suitable) */
738 static void path_power_down_sync(struct hda_codec *codec, struct nid_path *path)
740 struct hda_gen_spec *spec = codec->spec;
744 if (!spec->power_down_unused || path->active)
747 for (i = 0; i < path->depth; i++) {
748 hda_nid_t nid = path->path[i];
749 if (!snd_hda_check_power_state(codec, nid, AC_PWRST_D3)) {
750 snd_hda_codec_write(codec, nid, 0,
751 AC_VERB_SET_POWER_STATE,
759 snd_hda_codec_read(codec, path->path[0], 0,
760 AC_VERB_GET_POWER_STATE, 0);
764 /* turn on/off EAPD on the given pin */
765 static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable)
767 struct hda_gen_spec *spec = codec->spec;
768 if (spec->own_eapd_ctl ||
769 !(snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD))
773 snd_hda_codec_update_cache(codec, pin, 0,
774 AC_VERB_SET_EAPD_BTLENABLE,
775 enable ? 0x02 : 0x00);
778 /* re-initialize the path specified by the given path index */
779 static void resume_path_from_idx(struct hda_codec *codec, int path_idx)
781 struct nid_path *path = snd_hda_get_path_from_idx(codec, path_idx);
783 snd_hda_activate_path(codec, path, path->active, false);
788 * Helper functions for creating mixer ctl elements
796 static const struct snd_kcontrol_new control_templates[] = {
797 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
798 HDA_CODEC_MUTE(NULL, 0, 0, 0),
799 HDA_BIND_MUTE(NULL, 0, 0, 0),
802 /* add dynamic controls from template */
803 static struct snd_kcontrol_new *
804 add_control(struct hda_gen_spec *spec, int type, const char *name,
805 int cidx, unsigned long val)
807 struct snd_kcontrol_new *knew;
809 knew = snd_hda_gen_add_kctl(spec, name, &control_templates[type]);
813 if (get_amp_nid_(val))
814 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
815 knew->private_value = val;
819 static int add_control_with_pfx(struct hda_gen_spec *spec, int type,
820 const char *pfx, const char *dir,
821 const char *sfx, int cidx, unsigned long val)
824 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
825 if (!add_control(spec, type, name, cidx, val))
830 #define add_pb_vol_ctrl(spec, type, pfx, val) \
831 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", 0, val)
832 #define add_pb_sw_ctrl(spec, type, pfx, val) \
833 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", 0, val)
834 #define __add_pb_vol_ctrl(spec, type, pfx, cidx, val) \
835 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", cidx, val)
836 #define __add_pb_sw_ctrl(spec, type, pfx, cidx, val) \
837 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", cidx, val)
839 static int add_vol_ctl(struct hda_codec *codec, const char *pfx, int cidx,
840 unsigned int chs, struct nid_path *path)
845 val = path->ctls[NID_PATH_VOL_CTL];
848 val = amp_val_replace_channels(val, chs);
849 return __add_pb_vol_ctrl(codec->spec, HDA_CTL_WIDGET_VOL, pfx, cidx, val);
852 /* return the channel bits suitable for the given path->ctls[] */
853 static int get_default_ch_nums(struct hda_codec *codec, struct nid_path *path,
856 int chs = 1; /* mono (left only) */
858 hda_nid_t nid = get_amp_nid_(path->ctls[type]);
859 if (nid && (get_wcaps(codec, nid) & AC_WCAP_STEREO))
860 chs = 3; /* stereo */
865 static int add_stereo_vol(struct hda_codec *codec, const char *pfx, int cidx,
866 struct nid_path *path)
868 int chs = get_default_ch_nums(codec, path, NID_PATH_VOL_CTL);
869 return add_vol_ctl(codec, pfx, cidx, chs, path);
872 /* create a mute-switch for the given mixer widget;
873 * if it has multiple sources (e.g. DAC and loopback), create a bind-mute
875 static int add_sw_ctl(struct hda_codec *codec, const char *pfx, int cidx,
876 unsigned int chs, struct nid_path *path)
879 int type = HDA_CTL_WIDGET_MUTE;
883 val = path->ctls[NID_PATH_MUTE_CTL];
886 val = amp_val_replace_channels(val, chs);
887 if (get_amp_direction_(val) == HDA_INPUT) {
888 hda_nid_t nid = get_amp_nid_(val);
889 int nums = snd_hda_get_num_conns(codec, nid);
891 type = HDA_CTL_BIND_MUTE;
895 return __add_pb_sw_ctrl(codec->spec, type, pfx, cidx, val);
898 static int add_stereo_sw(struct hda_codec *codec, const char *pfx,
899 int cidx, struct nid_path *path)
901 int chs = get_default_ch_nums(codec, path, NID_PATH_MUTE_CTL);
902 return add_sw_ctl(codec, pfx, cidx, chs, path);
905 /* any ctl assigned to the path with the given index? */
906 static bool path_has_mixer(struct hda_codec *codec, int path_idx, int ctl_type)
908 struct nid_path *path = snd_hda_get_path_from_idx(codec, path_idx);
909 return path && path->ctls[ctl_type];
912 static const char * const channel_name[4] = {
913 "Front", "Surround", "CLFE", "Side"
916 /* give some appropriate ctl name prefix for the given line out channel */
917 static const char *get_line_out_pfx(struct hda_codec *codec, int ch,
918 int *index, int ctl_type)
920 struct hda_gen_spec *spec = codec->spec;
921 struct auto_pin_cfg *cfg = &spec->autocfg;
924 if (cfg->line_outs == 1 && !spec->multi_ios &&
925 !cfg->hp_outs && !cfg->speaker_outs)
926 return spec->vmaster_mute.hook ? "PCM" : "Master";
928 /* if there is really a single DAC used in the whole output paths,
929 * use it master (or "PCM" if a vmaster hook is present)
931 if (spec->multiout.num_dacs == 1 && !spec->mixer_nid &&
932 !spec->multiout.hp_out_nid[0] && !spec->multiout.extra_out_nid[0])
933 return spec->vmaster_mute.hook ? "PCM" : "Master";
935 /* multi-io channels */
936 if (ch >= cfg->line_outs)
937 return channel_name[ch];
939 switch (cfg->line_out_type) {
940 case AUTO_PIN_SPEAKER_OUT:
941 /* if the primary channel vol/mute is shared with HP volume,
942 * don't name it as Speaker
944 if (!ch && cfg->hp_outs &&
945 !path_has_mixer(codec, spec->hp_paths[0], ctl_type))
947 if (cfg->line_outs == 1)
949 if (cfg->line_outs == 2)
950 return ch ? "Bass Speaker" : "Speaker";
952 case AUTO_PIN_HP_OUT:
953 /* if the primary channel vol/mute is shared with spk volume,
954 * don't name it as Headphone
956 if (!ch && cfg->speaker_outs &&
957 !path_has_mixer(codec, spec->speaker_paths[0], ctl_type))
959 /* for multi-io case, only the primary out */
960 if (ch && spec->multi_ios)
966 /* for a single channel output, we don't have to name the channel */
967 if (cfg->line_outs == 1 && !spec->multi_ios)
970 if (ch >= ARRAY_SIZE(channel_name)) {
975 return channel_name[ch];
982 /* badness definition */
984 /* No primary DAC is found for the main output */
985 BAD_NO_PRIMARY_DAC = 0x10000,
986 /* No DAC is found for the extra output */
988 /* No possible multi-ios */
989 BAD_MULTI_IO = 0x103,
990 /* No individual DAC for extra output */
991 BAD_NO_EXTRA_DAC = 0x102,
992 /* No individual DAC for extra surrounds */
993 BAD_NO_EXTRA_SURR_DAC = 0x101,
994 /* Primary DAC shared with main surrounds */
995 BAD_SHARED_SURROUND = 0x100,
996 /* Primary DAC shared with main CLFE */
997 BAD_SHARED_CLFE = 0x10,
998 /* Primary DAC shared with extra surrounds */
999 BAD_SHARED_EXTRA_SURROUND = 0x10,
1000 /* Volume widget is shared */
1001 BAD_SHARED_VOL = 0x10,
1004 /* look for widgets in the given path which are appropriate for
1005 * volume and mute controls, and assign the values to ctls[].
1007 * When no appropriate widget is found in the path, the badness value
1008 * is incremented depending on the situation. The function returns the
1009 * total badness for both volume and mute controls.
1011 static int assign_out_path_ctls(struct hda_codec *codec, struct nid_path *path)
1018 return BAD_SHARED_VOL * 2;
1020 if (path->ctls[NID_PATH_VOL_CTL] ||
1021 path->ctls[NID_PATH_MUTE_CTL])
1022 return 0; /* already evaluated */
1024 nid = look_for_out_vol_nid(codec, path);
1026 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
1027 if (is_ctl_used(codec, val, NID_PATH_VOL_CTL))
1028 badness += BAD_SHARED_VOL;
1030 path->ctls[NID_PATH_VOL_CTL] = val;
1032 badness += BAD_SHARED_VOL;
1033 nid = look_for_out_mute_nid(codec, path);
1035 unsigned int wid_type = get_wcaps_type(get_wcaps(codec, nid));
1036 if (wid_type == AC_WID_PIN || wid_type == AC_WID_AUD_OUT ||
1037 nid_has_mute(codec, nid, HDA_OUTPUT))
1038 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
1040 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT);
1041 if (is_ctl_used(codec, val, NID_PATH_MUTE_CTL))
1042 badness += BAD_SHARED_VOL;
1044 path->ctls[NID_PATH_MUTE_CTL] = val;
1046 badness += BAD_SHARED_VOL;
1050 struct badness_table {
1051 int no_primary_dac; /* no primary DAC */
1052 int no_dac; /* no secondary DACs */
1053 int shared_primary; /* primary DAC is shared with main output */
1054 int shared_surr; /* secondary DAC shared with main or primary */
1055 int shared_clfe; /* third DAC shared with main or primary */
1056 int shared_surr_main; /* secondary DAC sahred with main/DAC0 */
1059 static struct badness_table main_out_badness = {
1060 .no_primary_dac = BAD_NO_PRIMARY_DAC,
1061 .no_dac = BAD_NO_DAC,
1062 .shared_primary = BAD_NO_PRIMARY_DAC,
1063 .shared_surr = BAD_SHARED_SURROUND,
1064 .shared_clfe = BAD_SHARED_CLFE,
1065 .shared_surr_main = BAD_SHARED_SURROUND,
1068 static struct badness_table extra_out_badness = {
1069 .no_primary_dac = BAD_NO_DAC,
1070 .no_dac = BAD_NO_DAC,
1071 .shared_primary = BAD_NO_EXTRA_DAC,
1072 .shared_surr = BAD_SHARED_EXTRA_SURROUND,
1073 .shared_clfe = BAD_SHARED_EXTRA_SURROUND,
1074 .shared_surr_main = BAD_NO_EXTRA_SURR_DAC,
1077 /* get the DAC of the primary output corresponding to the given array index */
1078 static hda_nid_t get_primary_out(struct hda_codec *codec, int idx)
1080 struct hda_gen_spec *spec = codec->spec;
1081 struct auto_pin_cfg *cfg = &spec->autocfg;
1083 if (cfg->line_outs > idx)
1084 return spec->private_dac_nids[idx];
1085 idx -= cfg->line_outs;
1086 if (spec->multi_ios > idx)
1087 return spec->multi_io[idx].dac;
1091 /* return the DAC if it's reachable, otherwise zero */
1092 static inline hda_nid_t try_dac(struct hda_codec *codec,
1093 hda_nid_t dac, hda_nid_t pin)
1095 return is_reachable_path(codec, dac, pin) ? dac : 0;
1098 /* try to assign DACs to pins and return the resultant badness */
1099 static int try_assign_dacs(struct hda_codec *codec, int num_outs,
1100 const hda_nid_t *pins, hda_nid_t *dacs,
1102 const struct badness_table *bad)
1104 struct hda_gen_spec *spec = codec->spec;
1112 for (i = 0; i < num_outs; i++) {
1113 struct nid_path *path;
1114 hda_nid_t pin = pins[i];
1116 path = snd_hda_get_path_from_idx(codec, path_idx[i]);
1118 badness += assign_out_path_ctls(codec, path);
1122 dacs[i] = look_for_dac(codec, pin, false);
1123 if (!dacs[i] && !i) {
1124 /* try to steal the DAC of surrounds for the front */
1125 for (j = 1; j < num_outs; j++) {
1126 if (is_reachable_path(codec, dacs[j], pin)) {
1129 invalidate_nid_path(codec, path_idx[j]);
1138 dac = try_dac(codec, get_primary_out(codec, i), pin);
1140 dac = try_dac(codec, dacs[0], pin);
1142 dac = try_dac(codec, get_primary_out(codec, i), pin);
1145 badness += bad->shared_primary;
1147 badness += bad->shared_surr;
1149 badness += bad->shared_clfe;
1150 } else if (is_reachable_path(codec, spec->private_dac_nids[0], pin)) {
1151 dac = spec->private_dac_nids[0];
1152 badness += bad->shared_surr_main;
1154 badness += bad->no_primary_dac;
1156 badness += bad->no_dac;
1160 path = snd_hda_add_new_path(codec, dac, pin, -spec->mixer_nid);
1161 if (!path && !i && spec->mixer_nid) {
1162 /* try with aamix */
1163 path = snd_hda_add_new_path(codec, dac, pin, 0);
1167 badness += bad->no_dac;
1169 /* print_nid_path("output", path); */
1170 path->active = true;
1171 path_idx[i] = snd_hda_get_path_idx(codec, path);
1172 badness += assign_out_path_ctls(codec, path);
1179 /* return NID if the given pin has only a single connection to a certain DAC */
1180 static hda_nid_t get_dac_if_single(struct hda_codec *codec, hda_nid_t pin)
1182 struct hda_gen_spec *spec = codec->spec;
1184 hda_nid_t nid_found = 0;
1186 for (i = 0; i < spec->num_all_dacs; i++) {
1187 hda_nid_t nid = spec->all_dacs[i];
1188 if (!nid || is_dac_already_used(codec, nid))
1190 if (is_reachable_path(codec, nid, pin)) {
1199 /* check whether the given pin can be a multi-io pin */
1200 static bool can_be_multiio_pin(struct hda_codec *codec,
1201 unsigned int location, hda_nid_t nid)
1203 unsigned int defcfg, caps;
1205 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1206 if (get_defcfg_connect(defcfg) != AC_JACK_PORT_COMPLEX)
1208 if (location && get_defcfg_location(defcfg) != location)
1210 caps = snd_hda_query_pin_caps(codec, nid);
1211 if (!(caps & AC_PINCAP_OUT))
1216 /* count the number of input pins that are capable to be multi-io */
1217 static int count_multiio_pins(struct hda_codec *codec, hda_nid_t reference_pin)
1219 struct hda_gen_spec *spec = codec->spec;
1220 struct auto_pin_cfg *cfg = &spec->autocfg;
1221 unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin);
1222 unsigned int location = get_defcfg_location(defcfg);
1226 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
1227 for (i = 0; i < cfg->num_inputs; i++) {
1228 if (cfg->inputs[i].type != type)
1230 if (can_be_multiio_pin(codec, location,
1231 cfg->inputs[i].pin))
1241 * When hardwired is set, try to fill ony hardwired pins, and returns
1242 * zero if any pins are filled, non-zero if nothing found.
1243 * When hardwired is off, try to fill possible input pins, and returns
1244 * the badness value.
1246 static int fill_multi_ios(struct hda_codec *codec,
1247 hda_nid_t reference_pin,
1250 struct hda_gen_spec *spec = codec->spec;
1251 struct auto_pin_cfg *cfg = &spec->autocfg;
1252 int type, i, j, num_pins, old_pins;
1253 unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin);
1254 unsigned int location = get_defcfg_location(defcfg);
1256 struct nid_path *path;
1258 old_pins = spec->multi_ios;
1262 num_pins = count_multiio_pins(codec, reference_pin);
1266 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
1267 for (i = 0; i < cfg->num_inputs; i++) {
1268 hda_nid_t nid = cfg->inputs[i].pin;
1271 if (cfg->inputs[i].type != type)
1273 if (!can_be_multiio_pin(codec, location, nid))
1275 for (j = 0; j < spec->multi_ios; j++) {
1276 if (nid == spec->multi_io[j].pin)
1279 if (j < spec->multi_ios)
1283 dac = get_dac_if_single(codec, nid);
1285 dac = look_for_dac(codec, nid, false);
1290 path = snd_hda_add_new_path(codec, dac, nid,
1296 /* print_nid_path("multiio", path); */
1297 spec->multi_io[spec->multi_ios].pin = nid;
1298 spec->multi_io[spec->multi_ios].dac = dac;
1299 spec->out_paths[cfg->line_outs + spec->multi_ios] =
1300 snd_hda_get_path_idx(codec, path);
1302 if (spec->multi_ios >= 2)
1308 badness = BAD_MULTI_IO;
1309 if (old_pins == spec->multi_ios) {
1311 return 1; /* nothing found */
1313 return badness; /* no badness if nothing found */
1315 if (!hardwired && spec->multi_ios < 2) {
1316 /* cancel newly assigned paths */
1317 spec->paths.used -= spec->multi_ios - old_pins;
1318 spec->multi_ios = old_pins;
1322 /* assign volume and mute controls */
1323 for (i = old_pins; i < spec->multi_ios; i++) {
1324 path = snd_hda_get_path_from_idx(codec, spec->out_paths[cfg->line_outs + i]);
1325 badness += assign_out_path_ctls(codec, path);
1331 /* map DACs for all pins in the list if they are single connections */
1332 static bool map_singles(struct hda_codec *codec, int outs,
1333 const hda_nid_t *pins, hda_nid_t *dacs, int *path_idx)
1335 struct hda_gen_spec *spec = codec->spec;
1338 for (i = 0; i < outs; i++) {
1339 struct nid_path *path;
1343 dac = get_dac_if_single(codec, pins[i]);
1346 path = snd_hda_add_new_path(codec, dac, pins[i],
1348 if (!path && !i && spec->mixer_nid)
1349 path = snd_hda_add_new_path(codec, dac, pins[i], 0);
1353 /* print_nid_path("output", path); */
1354 path->active = true;
1355 path_idx[i] = snd_hda_get_path_idx(codec, path);
1361 /* create a new path including aamix if available, and return its index */
1362 static int check_aamix_out_path(struct hda_codec *codec, int path_idx)
1364 struct hda_gen_spec *spec = codec->spec;
1365 struct nid_path *path;
1368 path = snd_hda_get_path_from_idx(codec, path_idx);
1369 if (!path || !path->depth ||
1370 is_nid_contained(path, spec->mixer_nid))
1372 dac = path->path[0];
1373 pin = path->path[path->depth - 1];
1374 path = snd_hda_add_new_path(codec, dac, pin, spec->mixer_nid);
1376 if (dac != spec->multiout.dac_nids[0])
1377 dac = spec->multiout.dac_nids[0];
1378 else if (spec->multiout.hp_out_nid[0])
1379 dac = spec->multiout.hp_out_nid[0];
1380 else if (spec->multiout.extra_out_nid[0])
1381 dac = spec->multiout.extra_out_nid[0];
1383 path = snd_hda_add_new_path(codec, dac, pin,
1388 /* print_nid_path("output-aamix", path); */
1389 path->active = false; /* unused as default */
1390 return snd_hda_get_path_idx(codec, path);
1393 /* fill the empty entries in the dac array for speaker/hp with the
1394 * shared dac pointed by the paths
1396 static void refill_shared_dacs(struct hda_codec *codec, int num_outs,
1397 hda_nid_t *dacs, int *path_idx)
1399 struct nid_path *path;
1402 for (i = 0; i < num_outs; i++) {
1405 path = snd_hda_get_path_from_idx(codec, path_idx[i]);
1408 dacs[i] = path->path[0];
1412 /* fill in the dac_nids table from the parsed pin configuration */
1413 static int fill_and_eval_dacs(struct hda_codec *codec,
1414 bool fill_hardwired,
1415 bool fill_mio_first)
1417 struct hda_gen_spec *spec = codec->spec;
1418 struct auto_pin_cfg *cfg = &spec->autocfg;
1419 int i, err, badness;
1421 /* set num_dacs once to full for look_for_dac() */
1422 spec->multiout.num_dacs = cfg->line_outs;
1423 spec->multiout.dac_nids = spec->private_dac_nids;
1424 memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids));
1425 memset(spec->multiout.hp_out_nid, 0, sizeof(spec->multiout.hp_out_nid));
1426 memset(spec->multiout.extra_out_nid, 0, sizeof(spec->multiout.extra_out_nid));
1427 spec->multi_ios = 0;
1428 snd_array_free(&spec->paths);
1430 /* clear path indices */
1431 memset(spec->out_paths, 0, sizeof(spec->out_paths));
1432 memset(spec->hp_paths, 0, sizeof(spec->hp_paths));
1433 memset(spec->speaker_paths, 0, sizeof(spec->speaker_paths));
1434 memset(spec->aamix_out_paths, 0, sizeof(spec->aamix_out_paths));
1435 memset(spec->digout_paths, 0, sizeof(spec->digout_paths));
1436 memset(spec->input_paths, 0, sizeof(spec->input_paths));
1437 memset(spec->loopback_paths, 0, sizeof(spec->loopback_paths));
1438 memset(&spec->digin_path, 0, sizeof(spec->digin_path));
1442 /* fill hard-wired DACs first */
1443 if (fill_hardwired) {
1446 mapped = map_singles(codec, cfg->line_outs,
1448 spec->private_dac_nids,
1450 mapped |= map_singles(codec, cfg->hp_outs,
1452 spec->multiout.hp_out_nid,
1454 mapped |= map_singles(codec, cfg->speaker_outs,
1456 spec->multiout.extra_out_nid,
1457 spec->speaker_paths);
1458 if (fill_mio_first && cfg->line_outs == 1 &&
1459 cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1460 err = fill_multi_ios(codec, cfg->line_out_pins[0], true);
1467 badness += try_assign_dacs(codec, cfg->line_outs, cfg->line_out_pins,
1468 spec->private_dac_nids, spec->out_paths,
1471 if (fill_mio_first &&
1472 cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1473 /* try to fill multi-io first */
1474 err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
1477 /* we don't count badness at this stage yet */
1480 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
1481 err = try_assign_dacs(codec, cfg->hp_outs, cfg->hp_pins,
1482 spec->multiout.hp_out_nid,
1484 &extra_out_badness);
1489 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1490 err = try_assign_dacs(codec, cfg->speaker_outs,
1492 spec->multiout.extra_out_nid,
1493 spec->speaker_paths,
1494 &extra_out_badness);
1499 if (cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1500 err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
1506 if (spec->mixer_nid) {
1507 spec->aamix_out_paths[0] =
1508 check_aamix_out_path(codec, spec->out_paths[0]);
1509 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1510 spec->aamix_out_paths[1] =
1511 check_aamix_out_path(codec, spec->hp_paths[0]);
1512 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1513 spec->aamix_out_paths[2] =
1514 check_aamix_out_path(codec, spec->speaker_paths[0]);
1517 if (cfg->hp_outs && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
1518 if (count_multiio_pins(codec, cfg->hp_pins[0]) >= 2)
1519 spec->multi_ios = 1; /* give badness */
1521 /* re-count num_dacs and squash invalid entries */
1522 spec->multiout.num_dacs = 0;
1523 for (i = 0; i < cfg->line_outs; i++) {
1524 if (spec->private_dac_nids[i])
1525 spec->multiout.num_dacs++;
1527 memmove(spec->private_dac_nids + i,
1528 spec->private_dac_nids + i + 1,
1529 sizeof(hda_nid_t) * (cfg->line_outs - i - 1));
1530 spec->private_dac_nids[cfg->line_outs - 1] = 0;
1534 spec->ext_channel_count = spec->min_channel_count =
1535 spec->multiout.num_dacs * 2;
1537 if (spec->multi_ios == 2) {
1538 for (i = 0; i < 2; i++)
1539 spec->private_dac_nids[spec->multiout.num_dacs++] =
1540 spec->multi_io[i].dac;
1541 } else if (spec->multi_ios) {
1542 spec->multi_ios = 0;
1543 badness += BAD_MULTI_IO;
1546 /* re-fill the shared DAC for speaker / headphone */
1547 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1548 refill_shared_dacs(codec, cfg->hp_outs,
1549 spec->multiout.hp_out_nid,
1551 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1552 refill_shared_dacs(codec, cfg->speaker_outs,
1553 spec->multiout.extra_out_nid,
1554 spec->speaker_paths);
1559 #define DEBUG_BADNESS
1561 #ifdef DEBUG_BADNESS
1562 #define debug_badness snd_printdd
1564 #define debug_badness(...)
1567 #ifdef DEBUG_BADNESS
1568 static inline void print_nid_path_idx(struct hda_codec *codec,
1569 const char *pfx, int idx)
1571 struct nid_path *path;
1573 path = snd_hda_get_path_from_idx(codec, idx);
1575 print_nid_path(pfx, path);
1578 static void debug_show_configs(struct hda_codec *codec,
1579 struct auto_pin_cfg *cfg)
1581 struct hda_gen_spec *spec = codec->spec;
1582 static const char * const lo_type[3] = { "LO", "SP", "HP" };
1585 debug_badness("multi_outs = %x/%x/%x/%x : %x/%x/%x/%x (type %s)\n",
1586 cfg->line_out_pins[0], cfg->line_out_pins[1],
1587 cfg->line_out_pins[2], cfg->line_out_pins[3],
1588 spec->multiout.dac_nids[0],
1589 spec->multiout.dac_nids[1],
1590 spec->multiout.dac_nids[2],
1591 spec->multiout.dac_nids[3],
1592 lo_type[cfg->line_out_type]);
1593 for (i = 0; i < cfg->line_outs; i++)
1594 print_nid_path_idx(codec, " out", spec->out_paths[i]);
1595 if (spec->multi_ios > 0)
1596 debug_badness("multi_ios(%d) = %x/%x : %x/%x\n",
1598 spec->multi_io[0].pin, spec->multi_io[1].pin,
1599 spec->multi_io[0].dac, spec->multi_io[1].dac);
1600 for (i = 0; i < spec->multi_ios; i++)
1601 print_nid_path_idx(codec, " mio",
1602 spec->out_paths[cfg->line_outs + i]);
1604 debug_badness("hp_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1605 cfg->hp_pins[0], cfg->hp_pins[1],
1606 cfg->hp_pins[2], cfg->hp_pins[3],
1607 spec->multiout.hp_out_nid[0],
1608 spec->multiout.hp_out_nid[1],
1609 spec->multiout.hp_out_nid[2],
1610 spec->multiout.hp_out_nid[3]);
1611 for (i = 0; i < cfg->hp_outs; i++)
1612 print_nid_path_idx(codec, " hp ", spec->hp_paths[i]);
1613 if (cfg->speaker_outs)
1614 debug_badness("spk_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1615 cfg->speaker_pins[0], cfg->speaker_pins[1],
1616 cfg->speaker_pins[2], cfg->speaker_pins[3],
1617 spec->multiout.extra_out_nid[0],
1618 spec->multiout.extra_out_nid[1],
1619 spec->multiout.extra_out_nid[2],
1620 spec->multiout.extra_out_nid[3]);
1621 for (i = 0; i < cfg->speaker_outs; i++)
1622 print_nid_path_idx(codec, " spk", spec->speaker_paths[i]);
1623 for (i = 0; i < 3; i++)
1624 print_nid_path_idx(codec, " mix", spec->aamix_out_paths[i]);
1627 #define debug_show_configs(codec, cfg) /* NOP */
1630 /* find all available DACs of the codec */
1631 static void fill_all_dac_nids(struct hda_codec *codec)
1633 struct hda_gen_spec *spec = codec->spec;
1635 hda_nid_t nid = codec->start_nid;
1637 spec->num_all_dacs = 0;
1638 memset(spec->all_dacs, 0, sizeof(spec->all_dacs));
1639 for (i = 0; i < codec->num_nodes; i++, nid++) {
1640 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_AUD_OUT)
1642 if (spec->num_all_dacs >= ARRAY_SIZE(spec->all_dacs)) {
1643 snd_printk(KERN_ERR "hda: Too many DACs!\n");
1646 spec->all_dacs[spec->num_all_dacs++] = nid;
1650 static int parse_output_paths(struct hda_codec *codec)
1652 struct hda_gen_spec *spec = codec->spec;
1653 struct auto_pin_cfg *cfg = &spec->autocfg;
1654 struct auto_pin_cfg *best_cfg;
1656 int best_badness = INT_MAX;
1658 bool fill_hardwired = true, fill_mio_first = true;
1659 bool best_wired = true, best_mio = true;
1660 bool hp_spk_swapped = false;
1662 best_cfg = kmalloc(sizeof(*best_cfg), GFP_KERNEL);
1668 badness = fill_and_eval_dacs(codec, fill_hardwired,
1674 debug_badness("==> lo_type=%d, wired=%d, mio=%d, badness=0x%x\n",
1675 cfg->line_out_type, fill_hardwired, fill_mio_first,
1677 debug_show_configs(codec, cfg);
1678 if (badness < best_badness) {
1679 best_badness = badness;
1681 best_wired = fill_hardwired;
1682 best_mio = fill_mio_first;
1686 fill_mio_first = !fill_mio_first;
1687 if (!fill_mio_first)
1689 fill_hardwired = !fill_hardwired;
1690 if (!fill_hardwired)
1694 hp_spk_swapped = true;
1695 if (cfg->speaker_outs > 0 &&
1696 cfg->line_out_type == AUTO_PIN_HP_OUT) {
1697 cfg->hp_outs = cfg->line_outs;
1698 memcpy(cfg->hp_pins, cfg->line_out_pins,
1699 sizeof(cfg->hp_pins));
1700 cfg->line_outs = cfg->speaker_outs;
1701 memcpy(cfg->line_out_pins, cfg->speaker_pins,
1702 sizeof(cfg->speaker_pins));
1703 cfg->speaker_outs = 0;
1704 memset(cfg->speaker_pins, 0, sizeof(cfg->speaker_pins));
1705 cfg->line_out_type = AUTO_PIN_SPEAKER_OUT;
1706 fill_hardwired = true;
1709 if (cfg->hp_outs > 0 &&
1710 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
1711 cfg->speaker_outs = cfg->line_outs;
1712 memcpy(cfg->speaker_pins, cfg->line_out_pins,
1713 sizeof(cfg->speaker_pins));
1714 cfg->line_outs = cfg->hp_outs;
1715 memcpy(cfg->line_out_pins, cfg->hp_pins,
1716 sizeof(cfg->hp_pins));
1718 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
1719 cfg->line_out_type = AUTO_PIN_HP_OUT;
1720 fill_hardwired = true;
1727 debug_badness("==> restoring best_cfg\n");
1729 fill_and_eval_dacs(codec, best_wired, best_mio);
1731 debug_badness("==> Best config: lo_type=%d, wired=%d, mio=%d\n",
1732 cfg->line_out_type, best_wired, best_mio);
1733 debug_show_configs(codec, cfg);
1735 if (cfg->line_out_pins[0]) {
1736 struct nid_path *path;
1737 path = snd_hda_get_path_from_idx(codec, spec->out_paths[0]);
1739 spec->vmaster_nid = look_for_out_vol_nid(codec, path);
1740 if (spec->vmaster_nid)
1741 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
1742 HDA_OUTPUT, spec->vmaster_tlv);
1745 /* set initial pinctl targets */
1746 if (spec->prefer_hp_amp || cfg->line_out_type == AUTO_PIN_HP_OUT)
1750 set_pin_targets(codec, cfg->line_outs, cfg->line_out_pins, val);
1751 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1752 set_pin_targets(codec, cfg->hp_outs, cfg->hp_pins, PIN_HP);
1753 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1754 val = spec->prefer_hp_amp ? PIN_HP : PIN_OUT;
1755 set_pin_targets(codec, cfg->speaker_outs,
1756 cfg->speaker_pins, val);
1763 /* add playback controls from the parsed DAC table */
1764 static int create_multi_out_ctls(struct hda_codec *codec,
1765 const struct auto_pin_cfg *cfg)
1767 struct hda_gen_spec *spec = codec->spec;
1768 int i, err, noutputs;
1770 noutputs = cfg->line_outs;
1771 if (spec->multi_ios > 0 && cfg->line_outs < 3)
1772 noutputs += spec->multi_ios;
1774 for (i = 0; i < noutputs; i++) {
1777 struct nid_path *path;
1779 path = snd_hda_get_path_from_idx(codec, spec->out_paths[i]);
1783 name = get_line_out_pfx(codec, i, &index, NID_PATH_VOL_CTL);
1784 if (!name || !strcmp(name, "CLFE")) {
1786 err = add_vol_ctl(codec, "Center", 0, 1, path);
1789 err = add_vol_ctl(codec, "LFE", 0, 2, path);
1793 err = add_stereo_vol(codec, name, index, path);
1798 name = get_line_out_pfx(codec, i, &index, NID_PATH_MUTE_CTL);
1799 if (!name || !strcmp(name, "CLFE")) {
1800 err = add_sw_ctl(codec, "Center", 0, 1, path);
1803 err = add_sw_ctl(codec, "LFE", 0, 2, path);
1807 err = add_stereo_sw(codec, name, index, path);
1815 static int create_extra_out(struct hda_codec *codec, int path_idx,
1816 const char *pfx, int cidx)
1818 struct nid_path *path;
1821 path = snd_hda_get_path_from_idx(codec, path_idx);
1824 err = add_stereo_vol(codec, pfx, cidx, path);
1827 err = add_stereo_sw(codec, pfx, cidx, path);
1833 /* add playback controls for speaker and HP outputs */
1834 static int create_extra_outs(struct hda_codec *codec, int num_pins,
1835 const int *paths, const char *pfx)
1839 for (i = 0; i < num_pins; i++) {
1844 if (num_pins == 2 && i == 1 && !strcmp(pfx, "Speaker"))
1845 name = "Bass Speaker";
1846 else if (num_pins >= 3) {
1847 snprintf(tmp, sizeof(tmp), "%s %s",
1848 pfx, channel_name[i]);
1854 err = create_extra_out(codec, paths[i], name, idx);
1861 static int create_hp_out_ctls(struct hda_codec *codec)
1863 struct hda_gen_spec *spec = codec->spec;
1864 return create_extra_outs(codec, spec->autocfg.hp_outs,
1869 static int create_speaker_out_ctls(struct hda_codec *codec)
1871 struct hda_gen_spec *spec = codec->spec;
1872 return create_extra_outs(codec, spec->autocfg.speaker_outs,
1873 spec->speaker_paths,
1878 * independent HP controls
1881 static int indep_hp_info(struct snd_kcontrol *kcontrol,
1882 struct snd_ctl_elem_info *uinfo)
1884 return snd_hda_enum_bool_helper_info(kcontrol, uinfo);
1887 static int indep_hp_get(struct snd_kcontrol *kcontrol,
1888 struct snd_ctl_elem_value *ucontrol)
1890 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1891 struct hda_gen_spec *spec = codec->spec;
1892 ucontrol->value.enumerated.item[0] = spec->indep_hp_enabled;
1896 static void update_aamix_paths(struct hda_codec *codec, bool do_mix,
1897 int nomix_path_idx, int mix_path_idx,
1900 static int indep_hp_put(struct snd_kcontrol *kcontrol,
1901 struct snd_ctl_elem_value *ucontrol)
1903 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1904 struct hda_gen_spec *spec = codec->spec;
1905 unsigned int select = ucontrol->value.enumerated.item[0];
1908 mutex_lock(&spec->pcm_mutex);
1909 if (spec->active_streams) {
1914 if (spec->indep_hp_enabled != select) {
1916 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)
1917 dacp = &spec->private_dac_nids[0];
1919 dacp = &spec->multiout.hp_out_nid[0];
1921 /* update HP aamix paths in case it conflicts with indep HP */
1922 if (spec->have_aamix_ctl) {
1923 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)
1924 update_aamix_paths(codec, spec->aamix_mode,
1926 spec->aamix_out_paths[0],
1927 spec->autocfg.line_out_type);
1929 update_aamix_paths(codec, spec->aamix_mode,
1931 spec->aamix_out_paths[1],
1935 spec->indep_hp_enabled = select;
1936 if (spec->indep_hp_enabled)
1939 *dacp = spec->alt_dac_nid;
1941 /* update HP auto-mute state too */
1942 if (spec->hp_automute_hook)
1943 spec->hp_automute_hook(codec, NULL);
1945 snd_hda_gen_hp_automute(codec, NULL);
1950 mutex_unlock(&spec->pcm_mutex);
1954 static const struct snd_kcontrol_new indep_hp_ctl = {
1955 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1956 .name = "Independent HP",
1957 .info = indep_hp_info,
1958 .get = indep_hp_get,
1959 .put = indep_hp_put,
1963 static int create_indep_hp_ctls(struct hda_codec *codec)
1965 struct hda_gen_spec *spec = codec->spec;
1968 if (!spec->indep_hp)
1970 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)
1971 dac = spec->multiout.dac_nids[0];
1973 dac = spec->multiout.hp_out_nid[0];
1979 spec->indep_hp_enabled = false;
1980 spec->alt_dac_nid = dac;
1981 if (!snd_hda_gen_add_kctl(spec, NULL, &indep_hp_ctl))
1987 * channel mode enum control
1990 static int ch_mode_info(struct snd_kcontrol *kcontrol,
1991 struct snd_ctl_elem_info *uinfo)
1993 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1994 struct hda_gen_spec *spec = codec->spec;
1997 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1999 uinfo->value.enumerated.items = spec->multi_ios + 1;
2000 if (uinfo->value.enumerated.item > spec->multi_ios)
2001 uinfo->value.enumerated.item = spec->multi_ios;
2002 chs = uinfo->value.enumerated.item * 2 + spec->min_channel_count;
2003 sprintf(uinfo->value.enumerated.name, "%dch", chs);
2007 static int ch_mode_get(struct snd_kcontrol *kcontrol,
2008 struct snd_ctl_elem_value *ucontrol)
2010 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2011 struct hda_gen_spec *spec = codec->spec;
2012 ucontrol->value.enumerated.item[0] =
2013 (spec->ext_channel_count - spec->min_channel_count) / 2;
2017 static inline struct nid_path *
2018 get_multiio_path(struct hda_codec *codec, int idx)
2020 struct hda_gen_spec *spec = codec->spec;
2021 return snd_hda_get_path_from_idx(codec,
2022 spec->out_paths[spec->autocfg.line_outs + idx]);
2025 static void update_automute_all(struct hda_codec *codec);
2027 static int set_multi_io(struct hda_codec *codec, int idx, bool output)
2029 struct hda_gen_spec *spec = codec->spec;
2030 hda_nid_t nid = spec->multi_io[idx].pin;
2031 struct nid_path *path;
2033 path = get_multiio_path(codec, idx);
2037 if (path->active == output)
2041 set_pin_target(codec, nid, PIN_OUT, true);
2042 snd_hda_activate_path(codec, path, true, true);
2043 set_pin_eapd(codec, nid, true);
2045 set_pin_eapd(codec, nid, false);
2046 snd_hda_activate_path(codec, path, false, true);
2047 set_pin_target(codec, nid, spec->multi_io[idx].ctl_in, true);
2048 path_power_down_sync(codec, path);
2051 /* update jack retasking in case it modifies any of them */
2052 update_automute_all(codec);
2057 static int ch_mode_put(struct snd_kcontrol *kcontrol,
2058 struct snd_ctl_elem_value *ucontrol)
2060 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2061 struct hda_gen_spec *spec = codec->spec;
2064 ch = ucontrol->value.enumerated.item[0];
2065 if (ch < 0 || ch > spec->multi_ios)
2067 if (ch == (spec->ext_channel_count - spec->min_channel_count) / 2)
2069 spec->ext_channel_count = ch * 2 + spec->min_channel_count;
2070 for (i = 0; i < spec->multi_ios; i++)
2071 set_multi_io(codec, i, i < ch);
2072 spec->multiout.max_channels = max(spec->ext_channel_count,
2073 spec->const_channel_count);
2074 if (spec->need_dac_fix)
2075 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
2079 static const struct snd_kcontrol_new channel_mode_enum = {
2080 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2081 .name = "Channel Mode",
2082 .info = ch_mode_info,
2087 static int create_multi_channel_mode(struct hda_codec *codec)
2089 struct hda_gen_spec *spec = codec->spec;
2091 if (spec->multi_ios > 0) {
2092 if (!snd_hda_gen_add_kctl(spec, NULL, &channel_mode_enum))
2099 * aamix loopback enable/disable switch
2102 #define loopback_mixing_info indep_hp_info
2104 static int loopback_mixing_get(struct snd_kcontrol *kcontrol,
2105 struct snd_ctl_elem_value *ucontrol)
2107 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2108 struct hda_gen_spec *spec = codec->spec;
2109 ucontrol->value.enumerated.item[0] = spec->aamix_mode;
2113 static void update_aamix_paths(struct hda_codec *codec, bool do_mix,
2114 int nomix_path_idx, int mix_path_idx,
2117 struct hda_gen_spec *spec = codec->spec;
2118 struct nid_path *nomix_path, *mix_path;
2120 nomix_path = snd_hda_get_path_from_idx(codec, nomix_path_idx);
2121 mix_path = snd_hda_get_path_from_idx(codec, mix_path_idx);
2122 if (!nomix_path || !mix_path)
2125 /* if HP aamix path is driven from a different DAC and the
2126 * independent HP mode is ON, can't turn on aamix path
2128 if (out_type == AUTO_PIN_HP_OUT && spec->indep_hp_enabled &&
2129 mix_path->path[0] != spec->alt_dac_nid)
2133 snd_hda_activate_path(codec, nomix_path, false, true);
2134 snd_hda_activate_path(codec, mix_path, true, true);
2135 path_power_down_sync(codec, nomix_path);
2137 snd_hda_activate_path(codec, mix_path, false, true);
2138 snd_hda_activate_path(codec, nomix_path, true, true);
2139 path_power_down_sync(codec, mix_path);
2143 static int loopback_mixing_put(struct snd_kcontrol *kcontrol,
2144 struct snd_ctl_elem_value *ucontrol)
2146 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2147 struct hda_gen_spec *spec = codec->spec;
2148 unsigned int val = ucontrol->value.enumerated.item[0];
2150 if (val == spec->aamix_mode)
2152 spec->aamix_mode = val;
2153 update_aamix_paths(codec, val, spec->out_paths[0],
2154 spec->aamix_out_paths[0],
2155 spec->autocfg.line_out_type);
2156 update_aamix_paths(codec, val, spec->hp_paths[0],
2157 spec->aamix_out_paths[1],
2159 update_aamix_paths(codec, val, spec->speaker_paths[0],
2160 spec->aamix_out_paths[2],
2161 AUTO_PIN_SPEAKER_OUT);
2165 static const struct snd_kcontrol_new loopback_mixing_enum = {
2166 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2167 .name = "Loopback Mixing",
2168 .info = loopback_mixing_info,
2169 .get = loopback_mixing_get,
2170 .put = loopback_mixing_put,
2173 static int create_loopback_mixing_ctl(struct hda_codec *codec)
2175 struct hda_gen_spec *spec = codec->spec;
2177 if (!spec->mixer_nid)
2179 if (!(spec->aamix_out_paths[0] || spec->aamix_out_paths[1] ||
2180 spec->aamix_out_paths[2]))
2182 if (!snd_hda_gen_add_kctl(spec, NULL, &loopback_mixing_enum))
2184 spec->have_aamix_ctl = 1;
2189 * shared headphone/mic handling
2192 static void call_update_outputs(struct hda_codec *codec);
2194 /* for shared I/O, change the pin-control accordingly */
2195 static void update_shared_mic_hp(struct hda_codec *codec, bool set_as_mic)
2197 struct hda_gen_spec *spec = codec->spec;
2199 hda_nid_t pin = spec->autocfg.inputs[1].pin;
2200 /* NOTE: this assumes that there are only two inputs, the
2201 * first is the real internal mic and the second is HP/mic jack.
2204 val = snd_hda_get_default_vref(codec, pin);
2206 /* This pin does not have vref caps - let's enable vref on pin 0x18
2207 instead, as suggested by Realtek */
2208 if (val == AC_PINCTL_VREF_HIZ && spec->shared_mic_vref_pin) {
2209 const hda_nid_t vref_pin = spec->shared_mic_vref_pin;
2210 unsigned int vref_val = snd_hda_get_default_vref(codec, vref_pin);
2211 if (vref_val != AC_PINCTL_VREF_HIZ)
2212 snd_hda_set_pin_ctl_cache(codec, vref_pin,
2213 PIN_IN | (set_as_mic ? vref_val : 0));
2216 val = set_as_mic ? val | PIN_IN : PIN_HP;
2217 set_pin_target(codec, pin, val, true);
2219 spec->automute_speaker = !set_as_mic;
2220 call_update_outputs(codec);
2223 /* create a shared input with the headphone out */
2224 static int create_shared_input(struct hda_codec *codec)
2226 struct hda_gen_spec *spec = codec->spec;
2227 struct auto_pin_cfg *cfg = &spec->autocfg;
2228 unsigned int defcfg;
2231 /* only one internal input pin? */
2232 if (cfg->num_inputs != 1)
2234 defcfg = snd_hda_codec_get_pincfg(codec, cfg->inputs[0].pin);
2235 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
2238 if (cfg->hp_outs == 1 && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
2239 nid = cfg->hp_pins[0]; /* OK, we have a single HP-out */
2240 else if (cfg->line_outs == 1 && cfg->line_out_type == AUTO_PIN_HP_OUT)
2241 nid = cfg->line_out_pins[0]; /* OK, we have a single line-out */
2243 return 0; /* both not available */
2245 if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_IN))
2246 return 0; /* no input */
2248 cfg->inputs[1].pin = nid;
2249 cfg->inputs[1].type = AUTO_PIN_MIC;
2250 cfg->num_inputs = 2;
2251 spec->shared_mic_hp = 1;
2252 snd_printdd("hda-codec: Enable shared I/O jack on NID 0x%x\n", nid);
2259 static int out_jack_mode_info(struct snd_kcontrol *kcontrol,
2260 struct snd_ctl_elem_info *uinfo)
2262 static const char * const texts[] = {
2263 "Line Out", "Headphone Out",
2265 return snd_hda_enum_helper_info(kcontrol, uinfo, 2, texts);
2268 static int out_jack_mode_get(struct snd_kcontrol *kcontrol,
2269 struct snd_ctl_elem_value *ucontrol)
2271 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2272 hda_nid_t nid = kcontrol->private_value;
2273 if (snd_hda_codec_get_pin_target(codec, nid) == PIN_HP)
2274 ucontrol->value.enumerated.item[0] = 1;
2276 ucontrol->value.enumerated.item[0] = 0;
2280 static int out_jack_mode_put(struct snd_kcontrol *kcontrol,
2281 struct snd_ctl_elem_value *ucontrol)
2283 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2284 hda_nid_t nid = kcontrol->private_value;
2287 val = ucontrol->value.enumerated.item[0] ? PIN_HP : PIN_OUT;
2288 if (snd_hda_codec_get_pin_target(codec, nid) == val)
2290 snd_hda_set_pin_ctl_cache(codec, nid, val);
2294 static const struct snd_kcontrol_new out_jack_mode_enum = {
2295 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2296 .info = out_jack_mode_info,
2297 .get = out_jack_mode_get,
2298 .put = out_jack_mode_put,
2301 static bool find_kctl_name(struct hda_codec *codec, const char *name, int idx)
2303 struct hda_gen_spec *spec = codec->spec;
2306 for (i = 0; i < spec->kctls.used; i++) {
2307 struct snd_kcontrol_new *kctl = snd_array_elem(&spec->kctls, i);
2308 if (!strcmp(kctl->name, name) && kctl->index == idx)
2314 static void get_jack_mode_name(struct hda_codec *codec, hda_nid_t pin,
2315 char *name, size_t name_len)
2317 struct hda_gen_spec *spec = codec->spec;
2320 snd_hda_get_pin_label(codec, pin, &spec->autocfg, name, name_len, &idx);
2321 strlcat(name, " Jack Mode", name_len);
2323 for (; find_kctl_name(codec, name, idx); idx++)
2327 static int create_out_jack_modes(struct hda_codec *codec, int num_pins,
2330 struct hda_gen_spec *spec = codec->spec;
2333 for (i = 0; i < num_pins; i++) {
2334 hda_nid_t pin = pins[i];
2335 unsigned int pincap = snd_hda_query_pin_caps(codec, pin);
2336 if ((pincap & AC_PINCAP_OUT) && (pincap & AC_PINCAP_HP_DRV)) {
2337 struct snd_kcontrol_new *knew;
2339 get_jack_mode_name(codec, pin, name, sizeof(name));
2340 knew = snd_hda_gen_add_kctl(spec, name,
2341 &out_jack_mode_enum);
2344 knew->private_value = pin;
2355 /* from AC_PINCTL_VREF_HIZ to AC_PINCTL_VREF_100 */
2358 static const char * const vref_texts[NUM_VREFS] = {
2359 "Line In", "Mic 50pc Bias", "Mic 0V Bias",
2360 "", "Mic 80pc Bias", "Mic 100pc Bias"
2363 static unsigned int get_vref_caps(struct hda_codec *codec, hda_nid_t pin)
2365 unsigned int pincap;
2367 pincap = snd_hda_query_pin_caps(codec, pin);
2368 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
2369 /* filter out unusual vrefs */
2370 pincap &= ~(AC_PINCAP_VREF_GRD | AC_PINCAP_VREF_100);
2374 /* convert from the enum item index to the vref ctl index (0=HIZ, 1=50%...) */
2375 static int get_vref_idx(unsigned int vref_caps, unsigned int item_idx)
2377 unsigned int i, n = 0;
2379 for (i = 0; i < NUM_VREFS; i++) {
2380 if (vref_caps & (1 << i)) {
2389 /* convert back from the vref ctl index to the enum item index */
2390 static int cvt_from_vref_idx(unsigned int vref_caps, unsigned int idx)
2392 unsigned int i, n = 0;
2394 for (i = 0; i < NUM_VREFS; i++) {
2397 if (vref_caps & (1 << i))
2403 static int in_jack_mode_info(struct snd_kcontrol *kcontrol,
2404 struct snd_ctl_elem_info *uinfo)
2406 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2407 hda_nid_t nid = kcontrol->private_value;
2408 unsigned int vref_caps = get_vref_caps(codec, nid);
2410 snd_hda_enum_helper_info(kcontrol, uinfo, hweight32(vref_caps),
2412 /* set the right text */
2413 strcpy(uinfo->value.enumerated.name,
2414 vref_texts[get_vref_idx(vref_caps, uinfo->value.enumerated.item)]);
2418 static int in_jack_mode_get(struct snd_kcontrol *kcontrol,
2419 struct snd_ctl_elem_value *ucontrol)
2421 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2422 hda_nid_t nid = kcontrol->private_value;
2423 unsigned int vref_caps = get_vref_caps(codec, nid);
2426 idx = snd_hda_codec_get_pin_target(codec, nid) & AC_PINCTL_VREFEN;
2427 ucontrol->value.enumerated.item[0] = cvt_from_vref_idx(vref_caps, idx);
2431 static int in_jack_mode_put(struct snd_kcontrol *kcontrol,
2432 struct snd_ctl_elem_value *ucontrol)
2434 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2435 hda_nid_t nid = kcontrol->private_value;
2436 unsigned int vref_caps = get_vref_caps(codec, nid);
2437 unsigned int val, idx;
2439 val = snd_hda_codec_get_pin_target(codec, nid);
2440 idx = cvt_from_vref_idx(vref_caps, val & AC_PINCTL_VREFEN);
2441 if (idx == ucontrol->value.enumerated.item[0])
2444 val &= ~AC_PINCTL_VREFEN;
2445 val |= get_vref_idx(vref_caps, ucontrol->value.enumerated.item[0]);
2446 snd_hda_set_pin_ctl_cache(codec, nid, val);
2450 static const struct snd_kcontrol_new in_jack_mode_enum = {
2451 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2452 .info = in_jack_mode_info,
2453 .get = in_jack_mode_get,
2454 .put = in_jack_mode_put,
2457 static int create_in_jack_mode(struct hda_codec *codec, hda_nid_t pin)
2459 struct hda_gen_spec *spec = codec->spec;
2460 unsigned int defcfg;
2461 struct snd_kcontrol_new *knew;
2464 /* no jack mode for fixed pins */
2465 defcfg = snd_hda_codec_get_pincfg(codec, pin);
2466 if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
2469 /* no multiple vref caps? */
2470 if (hweight32(get_vref_caps(codec, pin)) <= 1)
2473 get_jack_mode_name(codec, pin, name, sizeof(name));
2474 knew = snd_hda_gen_add_kctl(spec, name, &in_jack_mode_enum);
2477 knew->private_value = pin;
2487 /* add the powersave loopback-list entry */
2488 static void add_loopback_list(struct hda_gen_spec *spec, hda_nid_t mix, int idx)
2490 struct hda_amp_list *list;
2492 if (spec->num_loopbacks >= ARRAY_SIZE(spec->loopback_list) - 1)
2494 list = spec->loopback_list + spec->num_loopbacks;
2496 list->dir = HDA_INPUT;
2498 spec->num_loopbacks++;
2499 spec->loopback.amplist = spec->loopback_list;
2502 #define add_loopback_list(spec, mix, idx) /* NOP */
2505 /* create input playback/capture controls for the given pin */
2506 static int new_analog_input(struct hda_codec *codec, int input_idx,
2507 hda_nid_t pin, const char *ctlname, int ctlidx,
2510 struct hda_gen_spec *spec = codec->spec;
2511 struct nid_path *path;
2515 if (!nid_has_volume(codec, mix_nid, HDA_INPUT) &&
2516 !nid_has_mute(codec, mix_nid, HDA_INPUT))
2517 return 0; /* no need for analog loopback */
2519 path = snd_hda_add_new_path(codec, pin, mix_nid, 0);
2522 print_nid_path("loopback", path);
2523 spec->loopback_paths[input_idx] = snd_hda_get_path_idx(codec, path);
2525 idx = path->idx[path->depth - 1];
2526 if (nid_has_volume(codec, mix_nid, HDA_INPUT)) {
2527 val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
2528 err = __add_pb_vol_ctrl(spec, HDA_CTL_WIDGET_VOL, ctlname, ctlidx, val);
2531 path->ctls[NID_PATH_VOL_CTL] = val;
2534 if (nid_has_mute(codec, mix_nid, HDA_INPUT)) {
2535 val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
2536 err = __add_pb_sw_ctrl(spec, HDA_CTL_WIDGET_MUTE, ctlname, ctlidx, val);
2539 path->ctls[NID_PATH_MUTE_CTL] = val;
2542 path->active = true;
2543 add_loopback_list(spec, mix_nid, idx);
2545 if (spec->mixer_nid != spec->mixer_merge_nid &&
2546 !spec->loopback_merge_path) {
2547 path = snd_hda_add_new_path(codec, spec->mixer_nid,
2548 spec->mixer_merge_nid, 0);
2550 print_nid_path("loopback-merge", path);
2551 path->active = true;
2552 spec->loopback_merge_path =
2553 snd_hda_get_path_idx(codec, path);
2560 static int is_input_pin(struct hda_codec *codec, hda_nid_t nid)
2562 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
2563 return (pincap & AC_PINCAP_IN) != 0;
2566 /* Parse the codec tree and retrieve ADCs */
2567 static int fill_adc_nids(struct hda_codec *codec)
2569 struct hda_gen_spec *spec = codec->spec;
2571 hda_nid_t *adc_nids = spec->adc_nids;
2572 int max_nums = ARRAY_SIZE(spec->adc_nids);
2575 nid = codec->start_nid;
2576 for (i = 0; i < codec->num_nodes; i++, nid++) {
2577 unsigned int caps = get_wcaps(codec, nid);
2578 int type = get_wcaps_type(caps);
2580 if (type != AC_WID_AUD_IN || (caps & AC_WCAP_DIGITAL))
2582 adc_nids[nums] = nid;
2583 if (++nums >= max_nums)
2586 spec->num_adc_nids = nums;
2588 /* copy the detected ADCs to all_adcs[] */
2589 spec->num_all_adcs = nums;
2590 memcpy(spec->all_adcs, spec->adc_nids, nums * sizeof(hda_nid_t));
2595 /* filter out invalid adc_nids that don't give all active input pins;
2596 * if needed, check whether dynamic ADC-switching is available
2598 static int check_dyn_adc_switch(struct hda_codec *codec)
2600 struct hda_gen_spec *spec = codec->spec;
2601 struct hda_input_mux *imux = &spec->input_mux;
2602 unsigned int ok_bits;
2608 for (n = 0; n < spec->num_adc_nids; n++) {
2609 for (i = 0; i < imux->num_items; i++) {
2610 if (!spec->input_paths[i][n])
2613 if (i >= imux->num_items) {
2614 ok_bits |= (1 << n);
2620 if (spec->shared_mic_hp) {
2621 spec->shared_mic_hp = 0;
2622 imux->num_items = 1;
2626 /* check whether ADC-switch is possible */
2627 for (i = 0; i < imux->num_items; i++) {
2628 for (n = 0; n < spec->num_adc_nids; n++) {
2629 if (spec->input_paths[i][n]) {
2630 spec->dyn_adc_idx[i] = n;
2636 snd_printdd("hda-codec: enabling ADC switching\n");
2637 spec->dyn_adc_switch = 1;
2638 } else if (nums != spec->num_adc_nids) {
2639 /* shrink the invalid adcs and input paths */
2641 for (n = 0; n < spec->num_adc_nids; n++) {
2642 if (!(ok_bits & (1 << n)))
2645 spec->adc_nids[nums] = spec->adc_nids[n];
2646 for (i = 0; i < imux->num_items; i++) {
2647 invalidate_nid_path(codec,
2648 spec->input_paths[i][nums]);
2649 spec->input_paths[i][nums] =
2650 spec->input_paths[i][n];
2655 spec->num_adc_nids = nums;
2658 if (imux->num_items == 1 || spec->shared_mic_hp) {
2659 snd_printdd("hda-codec: reducing to a single ADC\n");
2660 spec->num_adc_nids = 1; /* reduce to a single ADC */
2663 /* single index for individual volumes ctls */
2664 if (!spec->dyn_adc_switch && spec->multi_cap_vol)
2665 spec->num_adc_nids = 1;
2670 /* parse capture source paths from the given pin and create imux items */
2671 static int parse_capture_source(struct hda_codec *codec, hda_nid_t pin,
2672 int cfg_idx, int num_adcs,
2673 const char *label, int anchor)
2675 struct hda_gen_spec *spec = codec->spec;
2676 struct hda_input_mux *imux = &spec->input_mux;
2677 int imux_idx = imux->num_items;
2678 bool imux_added = false;
2681 for (c = 0; c < num_adcs; c++) {
2682 struct nid_path *path;
2683 hda_nid_t adc = spec->adc_nids[c];
2685 if (!is_reachable_path(codec, pin, adc))
2687 path = snd_hda_add_new_path(codec, pin, adc, anchor);
2690 print_nid_path("input", path);
2691 spec->input_paths[imux_idx][c] =
2692 snd_hda_get_path_idx(codec, path);
2695 spec->imux_pins[imux->num_items] = pin;
2696 snd_hda_add_imux_item(imux, label, cfg_idx, NULL);
2705 * create playback/capture controls for input pins
2708 /* fill the label for each input at first */
2709 static int fill_input_pin_labels(struct hda_codec *codec)
2711 struct hda_gen_spec *spec = codec->spec;
2712 const struct auto_pin_cfg *cfg = &spec->autocfg;
2715 for (i = 0; i < cfg->num_inputs; i++) {
2716 hda_nid_t pin = cfg->inputs[i].pin;
2720 if (!is_input_pin(codec, pin))
2723 label = hda_get_autocfg_input_label(codec, cfg, i);
2725 for (j = i - 1; j >= 0; j--) {
2726 if (spec->input_labels[j] &&
2727 !strcmp(spec->input_labels[j], label)) {
2728 idx = spec->input_label_idxs[j] + 1;
2733 spec->input_labels[i] = label;
2734 spec->input_label_idxs[i] = idx;
2740 #define CFG_IDX_MIX 99 /* a dummy cfg->input idx for stereo mix */
2742 static int create_input_ctls(struct hda_codec *codec)
2744 struct hda_gen_spec *spec = codec->spec;
2745 const struct auto_pin_cfg *cfg = &spec->autocfg;
2746 hda_nid_t mixer = spec->mixer_nid;
2751 num_adcs = fill_adc_nids(codec);
2755 err = fill_input_pin_labels(codec);
2759 for (i = 0; i < cfg->num_inputs; i++) {
2762 pin = cfg->inputs[i].pin;
2763 if (!is_input_pin(codec, pin))
2767 if (cfg->inputs[i].type == AUTO_PIN_MIC)
2768 val |= snd_hda_get_default_vref(codec, pin);
2769 set_pin_target(codec, pin, val, false);
2772 if (is_reachable_path(codec, pin, mixer)) {
2773 err = new_analog_input(codec, i, pin,
2774 spec->input_labels[i],
2775 spec->input_label_idxs[i],
2782 err = parse_capture_source(codec, pin, i, num_adcs,
2783 spec->input_labels[i], -mixer);
2787 if (spec->add_in_jack_modes) {
2788 err = create_in_jack_mode(codec, pin);
2794 if (mixer && spec->add_stereo_mix_input) {
2795 err = parse_capture_source(codec, mixer, CFG_IDX_MIX, num_adcs,
2809 /* get the input path specified by the given adc and imux indices */
2810 static struct nid_path *get_input_path(struct hda_codec *codec, int adc_idx, int imux_idx)
2812 struct hda_gen_spec *spec = codec->spec;
2813 if (imux_idx < 0 || imux_idx >= HDA_MAX_NUM_INPUTS) {
2817 if (spec->dyn_adc_switch)
2818 adc_idx = spec->dyn_adc_idx[imux_idx];
2819 if (adc_idx < 0 || adc_idx >= AUTO_CFG_MAX_INS) {
2823 return snd_hda_get_path_from_idx(codec, spec->input_paths[imux_idx][adc_idx]);
2826 static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
2829 static int mux_enum_info(struct snd_kcontrol *kcontrol,
2830 struct snd_ctl_elem_info *uinfo)
2832 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2833 struct hda_gen_spec *spec = codec->spec;
2834 return snd_hda_input_mux_info(&spec->input_mux, uinfo);
2837 static int mux_enum_get(struct snd_kcontrol *kcontrol,
2838 struct snd_ctl_elem_value *ucontrol)
2840 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2841 struct hda_gen_spec *spec = codec->spec;
2842 /* the ctls are created at once with multiple counts */
2843 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2845 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
2849 static int mux_enum_put(struct snd_kcontrol *kcontrol,
2850 struct snd_ctl_elem_value *ucontrol)
2852 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2853 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2854 return mux_select(codec, adc_idx,
2855 ucontrol->value.enumerated.item[0]);
2858 static const struct snd_kcontrol_new cap_src_temp = {
2859 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2860 .name = "Input Source",
2861 .info = mux_enum_info,
2862 .get = mux_enum_get,
2863 .put = mux_enum_put,
2867 * capture volume and capture switch ctls
2870 typedef int (*put_call_t)(struct snd_kcontrol *kcontrol,
2871 struct snd_ctl_elem_value *ucontrol);
2873 /* call the given amp update function for all amps in the imux list at once */
2874 static int cap_put_caller(struct snd_kcontrol *kcontrol,
2875 struct snd_ctl_elem_value *ucontrol,
2876 put_call_t func, int type)
2878 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2879 struct hda_gen_spec *spec = codec->spec;
2880 const struct hda_input_mux *imux;
2881 struct nid_path *path;
2882 int i, adc_idx, err = 0;
2884 imux = &spec->input_mux;
2885 adc_idx = kcontrol->id.index;
2886 mutex_lock(&codec->control_mutex);
2887 /* we use the cache-only update at first since multiple input paths
2888 * may shared the same amp; by updating only caches, the redundant
2889 * writes to hardware can be reduced.
2891 codec->cached_write = 1;
2892 for (i = 0; i < imux->num_items; i++) {
2893 path = get_input_path(codec, adc_idx, i);
2894 if (!path || !path->ctls[type])
2896 kcontrol->private_value = path->ctls[type];
2897 err = func(kcontrol, ucontrol);
2902 codec->cached_write = 0;
2903 mutex_unlock(&codec->control_mutex);
2904 snd_hda_codec_flush_cache(codec); /* flush the updates */
2905 if (err >= 0 && spec->cap_sync_hook)
2906 spec->cap_sync_hook(codec, ucontrol);
2910 /* capture volume ctl callbacks */
2911 #define cap_vol_info snd_hda_mixer_amp_volume_info
2912 #define cap_vol_get snd_hda_mixer_amp_volume_get
2913 #define cap_vol_tlv snd_hda_mixer_amp_tlv
2915 static int cap_vol_put(struct snd_kcontrol *kcontrol,
2916 struct snd_ctl_elem_value *ucontrol)
2918 return cap_put_caller(kcontrol, ucontrol,
2919 snd_hda_mixer_amp_volume_put,
2923 static const struct snd_kcontrol_new cap_vol_temp = {
2924 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2925 .name = "Capture Volume",
2926 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
2927 SNDRV_CTL_ELEM_ACCESS_TLV_READ |
2928 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK),
2929 .info = cap_vol_info,
2932 .tlv = { .c = cap_vol_tlv },
2935 /* capture switch ctl callbacks */
2936 #define cap_sw_info snd_ctl_boolean_stereo_info
2937 #define cap_sw_get snd_hda_mixer_amp_switch_get
2939 static int cap_sw_put(struct snd_kcontrol *kcontrol,
2940 struct snd_ctl_elem_value *ucontrol)
2942 return cap_put_caller(kcontrol, ucontrol,
2943 snd_hda_mixer_amp_switch_put,
2947 static const struct snd_kcontrol_new cap_sw_temp = {
2948 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2949 .name = "Capture Switch",
2950 .info = cap_sw_info,
2955 static int parse_capvol_in_path(struct hda_codec *codec, struct nid_path *path)
2960 path->ctls[NID_PATH_VOL_CTL] = path->ctls[NID_PATH_MUTE_CTL] = 0;
2961 for (depth = 0; depth < 3; depth++) {
2962 if (depth >= path->depth)
2964 i = path->depth - depth - 1;
2965 nid = path->path[i];
2966 if (!path->ctls[NID_PATH_VOL_CTL]) {
2967 if (nid_has_volume(codec, nid, HDA_OUTPUT))
2968 path->ctls[NID_PATH_VOL_CTL] =
2969 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
2970 else if (nid_has_volume(codec, nid, HDA_INPUT)) {
2971 int idx = path->idx[i];
2972 if (!depth && codec->single_adc_amp)
2974 path->ctls[NID_PATH_VOL_CTL] =
2975 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
2978 if (!path->ctls[NID_PATH_MUTE_CTL]) {
2979 if (nid_has_mute(codec, nid, HDA_OUTPUT))
2980 path->ctls[NID_PATH_MUTE_CTL] =
2981 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
2982 else if (nid_has_mute(codec, nid, HDA_INPUT)) {
2983 int idx = path->idx[i];
2984 if (!depth && codec->single_adc_amp)
2986 path->ctls[NID_PATH_MUTE_CTL] =
2987 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
2994 static bool is_inv_dmic_pin(struct hda_codec *codec, hda_nid_t nid)
2996 struct hda_gen_spec *spec = codec->spec;
2997 struct auto_pin_cfg *cfg = &spec->autocfg;
3001 if (!spec->inv_dmic_split)
3003 for (i = 0; i < cfg->num_inputs; i++) {
3004 if (cfg->inputs[i].pin != nid)
3006 if (cfg->inputs[i].type != AUTO_PIN_MIC)
3008 val = snd_hda_codec_get_pincfg(codec, nid);
3009 return snd_hda_get_input_pin_attr(val) == INPUT_PIN_ATTR_INT;
3014 /* capture switch put callback for a single control with hook call */
3015 static int cap_single_sw_put(struct snd_kcontrol *kcontrol,
3016 struct snd_ctl_elem_value *ucontrol)
3018 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3019 struct hda_gen_spec *spec = codec->spec;
3022 ret = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
3026 if (spec->cap_sync_hook)
3027 spec->cap_sync_hook(codec, ucontrol);
3032 static int add_single_cap_ctl(struct hda_codec *codec, const char *label,
3033 int idx, bool is_switch, unsigned int ctl,
3036 struct hda_gen_spec *spec = codec->spec;
3038 int type = is_switch ? HDA_CTL_WIDGET_MUTE : HDA_CTL_WIDGET_VOL;
3039 const char *sfx = is_switch ? "Switch" : "Volume";
3040 unsigned int chs = inv_dmic ? 1 : 3;
3041 struct snd_kcontrol_new *knew;
3047 snprintf(tmpname, sizeof(tmpname),
3048 "%s Capture %s", label, sfx);
3050 snprintf(tmpname, sizeof(tmpname),
3052 knew = add_control(spec, type, tmpname, idx,
3053 amp_val_replace_channels(ctl, chs));
3057 knew->put = cap_single_sw_put;
3061 /* Make independent right kcontrol */
3063 snprintf(tmpname, sizeof(tmpname),
3064 "Inverted %s Capture %s", label, sfx);
3066 snprintf(tmpname, sizeof(tmpname),
3067 "Inverted Capture %s", sfx);
3068 knew = add_control(spec, type, tmpname, idx,
3069 amp_val_replace_channels(ctl, 2));
3073 knew->put = cap_single_sw_put;
3077 /* create single (and simple) capture volume and switch controls */
3078 static int create_single_cap_vol_ctl(struct hda_codec *codec, int idx,
3079 unsigned int vol_ctl, unsigned int sw_ctl,
3083 err = add_single_cap_ctl(codec, NULL, idx, false, vol_ctl, inv_dmic);
3086 err = add_single_cap_ctl(codec, NULL, idx, true, sw_ctl, inv_dmic);
3092 /* create bound capture volume and switch controls */
3093 static int create_bind_cap_vol_ctl(struct hda_codec *codec, int idx,
3094 unsigned int vol_ctl, unsigned int sw_ctl)
3096 struct hda_gen_spec *spec = codec->spec;
3097 struct snd_kcontrol_new *knew;
3100 knew = snd_hda_gen_add_kctl(spec, NULL, &cap_vol_temp);
3104 knew->private_value = vol_ctl;
3105 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
3108 knew = snd_hda_gen_add_kctl(spec, NULL, &cap_sw_temp);
3112 knew->private_value = sw_ctl;
3113 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
3118 /* return the vol ctl when used first in the imux list */
3119 static unsigned int get_first_cap_ctl(struct hda_codec *codec, int idx, int type)
3121 struct nid_path *path;
3125 path = get_input_path(codec, 0, idx);
3128 ctl = path->ctls[type];
3131 for (i = 0; i < idx - 1; i++) {
3132 path = get_input_path(codec, 0, i);
3133 if (path && path->ctls[type] == ctl)
3139 /* create individual capture volume and switch controls per input */
3140 static int create_multi_cap_vol_ctl(struct hda_codec *codec)
3142 struct hda_gen_spec *spec = codec->spec;
3143 struct hda_input_mux *imux = &spec->input_mux;
3146 for (i = 0; i < imux->num_items; i++) {
3150 idx = imux->items[i].index;
3151 if (idx >= spec->autocfg.num_inputs)
3153 inv_dmic = is_inv_dmic_pin(codec, spec->imux_pins[i]);
3155 for (type = 0; type < 2; type++) {
3156 err = add_single_cap_ctl(codec,
3157 spec->input_labels[idx],
3158 spec->input_label_idxs[idx],
3160 get_first_cap_ctl(codec, i, type),
3169 static int create_capture_mixers(struct hda_codec *codec)
3171 struct hda_gen_spec *spec = codec->spec;
3172 struct hda_input_mux *imux = &spec->input_mux;
3173 int i, n, nums, err;
3175 if (spec->dyn_adc_switch)
3178 nums = spec->num_adc_nids;
3180 if (!spec->auto_mic && imux->num_items > 1) {
3181 struct snd_kcontrol_new *knew;
3183 name = nums > 1 ? "Input Source" : "Capture Source";
3184 knew = snd_hda_gen_add_kctl(spec, name, &cap_src_temp);
3190 for (n = 0; n < nums; n++) {
3192 bool multi_cap_vol = spec->multi_cap_vol;
3193 bool inv_dmic = false;
3197 for (i = 0; i < imux->num_items; i++) {
3198 struct nid_path *path;
3199 path = get_input_path(codec, n, i);
3202 parse_capvol_in_path(codec, path);
3204 vol = path->ctls[NID_PATH_VOL_CTL];
3205 else if (vol != path->ctls[NID_PATH_VOL_CTL]) {
3207 if (!same_amp_caps(codec, vol,
3208 path->ctls[NID_PATH_VOL_CTL], HDA_INPUT))
3209 multi_cap_vol = true;
3212 sw = path->ctls[NID_PATH_MUTE_CTL];
3213 else if (sw != path->ctls[NID_PATH_MUTE_CTL]) {
3215 if (!same_amp_caps(codec, sw,
3216 path->ctls[NID_PATH_MUTE_CTL], HDA_INPUT))
3217 multi_cap_vol = true;
3219 if (is_inv_dmic_pin(codec, spec->imux_pins[i]))
3224 err = create_single_cap_vol_ctl(codec, n, vol, sw,
3226 else if (!multi_cap_vol)
3227 err = create_bind_cap_vol_ctl(codec, n, vol, sw);
3229 err = create_multi_cap_vol_ctl(codec);
3238 * add mic boosts if needed
3241 /* check whether the given amp is feasible as a boost volume */
3242 static bool check_boost_vol(struct hda_codec *codec, hda_nid_t nid,
3247 if (!nid_has_volume(codec, nid, dir) ||
3248 is_ctl_associated(codec, nid, dir, idx, NID_PATH_VOL_CTL) ||
3249 is_ctl_associated(codec, nid, dir, idx, NID_PATH_BOOST_CTL))
3252 step = (query_amp_caps(codec, nid, dir) & AC_AMPCAP_STEP_SIZE)
3253 >> AC_AMPCAP_STEP_SIZE_SHIFT;
3259 /* look for a boost amp in a widget close to the pin */
3260 static unsigned int look_for_boost_amp(struct hda_codec *codec,
3261 struct nid_path *path)
3263 unsigned int val = 0;
3267 for (depth = 0; depth < 3; depth++) {
3268 if (depth >= path->depth - 1)
3270 nid = path->path[depth];
3271 if (depth && check_boost_vol(codec, nid, HDA_OUTPUT, 0)) {
3272 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
3274 } else if (check_boost_vol(codec, nid, HDA_INPUT,
3275 path->idx[depth])) {
3276 val = HDA_COMPOSE_AMP_VAL(nid, 3, path->idx[depth],
3285 static int parse_mic_boost(struct hda_codec *codec)
3287 struct hda_gen_spec *spec = codec->spec;
3288 struct auto_pin_cfg *cfg = &spec->autocfg;
3289 struct hda_input_mux *imux = &spec->input_mux;
3292 if (!spec->num_adc_nids)
3295 for (i = 0; i < imux->num_items; i++) {
3296 struct nid_path *path;
3299 char boost_label[44];
3301 idx = imux->items[i].index;
3302 if (idx >= imux->num_items)
3305 /* check only line-in and mic pins */
3306 if (cfg->inputs[idx].type > AUTO_PIN_LINE_IN)
3309 path = get_input_path(codec, 0, i);
3313 val = look_for_boost_amp(codec, path);
3317 /* create a boost control */
3318 snprintf(boost_label, sizeof(boost_label),
3319 "%s Boost Volume", spec->input_labels[idx]);
3320 if (!add_control(spec, HDA_CTL_WIDGET_VOL, boost_label,
3321 spec->input_label_idxs[idx], val))
3324 path->ctls[NID_PATH_BOOST_CTL] = val;
3330 * parse digital I/Os and set up NIDs in BIOS auto-parse mode
3332 static void parse_digital(struct hda_codec *codec)
3334 struct hda_gen_spec *spec = codec->spec;
3335 struct nid_path *path;
3337 hda_nid_t dig_nid, pin;
3339 /* support multiple SPDIFs; the secondary is set up as a slave */
3341 for (i = 0; i < spec->autocfg.dig_outs; i++) {
3342 pin = spec->autocfg.dig_out_pins[i];
3343 dig_nid = look_for_dac(codec, pin, true);
3346 path = snd_hda_add_new_path(codec, dig_nid, pin, 0);
3349 print_nid_path("digout", path);
3350 path->active = true;
3351 spec->digout_paths[i] = snd_hda_get_path_idx(codec, path);
3352 set_pin_target(codec, pin, PIN_OUT, false);
3354 spec->multiout.dig_out_nid = dig_nid;
3355 spec->dig_out_type = spec->autocfg.dig_out_type[0];
3357 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
3358 if (nums >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
3360 spec->slave_dig_outs[nums - 1] = dig_nid;
3365 if (spec->autocfg.dig_in_pin) {
3366 pin = spec->autocfg.dig_in_pin;
3367 dig_nid = codec->start_nid;
3368 for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
3369 unsigned int wcaps = get_wcaps(codec, dig_nid);
3370 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
3372 if (!(wcaps & AC_WCAP_DIGITAL))
3374 path = snd_hda_add_new_path(codec, pin, dig_nid, 0);
3376 print_nid_path("digin", path);
3377 path->active = true;
3378 spec->dig_in_nid = dig_nid;
3379 spec->digin_path = snd_hda_get_path_idx(codec, path);
3380 set_pin_target(codec, pin, PIN_IN, false);
3389 * input MUX handling
3392 static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur);
3394 /* select the given imux item; either unmute exclusively or select the route */
3395 static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
3398 struct hda_gen_spec *spec = codec->spec;
3399 const struct hda_input_mux *imux;
3400 struct nid_path *old_path, *path;
3402 imux = &spec->input_mux;
3403 if (!imux->num_items)
3406 if (idx >= imux->num_items)
3407 idx = imux->num_items - 1;
3408 if (spec->cur_mux[adc_idx] == idx)
3411 old_path = get_input_path(codec, adc_idx, spec->cur_mux[adc_idx]);
3414 if (old_path->active)
3415 snd_hda_activate_path(codec, old_path, false, false);
3417 spec->cur_mux[adc_idx] = idx;
3419 if (spec->shared_mic_hp)
3420 update_shared_mic_hp(codec, spec->cur_mux[adc_idx]);
3422 if (spec->dyn_adc_switch)
3423 dyn_adc_pcm_resetup(codec, idx);
3425 path = get_input_path(codec, adc_idx, idx);
3430 snd_hda_activate_path(codec, path, true, false);
3431 if (spec->cap_sync_hook)
3432 spec->cap_sync_hook(codec, NULL);
3433 path_power_down_sync(codec, old_path);
3439 * Jack detections for HP auto-mute and mic-switch
3442 /* check each pin in the given array; returns true if any of them is plugged */
3443 static bool detect_jacks(struct hda_codec *codec, int num_pins, hda_nid_t *pins)
3447 for (i = 0; i < num_pins; i++) {
3448 hda_nid_t nid = pins[i];
3451 /* don't detect pins retasked as inputs */
3452 if (snd_hda_codec_get_pin_target(codec, nid) & AC_PINCTL_IN_EN)
3454 present |= snd_hda_jack_detect(codec, nid);
3459 /* standard HP/line-out auto-mute helper */
3460 static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins,
3463 struct hda_gen_spec *spec = codec->spec;
3466 for (i = 0; i < num_pins; i++) {
3467 hda_nid_t nid = pins[i];
3471 /* don't reset VREF value in case it's controlling
3472 * the amp (see alc861_fixup_asus_amp_vref_0f())
3474 if (spec->keep_vref_in_automute)
3475 val = snd_hda_codec_get_pin_target(codec, nid) & ~PIN_HP;
3479 val |= snd_hda_codec_get_pin_target(codec, nid);
3480 /* here we call update_pin_ctl() so that the pinctl is changed
3481 * without changing the pinctl target value;
3482 * the original target value will be still referred at the
3483 * init / resume again
3485 update_pin_ctl(codec, nid, val);
3486 set_pin_eapd(codec, nid, !mute);
3490 /* Toggle outputs muting */
3491 void snd_hda_gen_update_outputs(struct hda_codec *codec)
3493 struct hda_gen_spec *spec = codec->spec;
3496 /* Control HP pins/amps depending on master_mute state;
3497 * in general, HP pins/amps control should be enabled in all cases,
3498 * but currently set only for master_mute, just to be safe
3500 if (!spec->shared_mic_hp) /* don't change HP-pin when shared with mic */
3501 do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
3502 spec->autocfg.hp_pins, spec->master_mute);
3504 if (!spec->automute_speaker)
3507 on = spec->hp_jack_present | spec->line_jack_present;
3508 on |= spec->master_mute;
3509 spec->speaker_muted = on;
3510 do_automute(codec, ARRAY_SIZE(spec->autocfg.speaker_pins),
3511 spec->autocfg.speaker_pins, on);
3513 /* toggle line-out mutes if needed, too */
3514 /* if LO is a copy of either HP or Speaker, don't need to handle it */
3515 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0] ||
3516 spec->autocfg.line_out_pins[0] == spec->autocfg.speaker_pins[0])
3518 if (!spec->automute_lo)
3521 on = spec->hp_jack_present;
3522 on |= spec->master_mute;
3523 spec->line_out_muted = on;
3524 do_automute(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
3525 spec->autocfg.line_out_pins, on);
3527 EXPORT_SYMBOL_HDA(snd_hda_gen_update_outputs);
3529 static void call_update_outputs(struct hda_codec *codec)
3531 struct hda_gen_spec *spec = codec->spec;
3532 if (spec->automute_hook)
3533 spec->automute_hook(codec);
3535 snd_hda_gen_update_outputs(codec);
3538 /* standard HP-automute helper */
3539 void snd_hda_gen_hp_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)
3541 struct hda_gen_spec *spec = codec->spec;
3542 hda_nid_t *pins = spec->autocfg.hp_pins;
3543 int num_pins = ARRAY_SIZE(spec->autocfg.hp_pins);
3545 /* No detection for the first HP jack during indep-HP mode */
3546 if (spec->indep_hp_enabled) {
3551 spec->hp_jack_present = detect_jacks(codec, num_pins, pins);
3552 if (!spec->detect_hp || (!spec->automute_speaker && !spec->automute_lo))
3554 call_update_outputs(codec);
3556 EXPORT_SYMBOL_HDA(snd_hda_gen_hp_automute);
3558 /* standard line-out-automute helper */
3559 void snd_hda_gen_line_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)
3561 struct hda_gen_spec *spec = codec->spec;
3563 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
3565 /* check LO jack only when it's different from HP */
3566 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0])
3569 spec->line_jack_present =
3570 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
3571 spec->autocfg.line_out_pins);
3572 if (!spec->automute_speaker || !spec->detect_lo)
3574 call_update_outputs(codec);
3576 EXPORT_SYMBOL_HDA(snd_hda_gen_line_automute);
3578 /* standard mic auto-switch helper */
3579 void snd_hda_gen_mic_autoswitch(struct hda_codec *codec, struct hda_jack_tbl *jack)
3581 struct hda_gen_spec *spec = codec->spec;
3584 if (!spec->auto_mic)
3587 for (i = spec->am_num_entries - 1; i > 0; i--) {
3588 hda_nid_t pin = spec->am_entry[i].pin;
3589 /* don't detect pins retasked as outputs */
3590 if (snd_hda_codec_get_pin_target(codec, pin) & AC_PINCTL_OUT_EN)
3592 if (snd_hda_jack_detect(codec, pin)) {
3593 mux_select(codec, 0, spec->am_entry[i].idx);
3597 mux_select(codec, 0, spec->am_entry[0].idx);
3599 EXPORT_SYMBOL_HDA(snd_hda_gen_mic_autoswitch);
3601 /* update jack retasking */
3602 static void update_automute_all(struct hda_codec *codec)
3604 struct hda_gen_spec *spec = codec->spec;
3606 if (spec->hp_automute_hook)
3607 spec->hp_automute_hook(codec, NULL);
3609 snd_hda_gen_hp_automute(codec, NULL);
3610 if (spec->line_automute_hook)
3611 spec->line_automute_hook(codec, NULL);
3613 snd_hda_gen_line_automute(codec, NULL);
3614 if (spec->mic_autoswitch_hook)
3615 spec->mic_autoswitch_hook(codec, NULL);
3617 snd_hda_gen_mic_autoswitch(codec, NULL);
3621 * Auto-Mute mode mixer enum support
3623 static int automute_mode_info(struct snd_kcontrol *kcontrol,
3624 struct snd_ctl_elem_info *uinfo)
3626 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3627 struct hda_gen_spec *spec = codec->spec;
3628 static const char * const texts3[] = {
3629 "Disabled", "Speaker Only", "Line Out+Speaker"
3632 if (spec->automute_speaker_possible && spec->automute_lo_possible)
3633 return snd_hda_enum_helper_info(kcontrol, uinfo, 3, texts3);
3634 return snd_hda_enum_bool_helper_info(kcontrol, uinfo);
3637 static int automute_mode_get(struct snd_kcontrol *kcontrol,
3638 struct snd_ctl_elem_value *ucontrol)
3640 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3641 struct hda_gen_spec *spec = codec->spec;
3642 unsigned int val = 0;
3643 if (spec->automute_speaker)
3645 if (spec->automute_lo)
3648 ucontrol->value.enumerated.item[0] = val;
3652 static int automute_mode_put(struct snd_kcontrol *kcontrol,
3653 struct snd_ctl_elem_value *ucontrol)
3655 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3656 struct hda_gen_spec *spec = codec->spec;
3658 switch (ucontrol->value.enumerated.item[0]) {
3660 if (!spec->automute_speaker && !spec->automute_lo)
3662 spec->automute_speaker = 0;
3663 spec->automute_lo = 0;
3666 if (spec->automute_speaker_possible) {
3667 if (!spec->automute_lo && spec->automute_speaker)
3669 spec->automute_speaker = 1;
3670 spec->automute_lo = 0;
3671 } else if (spec->automute_lo_possible) {
3672 if (spec->automute_lo)
3674 spec->automute_lo = 1;
3679 if (!spec->automute_lo_possible || !spec->automute_speaker_possible)
3681 if (spec->automute_speaker && spec->automute_lo)
3683 spec->automute_speaker = 1;
3684 spec->automute_lo = 1;
3689 call_update_outputs(codec);
3693 static const struct snd_kcontrol_new automute_mode_enum = {
3694 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3695 .name = "Auto-Mute Mode",
3696 .info = automute_mode_info,
3697 .get = automute_mode_get,
3698 .put = automute_mode_put,
3701 static int add_automute_mode_enum(struct hda_codec *codec)
3703 struct hda_gen_spec *spec = codec->spec;
3705 if (!snd_hda_gen_add_kctl(spec, NULL, &automute_mode_enum))
3711 * Check the availability of HP/line-out auto-mute;
3712 * Set up appropriately if really supported
3714 static int check_auto_mute_availability(struct hda_codec *codec)
3716 struct hda_gen_spec *spec = codec->spec;
3717 struct auto_pin_cfg *cfg = &spec->autocfg;
3721 if (spec->suppress_auto_mute)
3724 if (cfg->hp_pins[0])
3726 if (cfg->line_out_pins[0])
3728 if (cfg->speaker_pins[0])
3730 if (present < 2) /* need two different output types */
3733 if (!cfg->speaker_pins[0] &&
3734 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
3735 memcpy(cfg->speaker_pins, cfg->line_out_pins,
3736 sizeof(cfg->speaker_pins));
3737 cfg->speaker_outs = cfg->line_outs;
3740 if (!cfg->hp_pins[0] &&
3741 cfg->line_out_type == AUTO_PIN_HP_OUT) {
3742 memcpy(cfg->hp_pins, cfg->line_out_pins,
3743 sizeof(cfg->hp_pins));
3744 cfg->hp_outs = cfg->line_outs;
3747 for (i = 0; i < cfg->hp_outs; i++) {
3748 hda_nid_t nid = cfg->hp_pins[i];
3749 if (!is_jack_detectable(codec, nid))
3751 snd_printdd("hda-codec: Enable HP auto-muting on NID 0x%x\n",
3753 snd_hda_jack_detect_enable_callback(codec, nid, HDA_GEN_HP_EVENT,
3754 spec->hp_automute_hook ?
3755 spec->hp_automute_hook :
3756 snd_hda_gen_hp_automute);
3757 spec->detect_hp = 1;
3760 if (cfg->line_out_type == AUTO_PIN_LINE_OUT && cfg->line_outs) {
3761 if (cfg->speaker_outs)
3762 for (i = 0; i < cfg->line_outs; i++) {
3763 hda_nid_t nid = cfg->line_out_pins[i];
3764 if (!is_jack_detectable(codec, nid))
3766 snd_printdd("hda-codec: Enable Line-Out auto-muting on NID 0x%x\n", nid);
3767 snd_hda_jack_detect_enable_callback(codec, nid,
3768 HDA_GEN_FRONT_EVENT,
3769 spec->line_automute_hook ?
3770 spec->line_automute_hook :
3771 snd_hda_gen_line_automute);
3772 spec->detect_lo = 1;
3774 spec->automute_lo_possible = spec->detect_hp;
3777 spec->automute_speaker_possible = cfg->speaker_outs &&
3778 (spec->detect_hp || spec->detect_lo);
3780 spec->automute_lo = spec->automute_lo_possible;
3781 spec->automute_speaker = spec->automute_speaker_possible;
3783 if (spec->automute_speaker_possible || spec->automute_lo_possible) {
3784 /* create a control for automute mode */
3785 err = add_automute_mode_enum(codec);
3792 /* check whether all auto-mic pins are valid; setup indices if OK */
3793 static bool auto_mic_check_imux(struct hda_codec *codec)
3795 struct hda_gen_spec *spec = codec->spec;
3796 const struct hda_input_mux *imux;
3799 imux = &spec->input_mux;
3800 for (i = 0; i < spec->am_num_entries; i++) {
3801 spec->am_entry[i].idx =
3802 find_idx_in_nid_list(spec->am_entry[i].pin,
3803 spec->imux_pins, imux->num_items);
3804 if (spec->am_entry[i].idx < 0)
3805 return false; /* no corresponding imux */
3808 /* we don't need the jack detection for the first pin */
3809 for (i = 1; i < spec->am_num_entries; i++)
3810 snd_hda_jack_detect_enable_callback(codec,
3811 spec->am_entry[i].pin,
3813 spec->mic_autoswitch_hook ?
3814 spec->mic_autoswitch_hook :
3815 snd_hda_gen_mic_autoswitch);
3819 static int compare_attr(const void *ap, const void *bp)
3821 const struct automic_entry *a = ap;
3822 const struct automic_entry *b = bp;
3823 return (int)(a->attr - b->attr);
3827 * Check the availability of auto-mic switch;
3828 * Set up if really supported
3830 static int check_auto_mic_availability(struct hda_codec *codec)
3832 struct hda_gen_spec *spec = codec->spec;
3833 struct auto_pin_cfg *cfg = &spec->autocfg;
3837 if (spec->suppress_auto_mic)
3842 for (i = 0; i < cfg->num_inputs; i++) {
3843 hda_nid_t nid = cfg->inputs[i].pin;
3845 attr = snd_hda_codec_get_pincfg(codec, nid);
3846 attr = snd_hda_get_input_pin_attr(attr);
3847 if (types & (1 << attr))
3848 return 0; /* already occupied */
3850 case INPUT_PIN_ATTR_INT:
3851 if (cfg->inputs[i].type != AUTO_PIN_MIC)
3852 return 0; /* invalid type */
3854 case INPUT_PIN_ATTR_UNUSED:
3855 return 0; /* invalid entry */
3857 if (cfg->inputs[i].type > AUTO_PIN_LINE_IN)
3858 return 0; /* invalid type */
3859 if (!spec->line_in_auto_switch &&
3860 cfg->inputs[i].type != AUTO_PIN_MIC)
3861 return 0; /* only mic is allowed */
3862 if (!is_jack_detectable(codec, nid))
3863 return 0; /* no unsol support */
3866 if (num_pins >= MAX_AUTO_MIC_PINS)
3868 types |= (1 << attr);
3869 spec->am_entry[num_pins].pin = nid;
3870 spec->am_entry[num_pins].attr = attr;
3877 spec->am_num_entries = num_pins;
3878 /* sort the am_entry in the order of attr so that the pin with a
3879 * higher attr will be selected when the jack is plugged.
3881 sort(spec->am_entry, num_pins, sizeof(spec->am_entry[0]),
3882 compare_attr, NULL);
3884 if (!auto_mic_check_imux(codec))
3888 spec->num_adc_nids = 1;
3889 spec->cur_mux[0] = spec->am_entry[0].idx;
3890 snd_printdd("hda-codec: Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n",
3891 spec->am_entry[0].pin,
3892 spec->am_entry[1].pin,
3893 spec->am_entry[2].pin);
3898 /* power_filter hook; make inactive widgets into power down */
3899 static unsigned int snd_hda_gen_path_power_filter(struct hda_codec *codec,
3901 unsigned int power_state)
3903 if (power_state != AC_PWRST_D0)
3905 if (get_wcaps_type(get_wcaps(codec, nid)) >= AC_WID_POWER)
3907 if (is_active_nid(codec, nid, HDA_OUTPUT, 0))
3914 * Parse the given BIOS configuration and set up the hda_gen_spec
3916 * return 1 if successful, 0 if the proper config is not found,
3917 * or a negative error code
3919 int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
3920 struct auto_pin_cfg *cfg)
3922 struct hda_gen_spec *spec = codec->spec;
3925 parse_user_hints(codec);
3927 if (spec->mixer_nid && !spec->mixer_merge_nid)
3928 spec->mixer_merge_nid = spec->mixer_nid;
3930 if (cfg != &spec->autocfg) {
3931 spec->autocfg = *cfg;
3932 cfg = &spec->autocfg;
3935 fill_all_dac_nids(codec);
3937 if (!cfg->line_outs) {
3938 if (cfg->dig_outs || cfg->dig_in_pin) {
3939 spec->multiout.max_channels = 2;
3940 spec->no_analog = 1;
3943 return 0; /* can't find valid BIOS pin config */
3946 if (!spec->no_primary_hp &&
3947 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT &&
3948 cfg->line_outs <= cfg->hp_outs) {
3949 /* use HP as primary out */
3950 cfg->speaker_outs = cfg->line_outs;
3951 memcpy(cfg->speaker_pins, cfg->line_out_pins,
3952 sizeof(cfg->speaker_pins));
3953 cfg->line_outs = cfg->hp_outs;
3954 memcpy(cfg->line_out_pins, cfg->hp_pins, sizeof(cfg->hp_pins));
3956 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
3957 cfg->line_out_type = AUTO_PIN_HP_OUT;
3960 err = parse_output_paths(codec);
3963 err = create_multi_channel_mode(codec);
3966 err = create_multi_out_ctls(codec, cfg);
3969 err = create_hp_out_ctls(codec);
3972 err = create_speaker_out_ctls(codec);
3975 err = create_indep_hp_ctls(codec);
3978 err = create_loopback_mixing_ctl(codec);
3981 err = create_shared_input(codec);
3984 err = create_input_ctls(codec);
3988 spec->const_channel_count = spec->ext_channel_count;
3989 /* check the multiple speaker and headphone pins */
3990 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
3991 spec->const_channel_count = max(spec->const_channel_count,
3992 cfg->speaker_outs * 2);
3993 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
3994 spec->const_channel_count = max(spec->const_channel_count,
3996 spec->multiout.max_channels = max(spec->ext_channel_count,
3997 spec->const_channel_count);
3999 err = check_auto_mute_availability(codec);
4003 err = check_dyn_adc_switch(codec);
4007 if (!spec->shared_mic_hp) {
4008 err = check_auto_mic_availability(codec);
4013 err = create_capture_mixers(codec);
4017 err = parse_mic_boost(codec);
4021 if (spec->add_out_jack_modes) {
4022 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
4023 err = create_out_jack_modes(codec, cfg->line_outs,
4024 cfg->line_out_pins);
4028 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
4029 err = create_out_jack_modes(codec, cfg->hp_outs,
4037 parse_digital(codec);
4039 if (spec->power_down_unused)
4040 codec->power_filter = snd_hda_gen_path_power_filter;
4044 EXPORT_SYMBOL_HDA(snd_hda_gen_parse_auto_config);
4048 * Build control elements
4051 /* slave controls for virtual master */
4052 static const char * const slave_pfxs[] = {
4053 "Front", "Surround", "Center", "LFE", "Side",
4054 "Headphone", "Speaker", "Mono", "Line Out",
4055 "CLFE", "Bass Speaker", "PCM",
4056 "Speaker Front", "Speaker Surround", "Speaker CLFE", "Speaker Side",
4057 "Headphone Front", "Headphone Surround", "Headphone CLFE",
4062 int snd_hda_gen_build_controls(struct hda_codec *codec)
4064 struct hda_gen_spec *spec = codec->spec;
4067 if (spec->kctls.used) {
4068 err = snd_hda_add_new_ctls(codec, spec->kctls.list);
4073 if (spec->multiout.dig_out_nid) {
4074 err = snd_hda_create_dig_out_ctls(codec,
4075 spec->multiout.dig_out_nid,
4076 spec->multiout.dig_out_nid,
4077 spec->pcm_rec[1].pcm_type);
4080 if (!spec->no_analog) {
4081 err = snd_hda_create_spdif_share_sw(codec,
4085 spec->multiout.share_spdif = 1;
4088 if (spec->dig_in_nid) {
4089 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
4094 /* if we have no master control, let's create it */
4095 if (!spec->no_analog &&
4096 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
4097 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
4098 spec->vmaster_tlv, slave_pfxs,
4103 if (!spec->no_analog &&
4104 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
4105 err = __snd_hda_add_vmaster(codec, "Master Playback Switch",
4108 true, &spec->vmaster_mute.sw_kctl);
4111 if (spec->vmaster_mute.hook)
4112 snd_hda_add_vmaster_hook(codec, &spec->vmaster_mute,
4113 spec->vmaster_mute_enum);
4116 free_kctls(spec); /* no longer needed */
4118 if (spec->shared_mic_hp) {
4120 int nid = spec->autocfg.inputs[1].pin;
4121 err = snd_hda_jack_add_kctl(codec, nid, "Headphone Mic", 0);
4124 err = snd_hda_jack_detect_enable(codec, nid, 0);
4129 err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
4135 EXPORT_SYMBOL_HDA(snd_hda_gen_build_controls);
4142 static void call_pcm_playback_hook(struct hda_pcm_stream *hinfo,
4143 struct hda_codec *codec,
4144 struct snd_pcm_substream *substream,
4147 struct hda_gen_spec *spec = codec->spec;
4148 if (spec->pcm_playback_hook)
4149 spec->pcm_playback_hook(hinfo, codec, substream, action);
4152 static void call_pcm_capture_hook(struct hda_pcm_stream *hinfo,
4153 struct hda_codec *codec,
4154 struct snd_pcm_substream *substream,
4157 struct hda_gen_spec *spec = codec->spec;
4158 if (spec->pcm_capture_hook)
4159 spec->pcm_capture_hook(hinfo, codec, substream, action);
4163 * Analog playback callbacks
4165 static int playback_pcm_open(struct hda_pcm_stream *hinfo,
4166 struct hda_codec *codec,
4167 struct snd_pcm_substream *substream)
4169 struct hda_gen_spec *spec = codec->spec;
4172 mutex_lock(&spec->pcm_mutex);
4173 err = snd_hda_multi_out_analog_open(codec,
4174 &spec->multiout, substream,
4177 spec->active_streams |= 1 << STREAM_MULTI_OUT;
4178 call_pcm_playback_hook(hinfo, codec, substream,
4179 HDA_GEN_PCM_ACT_OPEN);
4181 mutex_unlock(&spec->pcm_mutex);
4185 static int playback_pcm_prepare(struct hda_pcm_stream *hinfo,
4186 struct hda_codec *codec,
4187 unsigned int stream_tag,
4188 unsigned int format,
4189 struct snd_pcm_substream *substream)
4191 struct hda_gen_spec *spec = codec->spec;
4194 err = snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
4195 stream_tag, format, substream);
4197 call_pcm_playback_hook(hinfo, codec, substream,
4198 HDA_GEN_PCM_ACT_PREPARE);
4202 static int playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
4203 struct hda_codec *codec,
4204 struct snd_pcm_substream *substream)
4206 struct hda_gen_spec *spec = codec->spec;
4209 err = snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
4211 call_pcm_playback_hook(hinfo, codec, substream,
4212 HDA_GEN_PCM_ACT_CLEANUP);
4216 static int playback_pcm_close(struct hda_pcm_stream *hinfo,
4217 struct hda_codec *codec,
4218 struct snd_pcm_substream *substream)
4220 struct hda_gen_spec *spec = codec->spec;
4221 mutex_lock(&spec->pcm_mutex);
4222 spec->active_streams &= ~(1 << STREAM_MULTI_OUT);
4223 call_pcm_playback_hook(hinfo, codec, substream,
4224 HDA_GEN_PCM_ACT_CLOSE);
4225 mutex_unlock(&spec->pcm_mutex);
4229 static int capture_pcm_open(struct hda_pcm_stream *hinfo,
4230 struct hda_codec *codec,
4231 struct snd_pcm_substream *substream)
4233 call_pcm_capture_hook(hinfo, codec, substream, HDA_GEN_PCM_ACT_OPEN);
4237 static int capture_pcm_prepare(struct hda_pcm_stream *hinfo,
4238 struct hda_codec *codec,
4239 unsigned int stream_tag,
4240 unsigned int format,
4241 struct snd_pcm_substream *substream)
4243 snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format);
4244 call_pcm_capture_hook(hinfo, codec, substream,
4245 HDA_GEN_PCM_ACT_PREPARE);
4249 static int capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
4250 struct hda_codec *codec,
4251 struct snd_pcm_substream *substream)
4253 snd_hda_codec_cleanup_stream(codec, hinfo->nid);
4254 call_pcm_capture_hook(hinfo, codec, substream,
4255 HDA_GEN_PCM_ACT_CLEANUP);
4259 static int capture_pcm_close(struct hda_pcm_stream *hinfo,
4260 struct hda_codec *codec,
4261 struct snd_pcm_substream *substream)
4263 call_pcm_capture_hook(hinfo, codec, substream, HDA_GEN_PCM_ACT_CLOSE);
4267 static int alt_playback_pcm_open(struct hda_pcm_stream *hinfo,
4268 struct hda_codec *codec,
4269 struct snd_pcm_substream *substream)
4271 struct hda_gen_spec *spec = codec->spec;
4274 mutex_lock(&spec->pcm_mutex);
4275 if (!spec->indep_hp_enabled)
4278 spec->active_streams |= 1 << STREAM_INDEP_HP;
4279 call_pcm_playback_hook(hinfo, codec, substream,
4280 HDA_GEN_PCM_ACT_OPEN);
4281 mutex_unlock(&spec->pcm_mutex);
4285 static int alt_playback_pcm_close(struct hda_pcm_stream *hinfo,
4286 struct hda_codec *codec,
4287 struct snd_pcm_substream *substream)
4289 struct hda_gen_spec *spec = codec->spec;
4290 mutex_lock(&spec->pcm_mutex);
4291 spec->active_streams &= ~(1 << STREAM_INDEP_HP);
4292 call_pcm_playback_hook(hinfo, codec, substream,
4293 HDA_GEN_PCM_ACT_CLOSE);
4294 mutex_unlock(&spec->pcm_mutex);
4298 static int alt_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
4299 struct hda_codec *codec,
4300 unsigned int stream_tag,
4301 unsigned int format,
4302 struct snd_pcm_substream *substream)
4304 snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format);
4305 call_pcm_playback_hook(hinfo, codec, substream,
4306 HDA_GEN_PCM_ACT_PREPARE);
4310 static int alt_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
4311 struct hda_codec *codec,
4312 struct snd_pcm_substream *substream)
4314 snd_hda_codec_cleanup_stream(codec, hinfo->nid);
4315 call_pcm_playback_hook(hinfo, codec, substream,
4316 HDA_GEN_PCM_ACT_CLEANUP);
4323 static int dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
4324 struct hda_codec *codec,
4325 struct snd_pcm_substream *substream)
4327 struct hda_gen_spec *spec = codec->spec;
4328 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
4331 static int dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
4332 struct hda_codec *codec,
4333 unsigned int stream_tag,
4334 unsigned int format,
4335 struct snd_pcm_substream *substream)
4337 struct hda_gen_spec *spec = codec->spec;
4338 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
4339 stream_tag, format, substream);
4342 static int dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
4343 struct hda_codec *codec,
4344 struct snd_pcm_substream *substream)
4346 struct hda_gen_spec *spec = codec->spec;
4347 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
4350 static int dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
4351 struct hda_codec *codec,
4352 struct snd_pcm_substream *substream)
4354 struct hda_gen_spec *spec = codec->spec;
4355 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
4361 #define alt_capture_pcm_open capture_pcm_open
4362 #define alt_capture_pcm_close capture_pcm_close
4364 static int alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
4365 struct hda_codec *codec,
4366 unsigned int stream_tag,
4367 unsigned int format,
4368 struct snd_pcm_substream *substream)
4370 struct hda_gen_spec *spec = codec->spec;
4372 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
4373 stream_tag, 0, format);
4374 call_pcm_capture_hook(hinfo, codec, substream,
4375 HDA_GEN_PCM_ACT_PREPARE);
4379 static int alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
4380 struct hda_codec *codec,
4381 struct snd_pcm_substream *substream)
4383 struct hda_gen_spec *spec = codec->spec;
4385 snd_hda_codec_cleanup_stream(codec,
4386 spec->adc_nids[substream->number + 1]);
4387 call_pcm_capture_hook(hinfo, codec, substream,
4388 HDA_GEN_PCM_ACT_CLEANUP);
4394 static const struct hda_pcm_stream pcm_analog_playback = {
4398 /* NID is set in build_pcms */
4400 .open = playback_pcm_open,
4401 .close = playback_pcm_close,
4402 .prepare = playback_pcm_prepare,
4403 .cleanup = playback_pcm_cleanup
4407 static const struct hda_pcm_stream pcm_analog_capture = {
4411 /* NID is set in build_pcms */
4413 .open = capture_pcm_open,
4414 .close = capture_pcm_close,
4415 .prepare = capture_pcm_prepare,
4416 .cleanup = capture_pcm_cleanup
4420 static const struct hda_pcm_stream pcm_analog_alt_playback = {
4424 /* NID is set in build_pcms */
4426 .open = alt_playback_pcm_open,
4427 .close = alt_playback_pcm_close,
4428 .prepare = alt_playback_pcm_prepare,
4429 .cleanup = alt_playback_pcm_cleanup
4433 static const struct hda_pcm_stream pcm_analog_alt_capture = {
4434 .substreams = 2, /* can be overridden */
4437 /* NID is set in build_pcms */
4439 .open = alt_capture_pcm_open,
4440 .close = alt_capture_pcm_close,
4441 .prepare = alt_capture_pcm_prepare,
4442 .cleanup = alt_capture_pcm_cleanup
4446 static const struct hda_pcm_stream pcm_digital_playback = {
4450 /* NID is set in build_pcms */
4452 .open = dig_playback_pcm_open,
4453 .close = dig_playback_pcm_close,
4454 .prepare = dig_playback_pcm_prepare,
4455 .cleanup = dig_playback_pcm_cleanup
4459 static const struct hda_pcm_stream pcm_digital_capture = {
4463 /* NID is set in build_pcms */
4466 /* Used by build_pcms to flag that a PCM has no playback stream */
4467 static const struct hda_pcm_stream pcm_null_stream = {
4474 * dynamic changing ADC PCM streams
4476 static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur)
4478 struct hda_gen_spec *spec = codec->spec;
4479 hda_nid_t new_adc = spec->adc_nids[spec->dyn_adc_idx[cur]];
4481 if (spec->cur_adc && spec->cur_adc != new_adc) {
4482 /* stream is running, let's swap the current ADC */
4483 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
4484 spec->cur_adc = new_adc;
4485 snd_hda_codec_setup_stream(codec, new_adc,
4486 spec->cur_adc_stream_tag, 0,
4487 spec->cur_adc_format);
4493 /* analog capture with dynamic dual-adc changes */
4494 static int dyn_adc_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
4495 struct hda_codec *codec,
4496 unsigned int stream_tag,
4497 unsigned int format,
4498 struct snd_pcm_substream *substream)
4500 struct hda_gen_spec *spec = codec->spec;
4501 spec->cur_adc = spec->adc_nids[spec->dyn_adc_idx[spec->cur_mux[0]]];
4502 spec->cur_adc_stream_tag = stream_tag;
4503 spec->cur_adc_format = format;
4504 snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
4508 static int dyn_adc_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
4509 struct hda_codec *codec,
4510 struct snd_pcm_substream *substream)
4512 struct hda_gen_spec *spec = codec->spec;
4513 snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
4518 static const struct hda_pcm_stream dyn_adc_pcm_analog_capture = {
4522 .nid = 0, /* fill later */
4524 .prepare = dyn_adc_capture_pcm_prepare,
4525 .cleanup = dyn_adc_capture_pcm_cleanup
4529 static void fill_pcm_stream_name(char *str, size_t len, const char *sfx,
4530 const char *chip_name)
4536 strlcpy(str, chip_name, len);
4538 /* drop non-alnum chars after a space */
4539 for (p = strchr(str, ' '); p; p = strchr(p + 1, ' ')) {
4540 if (!isalnum(p[1])) {
4545 strlcat(str, sfx, len);
4548 /* build PCM streams based on the parsed results */
4549 int snd_hda_gen_build_pcms(struct hda_codec *codec)
4551 struct hda_gen_spec *spec = codec->spec;
4552 struct hda_pcm *info = spec->pcm_rec;
4553 const struct hda_pcm_stream *p;
4554 bool have_multi_adcs;
4556 codec->num_pcms = 1;
4557 codec->pcm_info = info;
4559 if (spec->no_analog)
4562 fill_pcm_stream_name(spec->stream_name_analog,
4563 sizeof(spec->stream_name_analog),
4564 " Analog", codec->chip_name);
4565 info->name = spec->stream_name_analog;
4567 if (spec->multiout.num_dacs > 0) {
4568 p = spec->stream_analog_playback;
4570 p = &pcm_analog_playback;
4571 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
4572 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
4573 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
4574 spec->multiout.max_channels;
4575 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT &&
4576 spec->autocfg.line_outs == 2)
4577 info->stream[SNDRV_PCM_STREAM_PLAYBACK].chmap =
4580 if (spec->num_adc_nids) {
4581 p = spec->stream_analog_capture;
4583 if (spec->dyn_adc_switch)
4584 p = &dyn_adc_pcm_analog_capture;
4586 p = &pcm_analog_capture;
4588 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
4589 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
4593 /* SPDIF for stream index #1 */
4594 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
4595 fill_pcm_stream_name(spec->stream_name_digital,
4596 sizeof(spec->stream_name_digital),
4597 " Digital", codec->chip_name);
4598 codec->num_pcms = 2;
4599 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
4600 info = spec->pcm_rec + 1;
4601 info->name = spec->stream_name_digital;
4602 if (spec->dig_out_type)
4603 info->pcm_type = spec->dig_out_type;
4605 info->pcm_type = HDA_PCM_TYPE_SPDIF;
4606 if (spec->multiout.dig_out_nid) {
4607 p = spec->stream_digital_playback;
4609 p = &pcm_digital_playback;
4610 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
4611 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
4613 if (spec->dig_in_nid) {
4614 p = spec->stream_digital_capture;
4616 p = &pcm_digital_capture;
4617 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
4618 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
4622 if (spec->no_analog)
4625 /* If the use of more than one ADC is requested for the current
4626 * model, configure a second analog capture-only PCM.
4628 have_multi_adcs = (spec->num_adc_nids > 1) &&
4629 !spec->dyn_adc_switch && !spec->auto_mic;
4630 /* Additional Analaog capture for index #2 */
4631 if (spec->alt_dac_nid || have_multi_adcs) {
4632 fill_pcm_stream_name(spec->stream_name_alt_analog,
4633 sizeof(spec->stream_name_alt_analog),
4634 " Alt Analog", codec->chip_name);
4635 codec->num_pcms = 3;
4636 info = spec->pcm_rec + 2;
4637 info->name = spec->stream_name_alt_analog;
4638 if (spec->alt_dac_nid) {
4639 p = spec->stream_analog_alt_playback;
4641 p = &pcm_analog_alt_playback;
4642 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
4643 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
4646 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
4648 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
4650 if (have_multi_adcs) {
4651 p = spec->stream_analog_alt_capture;
4653 p = &pcm_analog_alt_capture;
4654 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
4655 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
4657 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
4658 spec->num_adc_nids - 1;
4660 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
4662 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
4668 EXPORT_SYMBOL_HDA(snd_hda_gen_build_pcms);
4672 * Standard auto-parser initializations
4675 /* configure the given path as a proper output */
4676 static void set_output_and_unmute(struct hda_codec *codec, int path_idx)
4678 struct nid_path *path;
4681 path = snd_hda_get_path_from_idx(codec, path_idx);
4682 if (!path || !path->depth)
4684 pin = path->path[path->depth - 1];
4685 restore_pin_ctl(codec, pin);
4686 snd_hda_activate_path(codec, path, path->active, true);
4687 set_pin_eapd(codec, pin, path->active);
4690 /* initialize primary output paths */
4691 static void init_multi_out(struct hda_codec *codec)
4693 struct hda_gen_spec *spec = codec->spec;
4696 for (i = 0; i < spec->autocfg.line_outs; i++)
4697 set_output_and_unmute(codec, spec->out_paths[i]);
4701 static void __init_extra_out(struct hda_codec *codec, int num_outs, int *paths)
4705 for (i = 0; i < num_outs; i++)
4706 set_output_and_unmute(codec, paths[i]);
4709 /* initialize hp and speaker paths */
4710 static void init_extra_out(struct hda_codec *codec)
4712 struct hda_gen_spec *spec = codec->spec;
4714 if (spec->autocfg.line_out_type != AUTO_PIN_HP_OUT)
4715 __init_extra_out(codec, spec->autocfg.hp_outs, spec->hp_paths);
4716 if (spec->autocfg.line_out_type != AUTO_PIN_SPEAKER_OUT)
4717 __init_extra_out(codec, spec->autocfg.speaker_outs,
4718 spec->speaker_paths);
4721 /* initialize multi-io paths */
4722 static void init_multi_io(struct hda_codec *codec)
4724 struct hda_gen_spec *spec = codec->spec;
4727 for (i = 0; i < spec->multi_ios; i++) {
4728 hda_nid_t pin = spec->multi_io[i].pin;
4729 struct nid_path *path;
4730 path = get_multiio_path(codec, i);
4733 if (!spec->multi_io[i].ctl_in)
4734 spec->multi_io[i].ctl_in =
4735 snd_hda_codec_get_pin_target(codec, pin);
4736 snd_hda_activate_path(codec, path, path->active, true);
4740 /* set up input pins and loopback paths */
4741 static void init_analog_input(struct hda_codec *codec)
4743 struct hda_gen_spec *spec = codec->spec;
4744 struct auto_pin_cfg *cfg = &spec->autocfg;
4747 for (i = 0; i < cfg->num_inputs; i++) {
4748 hda_nid_t nid = cfg->inputs[i].pin;
4749 if (is_input_pin(codec, nid))
4750 restore_pin_ctl(codec, nid);
4752 /* init loopback inputs */
4753 if (spec->mixer_nid) {
4754 resume_path_from_idx(codec, spec->loopback_paths[i]);
4755 resume_path_from_idx(codec, spec->loopback_merge_path);
4760 /* initialize ADC paths */
4761 static void init_input_src(struct hda_codec *codec)
4763 struct hda_gen_spec *spec = codec->spec;
4764 struct hda_input_mux *imux = &spec->input_mux;
4765 struct nid_path *path;
4768 if (spec->dyn_adc_switch)
4771 nums = spec->num_adc_nids;
4773 for (c = 0; c < nums; c++) {
4774 for (i = 0; i < imux->num_items; i++) {
4775 path = get_input_path(codec, c, i);
4777 bool active = path->active;
4778 if (i == spec->cur_mux[c])
4780 snd_hda_activate_path(codec, path, active, false);
4785 if (spec->shared_mic_hp)
4786 update_shared_mic_hp(codec, spec->cur_mux[0]);
4788 if (spec->cap_sync_hook)
4789 spec->cap_sync_hook(codec, NULL);
4792 /* set right pin controls for digital I/O */
4793 static void init_digital(struct hda_codec *codec)
4795 struct hda_gen_spec *spec = codec->spec;
4799 for (i = 0; i < spec->autocfg.dig_outs; i++)
4800 set_output_and_unmute(codec, spec->digout_paths[i]);
4801 pin = spec->autocfg.dig_in_pin;
4803 restore_pin_ctl(codec, pin);
4804 resume_path_from_idx(codec, spec->digin_path);
4808 /* clear unsol-event tags on unused pins; Conexant codecs seem to leave
4809 * invalid unsol tags by some reason
4811 static void clear_unsol_on_unused_pins(struct hda_codec *codec)
4815 for (i = 0; i < codec->init_pins.used; i++) {
4816 struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
4817 hda_nid_t nid = pin->nid;
4818 if (is_jack_detectable(codec, nid) &&
4819 !snd_hda_jack_tbl_get(codec, nid))
4820 snd_hda_codec_update_cache(codec, nid, 0,
4821 AC_VERB_SET_UNSOLICITED_ENABLE, 0);
4826 * initialize the generic spec;
4827 * this can be put as patch_ops.init function
4829 int snd_hda_gen_init(struct hda_codec *codec)
4831 struct hda_gen_spec *spec = codec->spec;
4833 if (spec->init_hook)
4834 spec->init_hook(codec);
4836 snd_hda_apply_verbs(codec);
4838 codec->cached_write = 1;
4840 init_multi_out(codec);
4841 init_extra_out(codec);
4842 init_multi_io(codec);
4843 init_analog_input(codec);
4844 init_input_src(codec);
4845 init_digital(codec);
4847 clear_unsol_on_unused_pins(codec);
4849 /* call init functions of standard auto-mute helpers */
4850 update_automute_all(codec);
4852 snd_hda_codec_flush_cache(codec);
4854 if (spec->vmaster_mute.sw_kctl && spec->vmaster_mute.hook)
4855 snd_hda_sync_vmaster_hook(&spec->vmaster_mute);
4857 hda_call_check_power_status(codec, 0x01);
4860 EXPORT_SYMBOL_HDA(snd_hda_gen_init);
4863 * free the generic spec;
4864 * this can be put as patch_ops.free function
4866 void snd_hda_gen_free(struct hda_codec *codec)
4868 snd_hda_gen_spec_free(codec->spec);
4872 EXPORT_SYMBOL_HDA(snd_hda_gen_free);
4876 * check the loopback power save state;
4877 * this can be put as patch_ops.check_power_status function
4879 int snd_hda_gen_check_power_status(struct hda_codec *codec, hda_nid_t nid)
4881 struct hda_gen_spec *spec = codec->spec;
4882 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
4884 EXPORT_SYMBOL_HDA(snd_hda_gen_check_power_status);
4889 * the generic codec support
4892 static const struct hda_codec_ops generic_patch_ops = {
4893 .build_controls = snd_hda_gen_build_controls,
4894 .build_pcms = snd_hda_gen_build_pcms,
4895 .init = snd_hda_gen_init,
4896 .free = snd_hda_gen_free,
4897 .unsol_event = snd_hda_jack_unsol_event,
4899 .check_power_status = snd_hda_gen_check_power_status,
4903 int snd_hda_parse_generic_codec(struct hda_codec *codec)
4905 struct hda_gen_spec *spec;
4908 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4911 snd_hda_gen_spec_init(spec);
4914 err = snd_hda_parse_pin_defcfg(codec, &spec->autocfg, NULL, 0);
4918 err = snd_hda_gen_parse_auto_config(codec, &spec->autocfg);
4922 codec->patch_ops = generic_patch_ops;
4926 snd_hda_gen_free(codec);
4929 EXPORT_SYMBOL_HDA(snd_hda_parse_generic_codec);