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/ctype.h>
28 #include <linux/string.h>
29 #include <sound/core.h>
30 #include <sound/jack.h>
31 #include "hda_codec.h"
32 #include "hda_local.h"
33 #include "hda_auto_parser.h"
35 #include "hda_generic.h"
38 /* initialize hda_gen_spec struct */
39 int snd_hda_gen_spec_init(struct hda_gen_spec *spec)
41 snd_array_init(&spec->kctls, sizeof(struct snd_kcontrol_new), 32);
42 snd_array_init(&spec->paths, sizeof(struct nid_path), 8);
43 mutex_init(&spec->pcm_mutex);
46 EXPORT_SYMBOL_HDA(snd_hda_gen_spec_init);
48 struct snd_kcontrol_new *
49 snd_hda_gen_add_kctl(struct hda_gen_spec *spec, const char *name,
50 const struct snd_kcontrol_new *temp)
52 struct snd_kcontrol_new *knew = snd_array_new(&spec->kctls);
57 knew->name = kstrdup(name, GFP_KERNEL);
59 knew->name = kstrdup(knew->name, GFP_KERNEL);
64 EXPORT_SYMBOL_HDA(snd_hda_gen_add_kctl);
66 static void free_kctls(struct hda_gen_spec *spec)
68 if (spec->kctls.list) {
69 struct snd_kcontrol_new *kctl = spec->kctls.list;
71 for (i = 0; i < spec->kctls.used; i++)
74 snd_array_free(&spec->kctls);
77 void snd_hda_gen_spec_free(struct hda_gen_spec *spec)
82 snd_array_free(&spec->paths);
84 EXPORT_SYMBOL_HDA(snd_hda_gen_spec_free);
87 * pin control value accesses
90 #define update_pin_ctl(codec, pin, val) \
91 snd_hda_codec_update_cache(codec, pin, 0, \
92 AC_VERB_SET_PIN_WIDGET_CONTROL, val)
94 /* restore the pinctl based on the cached value */
95 static inline void restore_pin_ctl(struct hda_codec *codec, hda_nid_t pin)
97 update_pin_ctl(codec, pin, snd_hda_codec_get_pin_target(codec, pin));
100 /* set the pinctl target value and write it if requested */
101 static void set_pin_target(struct hda_codec *codec, hda_nid_t pin,
102 unsigned int val, bool do_write)
106 val = snd_hda_correct_pin_ctl(codec, pin, val);
107 snd_hda_codec_set_pin_target(codec, pin, val);
109 update_pin_ctl(codec, pin, val);
112 /* set pinctl target values for all given pins */
113 static void set_pin_targets(struct hda_codec *codec, int num_pins,
114 hda_nid_t *pins, unsigned int val)
117 for (i = 0; i < num_pins; i++)
118 set_pin_target(codec, pins[i], val, false);
125 /* return the position of NID in the list, or -1 if not found */
126 static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
129 for (i = 0; i < nums; i++)
135 /* return true if the given NID is contained in the path */
136 static bool is_nid_contained(struct nid_path *path, hda_nid_t nid)
138 return find_idx_in_nid_list(nid, path->path, path->depth) >= 0;
141 static struct nid_path *get_nid_path(struct hda_codec *codec,
142 hda_nid_t from_nid, hda_nid_t to_nid,
145 struct hda_gen_spec *spec = codec->spec;
148 for (i = 0; i < spec->paths.used; i++) {
149 struct nid_path *path = snd_array_elem(&spec->paths, i);
150 if (path->depth <= 0)
152 if ((!from_nid || path->path[0] == from_nid) &&
153 (!to_nid || path->path[path->depth - 1] == to_nid)) {
155 (anchor_nid > 0 && is_nid_contained(path, anchor_nid)) ||
156 (anchor_nid < 0 && !is_nid_contained(path, anchor_nid)))
163 /* get the path between the given NIDs;
164 * passing 0 to either @pin or @dac behaves as a wildcard
166 struct nid_path *snd_hda_get_nid_path(struct hda_codec *codec,
167 hda_nid_t from_nid, hda_nid_t to_nid)
169 return get_nid_path(codec, from_nid, to_nid, 0);
171 EXPORT_SYMBOL_HDA(snd_hda_get_nid_path);
173 /* get the index number corresponding to the path instance;
174 * the index starts from 1, for easier checking the invalid value
176 int snd_hda_get_path_idx(struct hda_codec *codec, struct nid_path *path)
178 struct hda_gen_spec *spec = codec->spec;
179 struct nid_path *array = spec->paths.list;
182 if (!spec->paths.used)
185 if (idx < 0 || idx >= spec->paths.used)
190 /* get the path instance corresponding to the given index number */
191 struct nid_path *snd_hda_get_path_from_idx(struct hda_codec *codec, int idx)
193 struct hda_gen_spec *spec = codec->spec;
195 if (idx <= 0 || idx > spec->paths.used)
197 return snd_array_elem(&spec->paths, idx - 1);
200 /* check whether the given DAC is already found in any existing paths */
201 static bool is_dac_already_used(struct hda_codec *codec, hda_nid_t nid)
203 struct hda_gen_spec *spec = codec->spec;
206 for (i = 0; i < spec->paths.used; i++) {
207 struct nid_path *path = snd_array_elem(&spec->paths, i);
208 if (path->path[0] == nid)
214 /* check whether the given two widgets can be connected */
215 static bool is_reachable_path(struct hda_codec *codec,
216 hda_nid_t from_nid, hda_nid_t to_nid)
218 if (!from_nid || !to_nid)
220 return snd_hda_get_conn_index(codec, to_nid, from_nid, true) >= 0;
223 /* nid, dir and idx */
224 #define AMP_VAL_COMPARE_MASK (0xffff | (1U << 18) | (0x0f << 19))
226 /* check whether the given ctl is already assigned in any path elements */
227 static bool is_ctl_used(struct hda_codec *codec, unsigned int val, int type)
229 struct hda_gen_spec *spec = codec->spec;
232 val &= AMP_VAL_COMPARE_MASK;
233 for (i = 0; i < spec->paths.used; i++) {
234 struct nid_path *path = snd_array_elem(&spec->paths, i);
235 if ((path->ctls[type] & AMP_VAL_COMPARE_MASK) == val)
241 /* check whether a control with the given (nid, dir, idx) was assigned */
242 static bool is_ctl_associated(struct hda_codec *codec, hda_nid_t nid,
245 unsigned int val = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
246 return is_ctl_used(codec, val, NID_PATH_VOL_CTL) ||
247 is_ctl_used(codec, val, NID_PATH_MUTE_CTL);
250 static void print_nid_path(const char *pfx, struct nid_path *path)
257 for (i = 0; i < path->depth; i++) {
259 sprintf(tmp, ":%02x", path->path[i]);
260 strlcat(buf, tmp, sizeof(buf));
262 snd_printdd("%s path: depth=%d %s\n", pfx, path->depth, buf);
265 /* called recursively */
266 static bool __parse_nid_path(struct hda_codec *codec,
267 hda_nid_t from_nid, hda_nid_t to_nid,
268 int anchor_nid, struct nid_path *path,
271 const hda_nid_t *conn;
274 if (to_nid == anchor_nid)
275 anchor_nid = 0; /* anchor passed */
276 else if (to_nid == (hda_nid_t)(-anchor_nid))
277 return false; /* hit the exclusive nid */
279 nums = snd_hda_get_conn_list(codec, to_nid, &conn);
280 for (i = 0; i < nums; i++) {
281 if (conn[i] != from_nid) {
282 /* special case: when from_nid is 0,
283 * try to find an empty DAC
286 get_wcaps_type(get_wcaps(codec, conn[i])) != AC_WID_AUD_OUT ||
287 is_dac_already_used(codec, conn[i]))
290 /* anchor is not requested or already passed? */
294 if (depth >= MAX_NID_PATH_DEPTH)
296 for (i = 0; i < nums; i++) {
298 type = get_wcaps_type(get_wcaps(codec, conn[i]));
299 if (type == AC_WID_AUD_OUT || type == AC_WID_AUD_IN ||
302 if (__parse_nid_path(codec, from_nid, conn[i],
303 anchor_nid, path, depth + 1))
309 path->path[path->depth] = conn[i];
310 path->idx[path->depth + 1] = i;
311 if (nums > 1 && get_wcaps_type(get_wcaps(codec, to_nid)) != AC_WID_AUD_MIX)
312 path->multi[path->depth + 1] = 1;
317 /* parse the widget path from the given nid to the target nid;
318 * when @from_nid is 0, try to find an empty DAC;
319 * when @anchor_nid is set to a positive value, only paths through the widget
320 * with the given value are evaluated.
321 * when @anchor_nid is set to a negative value, paths through the widget
322 * with the negative of given value are excluded, only other paths are chosen.
323 * when @anchor_nid is zero, no special handling about path selection.
325 bool snd_hda_parse_nid_path(struct hda_codec *codec, hda_nid_t from_nid,
326 hda_nid_t to_nid, int anchor_nid,
327 struct nid_path *path)
329 if (__parse_nid_path(codec, from_nid, to_nid, anchor_nid, path, 1)) {
330 path->path[path->depth] = to_nid;
336 EXPORT_SYMBOL_HDA(snd_hda_parse_nid_path);
339 * parse the path between the given NIDs and add to the path list.
340 * if no valid path is found, return NULL
343 snd_hda_add_new_path(struct hda_codec *codec, hda_nid_t from_nid,
344 hda_nid_t to_nid, int anchor_nid)
346 struct hda_gen_spec *spec = codec->spec;
347 struct nid_path *path;
349 if (from_nid && to_nid && !is_reachable_path(codec, from_nid, to_nid))
352 /* check whether the path has been already added */
353 path = get_nid_path(codec, from_nid, to_nid, anchor_nid);
357 path = snd_array_new(&spec->paths);
360 memset(path, 0, sizeof(*path));
361 if (snd_hda_parse_nid_path(codec, from_nid, to_nid, anchor_nid, path))
367 EXPORT_SYMBOL_HDA(snd_hda_add_new_path);
369 /* clear the given path as invalid so that it won't be picked up later */
370 static void invalidate_nid_path(struct hda_codec *codec, int idx)
372 struct nid_path *path = snd_hda_get_path_from_idx(codec, idx);
375 memset(path, 0, sizeof(*path));
378 /* look for an empty DAC slot */
379 static hda_nid_t look_for_dac(struct hda_codec *codec, hda_nid_t pin,
382 struct hda_gen_spec *spec = codec->spec;
386 for (i = 0; i < spec->num_all_dacs; i++) {
387 hda_nid_t nid = spec->all_dacs[i];
388 if (!nid || is_dac_already_used(codec, nid))
390 cap_digital = !!(get_wcaps(codec, nid) & AC_WCAP_DIGITAL);
391 if (is_digital != cap_digital)
393 if (is_reachable_path(codec, nid, pin))
399 /* replace the channels in the composed amp value with the given number */
400 static unsigned int amp_val_replace_channels(unsigned int val, unsigned int chs)
402 val &= ~(0x3U << 16);
407 /* check whether the widget has the given amp capability for the direction */
408 static bool check_amp_caps(struct hda_codec *codec, hda_nid_t nid,
409 int dir, unsigned int bits)
413 if (get_wcaps(codec, nid) & (1 << (dir + 1)))
414 if (query_amp_caps(codec, nid, dir) & bits)
419 #define nid_has_mute(codec, nid, dir) \
420 check_amp_caps(codec, nid, dir, AC_AMPCAP_MUTE)
421 #define nid_has_volume(codec, nid, dir) \
422 check_amp_caps(codec, nid, dir, AC_AMPCAP_NUM_STEPS)
424 /* look for a widget suitable for assigning a mute switch in the path */
425 static hda_nid_t look_for_out_mute_nid(struct hda_codec *codec,
426 struct nid_path *path)
430 for (i = path->depth - 1; i >= 0; i--) {
431 if (nid_has_mute(codec, path->path[i], HDA_OUTPUT))
432 return path->path[i];
433 if (i != path->depth - 1 && i != 0 &&
434 nid_has_mute(codec, path->path[i], HDA_INPUT))
435 return path->path[i];
440 /* look for a widget suitable for assigning a volume ctl in the path */
441 static hda_nid_t look_for_out_vol_nid(struct hda_codec *codec,
442 struct nid_path *path)
446 for (i = path->depth - 1; i >= 0; i--) {
447 if (nid_has_volume(codec, path->path[i], HDA_OUTPUT))
448 return path->path[i];
454 * path activation / deactivation
457 /* can have the amp-in capability? */
458 static bool has_amp_in(struct hda_codec *codec, struct nid_path *path, int idx)
460 hda_nid_t nid = path->path[idx];
461 unsigned int caps = get_wcaps(codec, nid);
462 unsigned int type = get_wcaps_type(caps);
464 if (!(caps & AC_WCAP_IN_AMP))
466 if (type == AC_WID_PIN && idx > 0) /* only for input pins */
471 /* can have the amp-out capability? */
472 static bool has_amp_out(struct hda_codec *codec, struct nid_path *path, int idx)
474 hda_nid_t nid = path->path[idx];
475 unsigned int caps = get_wcaps(codec, nid);
476 unsigned int type = get_wcaps_type(caps);
478 if (!(caps & AC_WCAP_OUT_AMP))
480 if (type == AC_WID_PIN && !idx) /* only for output pins */
485 /* check whether the given (nid,dir,idx) is active */
486 static bool is_active_nid(struct hda_codec *codec, hda_nid_t nid,
487 unsigned int idx, unsigned int dir)
489 struct hda_gen_spec *spec = codec->spec;
492 for (n = 0; n < spec->paths.used; n++) {
493 struct nid_path *path = snd_array_elem(&spec->paths, n);
496 for (i = 0; i < path->depth; i++) {
497 if (path->path[i] == nid) {
498 if (dir == HDA_OUTPUT || path->idx[i] == idx)
507 /* get the default amp value for the target state */
508 static int get_amp_val_to_activate(struct hda_codec *codec, hda_nid_t nid,
509 int dir, bool enable)
512 unsigned int val = 0;
514 caps = query_amp_caps(codec, nid, dir);
515 if (caps & AC_AMPCAP_NUM_STEPS) {
518 val = (caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT;
520 if (caps & AC_AMPCAP_MUTE) {
527 /* initialize the amp value (only at the first time) */
528 static void init_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx)
530 int val = get_amp_val_to_activate(codec, nid, dir, false);
531 snd_hda_codec_amp_init_stereo(codec, nid, dir, idx, 0xff, val);
534 static void activate_amp(struct hda_codec *codec, hda_nid_t nid, int dir,
535 int idx, bool enable)
538 if (is_ctl_associated(codec, nid, dir, idx) ||
539 (!enable && is_active_nid(codec, nid, dir, idx)))
541 val = get_amp_val_to_activate(codec, nid, dir, enable);
542 snd_hda_codec_amp_stereo(codec, nid, dir, idx, 0xff, val);
545 static void activate_amp_out(struct hda_codec *codec, struct nid_path *path,
548 hda_nid_t nid = path->path[i];
549 init_amp(codec, nid, HDA_OUTPUT, 0);
550 activate_amp(codec, nid, HDA_OUTPUT, 0, enable);
553 static void activate_amp_in(struct hda_codec *codec, struct nid_path *path,
554 int i, bool enable, bool add_aamix)
556 struct hda_gen_spec *spec = codec->spec;
557 const hda_nid_t *conn;
560 hda_nid_t nid = path->path[i];
562 nums = snd_hda_get_conn_list(codec, nid, &conn);
563 type = get_wcaps_type(get_wcaps(codec, nid));
564 if (type == AC_WID_PIN ||
565 (type == AC_WID_AUD_IN && codec->single_adc_amp)) {
571 for (n = 0; n < nums; n++)
572 init_amp(codec, nid, HDA_INPUT, n);
574 if (is_ctl_associated(codec, nid, HDA_INPUT, idx))
577 /* here is a little bit tricky in comparison with activate_amp_out();
578 * when aa-mixer is available, we need to enable the path as well
580 for (n = 0; n < nums; n++) {
581 if (n != idx && (!add_aamix || conn[n] != spec->mixer_nid))
583 activate_amp(codec, nid, HDA_INPUT, n, enable);
587 /* activate or deactivate the given path
588 * if @add_aamix is set, enable the input from aa-mix NID as well (if any)
590 void snd_hda_activate_path(struct hda_codec *codec, struct nid_path *path,
591 bool enable, bool add_aamix)
596 path->active = false;
598 for (i = path->depth - 1; i >= 0; i--) {
599 if (enable && path->multi[i])
600 snd_hda_codec_write_cache(codec, path->path[i], 0,
601 AC_VERB_SET_CONNECT_SEL,
603 if (has_amp_in(codec, path, i))
604 activate_amp_in(codec, path, i, enable, add_aamix);
605 if (has_amp_out(codec, path, i))
606 activate_amp_out(codec, path, i, enable);
612 EXPORT_SYMBOL_HDA(snd_hda_activate_path);
614 /* turn on/off EAPD on the given pin */
615 static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable)
617 struct hda_gen_spec *spec = codec->spec;
618 if (spec->own_eapd_ctl ||
619 !(snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD))
623 snd_hda_codec_update_cache(codec, pin, 0,
624 AC_VERB_SET_EAPD_BTLENABLE,
625 enable ? 0x02 : 0x00);
630 * Helper functions for creating mixer ctl elements
638 static const struct snd_kcontrol_new control_templates[] = {
639 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
640 HDA_CODEC_MUTE(NULL, 0, 0, 0),
641 HDA_BIND_MUTE(NULL, 0, 0, 0),
644 /* add dynamic controls from template */
645 static int add_control(struct hda_gen_spec *spec, int type, const char *name,
646 int cidx, unsigned long val)
648 struct snd_kcontrol_new *knew;
650 knew = snd_hda_gen_add_kctl(spec, name, &control_templates[type]);
654 if (get_amp_nid_(val))
655 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
656 knew->private_value = val;
660 static int add_control_with_pfx(struct hda_gen_spec *spec, int type,
661 const char *pfx, const char *dir,
662 const char *sfx, int cidx, unsigned long val)
665 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
666 return add_control(spec, type, name, cidx, val);
669 #define add_pb_vol_ctrl(spec, type, pfx, val) \
670 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", 0, val)
671 #define add_pb_sw_ctrl(spec, type, pfx, val) \
672 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", 0, val)
673 #define __add_pb_vol_ctrl(spec, type, pfx, cidx, val) \
674 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", cidx, val)
675 #define __add_pb_sw_ctrl(spec, type, pfx, cidx, val) \
676 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", cidx, val)
678 static int add_vol_ctl(struct hda_codec *codec, const char *pfx, int cidx,
679 unsigned int chs, struct nid_path *path)
684 val = path->ctls[NID_PATH_VOL_CTL];
687 val = amp_val_replace_channels(val, chs);
688 return __add_pb_vol_ctrl(codec->spec, HDA_CTL_WIDGET_VOL, pfx, cidx, val);
691 /* return the channel bits suitable for the given path->ctls[] */
692 static int get_default_ch_nums(struct hda_codec *codec, struct nid_path *path,
695 int chs = 1; /* mono (left only) */
697 hda_nid_t nid = get_amp_nid_(path->ctls[type]);
698 if (nid && (get_wcaps(codec, nid) & AC_WCAP_STEREO))
699 chs = 3; /* stereo */
704 static int add_stereo_vol(struct hda_codec *codec, const char *pfx, int cidx,
705 struct nid_path *path)
707 int chs = get_default_ch_nums(codec, path, NID_PATH_VOL_CTL);
708 return add_vol_ctl(codec, pfx, cidx, chs, path);
711 /* create a mute-switch for the given mixer widget;
712 * if it has multiple sources (e.g. DAC and loopback), create a bind-mute
714 static int add_sw_ctl(struct hda_codec *codec, const char *pfx, int cidx,
715 unsigned int chs, struct nid_path *path)
718 int type = HDA_CTL_WIDGET_MUTE;
722 val = path->ctls[NID_PATH_MUTE_CTL];
725 val = amp_val_replace_channels(val, chs);
726 if (get_amp_direction_(val) == HDA_INPUT) {
727 hda_nid_t nid = get_amp_nid_(val);
728 int nums = snd_hda_get_num_conns(codec, nid);
730 type = HDA_CTL_BIND_MUTE;
734 return __add_pb_sw_ctrl(codec->spec, type, pfx, cidx, val);
737 static int add_stereo_sw(struct hda_codec *codec, const char *pfx,
738 int cidx, struct nid_path *path)
740 int chs = get_default_ch_nums(codec, path, NID_PATH_MUTE_CTL);
741 return add_sw_ctl(codec, pfx, cidx, chs, path);
744 static const char * const channel_name[4] = {
745 "Front", "Surround", "CLFE", "Side"
748 /* give some appropriate ctl name prefix for the given line out channel */
749 static const char *get_line_out_pfx(struct hda_gen_spec *spec, int ch,
750 bool can_be_master, int *index)
752 struct auto_pin_cfg *cfg = &spec->autocfg;
755 if (cfg->line_outs == 1 && !spec->multi_ios &&
756 !cfg->hp_outs && !cfg->speaker_outs && can_be_master)
757 return spec->vmaster_mute.hook ? "PCM" : "Master";
759 /* if there is really a single DAC used in the whole output paths,
760 * use it master (or "PCM" if a vmaster hook is present)
762 if (spec->multiout.num_dacs == 1 && !spec->mixer_nid &&
763 !spec->multiout.hp_out_nid[0] && !spec->multiout.extra_out_nid[0])
764 return spec->vmaster_mute.hook ? "PCM" : "Master";
766 switch (cfg->line_out_type) {
767 case AUTO_PIN_SPEAKER_OUT:
768 if (cfg->line_outs == 1)
770 if (cfg->line_outs == 2)
771 return ch ? "Bass Speaker" : "Speaker";
773 case AUTO_PIN_HP_OUT:
774 /* for multi-io case, only the primary out */
775 if (ch && spec->multi_ios)
780 if (cfg->line_outs == 1 && !spec->multi_ios)
784 if (ch >= ARRAY_SIZE(channel_name)) {
789 return channel_name[ch];
796 /* badness definition */
798 /* No primary DAC is found for the main output */
799 BAD_NO_PRIMARY_DAC = 0x10000,
800 /* No DAC is found for the extra output */
802 /* No possible multi-ios */
803 BAD_MULTI_IO = 0x103,
804 /* No individual DAC for extra output */
805 BAD_NO_EXTRA_DAC = 0x102,
806 /* No individual DAC for extra surrounds */
807 BAD_NO_EXTRA_SURR_DAC = 0x101,
808 /* Primary DAC shared with main surrounds */
809 BAD_SHARED_SURROUND = 0x100,
810 /* Primary DAC shared with main CLFE */
811 BAD_SHARED_CLFE = 0x10,
812 /* Primary DAC shared with extra surrounds */
813 BAD_SHARED_EXTRA_SURROUND = 0x10,
814 /* Volume widget is shared */
815 BAD_SHARED_VOL = 0x10,
818 /* look for widgets in the given path which are appropriate for
819 * volume and mute controls, and assign the values to ctls[].
821 * When no appropriate widget is found in the path, the badness value
822 * is incremented depending on the situation. The function returns the
823 * total badness for both volume and mute controls.
825 static int assign_out_path_ctls(struct hda_codec *codec, struct nid_path *path)
832 return BAD_SHARED_VOL * 2;
834 if (path->ctls[NID_PATH_VOL_CTL] ||
835 path->ctls[NID_PATH_MUTE_CTL])
836 return 0; /* already evaluated */
838 nid = look_for_out_vol_nid(codec, path);
840 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
841 if (is_ctl_used(codec, val, NID_PATH_VOL_CTL))
842 badness += BAD_SHARED_VOL;
844 path->ctls[NID_PATH_VOL_CTL] = val;
846 badness += BAD_SHARED_VOL;
847 nid = look_for_out_mute_nid(codec, path);
849 unsigned int wid_type = get_wcaps_type(get_wcaps(codec, nid));
850 if (wid_type == AC_WID_PIN || wid_type == AC_WID_AUD_OUT ||
851 nid_has_mute(codec, nid, HDA_OUTPUT))
852 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
854 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT);
855 if (is_ctl_used(codec, val, NID_PATH_MUTE_CTL))
856 badness += BAD_SHARED_VOL;
858 path->ctls[NID_PATH_MUTE_CTL] = val;
860 badness += BAD_SHARED_VOL;
864 struct badness_table {
865 int no_primary_dac; /* no primary DAC */
866 int no_dac; /* no secondary DACs */
867 int shared_primary; /* primary DAC is shared with main output */
868 int shared_surr; /* secondary DAC shared with main or primary */
869 int shared_clfe; /* third DAC shared with main or primary */
870 int shared_surr_main; /* secondary DAC sahred with main/DAC0 */
873 static struct badness_table main_out_badness = {
874 .no_primary_dac = BAD_NO_PRIMARY_DAC,
875 .no_dac = BAD_NO_DAC,
876 .shared_primary = BAD_NO_PRIMARY_DAC,
877 .shared_surr = BAD_SHARED_SURROUND,
878 .shared_clfe = BAD_SHARED_CLFE,
879 .shared_surr_main = BAD_SHARED_SURROUND,
882 static struct badness_table extra_out_badness = {
883 .no_primary_dac = BAD_NO_DAC,
884 .no_dac = BAD_NO_DAC,
885 .shared_primary = BAD_NO_EXTRA_DAC,
886 .shared_surr = BAD_SHARED_EXTRA_SURROUND,
887 .shared_clfe = BAD_SHARED_EXTRA_SURROUND,
888 .shared_surr_main = BAD_NO_EXTRA_SURR_DAC,
891 /* get the DAC of the primary output corresponding to the given array index */
892 static hda_nid_t get_primary_out(struct hda_codec *codec, int idx)
894 struct hda_gen_spec *spec = codec->spec;
895 struct auto_pin_cfg *cfg = &spec->autocfg;
897 if (cfg->line_outs > idx)
898 return spec->private_dac_nids[idx];
899 idx -= cfg->line_outs;
900 if (spec->multi_ios > idx)
901 return spec->multi_io[idx].dac;
905 /* return the DAC if it's reachable, otherwise zero */
906 static inline hda_nid_t try_dac(struct hda_codec *codec,
907 hda_nid_t dac, hda_nid_t pin)
909 return is_reachable_path(codec, dac, pin) ? dac : 0;
912 /* try to assign DACs to pins and return the resultant badness */
913 static int try_assign_dacs(struct hda_codec *codec, int num_outs,
914 const hda_nid_t *pins, hda_nid_t *dacs,
916 const struct badness_table *bad)
918 struct hda_gen_spec *spec = codec->spec;
926 for (i = 0; i < num_outs; i++) {
927 struct nid_path *path;
928 hda_nid_t pin = pins[i];
930 path = snd_hda_get_path_from_idx(codec, path_idx[i]);
932 badness += assign_out_path_ctls(codec, path);
936 dacs[i] = look_for_dac(codec, pin, false);
937 if (!dacs[i] && !i) {
938 /* try to steal the DAC of surrounds for the front */
939 for (j = 1; j < num_outs; j++) {
940 if (is_reachable_path(codec, dacs[j], pin)) {
943 invalidate_nid_path(codec, path_idx[j]);
952 dac = try_dac(codec, get_primary_out(codec, i), pin);
954 dac = try_dac(codec, dacs[0], pin);
956 dac = try_dac(codec, get_primary_out(codec, i), pin);
959 badness += bad->shared_primary;
961 badness += bad->shared_surr;
963 badness += bad->shared_clfe;
964 } else if (is_reachable_path(codec, spec->private_dac_nids[0], pin)) {
965 dac = spec->private_dac_nids[0];
966 badness += bad->shared_surr_main;
968 badness += bad->no_primary_dac;
970 badness += bad->no_dac;
972 path = snd_hda_add_new_path(codec, dac, pin, -spec->mixer_nid);
973 if (!path && !i && spec->mixer_nid) {
975 path = snd_hda_add_new_path(codec, dac, pin, 0);
980 print_nid_path("output", path);
982 path_idx[i] = snd_hda_get_path_idx(codec, path);
983 badness += assign_out_path_ctls(codec, path);
990 /* return NID if the given pin has only a single connection to a certain DAC */
991 static hda_nid_t get_dac_if_single(struct hda_codec *codec, hda_nid_t pin)
993 struct hda_gen_spec *spec = codec->spec;
995 hda_nid_t nid_found = 0;
997 for (i = 0; i < spec->num_all_dacs; i++) {
998 hda_nid_t nid = spec->all_dacs[i];
999 if (!nid || is_dac_already_used(codec, nid))
1001 if (is_reachable_path(codec, nid, pin)) {
1010 /* check whether the given pin can be a multi-io pin */
1011 static bool can_be_multiio_pin(struct hda_codec *codec,
1012 unsigned int location, hda_nid_t nid)
1014 unsigned int defcfg, caps;
1016 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1017 if (get_defcfg_connect(defcfg) != AC_JACK_PORT_COMPLEX)
1019 if (location && get_defcfg_location(defcfg) != location)
1021 caps = snd_hda_query_pin_caps(codec, nid);
1022 if (!(caps & AC_PINCAP_OUT))
1027 /* count the number of input pins that are capable to be multi-io */
1028 static int count_multiio_pins(struct hda_codec *codec, hda_nid_t reference_pin)
1030 struct hda_gen_spec *spec = codec->spec;
1031 struct auto_pin_cfg *cfg = &spec->autocfg;
1032 unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin);
1033 unsigned int location = get_defcfg_location(defcfg);
1037 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
1038 for (i = 0; i < cfg->num_inputs; i++) {
1039 if (cfg->inputs[i].type != type)
1041 if (can_be_multiio_pin(codec, location,
1042 cfg->inputs[i].pin))
1052 * When hardwired is set, try to fill ony hardwired pins, and returns
1053 * zero if any pins are filled, non-zero if nothing found.
1054 * When hardwired is off, try to fill possible input pins, and returns
1055 * the badness value.
1057 static int fill_multi_ios(struct hda_codec *codec,
1058 hda_nid_t reference_pin,
1061 struct hda_gen_spec *spec = codec->spec;
1062 struct auto_pin_cfg *cfg = &spec->autocfg;
1063 int type, i, j, num_pins, old_pins;
1064 unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin);
1065 unsigned int location = get_defcfg_location(defcfg);
1067 struct nid_path *path;
1069 old_pins = spec->multi_ios;
1073 num_pins = count_multiio_pins(codec, reference_pin);
1077 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
1078 for (i = 0; i < cfg->num_inputs; i++) {
1079 hda_nid_t nid = cfg->inputs[i].pin;
1082 if (cfg->inputs[i].type != type)
1084 if (!can_be_multiio_pin(codec, location, nid))
1086 for (j = 0; j < spec->multi_ios; j++) {
1087 if (nid == spec->multi_io[j].pin)
1090 if (j < spec->multi_ios)
1094 dac = get_dac_if_single(codec, nid);
1096 dac = look_for_dac(codec, nid, false);
1101 path = snd_hda_add_new_path(codec, dac, nid,
1107 print_nid_path("multiio", path);
1108 spec->multi_io[spec->multi_ios].pin = nid;
1109 spec->multi_io[spec->multi_ios].dac = dac;
1110 spec->out_paths[cfg->line_outs + spec->multi_ios] =
1111 snd_hda_get_path_idx(codec, path);
1113 if (spec->multi_ios >= 2)
1119 badness = BAD_MULTI_IO;
1120 if (old_pins == spec->multi_ios) {
1122 return 1; /* nothing found */
1124 return badness; /* no badness if nothing found */
1126 if (!hardwired && spec->multi_ios < 2) {
1127 /* cancel newly assigned paths */
1128 spec->paths.used -= spec->multi_ios - old_pins;
1129 spec->multi_ios = old_pins;
1133 /* assign volume and mute controls */
1134 for (i = old_pins; i < spec->multi_ios; i++) {
1135 path = snd_hda_get_path_from_idx(codec, spec->out_paths[cfg->line_outs + i]);
1136 badness += assign_out_path_ctls(codec, path);
1142 /* map DACs for all pins in the list if they are single connections */
1143 static bool map_singles(struct hda_codec *codec, int outs,
1144 const hda_nid_t *pins, hda_nid_t *dacs, int *path_idx)
1146 struct hda_gen_spec *spec = codec->spec;
1149 for (i = 0; i < outs; i++) {
1150 struct nid_path *path;
1154 dac = get_dac_if_single(codec, pins[i]);
1157 path = snd_hda_add_new_path(codec, dac, pins[i],
1159 if (!path && !i && spec->mixer_nid)
1160 path = snd_hda_add_new_path(codec, dac, pins[i], 0);
1164 print_nid_path("output", path);
1165 path->active = true;
1166 path_idx[i] = snd_hda_get_path_idx(codec, path);
1172 /* create a new path including aamix if available, and return its index */
1173 static int check_aamix_out_path(struct hda_codec *codec, int path_idx)
1175 struct hda_gen_spec *spec = codec->spec;
1176 struct nid_path *path;
1178 path = snd_hda_get_path_from_idx(codec, path_idx);
1179 if (!path || !path->depth ||
1180 is_nid_contained(path, spec->mixer_nid))
1182 path = snd_hda_add_new_path(codec, path->path[0],
1183 path->path[path->depth - 1],
1187 print_nid_path("output-aamix", path);
1188 path->active = false; /* unused as default */
1189 return snd_hda_get_path_idx(codec, path);
1192 /* fill the empty entries in the dac array for speaker/hp with the
1193 * shared dac pointed by the paths
1195 static void refill_shared_dacs(struct hda_codec *codec, int num_outs,
1196 hda_nid_t *dacs, int *path_idx)
1198 struct nid_path *path;
1201 for (i = 0; i < num_outs; i++) {
1204 path = snd_hda_get_path_from_idx(codec, path_idx[i]);
1207 dacs[i] = path->path[0];
1211 /* fill in the dac_nids table from the parsed pin configuration */
1212 static int fill_and_eval_dacs(struct hda_codec *codec,
1213 bool fill_hardwired,
1214 bool fill_mio_first)
1216 struct hda_gen_spec *spec = codec->spec;
1217 struct auto_pin_cfg *cfg = &spec->autocfg;
1218 int i, err, badness;
1220 /* set num_dacs once to full for look_for_dac() */
1221 spec->multiout.num_dacs = cfg->line_outs;
1222 spec->multiout.dac_nids = spec->private_dac_nids;
1223 memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids));
1224 memset(spec->multiout.hp_out_nid, 0, sizeof(spec->multiout.hp_out_nid));
1225 memset(spec->multiout.extra_out_nid, 0, sizeof(spec->multiout.extra_out_nid));
1226 spec->multi_ios = 0;
1227 snd_array_free(&spec->paths);
1229 /* clear path indices */
1230 memset(spec->out_paths, 0, sizeof(spec->out_paths));
1231 memset(spec->hp_paths, 0, sizeof(spec->hp_paths));
1232 memset(spec->speaker_paths, 0, sizeof(spec->speaker_paths));
1233 memset(spec->aamix_out_paths, 0, sizeof(spec->aamix_out_paths));
1234 memset(spec->digout_paths, 0, sizeof(spec->digout_paths));
1235 memset(spec->input_paths, 0, sizeof(spec->input_paths));
1236 memset(spec->loopback_paths, 0, sizeof(spec->loopback_paths));
1237 memset(&spec->digin_path, 0, sizeof(spec->digin_path));
1241 /* fill hard-wired DACs first */
1242 if (fill_hardwired) {
1245 mapped = map_singles(codec, cfg->line_outs,
1247 spec->private_dac_nids,
1249 mapped |= map_singles(codec, cfg->hp_outs,
1251 spec->multiout.hp_out_nid,
1253 mapped |= map_singles(codec, cfg->speaker_outs,
1255 spec->multiout.extra_out_nid,
1256 spec->speaker_paths);
1257 if (fill_mio_first && cfg->line_outs == 1 &&
1258 cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1259 err = fill_multi_ios(codec, cfg->line_out_pins[0], true);
1266 badness += try_assign_dacs(codec, cfg->line_outs, cfg->line_out_pins,
1267 spec->private_dac_nids, spec->out_paths,
1270 if (fill_mio_first &&
1271 cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1272 /* try to fill multi-io first */
1273 err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
1276 /* we don't count badness at this stage yet */
1279 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
1280 err = try_assign_dacs(codec, cfg->hp_outs, cfg->hp_pins,
1281 spec->multiout.hp_out_nid,
1283 &extra_out_badness);
1288 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1289 err = try_assign_dacs(codec, cfg->speaker_outs,
1291 spec->multiout.extra_out_nid,
1292 spec->speaker_paths,
1293 &extra_out_badness);
1298 if (cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1299 err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
1305 if (spec->mixer_nid) {
1306 spec->aamix_out_paths[0] =
1307 check_aamix_out_path(codec, spec->out_paths[0]);
1308 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1309 spec->aamix_out_paths[1] =
1310 check_aamix_out_path(codec, spec->hp_paths[0]);
1311 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1312 spec->aamix_out_paths[2] =
1313 check_aamix_out_path(codec, spec->speaker_paths[0]);
1316 if (cfg->hp_outs && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
1317 if (count_multiio_pins(codec, cfg->hp_pins[0]) >= 2)
1318 spec->multi_ios = 1; /* give badness */
1320 /* re-count num_dacs and squash invalid entries */
1321 spec->multiout.num_dacs = 0;
1322 for (i = 0; i < cfg->line_outs; i++) {
1323 if (spec->private_dac_nids[i])
1324 spec->multiout.num_dacs++;
1326 memmove(spec->private_dac_nids + i,
1327 spec->private_dac_nids + i + 1,
1328 sizeof(hda_nid_t) * (cfg->line_outs - i - 1));
1329 spec->private_dac_nids[cfg->line_outs - 1] = 0;
1333 spec->ext_channel_count = spec->min_channel_count =
1334 spec->multiout.num_dacs;
1336 if (spec->multi_ios == 2) {
1337 for (i = 0; i < 2; i++)
1338 spec->private_dac_nids[spec->multiout.num_dacs++] =
1339 spec->multi_io[i].dac;
1340 } else if (spec->multi_ios) {
1341 spec->multi_ios = 0;
1342 badness += BAD_MULTI_IO;
1345 /* re-fill the shared DAC for speaker / headphone */
1346 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1347 refill_shared_dacs(codec, cfg->hp_outs,
1348 spec->multiout.hp_out_nid,
1350 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1351 refill_shared_dacs(codec, cfg->speaker_outs,
1352 spec->multiout.extra_out_nid,
1353 spec->speaker_paths);
1355 /* set initial pinctl targets */
1356 set_pin_targets(codec, cfg->line_outs, cfg->line_out_pins,
1357 cfg->line_out_type == AUTO_PIN_HP_OUT ? PIN_HP : PIN_OUT);
1358 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1359 set_pin_targets(codec, cfg->hp_outs, cfg->hp_pins, PIN_HP);
1360 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1361 set_pin_targets(codec, cfg->speaker_outs,
1362 cfg->speaker_pins, PIN_OUT);
1367 #define DEBUG_BADNESS
1369 #ifdef DEBUG_BADNESS
1370 #define debug_badness snd_printdd
1372 #define debug_badness(...)
1375 static void debug_show_configs(struct hda_gen_spec *spec, struct auto_pin_cfg *cfg)
1377 debug_badness("multi_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1378 cfg->line_out_pins[0], cfg->line_out_pins[1],
1379 cfg->line_out_pins[2], cfg->line_out_pins[3],
1380 spec->multiout.dac_nids[0],
1381 spec->multiout.dac_nids[1],
1382 spec->multiout.dac_nids[2],
1383 spec->multiout.dac_nids[3]);
1384 if (spec->multi_ios > 0)
1385 debug_badness("multi_ios(%d) = %x/%x : %x/%x\n",
1387 spec->multi_io[0].pin, spec->multi_io[1].pin,
1388 spec->multi_io[0].dac, spec->multi_io[1].dac);
1389 debug_badness("hp_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1390 cfg->hp_pins[0], cfg->hp_pins[1],
1391 cfg->hp_pins[2], cfg->hp_pins[3],
1392 spec->multiout.hp_out_nid[0],
1393 spec->multiout.hp_out_nid[1],
1394 spec->multiout.hp_out_nid[2],
1395 spec->multiout.hp_out_nid[3]);
1396 debug_badness("spk_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1397 cfg->speaker_pins[0], cfg->speaker_pins[1],
1398 cfg->speaker_pins[2], cfg->speaker_pins[3],
1399 spec->multiout.extra_out_nid[0],
1400 spec->multiout.extra_out_nid[1],
1401 spec->multiout.extra_out_nid[2],
1402 spec->multiout.extra_out_nid[3]);
1405 /* find all available DACs of the codec */
1406 static void fill_all_dac_nids(struct hda_codec *codec)
1408 struct hda_gen_spec *spec = codec->spec;
1410 hda_nid_t nid = codec->start_nid;
1412 spec->num_all_dacs = 0;
1413 memset(spec->all_dacs, 0, sizeof(spec->all_dacs));
1414 for (i = 0; i < codec->num_nodes; i++, nid++) {
1415 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_AUD_OUT)
1417 if (spec->num_all_dacs >= ARRAY_SIZE(spec->all_dacs)) {
1418 snd_printk(KERN_ERR "hda: Too many DACs!\n");
1421 spec->all_dacs[spec->num_all_dacs++] = nid;
1425 static int parse_output_paths(struct hda_codec *codec)
1427 struct hda_gen_spec *spec = codec->spec;
1428 struct auto_pin_cfg *cfg = &spec->autocfg;
1429 struct auto_pin_cfg *best_cfg;
1430 int best_badness = INT_MAX;
1432 bool fill_hardwired = true, fill_mio_first = true;
1433 bool best_wired = true, best_mio = true;
1434 bool hp_spk_swapped = false;
1436 fill_all_dac_nids(codec);
1438 best_cfg = kmalloc(sizeof(*best_cfg), GFP_KERNEL);
1444 badness = fill_and_eval_dacs(codec, fill_hardwired,
1450 debug_badness("==> lo_type=%d, wired=%d, mio=%d, badness=0x%x\n",
1451 cfg->line_out_type, fill_hardwired, fill_mio_first,
1453 debug_show_configs(spec, cfg);
1454 if (badness < best_badness) {
1455 best_badness = badness;
1457 best_wired = fill_hardwired;
1458 best_mio = fill_mio_first;
1462 fill_mio_first = !fill_mio_first;
1463 if (!fill_mio_first)
1465 fill_hardwired = !fill_hardwired;
1466 if (!fill_hardwired)
1470 hp_spk_swapped = true;
1471 if (cfg->speaker_outs > 0 &&
1472 cfg->line_out_type == AUTO_PIN_HP_OUT) {
1473 cfg->hp_outs = cfg->line_outs;
1474 memcpy(cfg->hp_pins, cfg->line_out_pins,
1475 sizeof(cfg->hp_pins));
1476 cfg->line_outs = cfg->speaker_outs;
1477 memcpy(cfg->line_out_pins, cfg->speaker_pins,
1478 sizeof(cfg->speaker_pins));
1479 cfg->speaker_outs = 0;
1480 memset(cfg->speaker_pins, 0, sizeof(cfg->speaker_pins));
1481 cfg->line_out_type = AUTO_PIN_SPEAKER_OUT;
1482 fill_hardwired = true;
1485 if (cfg->hp_outs > 0 &&
1486 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
1487 cfg->speaker_outs = cfg->line_outs;
1488 memcpy(cfg->speaker_pins, cfg->line_out_pins,
1489 sizeof(cfg->speaker_pins));
1490 cfg->line_outs = cfg->hp_outs;
1491 memcpy(cfg->line_out_pins, cfg->hp_pins,
1492 sizeof(cfg->hp_pins));
1494 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
1495 cfg->line_out_type = AUTO_PIN_HP_OUT;
1496 fill_hardwired = true;
1503 debug_badness("==> restoring best_cfg\n");
1505 fill_and_eval_dacs(codec, best_wired, best_mio);
1507 debug_badness("==> Best config: lo_type=%d, wired=%d, mio=%d\n",
1508 cfg->line_out_type, best_wired, best_mio);
1509 debug_show_configs(spec, cfg);
1511 if (cfg->line_out_pins[0]) {
1512 struct nid_path *path;
1513 path = snd_hda_get_path_from_idx(codec, spec->out_paths[0]);
1515 spec->vmaster_nid = look_for_out_vol_nid(codec, path);
1522 /* add playback controls from the parsed DAC table */
1523 static int create_multi_out_ctls(struct hda_codec *codec,
1524 const struct auto_pin_cfg *cfg)
1526 struct hda_gen_spec *spec = codec->spec;
1527 int i, err, noutputs;
1529 noutputs = cfg->line_outs;
1530 if (spec->multi_ios > 0 && cfg->line_outs < 3)
1531 noutputs += spec->multi_ios;
1533 for (i = 0; i < noutputs; i++) {
1536 struct nid_path *path;
1538 if (i >= cfg->line_outs) {
1540 name = channel_name[i];
1542 name = get_line_out_pfx(spec, i, true, &index);
1545 path = snd_hda_get_path_from_idx(codec, spec->out_paths[i]);
1548 if (!name || !strcmp(name, "CLFE")) {
1550 err = add_vol_ctl(codec, "Center", 0, 1, path);
1553 err = add_vol_ctl(codec, "LFE", 0, 2, path);
1556 err = add_sw_ctl(codec, "Center", 0, 1, path);
1559 err = add_sw_ctl(codec, "LFE", 0, 2, path);
1563 err = add_stereo_vol(codec, name, index, path);
1566 err = add_stereo_sw(codec, name, index, path);
1574 static int create_extra_out(struct hda_codec *codec, int path_idx,
1575 const char *pfx, int cidx)
1577 struct nid_path *path;
1580 path = snd_hda_get_path_from_idx(codec, path_idx);
1583 err = add_stereo_vol(codec, pfx, cidx, path);
1586 err = add_stereo_sw(codec, pfx, cidx, path);
1592 /* add playback controls for speaker and HP outputs */
1593 static int create_extra_outs(struct hda_codec *codec, int num_pins,
1594 const int *paths, const char *pfx)
1598 for (i = 0; i < num_pins; i++) {
1603 if (num_pins == 2 && i == 1 && !strcmp(pfx, "Speaker"))
1604 name = "Bass Speaker";
1605 else if (num_pins >= 3) {
1606 snprintf(tmp, sizeof(tmp), "%s %s",
1607 pfx, channel_name[i]);
1613 err = create_extra_out(codec, paths[i], name, idx);
1620 static int create_hp_out_ctls(struct hda_codec *codec)
1622 struct hda_gen_spec *spec = codec->spec;
1623 return create_extra_outs(codec, spec->autocfg.hp_outs,
1628 static int create_speaker_out_ctls(struct hda_codec *codec)
1630 struct hda_gen_spec *spec = codec->spec;
1631 return create_extra_outs(codec, spec->autocfg.speaker_outs,
1632 spec->speaker_paths,
1637 * independent HP controls
1640 static int indep_hp_info(struct snd_kcontrol *kcontrol,
1641 struct snd_ctl_elem_info *uinfo)
1643 return snd_hda_enum_bool_helper_info(kcontrol, uinfo);
1646 static int indep_hp_get(struct snd_kcontrol *kcontrol,
1647 struct snd_ctl_elem_value *ucontrol)
1649 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1650 struct hda_gen_spec *spec = codec->spec;
1651 ucontrol->value.enumerated.item[0] = spec->indep_hp_enabled;
1655 static int indep_hp_put(struct snd_kcontrol *kcontrol,
1656 struct snd_ctl_elem_value *ucontrol)
1658 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1659 struct hda_gen_spec *spec = codec->spec;
1660 unsigned int select = ucontrol->value.enumerated.item[0];
1663 mutex_lock(&spec->pcm_mutex);
1664 if (spec->active_streams) {
1669 if (spec->indep_hp_enabled != select) {
1670 spec->indep_hp_enabled = select;
1671 if (spec->indep_hp_enabled)
1672 spec->multiout.hp_out_nid[0] = 0;
1674 spec->multiout.hp_out_nid[0] = spec->alt_dac_nid;
1678 mutex_unlock(&spec->pcm_mutex);
1682 static const struct snd_kcontrol_new indep_hp_ctl = {
1683 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1684 .name = "Independent HP",
1685 .info = indep_hp_info,
1686 .get = indep_hp_get,
1687 .put = indep_hp_put,
1691 static int create_indep_hp_ctls(struct hda_codec *codec)
1693 struct hda_gen_spec *spec = codec->spec;
1695 if (!spec->indep_hp)
1697 if (!spec->multiout.hp_out_nid[0]) {
1702 spec->indep_hp_enabled = false;
1703 spec->alt_dac_nid = spec->multiout.hp_out_nid[0];
1704 if (!snd_hda_gen_add_kctl(spec, NULL, &indep_hp_ctl))
1710 * channel mode enum control
1713 static int ch_mode_info(struct snd_kcontrol *kcontrol,
1714 struct snd_ctl_elem_info *uinfo)
1716 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1717 struct hda_gen_spec *spec = codec->spec;
1720 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1722 uinfo->value.enumerated.items = spec->multi_ios + 1;
1723 if (uinfo->value.enumerated.item > spec->multi_ios)
1724 uinfo->value.enumerated.item = spec->multi_ios;
1725 chs = uinfo->value.enumerated.item * 2 + spec->min_channel_count;
1726 sprintf(uinfo->value.enumerated.name, "%dch", chs);
1730 static int ch_mode_get(struct snd_kcontrol *kcontrol,
1731 struct snd_ctl_elem_value *ucontrol)
1733 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1734 struct hda_gen_spec *spec = codec->spec;
1735 ucontrol->value.enumerated.item[0] =
1736 (spec->ext_channel_count - spec->min_channel_count) / 2;
1740 static inline struct nid_path *
1741 get_multiio_path(struct hda_codec *codec, int idx)
1743 struct hda_gen_spec *spec = codec->spec;
1744 return snd_hda_get_path_from_idx(codec,
1745 spec->out_paths[spec->autocfg.line_outs + idx]);
1748 static int set_multi_io(struct hda_codec *codec, int idx, bool output)
1750 struct hda_gen_spec *spec = codec->spec;
1751 hda_nid_t nid = spec->multi_io[idx].pin;
1752 struct nid_path *path;
1754 path = get_multiio_path(codec, idx);
1758 if (path->active == output)
1762 set_pin_target(codec, nid, PIN_OUT, true);
1763 snd_hda_activate_path(codec, path, true, true);
1764 set_pin_eapd(codec, nid, true);
1766 set_pin_eapd(codec, nid, false);
1767 snd_hda_activate_path(codec, path, false, true);
1768 set_pin_target(codec, nid, spec->multi_io[idx].ctl_in, true);
1773 static int ch_mode_put(struct snd_kcontrol *kcontrol,
1774 struct snd_ctl_elem_value *ucontrol)
1776 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1777 struct hda_gen_spec *spec = codec->spec;
1780 ch = ucontrol->value.enumerated.item[0];
1781 if (ch < 0 || ch > spec->multi_ios)
1783 if (ch == (spec->ext_channel_count - spec->min_channel_count) / 2)
1785 spec->ext_channel_count = ch * 2 + spec->min_channel_count;
1786 for (i = 0; i < spec->multi_ios; i++)
1787 set_multi_io(codec, i, i < ch);
1788 spec->multiout.max_channels = max(spec->ext_channel_count,
1789 spec->const_channel_count);
1790 if (spec->need_dac_fix)
1791 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
1795 static const struct snd_kcontrol_new channel_mode_enum = {
1796 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1797 .name = "Channel Mode",
1798 .info = ch_mode_info,
1803 static int create_multi_channel_mode(struct hda_codec *codec)
1805 struct hda_gen_spec *spec = codec->spec;
1807 if (spec->multi_ios > 0) {
1808 if (!snd_hda_gen_add_kctl(spec, NULL, &channel_mode_enum))
1815 * aamix loopback enable/disable switch
1818 #define loopback_mixing_info indep_hp_info
1820 static int loopback_mixing_get(struct snd_kcontrol *kcontrol,
1821 struct snd_ctl_elem_value *ucontrol)
1823 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1824 struct hda_gen_spec *spec = codec->spec;
1825 ucontrol->value.enumerated.item[0] = spec->aamix_mode;
1829 static void update_aamix_paths(struct hda_codec *codec, bool do_mix,
1830 int nomix_path_idx, int mix_path_idx)
1832 struct nid_path *nomix_path, *mix_path;
1834 nomix_path = snd_hda_get_path_from_idx(codec, nomix_path_idx);
1835 mix_path = snd_hda_get_path_from_idx(codec, mix_path_idx);
1836 if (!nomix_path || !mix_path)
1839 snd_hda_activate_path(codec, nomix_path, false, true);
1840 snd_hda_activate_path(codec, mix_path, true, true);
1842 snd_hda_activate_path(codec, mix_path, false, true);
1843 snd_hda_activate_path(codec, nomix_path, true, true);
1847 static int loopback_mixing_put(struct snd_kcontrol *kcontrol,
1848 struct snd_ctl_elem_value *ucontrol)
1850 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1851 struct hda_gen_spec *spec = codec->spec;
1852 unsigned int val = ucontrol->value.enumerated.item[0];
1854 if (val == spec->aamix_mode)
1856 spec->aamix_mode = val;
1857 update_aamix_paths(codec, val, spec->out_paths[0],
1858 spec->aamix_out_paths[0]);
1859 update_aamix_paths(codec, val, spec->hp_paths[0],
1860 spec->aamix_out_paths[1]);
1861 update_aamix_paths(codec, val, spec->speaker_paths[0],
1862 spec->aamix_out_paths[2]);
1866 static const struct snd_kcontrol_new loopback_mixing_enum = {
1867 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1868 .name = "Loopback Mixing",
1869 .info = loopback_mixing_info,
1870 .get = loopback_mixing_get,
1871 .put = loopback_mixing_put,
1874 static int create_loopback_mixing_ctl(struct hda_codec *codec)
1876 struct hda_gen_spec *spec = codec->spec;
1878 if (!spec->mixer_nid)
1880 if (!(spec->aamix_out_paths[0] || spec->aamix_out_paths[1] ||
1881 spec->aamix_out_paths[2]))
1883 if (!snd_hda_gen_add_kctl(spec, NULL, &loopback_mixing_enum))
1889 * shared headphone/mic handling
1892 static void call_update_outputs(struct hda_codec *codec);
1894 /* for shared I/O, change the pin-control accordingly */
1895 static void update_shared_mic_hp(struct hda_codec *codec, bool set_as_mic)
1897 struct hda_gen_spec *spec = codec->spec;
1899 hda_nid_t pin = spec->autocfg.inputs[1].pin;
1900 /* NOTE: this assumes that there are only two inputs, the
1901 * first is the real internal mic and the second is HP/mic jack.
1904 val = snd_hda_get_default_vref(codec, pin);
1906 /* This pin does not have vref caps - let's enable vref on pin 0x18
1907 instead, as suggested by Realtek */
1908 if (val == AC_PINCTL_VREF_HIZ && spec->shared_mic_vref_pin) {
1909 const hda_nid_t vref_pin = spec->shared_mic_vref_pin;
1910 unsigned int vref_val = snd_hda_get_default_vref(codec, vref_pin);
1911 if (vref_val != AC_PINCTL_VREF_HIZ)
1912 snd_hda_set_pin_ctl_cache(codec, vref_pin,
1913 PIN_IN | (set_as_mic ? vref_val : 0));
1916 val = set_as_mic ? val | PIN_IN : PIN_HP;
1917 set_pin_target(codec, pin, val, true);
1919 spec->automute_speaker = !set_as_mic;
1920 call_update_outputs(codec);
1923 /* create a shared input with the headphone out */
1924 static int create_shared_input(struct hda_codec *codec)
1926 struct hda_gen_spec *spec = codec->spec;
1927 struct auto_pin_cfg *cfg = &spec->autocfg;
1928 unsigned int defcfg;
1931 /* only one internal input pin? */
1932 if (cfg->num_inputs != 1)
1934 defcfg = snd_hda_codec_get_pincfg(codec, cfg->inputs[0].pin);
1935 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
1938 if (cfg->hp_outs == 1 && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
1939 nid = cfg->hp_pins[0]; /* OK, we have a single HP-out */
1940 else if (cfg->line_outs == 1 && cfg->line_out_type == AUTO_PIN_HP_OUT)
1941 nid = cfg->line_out_pins[0]; /* OK, we have a single line-out */
1943 return 0; /* both not available */
1945 if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_IN))
1946 return 0; /* no input */
1948 cfg->inputs[1].pin = nid;
1949 cfg->inputs[1].type = AUTO_PIN_MIC;
1950 cfg->num_inputs = 2;
1951 spec->shared_mic_hp = 1;
1952 snd_printdd("hda-codec: Enable shared I/O jack on NID 0x%x\n", nid);
1962 /* add the powersave loopback-list entry */
1963 static void add_loopback_list(struct hda_gen_spec *spec, hda_nid_t mix, int idx)
1965 struct hda_amp_list *list;
1967 if (spec->num_loopbacks >= ARRAY_SIZE(spec->loopback_list) - 1)
1969 list = spec->loopback_list + spec->num_loopbacks;
1971 list->dir = HDA_INPUT;
1973 spec->num_loopbacks++;
1974 spec->loopback.amplist = spec->loopback_list;
1977 #define add_loopback_list(spec, mix, idx) /* NOP */
1980 /* create input playback/capture controls for the given pin */
1981 static int new_analog_input(struct hda_codec *codec, int input_idx,
1982 hda_nid_t pin, const char *ctlname, int ctlidx,
1985 struct hda_gen_spec *spec = codec->spec;
1986 struct nid_path *path;
1990 if (!nid_has_volume(codec, mix_nid, HDA_INPUT) &&
1991 !nid_has_mute(codec, mix_nid, HDA_INPUT))
1992 return 0; /* no need for analog loopback */
1994 path = snd_hda_add_new_path(codec, pin, mix_nid, 0);
1997 print_nid_path("loopback", path);
1998 spec->loopback_paths[input_idx] = snd_hda_get_path_idx(codec, path);
2000 idx = path->idx[path->depth - 1];
2001 if (nid_has_volume(codec, mix_nid, HDA_INPUT)) {
2002 val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
2003 err = __add_pb_vol_ctrl(spec, HDA_CTL_WIDGET_VOL, ctlname, ctlidx, val);
2006 path->ctls[NID_PATH_VOL_CTL] = val;
2009 if (nid_has_mute(codec, mix_nid, HDA_INPUT)) {
2010 val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
2011 err = __add_pb_sw_ctrl(spec, HDA_CTL_WIDGET_MUTE, ctlname, ctlidx, val);
2014 path->ctls[NID_PATH_MUTE_CTL] = val;
2017 path->active = true;
2018 add_loopback_list(spec, mix_nid, idx);
2022 static int is_input_pin(struct hda_codec *codec, hda_nid_t nid)
2024 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
2025 return (pincap & AC_PINCAP_IN) != 0;
2028 /* Parse the codec tree and retrieve ADCs */
2029 static int fill_adc_nids(struct hda_codec *codec)
2031 struct hda_gen_spec *spec = codec->spec;
2033 hda_nid_t *adc_nids = spec->adc_nids;
2034 int max_nums = ARRAY_SIZE(spec->adc_nids);
2037 nid = codec->start_nid;
2038 for (i = 0; i < codec->num_nodes; i++, nid++) {
2039 unsigned int caps = get_wcaps(codec, nid);
2040 int type = get_wcaps_type(caps);
2042 if (type != AC_WID_AUD_IN || (caps & AC_WCAP_DIGITAL))
2044 adc_nids[nums] = nid;
2045 if (++nums >= max_nums)
2048 spec->num_adc_nids = nums;
2052 /* filter out invalid adc_nids that don't give all active input pins;
2053 * if needed, check whether dynamic ADC-switching is available
2055 static int check_dyn_adc_switch(struct hda_codec *codec)
2057 struct hda_gen_spec *spec = codec->spec;
2058 struct hda_input_mux *imux = &spec->input_mux;
2059 unsigned int ok_bits;
2065 for (n = 0; n < spec->num_adc_nids; n++) {
2066 for (i = 0; i < imux->num_items; i++) {
2067 if (!spec->input_paths[i][n])
2070 if (i >= imux->num_items) {
2071 ok_bits |= (1 << n);
2077 if (spec->shared_mic_hp) {
2078 spec->shared_mic_hp = 0;
2079 imux->num_items = 1;
2083 /* check whether ADC-switch is possible */
2084 for (i = 0; i < imux->num_items; i++) {
2085 for (n = 0; n < spec->num_adc_nids; n++) {
2086 if (spec->input_paths[i][n]) {
2087 spec->dyn_adc_idx[i] = n;
2093 snd_printdd("hda-codec: enabling ADC switching\n");
2094 spec->dyn_adc_switch = 1;
2095 } else if (nums != spec->num_adc_nids) {
2096 /* shrink the invalid adcs and input paths */
2098 for (n = 0; n < spec->num_adc_nids; n++) {
2099 if (!(ok_bits & (1 << n)))
2102 spec->adc_nids[nums] = spec->adc_nids[n];
2103 for (i = 0; i < imux->num_items; i++) {
2104 invalidate_nid_path(codec,
2105 spec->input_paths[i][nums]);
2106 spec->input_paths[i][nums] =
2107 spec->input_paths[i][n];
2112 spec->num_adc_nids = nums;
2115 if (imux->num_items == 1 || spec->shared_mic_hp) {
2116 snd_printdd("hda-codec: reducing to a single ADC\n");
2117 spec->num_adc_nids = 1; /* reduce to a single ADC */
2120 /* single index for individual volumes ctls */
2121 if (!spec->dyn_adc_switch && spec->multi_cap_vol)
2122 spec->num_adc_nids = 1;
2127 /* parse capture source paths from the given pin and create imux items */
2128 static int parse_capture_source(struct hda_codec *codec, hda_nid_t pin,
2129 int num_adcs, const char *label, int anchor)
2131 struct hda_gen_spec *spec = codec->spec;
2132 struct hda_input_mux *imux = &spec->input_mux;
2133 int imux_idx = imux->num_items;
2134 bool imux_added = false;
2137 for (c = 0; c < num_adcs; c++) {
2138 struct nid_path *path;
2139 hda_nid_t adc = spec->adc_nids[c];
2141 if (!is_reachable_path(codec, pin, adc))
2143 path = snd_hda_add_new_path(codec, pin, adc, anchor);
2146 print_nid_path("input", path);
2147 spec->input_paths[imux_idx][c] =
2148 snd_hda_get_path_idx(codec, path);
2151 spec->imux_pins[imux->num_items] = pin;
2152 snd_hda_add_imux_item(imux, label,
2153 imux->num_items, NULL);
2162 * create playback/capture controls for input pins
2164 static int create_input_ctls(struct hda_codec *codec)
2166 struct hda_gen_spec *spec = codec->spec;
2167 const struct auto_pin_cfg *cfg = &spec->autocfg;
2168 hda_nid_t mixer = spec->mixer_nid;
2170 int i, err, type_idx = 0;
2171 const char *prev_label = NULL;
2174 num_adcs = fill_adc_nids(codec);
2178 for (i = 0; i < cfg->num_inputs; i++) {
2182 pin = cfg->inputs[i].pin;
2183 if (!is_input_pin(codec, pin))
2186 label = hda_get_autocfg_input_label(codec, cfg, i);
2187 if (prev_label && !strcmp(label, prev_label))
2194 if (cfg->inputs[i].type == AUTO_PIN_MIC)
2195 val |= snd_hda_get_default_vref(codec, pin);
2196 set_pin_target(codec, pin, val, false);
2199 if (is_reachable_path(codec, pin, mixer)) {
2200 err = new_analog_input(codec, i, pin,
2201 label, type_idx, mixer);
2207 err = parse_capture_source(codec, pin, num_adcs, label, -mixer);
2212 if (mixer && spec->add_stereo_mix_input) {
2213 err = parse_capture_source(codec, mixer, num_adcs,
2227 /* get the input path specified by the given adc and imux indices */
2228 static struct nid_path *get_input_path(struct hda_codec *codec, int adc_idx, int imux_idx)
2230 struct hda_gen_spec *spec = codec->spec;
2231 if (spec->dyn_adc_switch)
2232 adc_idx = spec->dyn_adc_idx[imux_idx];
2233 return snd_hda_get_path_from_idx(codec, spec->input_paths[imux_idx][adc_idx]);
2236 static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
2239 static int mux_enum_info(struct snd_kcontrol *kcontrol,
2240 struct snd_ctl_elem_info *uinfo)
2242 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2243 struct hda_gen_spec *spec = codec->spec;
2244 return snd_hda_input_mux_info(&spec->input_mux, uinfo);
2247 static int mux_enum_get(struct snd_kcontrol *kcontrol,
2248 struct snd_ctl_elem_value *ucontrol)
2250 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2251 struct hda_gen_spec *spec = codec->spec;
2252 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2254 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
2258 static int mux_enum_put(struct snd_kcontrol *kcontrol,
2259 struct snd_ctl_elem_value *ucontrol)
2261 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2262 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2263 return mux_select(codec, adc_idx,
2264 ucontrol->value.enumerated.item[0]);
2267 static const struct snd_kcontrol_new cap_src_temp = {
2268 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2269 .name = "Input Source",
2270 .info = mux_enum_info,
2271 .get = mux_enum_get,
2272 .put = mux_enum_put,
2276 * capture volume and capture switch ctls
2279 typedef int (*put_call_t)(struct snd_kcontrol *kcontrol,
2280 struct snd_ctl_elem_value *ucontrol);
2282 /* call the given amp update function for all amps in the imux list at once */
2283 static int cap_put_caller(struct snd_kcontrol *kcontrol,
2284 struct snd_ctl_elem_value *ucontrol,
2285 put_call_t func, int type)
2287 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2288 struct hda_gen_spec *spec = codec->spec;
2289 const struct hda_input_mux *imux;
2290 struct nid_path *path;
2291 int i, adc_idx, err = 0;
2293 imux = &spec->input_mux;
2294 adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2295 mutex_lock(&codec->control_mutex);
2296 /* we use the cache-only update at first since multiple input paths
2297 * may shared the same amp; by updating only caches, the redundant
2298 * writes to hardware can be reduced.
2300 codec->cached_write = 1;
2301 for (i = 0; i < imux->num_items; i++) {
2302 path = get_input_path(codec, adc_idx, i);
2303 if (!path || !path->ctls[type])
2305 kcontrol->private_value = path->ctls[type];
2306 err = func(kcontrol, ucontrol);
2311 codec->cached_write = 0;
2312 mutex_unlock(&codec->control_mutex);
2313 snd_hda_codec_flush_amp_cache(codec); /* flush the updates */
2314 if (err >= 0 && spec->cap_sync_hook)
2315 spec->cap_sync_hook(codec);
2319 /* capture volume ctl callbacks */
2320 #define cap_vol_info snd_hda_mixer_amp_volume_info
2321 #define cap_vol_get snd_hda_mixer_amp_volume_get
2322 #define cap_vol_tlv snd_hda_mixer_amp_tlv
2324 static int cap_vol_put(struct snd_kcontrol *kcontrol,
2325 struct snd_ctl_elem_value *ucontrol)
2327 return cap_put_caller(kcontrol, ucontrol,
2328 snd_hda_mixer_amp_volume_put,
2332 static const struct snd_kcontrol_new cap_vol_temp = {
2333 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2334 .name = "Capture Volume",
2335 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
2336 SNDRV_CTL_ELEM_ACCESS_TLV_READ |
2337 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK),
2338 .info = cap_vol_info,
2341 .tlv = { .c = cap_vol_tlv },
2344 /* capture switch ctl callbacks */
2345 #define cap_sw_info snd_ctl_boolean_stereo_info
2346 #define cap_sw_get snd_hda_mixer_amp_switch_get
2348 static int cap_sw_put(struct snd_kcontrol *kcontrol,
2349 struct snd_ctl_elem_value *ucontrol)
2351 return cap_put_caller(kcontrol, ucontrol,
2352 snd_hda_mixer_amp_switch_put,
2356 static const struct snd_kcontrol_new cap_sw_temp = {
2357 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2358 .name = "Capture Switch",
2359 .info = cap_sw_info,
2364 static int parse_capvol_in_path(struct hda_codec *codec, struct nid_path *path)
2369 path->ctls[NID_PATH_VOL_CTL] = path->ctls[NID_PATH_MUTE_CTL] = 0;
2370 for (depth = 0; depth < 3; depth++) {
2371 if (depth >= path->depth)
2373 i = path->depth - depth - 1;
2374 nid = path->path[i];
2375 if (!path->ctls[NID_PATH_VOL_CTL]) {
2376 if (nid_has_volume(codec, nid, HDA_OUTPUT))
2377 path->ctls[NID_PATH_VOL_CTL] =
2378 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
2379 else if (nid_has_volume(codec, nid, HDA_INPUT)) {
2380 int idx = path->idx[i];
2381 if (!depth && codec->single_adc_amp)
2383 path->ctls[NID_PATH_VOL_CTL] =
2384 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
2387 if (!path->ctls[NID_PATH_MUTE_CTL]) {
2388 if (nid_has_mute(codec, nid, HDA_OUTPUT))
2389 path->ctls[NID_PATH_MUTE_CTL] =
2390 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
2391 else if (nid_has_mute(codec, nid, HDA_INPUT)) {
2392 int idx = path->idx[i];
2393 if (!depth && codec->single_adc_amp)
2395 path->ctls[NID_PATH_MUTE_CTL] =
2396 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
2403 static bool is_inv_dmic_pin(struct hda_codec *codec, hda_nid_t nid)
2405 struct hda_gen_spec *spec = codec->spec;
2406 struct auto_pin_cfg *cfg = &spec->autocfg;
2410 if (!spec->inv_dmic_split)
2412 for (i = 0; i < cfg->num_inputs; i++) {
2413 if (cfg->inputs[i].pin != nid)
2415 if (cfg->inputs[i].type != AUTO_PIN_MIC)
2417 val = snd_hda_codec_get_pincfg(codec, nid);
2418 return snd_hda_get_input_pin_attr(val) == INPUT_PIN_ATTR_INT;
2423 static int add_single_cap_ctl(struct hda_codec *codec, const char *label,
2424 int idx, bool is_switch, unsigned int ctl,
2427 struct hda_gen_spec *spec = codec->spec;
2429 int type = is_switch ? HDA_CTL_WIDGET_MUTE : HDA_CTL_WIDGET_VOL;
2430 const char *sfx = is_switch ? "Switch" : "Volume";
2431 unsigned int chs = inv_dmic ? 1 : 3;
2438 snprintf(tmpname, sizeof(tmpname),
2439 "%s Capture %s", label, sfx);
2441 snprintf(tmpname, sizeof(tmpname),
2443 err = add_control(spec, type, tmpname, idx,
2444 amp_val_replace_channels(ctl, chs));
2445 if (err < 0 || !inv_dmic)
2448 /* Make independent right kcontrol */
2450 snprintf(tmpname, sizeof(tmpname),
2451 "Inverted %s Capture %s", label, sfx);
2453 snprintf(tmpname, sizeof(tmpname),
2454 "Inverted Capture %s", sfx);
2455 return add_control(spec, type, tmpname, idx,
2456 amp_val_replace_channels(ctl, 2));
2459 /* create single (and simple) capture volume and switch controls */
2460 static int create_single_cap_vol_ctl(struct hda_codec *codec, int idx,
2461 unsigned int vol_ctl, unsigned int sw_ctl,
2465 err = add_single_cap_ctl(codec, NULL, idx, false, vol_ctl, inv_dmic);
2468 err = add_single_cap_ctl(codec, NULL, idx, true, sw_ctl, inv_dmic);
2474 /* create bound capture volume and switch controls */
2475 static int create_bind_cap_vol_ctl(struct hda_codec *codec, int idx,
2476 unsigned int vol_ctl, unsigned int sw_ctl)
2478 struct hda_gen_spec *spec = codec->spec;
2479 struct snd_kcontrol_new *knew;
2482 knew = snd_hda_gen_add_kctl(spec, NULL, &cap_vol_temp);
2486 knew->private_value = vol_ctl;
2487 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2490 knew = snd_hda_gen_add_kctl(spec, NULL, &cap_sw_temp);
2494 knew->private_value = sw_ctl;
2495 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2500 /* return the vol ctl when used first in the imux list */
2501 static unsigned int get_first_cap_ctl(struct hda_codec *codec, int idx, int type)
2503 struct nid_path *path;
2507 path = get_input_path(codec, 0, idx);
2510 ctl = path->ctls[type];
2513 for (i = 0; i < idx - 1; i++) {
2514 path = get_input_path(codec, 0, i);
2515 if (path && path->ctls[type] == ctl)
2521 /* create individual capture volume and switch controls per input */
2522 static int create_multi_cap_vol_ctl(struct hda_codec *codec)
2524 struct hda_gen_spec *spec = codec->spec;
2525 struct hda_input_mux *imux = &spec->input_mux;
2526 int i, err, type, type_idx = 0;
2527 const char *prev_label = NULL;
2529 for (i = 0; i < imux->num_items; i++) {
2532 label = hda_get_autocfg_input_label(codec, &spec->autocfg, i);
2533 if (prev_label && !strcmp(label, prev_label))
2538 inv_dmic = is_inv_dmic_pin(codec, spec->imux_pins[i]);
2540 for (type = 0; type < 2; type++) {
2541 err = add_single_cap_ctl(codec, label, type_idx, type,
2542 get_first_cap_ctl(codec, i, type),
2551 static int create_capture_mixers(struct hda_codec *codec)
2553 struct hda_gen_spec *spec = codec->spec;
2554 struct hda_input_mux *imux = &spec->input_mux;
2555 int i, n, nums, err;
2557 if (spec->dyn_adc_switch)
2560 nums = spec->num_adc_nids;
2562 if (!spec->auto_mic && imux->num_items > 1) {
2563 struct snd_kcontrol_new *knew;
2565 name = nums > 1 ? "Input Source" : "Capture Source";
2566 knew = snd_hda_gen_add_kctl(spec, name, &cap_src_temp);
2572 for (n = 0; n < nums; n++) {
2574 bool inv_dmic = false;
2578 for (i = 0; i < imux->num_items; i++) {
2579 struct nid_path *path;
2580 path = get_input_path(codec, n, i);
2583 parse_capvol_in_path(codec, path);
2585 vol = path->ctls[NID_PATH_VOL_CTL];
2586 else if (vol != path->ctls[NID_PATH_VOL_CTL])
2589 sw = path->ctls[NID_PATH_MUTE_CTL];
2590 else if (sw != path->ctls[NID_PATH_MUTE_CTL])
2592 if (is_inv_dmic_pin(codec, spec->imux_pins[i]))
2597 err = create_single_cap_vol_ctl(codec, n, vol, sw,
2599 else if (!spec->multi_cap_vol)
2600 err = create_bind_cap_vol_ctl(codec, n, vol, sw);
2602 err = create_multi_cap_vol_ctl(codec);
2611 * add mic boosts if needed
2613 static int parse_mic_boost(struct hda_codec *codec)
2615 struct hda_gen_spec *spec = codec->spec;
2616 struct auto_pin_cfg *cfg = &spec->autocfg;
2620 const char *prev_label = NULL;
2622 for (i = 0; i < cfg->num_inputs; i++) {
2623 if (cfg->inputs[i].type > AUTO_PIN_MIC)
2625 nid = cfg->inputs[i].pin;
2626 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) {
2628 char boost_label[44];
2629 struct nid_path *path;
2632 label = hda_get_autocfg_input_label(codec, cfg, i);
2633 if (prev_label && !strcmp(label, prev_label))
2639 snprintf(boost_label, sizeof(boost_label),
2640 "%s Boost Volume", label);
2641 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT);
2642 err = add_control(spec, HDA_CTL_WIDGET_VOL,
2643 boost_label, type_idx, val);
2647 path = snd_hda_get_nid_path(codec, nid, 0);
2649 path->ctls[NID_PATH_BOOST_CTL] = val;
2656 * parse digital I/Os and set up NIDs in BIOS auto-parse mode
2658 static void parse_digital(struct hda_codec *codec)
2660 struct hda_gen_spec *spec = codec->spec;
2661 struct nid_path *path;
2663 hda_nid_t dig_nid, pin;
2665 /* support multiple SPDIFs; the secondary is set up as a slave */
2667 for (i = 0; i < spec->autocfg.dig_outs; i++) {
2668 pin = spec->autocfg.dig_out_pins[i];
2669 dig_nid = look_for_dac(codec, pin, true);
2672 path = snd_hda_add_new_path(codec, dig_nid, pin, 0);
2675 print_nid_path("digout", path);
2676 path->active = true;
2677 spec->digout_paths[i] = snd_hda_get_path_idx(codec, path);
2678 set_pin_target(codec, pin, PIN_OUT, false);
2680 spec->multiout.dig_out_nid = dig_nid;
2681 spec->dig_out_type = spec->autocfg.dig_out_type[0];
2683 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
2684 if (nums >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
2686 spec->slave_dig_outs[nums - 1] = dig_nid;
2691 if (spec->autocfg.dig_in_pin) {
2692 pin = spec->autocfg.dig_in_pin;
2693 dig_nid = codec->start_nid;
2694 for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
2695 unsigned int wcaps = get_wcaps(codec, dig_nid);
2696 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
2698 if (!(wcaps & AC_WCAP_DIGITAL))
2700 path = snd_hda_add_new_path(codec, pin, dig_nid, 0);
2702 print_nid_path("digin", path);
2703 path->active = true;
2704 spec->dig_in_nid = dig_nid;
2705 spec->digin_path = snd_hda_get_path_idx(codec, path);
2706 set_pin_target(codec, pin, PIN_IN, false);
2715 * input MUX handling
2718 static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur);
2720 /* select the given imux item; either unmute exclusively or select the route */
2721 static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
2724 struct hda_gen_spec *spec = codec->spec;
2725 const struct hda_input_mux *imux;
2726 struct nid_path *path;
2728 imux = &spec->input_mux;
2729 if (!imux->num_items)
2732 if (idx >= imux->num_items)
2733 idx = imux->num_items - 1;
2734 if (spec->cur_mux[adc_idx] == idx)
2737 path = get_input_path(codec, adc_idx, spec->cur_mux[adc_idx]);
2741 snd_hda_activate_path(codec, path, false, false);
2743 spec->cur_mux[adc_idx] = idx;
2745 if (spec->shared_mic_hp)
2746 update_shared_mic_hp(codec, spec->cur_mux[adc_idx]);
2748 if (spec->dyn_adc_switch)
2749 dyn_adc_pcm_resetup(codec, idx);
2751 path = get_input_path(codec, adc_idx, idx);
2756 snd_hda_activate_path(codec, path, true, false);
2757 if (spec->cap_sync_hook)
2758 spec->cap_sync_hook(codec);
2764 * Jack detections for HP auto-mute and mic-switch
2767 /* check each pin in the given array; returns true if any of them is plugged */
2768 static bool detect_jacks(struct hda_codec *codec, int num_pins, hda_nid_t *pins)
2772 for (i = 0; i < num_pins; i++) {
2773 hda_nid_t nid = pins[i];
2776 present |= snd_hda_jack_detect(codec, nid);
2781 /* standard HP/line-out auto-mute helper */
2782 static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins,
2785 struct hda_gen_spec *spec = codec->spec;
2788 for (i = 0; i < num_pins; i++) {
2789 hda_nid_t nid = pins[i];
2793 /* don't reset VREF value in case it's controlling
2794 * the amp (see alc861_fixup_asus_amp_vref_0f())
2796 if (spec->keep_vref_in_automute)
2797 val = snd_hda_codec_get_pin_target(codec, nid) & ~PIN_HP;
2801 val |= snd_hda_codec_get_pin_target(codec, nid);
2802 /* here we call update_pin_ctl() so that the pinctl is changed
2803 * without changing the pinctl target value;
2804 * the original target value will be still referred at the
2805 * init / resume again
2807 update_pin_ctl(codec, nid, val);
2808 set_pin_eapd(codec, nid, !mute);
2812 /* Toggle outputs muting */
2813 void snd_hda_gen_update_outputs(struct hda_codec *codec)
2815 struct hda_gen_spec *spec = codec->spec;
2818 /* Control HP pins/amps depending on master_mute state;
2819 * in general, HP pins/amps control should be enabled in all cases,
2820 * but currently set only for master_mute, just to be safe
2822 if (!spec->shared_mic_hp) /* don't change HP-pin when shared with mic */
2823 do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
2824 spec->autocfg.hp_pins, spec->master_mute);
2826 if (!spec->automute_speaker)
2829 on = spec->hp_jack_present | spec->line_jack_present;
2830 on |= spec->master_mute;
2831 do_automute(codec, ARRAY_SIZE(spec->autocfg.speaker_pins),
2832 spec->autocfg.speaker_pins, on);
2834 /* toggle line-out mutes if needed, too */
2835 /* if LO is a copy of either HP or Speaker, don't need to handle it */
2836 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0] ||
2837 spec->autocfg.line_out_pins[0] == spec->autocfg.speaker_pins[0])
2839 if (!spec->automute_lo)
2842 on = spec->hp_jack_present;
2843 on |= spec->master_mute;
2844 do_automute(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
2845 spec->autocfg.line_out_pins, on);
2847 EXPORT_SYMBOL_HDA(snd_hda_gen_update_outputs);
2849 static void call_update_outputs(struct hda_codec *codec)
2851 struct hda_gen_spec *spec = codec->spec;
2852 if (spec->automute_hook)
2853 spec->automute_hook(codec);
2855 snd_hda_gen_update_outputs(codec);
2858 /* standard HP-automute helper */
2859 void snd_hda_gen_hp_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)
2861 struct hda_gen_spec *spec = codec->spec;
2863 spec->hp_jack_present =
2864 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
2865 spec->autocfg.hp_pins);
2866 if (!spec->detect_hp || (!spec->automute_speaker && !spec->automute_lo))
2868 call_update_outputs(codec);
2870 EXPORT_SYMBOL_HDA(snd_hda_gen_hp_automute);
2872 /* standard line-out-automute helper */
2873 void snd_hda_gen_line_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)
2875 struct hda_gen_spec *spec = codec->spec;
2877 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
2879 /* check LO jack only when it's different from HP */
2880 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0])
2883 spec->line_jack_present =
2884 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
2885 spec->autocfg.line_out_pins);
2886 if (!spec->automute_speaker || !spec->detect_lo)
2888 call_update_outputs(codec);
2890 EXPORT_SYMBOL_HDA(snd_hda_gen_line_automute);
2892 /* standard mic auto-switch helper */
2893 void snd_hda_gen_mic_autoswitch(struct hda_codec *codec, struct hda_jack_tbl *jack)
2895 struct hda_gen_spec *spec = codec->spec;
2898 if (!spec->auto_mic)
2901 for (i = spec->am_num_entries - 1; i > 0; i--) {
2902 if (snd_hda_jack_detect(codec, spec->am_entry[i].pin)) {
2903 mux_select(codec, 0, spec->am_entry[i].idx);
2907 mux_select(codec, 0, spec->am_entry[0].idx);
2909 EXPORT_SYMBOL_HDA(snd_hda_gen_mic_autoswitch);
2912 * Auto-Mute mode mixer enum support
2914 static int automute_mode_info(struct snd_kcontrol *kcontrol,
2915 struct snd_ctl_elem_info *uinfo)
2917 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2918 struct hda_gen_spec *spec = codec->spec;
2919 static const char * const texts3[] = {
2920 "Disabled", "Speaker Only", "Line Out+Speaker"
2923 if (spec->automute_speaker_possible && spec->automute_lo_possible)
2924 return snd_hda_enum_helper_info(kcontrol, uinfo, 3, texts3);
2925 return snd_hda_enum_bool_helper_info(kcontrol, uinfo);
2928 static int automute_mode_get(struct snd_kcontrol *kcontrol,
2929 struct snd_ctl_elem_value *ucontrol)
2931 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2932 struct hda_gen_spec *spec = codec->spec;
2933 unsigned int val = 0;
2934 if (spec->automute_speaker)
2936 if (spec->automute_lo)
2939 ucontrol->value.enumerated.item[0] = val;
2943 static int automute_mode_put(struct snd_kcontrol *kcontrol,
2944 struct snd_ctl_elem_value *ucontrol)
2946 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2947 struct hda_gen_spec *spec = codec->spec;
2949 switch (ucontrol->value.enumerated.item[0]) {
2951 if (!spec->automute_speaker && !spec->automute_lo)
2953 spec->automute_speaker = 0;
2954 spec->automute_lo = 0;
2957 if (spec->automute_speaker_possible) {
2958 if (!spec->automute_lo && spec->automute_speaker)
2960 spec->automute_speaker = 1;
2961 spec->automute_lo = 0;
2962 } else if (spec->automute_lo_possible) {
2963 if (spec->automute_lo)
2965 spec->automute_lo = 1;
2970 if (!spec->automute_lo_possible || !spec->automute_speaker_possible)
2972 if (spec->automute_speaker && spec->automute_lo)
2974 spec->automute_speaker = 1;
2975 spec->automute_lo = 1;
2980 call_update_outputs(codec);
2984 static const struct snd_kcontrol_new automute_mode_enum = {
2985 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2986 .name = "Auto-Mute Mode",
2987 .info = automute_mode_info,
2988 .get = automute_mode_get,
2989 .put = automute_mode_put,
2992 static int add_automute_mode_enum(struct hda_codec *codec)
2994 struct hda_gen_spec *spec = codec->spec;
2996 if (!snd_hda_gen_add_kctl(spec, NULL, &automute_mode_enum))
3002 * Check the availability of HP/line-out auto-mute;
3003 * Set up appropriately if really supported
3005 static int check_auto_mute_availability(struct hda_codec *codec)
3007 struct hda_gen_spec *spec = codec->spec;
3008 struct auto_pin_cfg *cfg = &spec->autocfg;
3012 if (cfg->hp_pins[0])
3014 if (cfg->line_out_pins[0])
3016 if (cfg->speaker_pins[0])
3018 if (present < 2) /* need two different output types */
3021 if (!cfg->speaker_pins[0] &&
3022 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
3023 memcpy(cfg->speaker_pins, cfg->line_out_pins,
3024 sizeof(cfg->speaker_pins));
3025 cfg->speaker_outs = cfg->line_outs;
3028 if (!cfg->hp_pins[0] &&
3029 cfg->line_out_type == AUTO_PIN_HP_OUT) {
3030 memcpy(cfg->hp_pins, cfg->line_out_pins,
3031 sizeof(cfg->hp_pins));
3032 cfg->hp_outs = cfg->line_outs;
3035 for (i = 0; i < cfg->hp_outs; i++) {
3036 hda_nid_t nid = cfg->hp_pins[i];
3037 if (!is_jack_detectable(codec, nid))
3039 snd_printdd("hda-codec: Enable HP auto-muting on NID 0x%x\n",
3041 snd_hda_jack_detect_enable_callback(codec, nid, HDA_GEN_HP_EVENT,
3042 spec->hp_automute_hook ?
3043 spec->hp_automute_hook :
3044 snd_hda_gen_hp_automute);
3045 spec->detect_hp = 1;
3048 if (cfg->line_out_type == AUTO_PIN_LINE_OUT && cfg->line_outs) {
3049 if (cfg->speaker_outs)
3050 for (i = 0; i < cfg->line_outs; i++) {
3051 hda_nid_t nid = cfg->line_out_pins[i];
3052 if (!is_jack_detectable(codec, nid))
3054 snd_printdd("hda-codec: Enable Line-Out auto-muting on NID 0x%x\n", nid);
3055 snd_hda_jack_detect_enable_callback(codec, nid,
3056 HDA_GEN_FRONT_EVENT,
3057 spec->line_automute_hook ?
3058 spec->line_automute_hook :
3059 snd_hda_gen_line_automute);
3060 spec->detect_lo = 1;
3062 spec->automute_lo_possible = spec->detect_hp;
3065 spec->automute_speaker_possible = cfg->speaker_outs &&
3066 (spec->detect_hp || spec->detect_lo);
3068 spec->automute_lo = spec->automute_lo_possible;
3069 spec->automute_speaker = spec->automute_speaker_possible;
3071 if (spec->automute_speaker_possible || spec->automute_lo_possible) {
3072 /* create a control for automute mode */
3073 err = add_automute_mode_enum(codec);
3080 /* check whether all auto-mic pins are valid; setup indices if OK */
3081 static bool auto_mic_check_imux(struct hda_codec *codec)
3083 struct hda_gen_spec *spec = codec->spec;
3084 const struct hda_input_mux *imux;
3087 imux = &spec->input_mux;
3088 for (i = 0; i < spec->am_num_entries; i++) {
3089 spec->am_entry[i].idx =
3090 find_idx_in_nid_list(spec->am_entry[i].pin,
3091 spec->imux_pins, imux->num_items);
3092 if (spec->am_entry[i].idx < 0)
3093 return false; /* no corresponding imux */
3096 /* we don't need the jack detection for the first pin */
3097 for (i = 1; i < spec->am_num_entries; i++)
3098 snd_hda_jack_detect_enable_callback(codec,
3099 spec->am_entry[i].pin,
3101 spec->mic_autoswitch_hook ?
3102 spec->mic_autoswitch_hook :
3103 snd_hda_gen_mic_autoswitch);
3107 static int compare_attr(const void *ap, const void *bp)
3109 const struct automic_entry *a = ap;
3110 const struct automic_entry *b = bp;
3111 return (int)(a->attr - b->attr);
3115 * Check the availability of auto-mic switch;
3116 * Set up if really supported
3118 static int check_auto_mic_availability(struct hda_codec *codec)
3120 struct hda_gen_spec *spec = codec->spec;
3121 struct auto_pin_cfg *cfg = &spec->autocfg;
3125 if (spec->suppress_auto_mic)
3130 for (i = 0; i < cfg->num_inputs; i++) {
3131 hda_nid_t nid = cfg->inputs[i].pin;
3133 attr = snd_hda_codec_get_pincfg(codec, nid);
3134 attr = snd_hda_get_input_pin_attr(attr);
3135 if (types & (1 << attr))
3136 return 0; /* already occupied */
3138 case INPUT_PIN_ATTR_INT:
3139 if (cfg->inputs[i].type != AUTO_PIN_MIC)
3140 return 0; /* invalid type */
3142 case INPUT_PIN_ATTR_UNUSED:
3143 return 0; /* invalid entry */
3145 if (cfg->inputs[i].type > AUTO_PIN_LINE_IN)
3146 return 0; /* invalid type */
3147 if (!spec->line_in_auto_switch &&
3148 cfg->inputs[i].type != AUTO_PIN_MIC)
3149 return 0; /* only mic is allowed */
3150 if (!is_jack_detectable(codec, nid))
3151 return 0; /* no unsol support */
3154 if (num_pins >= MAX_AUTO_MIC_PINS)
3156 types |= (1 << attr);
3157 spec->am_entry[num_pins].pin = nid;
3158 spec->am_entry[num_pins].attr = attr;
3165 spec->am_num_entries = num_pins;
3166 /* sort the am_entry in the order of attr so that the pin with a
3167 * higher attr will be selected when the jack is plugged.
3169 sort(spec->am_entry, num_pins, sizeof(spec->am_entry[0]),
3170 compare_attr, NULL);
3172 if (!auto_mic_check_imux(codec))
3176 spec->num_adc_nids = 1;
3177 spec->cur_mux[0] = spec->am_entry[0].idx;
3178 snd_printdd("hda-codec: Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n",
3179 spec->am_entry[0].pin,
3180 spec->am_entry[1].pin,
3181 spec->am_entry[2].pin);
3188 * Parse the given BIOS configuration and set up the hda_gen_spec
3190 * return 1 if successful, 0 if the proper config is not found,
3191 * or a negative error code
3193 int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
3194 struct auto_pin_cfg *cfg)
3196 struct hda_gen_spec *spec = codec->spec;
3199 if (cfg != &spec->autocfg) {
3200 spec->autocfg = *cfg;
3201 cfg = &spec->autocfg;
3204 if (!cfg->line_outs) {
3205 if (cfg->dig_outs || cfg->dig_in_pin) {
3206 spec->multiout.max_channels = 2;
3207 spec->no_analog = 1;
3210 return 0; /* can't find valid BIOS pin config */
3213 if (!spec->no_primary_hp &&
3214 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT &&
3215 cfg->line_outs <= cfg->hp_outs) {
3216 /* use HP as primary out */
3217 cfg->speaker_outs = cfg->line_outs;
3218 memcpy(cfg->speaker_pins, cfg->line_out_pins,
3219 sizeof(cfg->speaker_pins));
3220 cfg->line_outs = cfg->hp_outs;
3221 memcpy(cfg->line_out_pins, cfg->hp_pins, sizeof(cfg->hp_pins));
3223 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
3224 cfg->line_out_type = AUTO_PIN_HP_OUT;
3227 err = parse_output_paths(codec);
3230 err = create_multi_channel_mode(codec);
3233 err = create_multi_out_ctls(codec, cfg);
3236 err = create_hp_out_ctls(codec);
3239 err = create_speaker_out_ctls(codec);
3242 err = create_indep_hp_ctls(codec);
3245 err = create_loopback_mixing_ctl(codec);
3248 err = create_shared_input(codec);
3251 err = create_input_ctls(codec);
3255 spec->const_channel_count = spec->ext_channel_count;
3256 /* check the multiple speaker and headphone pins */
3257 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
3258 spec->const_channel_count = max(spec->const_channel_count,
3259 cfg->speaker_outs * 2);
3260 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
3261 spec->const_channel_count = max(spec->const_channel_count,
3263 spec->multiout.max_channels = max(spec->ext_channel_count,
3264 spec->const_channel_count);
3266 err = check_auto_mute_availability(codec);
3270 err = check_dyn_adc_switch(codec);
3274 if (!spec->shared_mic_hp) {
3275 err = check_auto_mic_availability(codec);
3280 err = create_capture_mixers(codec);
3284 err = parse_mic_boost(codec);
3289 parse_digital(codec);
3293 EXPORT_SYMBOL_HDA(snd_hda_gen_parse_auto_config);
3297 * Build control elements
3300 /* slave controls for virtual master */
3301 static const char * const slave_pfxs[] = {
3302 "Front", "Surround", "Center", "LFE", "Side",
3303 "Headphone", "Speaker", "Mono", "Line Out",
3304 "CLFE", "Bass Speaker", "PCM",
3305 "Speaker Front", "Speaker Surround", "Speaker CLFE", "Speaker Side",
3306 "Headphone Front", "Headphone Surround", "Headphone CLFE",
3311 int snd_hda_gen_build_controls(struct hda_codec *codec)
3313 struct hda_gen_spec *spec = codec->spec;
3316 if (spec->kctls.used) {
3317 err = snd_hda_add_new_ctls(codec, spec->kctls.list);
3322 if (spec->multiout.dig_out_nid) {
3323 err = snd_hda_create_dig_out_ctls(codec,
3324 spec->multiout.dig_out_nid,
3325 spec->multiout.dig_out_nid,
3326 spec->pcm_rec[1].pcm_type);
3329 if (!spec->no_analog) {
3330 err = snd_hda_create_spdif_share_sw(codec,
3334 spec->multiout.share_spdif = 1;
3337 if (spec->dig_in_nid) {
3338 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
3343 /* if we have no master control, let's create it */
3344 if (!spec->no_analog &&
3345 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
3346 unsigned int vmaster_tlv[4];
3347 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
3348 HDA_OUTPUT, vmaster_tlv);
3349 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
3350 vmaster_tlv, slave_pfxs,
3355 if (!spec->no_analog &&
3356 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
3357 err = __snd_hda_add_vmaster(codec, "Master Playback Switch",
3360 true, &spec->vmaster_mute.sw_kctl);
3363 if (spec->vmaster_mute.hook)
3364 snd_hda_add_vmaster_hook(codec, &spec->vmaster_mute,
3365 spec->vmaster_mute_enum);
3368 free_kctls(spec); /* no longer needed */
3370 if (spec->shared_mic_hp) {
3372 int nid = spec->autocfg.inputs[1].pin;
3373 err = snd_hda_jack_add_kctl(codec, nid, "Headphone Mic", 0);
3376 err = snd_hda_jack_detect_enable(codec, nid, 0);
3381 err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
3387 EXPORT_SYMBOL_HDA(snd_hda_gen_build_controls);
3394 static void call_pcm_playback_hook(struct hda_pcm_stream *hinfo,
3395 struct hda_codec *codec,
3396 struct snd_pcm_substream *substream,
3399 struct hda_gen_spec *spec = codec->spec;
3400 if (spec->pcm_playback_hook)
3401 spec->pcm_playback_hook(hinfo, codec, substream, action);
3405 * Analog playback callbacks
3407 static int playback_pcm_open(struct hda_pcm_stream *hinfo,
3408 struct hda_codec *codec,
3409 struct snd_pcm_substream *substream)
3411 struct hda_gen_spec *spec = codec->spec;
3414 mutex_lock(&spec->pcm_mutex);
3415 err = snd_hda_multi_out_analog_open(codec,
3416 &spec->multiout, substream,
3419 spec->active_streams |= 1 << STREAM_MULTI_OUT;
3420 call_pcm_playback_hook(hinfo, codec, substream,
3421 HDA_GEN_PCM_ACT_OPEN);
3423 mutex_unlock(&spec->pcm_mutex);
3427 static int playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3428 struct hda_codec *codec,
3429 unsigned int stream_tag,
3430 unsigned int format,
3431 struct snd_pcm_substream *substream)
3433 struct hda_gen_spec *spec = codec->spec;
3436 err = snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3437 stream_tag, format, substream);
3439 call_pcm_playback_hook(hinfo, codec, substream,
3440 HDA_GEN_PCM_ACT_PREPARE);
3444 static int playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3445 struct hda_codec *codec,
3446 struct snd_pcm_substream *substream)
3448 struct hda_gen_spec *spec = codec->spec;
3451 err = snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3453 call_pcm_playback_hook(hinfo, codec, substream,
3454 HDA_GEN_PCM_ACT_CLEANUP);
3458 static int playback_pcm_close(struct hda_pcm_stream *hinfo,
3459 struct hda_codec *codec,
3460 struct snd_pcm_substream *substream)
3462 struct hda_gen_spec *spec = codec->spec;
3463 mutex_lock(&spec->pcm_mutex);
3464 spec->active_streams &= ~(1 << STREAM_MULTI_OUT);
3465 call_pcm_playback_hook(hinfo, codec, substream,
3466 HDA_GEN_PCM_ACT_CLOSE);
3467 mutex_unlock(&spec->pcm_mutex);
3471 static int alt_playback_pcm_open(struct hda_pcm_stream *hinfo,
3472 struct hda_codec *codec,
3473 struct snd_pcm_substream *substream)
3475 struct hda_gen_spec *spec = codec->spec;
3478 mutex_lock(&spec->pcm_mutex);
3479 if (!spec->indep_hp_enabled)
3482 spec->active_streams |= 1 << STREAM_INDEP_HP;
3483 call_pcm_playback_hook(hinfo, codec, substream,
3484 HDA_GEN_PCM_ACT_OPEN);
3485 mutex_unlock(&spec->pcm_mutex);
3489 static int alt_playback_pcm_close(struct hda_pcm_stream *hinfo,
3490 struct hda_codec *codec,
3491 struct snd_pcm_substream *substream)
3493 struct hda_gen_spec *spec = codec->spec;
3494 mutex_lock(&spec->pcm_mutex);
3495 spec->active_streams &= ~(1 << STREAM_INDEP_HP);
3496 call_pcm_playback_hook(hinfo, codec, substream,
3497 HDA_GEN_PCM_ACT_CLOSE);
3498 mutex_unlock(&spec->pcm_mutex);
3502 static int alt_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3503 struct hda_codec *codec,
3504 unsigned int stream_tag,
3505 unsigned int format,
3506 struct snd_pcm_substream *substream)
3508 snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format);
3509 call_pcm_playback_hook(hinfo, codec, substream,
3510 HDA_GEN_PCM_ACT_PREPARE);
3514 static int alt_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3515 struct hda_codec *codec,
3516 struct snd_pcm_substream *substream)
3518 snd_hda_codec_cleanup_stream(codec, hinfo->nid);
3519 call_pcm_playback_hook(hinfo, codec, substream,
3520 HDA_GEN_PCM_ACT_CLEANUP);
3527 static int dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3528 struct hda_codec *codec,
3529 struct snd_pcm_substream *substream)
3531 struct hda_gen_spec *spec = codec->spec;
3532 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3535 static int dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3536 struct hda_codec *codec,
3537 unsigned int stream_tag,
3538 unsigned int format,
3539 struct snd_pcm_substream *substream)
3541 struct hda_gen_spec *spec = codec->spec;
3542 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3543 stream_tag, format, substream);
3546 static int dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3547 struct hda_codec *codec,
3548 struct snd_pcm_substream *substream)
3550 struct hda_gen_spec *spec = codec->spec;
3551 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3554 static int dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3555 struct hda_codec *codec,
3556 struct snd_pcm_substream *substream)
3558 struct hda_gen_spec *spec = codec->spec;
3559 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3565 static int alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3566 struct hda_codec *codec,
3567 unsigned int stream_tag,
3568 unsigned int format,
3569 struct snd_pcm_substream *substream)
3571 struct hda_gen_spec *spec = codec->spec;
3573 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3574 stream_tag, 0, format);
3578 static int alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3579 struct hda_codec *codec,
3580 struct snd_pcm_substream *substream)
3582 struct hda_gen_spec *spec = codec->spec;
3584 snd_hda_codec_cleanup_stream(codec,
3585 spec->adc_nids[substream->number + 1]);
3591 static const struct hda_pcm_stream pcm_analog_playback = {
3595 /* NID is set in build_pcms */
3597 .open = playback_pcm_open,
3598 .close = playback_pcm_close,
3599 .prepare = playback_pcm_prepare,
3600 .cleanup = playback_pcm_cleanup
3604 static const struct hda_pcm_stream pcm_analog_capture = {
3608 /* NID is set in build_pcms */
3611 static const struct hda_pcm_stream pcm_analog_alt_playback = {
3615 /* NID is set in build_pcms */
3617 .open = alt_playback_pcm_open,
3618 .close = alt_playback_pcm_close,
3619 .prepare = alt_playback_pcm_prepare,
3620 .cleanup = alt_playback_pcm_cleanup
3624 static const struct hda_pcm_stream pcm_analog_alt_capture = {
3625 .substreams = 2, /* can be overridden */
3628 /* NID is set in build_pcms */
3630 .prepare = alt_capture_pcm_prepare,
3631 .cleanup = alt_capture_pcm_cleanup
3635 static const struct hda_pcm_stream pcm_digital_playback = {
3639 /* NID is set in build_pcms */
3641 .open = dig_playback_pcm_open,
3642 .close = dig_playback_pcm_close,
3643 .prepare = dig_playback_pcm_prepare,
3644 .cleanup = dig_playback_pcm_cleanup
3648 static const struct hda_pcm_stream pcm_digital_capture = {
3652 /* NID is set in build_pcms */
3655 /* Used by build_pcms to flag that a PCM has no playback stream */
3656 static const struct hda_pcm_stream pcm_null_stream = {
3663 * dynamic changing ADC PCM streams
3665 static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur)
3667 struct hda_gen_spec *spec = codec->spec;
3668 hda_nid_t new_adc = spec->adc_nids[spec->dyn_adc_idx[cur]];
3670 if (spec->cur_adc && spec->cur_adc != new_adc) {
3671 /* stream is running, let's swap the current ADC */
3672 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
3673 spec->cur_adc = new_adc;
3674 snd_hda_codec_setup_stream(codec, new_adc,
3675 spec->cur_adc_stream_tag, 0,
3676 spec->cur_adc_format);
3682 /* analog capture with dynamic dual-adc changes */
3683 static int dyn_adc_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3684 struct hda_codec *codec,
3685 unsigned int stream_tag,
3686 unsigned int format,
3687 struct snd_pcm_substream *substream)
3689 struct hda_gen_spec *spec = codec->spec;
3690 spec->cur_adc = spec->adc_nids[spec->dyn_adc_idx[spec->cur_mux[0]]];
3691 spec->cur_adc_stream_tag = stream_tag;
3692 spec->cur_adc_format = format;
3693 snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
3697 static int dyn_adc_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3698 struct hda_codec *codec,
3699 struct snd_pcm_substream *substream)
3701 struct hda_gen_spec *spec = codec->spec;
3702 snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
3707 static const struct hda_pcm_stream dyn_adc_pcm_analog_capture = {
3711 .nid = 0, /* fill later */
3713 .prepare = dyn_adc_capture_pcm_prepare,
3714 .cleanup = dyn_adc_capture_pcm_cleanup
3718 static void fill_pcm_stream_name(char *str, size_t len, const char *sfx,
3719 const char *chip_name)
3725 strlcpy(str, chip_name, len);
3727 /* drop non-alnum chars after a space */
3728 for (p = strchr(str, ' '); p; p = strchr(p + 1, ' ')) {
3729 if (!isalnum(p[1])) {
3734 strlcat(str, sfx, len);
3737 /* build PCM streams based on the parsed results */
3738 int snd_hda_gen_build_pcms(struct hda_codec *codec)
3740 struct hda_gen_spec *spec = codec->spec;
3741 struct hda_pcm *info = spec->pcm_rec;
3742 const struct hda_pcm_stream *p;
3743 bool have_multi_adcs;
3745 codec->num_pcms = 1;
3746 codec->pcm_info = info;
3748 if (spec->no_analog)
3751 fill_pcm_stream_name(spec->stream_name_analog,
3752 sizeof(spec->stream_name_analog),
3753 " Analog", codec->chip_name);
3754 info->name = spec->stream_name_analog;
3756 if (spec->multiout.num_dacs > 0) {
3757 p = spec->stream_analog_playback;
3759 p = &pcm_analog_playback;
3760 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3761 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3762 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
3763 spec->multiout.max_channels;
3764 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT &&
3765 spec->autocfg.line_outs == 2)
3766 info->stream[SNDRV_PCM_STREAM_PLAYBACK].chmap =
3769 if (spec->num_adc_nids) {
3770 p = spec->stream_analog_capture;
3772 if (spec->dyn_adc_switch)
3773 p = &dyn_adc_pcm_analog_capture;
3775 p = &pcm_analog_capture;
3777 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3778 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3782 /* SPDIF for stream index #1 */
3783 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3784 fill_pcm_stream_name(spec->stream_name_digital,
3785 sizeof(spec->stream_name_digital),
3786 " Digital", codec->chip_name);
3787 codec->num_pcms = 2;
3788 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3789 info = spec->pcm_rec + 1;
3790 info->name = spec->stream_name_digital;
3791 if (spec->dig_out_type)
3792 info->pcm_type = spec->dig_out_type;
3794 info->pcm_type = HDA_PCM_TYPE_SPDIF;
3795 if (spec->multiout.dig_out_nid) {
3796 p = spec->stream_digital_playback;
3798 p = &pcm_digital_playback;
3799 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3800 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3802 if (spec->dig_in_nid) {
3803 p = spec->stream_digital_capture;
3805 p = &pcm_digital_capture;
3806 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3807 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3811 if (spec->no_analog)
3814 /* If the use of more than one ADC is requested for the current
3815 * model, configure a second analog capture-only PCM.
3817 have_multi_adcs = (spec->num_adc_nids > 1) &&
3818 !spec->dyn_adc_switch && !spec->auto_mic;
3819 /* Additional Analaog capture for index #2 */
3820 if (spec->alt_dac_nid || have_multi_adcs) {
3821 codec->num_pcms = 3;
3822 info = spec->pcm_rec + 2;
3823 info->name = spec->stream_name_analog;
3824 if (spec->alt_dac_nid) {
3825 p = spec->stream_analog_alt_playback;
3827 p = &pcm_analog_alt_playback;
3828 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3829 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3832 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3834 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3836 if (have_multi_adcs) {
3837 p = spec->stream_analog_alt_capture;
3839 p = &pcm_analog_alt_capture;
3840 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3841 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3843 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3844 spec->num_adc_nids - 1;
3846 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3848 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3854 EXPORT_SYMBOL_HDA(snd_hda_gen_build_pcms);
3858 * Standard auto-parser initializations
3861 /* configure the given path as a proper output */
3862 static void set_output_and_unmute(struct hda_codec *codec, int path_idx)
3864 struct nid_path *path;
3867 path = snd_hda_get_path_from_idx(codec, path_idx);
3868 if (!path || !path->depth)
3870 pin = path->path[path->depth - 1];
3871 restore_pin_ctl(codec, pin);
3872 snd_hda_activate_path(codec, path, path->active, true);
3873 set_pin_eapd(codec, pin, path->active);
3876 /* initialize primary output paths */
3877 static void init_multi_out(struct hda_codec *codec)
3879 struct hda_gen_spec *spec = codec->spec;
3882 for (i = 0; i < spec->autocfg.line_outs; i++)
3883 set_output_and_unmute(codec, spec->out_paths[i]);
3887 static void __init_extra_out(struct hda_codec *codec, int num_outs, int *paths)
3891 for (i = 0; i < num_outs; i++)
3892 set_output_and_unmute(codec, paths[i]);
3895 /* initialize hp and speaker paths */
3896 static void init_extra_out(struct hda_codec *codec)
3898 struct hda_gen_spec *spec = codec->spec;
3900 if (spec->autocfg.line_out_type != AUTO_PIN_HP_OUT)
3901 __init_extra_out(codec, spec->autocfg.hp_outs, spec->hp_paths);
3902 if (spec->autocfg.line_out_type != AUTO_PIN_SPEAKER_OUT)
3903 __init_extra_out(codec, spec->autocfg.speaker_outs,
3904 spec->speaker_paths);
3907 /* initialize multi-io paths */
3908 static void init_multi_io(struct hda_codec *codec)
3910 struct hda_gen_spec *spec = codec->spec;
3913 for (i = 0; i < spec->multi_ios; i++) {
3914 hda_nid_t pin = spec->multi_io[i].pin;
3915 struct nid_path *path;
3916 path = get_multiio_path(codec, i);
3919 if (!spec->multi_io[i].ctl_in)
3920 spec->multi_io[i].ctl_in =
3921 snd_hda_codec_get_pin_target(codec, pin);
3922 snd_hda_activate_path(codec, path, path->active, true);
3926 /* set up input pins and loopback paths */
3927 static void init_analog_input(struct hda_codec *codec)
3929 struct hda_gen_spec *spec = codec->spec;
3930 struct auto_pin_cfg *cfg = &spec->autocfg;
3933 for (i = 0; i < cfg->num_inputs; i++) {
3934 hda_nid_t nid = cfg->inputs[i].pin;
3935 if (is_input_pin(codec, nid))
3936 restore_pin_ctl(codec, nid);
3938 /* init loopback inputs */
3939 if (spec->mixer_nid) {
3940 struct nid_path *path;
3941 path = snd_hda_get_path_from_idx(codec, spec->loopback_paths[i]);
3943 snd_hda_activate_path(codec, path,
3944 path->active, false);
3949 /* initialize ADC paths */
3950 static void init_input_src(struct hda_codec *codec)
3952 struct hda_gen_spec *spec = codec->spec;
3953 struct hda_input_mux *imux = &spec->input_mux;
3954 struct nid_path *path;
3957 if (spec->dyn_adc_switch)
3960 nums = spec->num_adc_nids;
3962 for (c = 0; c < nums; c++) {
3963 for (i = 0; i < imux->num_items; i++) {
3964 path = get_input_path(codec, c, i);
3966 bool active = path->active;
3967 if (i == spec->cur_mux[c])
3969 snd_hda_activate_path(codec, path, active, false);
3974 if (spec->shared_mic_hp)
3975 update_shared_mic_hp(codec, spec->cur_mux[0]);
3977 if (spec->cap_sync_hook)
3978 spec->cap_sync_hook(codec);
3981 /* set right pin controls for digital I/O */
3982 static void init_digital(struct hda_codec *codec)
3984 struct hda_gen_spec *spec = codec->spec;
3988 for (i = 0; i < spec->autocfg.dig_outs; i++)
3989 set_output_and_unmute(codec, spec->digout_paths[i]);
3990 pin = spec->autocfg.dig_in_pin;
3992 struct nid_path *path;
3993 restore_pin_ctl(codec, pin);
3994 path = snd_hda_get_path_from_idx(codec, spec->digin_path);
3996 snd_hda_activate_path(codec, path, path->active, false);
4000 /* clear unsol-event tags on unused pins; Conexant codecs seem to leave
4001 * invalid unsol tags by some reason
4003 static void clear_unsol_on_unused_pins(struct hda_codec *codec)
4007 for (i = 0; i < codec->init_pins.used; i++) {
4008 struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
4009 hda_nid_t nid = pin->nid;
4010 if (is_jack_detectable(codec, nid) &&
4011 !snd_hda_jack_tbl_get(codec, nid))
4012 snd_hda_codec_update_cache(codec, nid, 0,
4013 AC_VERB_SET_UNSOLICITED_ENABLE, 0);
4018 * initialize the generic spec;
4019 * this can be put as patch_ops.init function
4021 int snd_hda_gen_init(struct hda_codec *codec)
4023 struct hda_gen_spec *spec = codec->spec;
4025 if (spec->init_hook)
4026 spec->init_hook(codec);
4028 snd_hda_apply_verbs(codec);
4030 codec->cached_write = 1;
4032 init_multi_out(codec);
4033 init_extra_out(codec);
4034 init_multi_io(codec);
4035 init_analog_input(codec);
4036 init_input_src(codec);
4037 init_digital(codec);
4039 clear_unsol_on_unused_pins(codec);
4041 /* call init functions of standard auto-mute helpers */
4042 snd_hda_gen_hp_automute(codec, NULL);
4043 snd_hda_gen_line_automute(codec, NULL);
4044 snd_hda_gen_mic_autoswitch(codec, NULL);
4046 snd_hda_codec_flush_amp_cache(codec);
4047 snd_hda_codec_flush_cmd_cache(codec);
4049 if (spec->vmaster_mute.sw_kctl && spec->vmaster_mute.hook)
4050 snd_hda_sync_vmaster_hook(&spec->vmaster_mute);
4052 hda_call_check_power_status(codec, 0x01);
4055 EXPORT_SYMBOL_HDA(snd_hda_gen_init);
4058 * free the generic spec;
4059 * this can be put as patch_ops.free function
4061 void snd_hda_gen_free(struct hda_codec *codec)
4063 snd_hda_gen_spec_free(codec->spec);
4067 EXPORT_SYMBOL_HDA(snd_hda_gen_free);
4071 * check the loopback power save state;
4072 * this can be put as patch_ops.check_power_status function
4074 int snd_hda_gen_check_power_status(struct hda_codec *codec, hda_nid_t nid)
4076 struct hda_gen_spec *spec = codec->spec;
4077 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
4079 EXPORT_SYMBOL_HDA(snd_hda_gen_check_power_status);
4084 * the generic codec support
4087 static const struct hda_codec_ops generic_patch_ops = {
4088 .build_controls = snd_hda_gen_build_controls,
4089 .build_pcms = snd_hda_gen_build_pcms,
4090 .init = snd_hda_gen_init,
4091 .free = snd_hda_gen_free,
4092 .unsol_event = snd_hda_jack_unsol_event,
4094 .check_power_status = snd_hda_gen_check_power_status,
4098 int snd_hda_parse_generic_codec(struct hda_codec *codec)
4100 struct hda_gen_spec *spec;
4103 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4106 snd_hda_gen_spec_init(spec);
4109 err = snd_hda_parse_pin_defcfg(codec, &spec->autocfg, NULL, 0);
4113 err = snd_hda_gen_parse_auto_config(codec, &spec->autocfg);
4117 codec->patch_ops = generic_patch_ops;
4121 snd_hda_gen_free(codec);
4124 EXPORT_SYMBOL_HDA(snd_hda_parse_generic_codec);