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);
90 static struct nid_path *get_nid_path(struct hda_codec *codec,
91 hda_nid_t from_nid, hda_nid_t to_nid,
94 struct hda_gen_spec *spec = codec->spec;
97 for (i = 0; i < spec->paths.used; i++) {
98 struct nid_path *path = snd_array_elem(&spec->paths, i);
101 if ((!from_nid || path->path[0] == from_nid) &&
102 (!to_nid || path->path[path->depth - 1] == to_nid)) {
103 if (with_aa_mix == HDA_PARSE_ALL ||
104 path->with_aa_mix == with_aa_mix)
111 /* get the path between the given NIDs;
112 * passing 0 to either @pin or @dac behaves as a wildcard
114 struct nid_path *snd_hda_get_nid_path(struct hda_codec *codec,
115 hda_nid_t from_nid, hda_nid_t to_nid)
117 return get_nid_path(codec, from_nid, to_nid, HDA_PARSE_ALL);
119 EXPORT_SYMBOL_HDA(snd_hda_get_nid_path);
121 /* get the index number corresponding to the path instance;
122 * the index starts from 1, for easier checking the invalid value
124 int snd_hda_get_path_idx(struct hda_codec *codec, struct nid_path *path)
126 struct hda_gen_spec *spec = codec->spec;
127 struct nid_path *array = spec->paths.list;
130 if (!spec->paths.used)
133 if (idx < 0 || idx >= spec->paths.used)
138 /* get the path instance corresponding to the given index number */
139 struct nid_path *snd_hda_get_path_from_idx(struct hda_codec *codec, int idx)
141 struct hda_gen_spec *spec = codec->spec;
143 if (idx <= 0 || idx > spec->paths.used)
145 return snd_array_elem(&spec->paths, idx - 1);
148 /* check whether the given DAC is already found in any existing paths */
149 static bool is_dac_already_used(struct hda_codec *codec, hda_nid_t nid)
151 struct hda_gen_spec *spec = codec->spec;
154 for (i = 0; i < spec->paths.used; i++) {
155 struct nid_path *path = snd_array_elem(&spec->paths, i);
156 if (path->path[0] == nid)
162 /* check whether the given two widgets can be connected */
163 static bool is_reachable_path(struct hda_codec *codec,
164 hda_nid_t from_nid, hda_nid_t to_nid)
166 if (!from_nid || !to_nid)
168 return snd_hda_get_conn_index(codec, to_nid, from_nid, true) >= 0;
171 /* nid, dir and idx */
172 #define AMP_VAL_COMPARE_MASK (0xffff | (1U << 18) | (0x0f << 19))
174 /* check whether the given ctl is already assigned in any path elements */
175 static bool is_ctl_used(struct hda_codec *codec, unsigned int val, int type)
177 struct hda_gen_spec *spec = codec->spec;
180 val &= AMP_VAL_COMPARE_MASK;
181 for (i = 0; i < spec->paths.used; i++) {
182 struct nid_path *path = snd_array_elem(&spec->paths, i);
183 if ((path->ctls[type] & AMP_VAL_COMPARE_MASK) == val)
189 /* check whether a control with the given (nid, dir, idx) was assigned */
190 static bool is_ctl_associated(struct hda_codec *codec, hda_nid_t nid,
193 unsigned int val = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
194 return is_ctl_used(codec, val, NID_PATH_VOL_CTL) ||
195 is_ctl_used(codec, val, NID_PATH_MUTE_CTL);
198 static void print_nid_path(const char *pfx, struct nid_path *path)
205 for (i = 0; i < path->depth; i++) {
207 sprintf(tmp, ":%02x", path->path[i]);
208 strlcat(buf, tmp, sizeof(buf));
210 snd_printdd("%s path: depth=%d %s\n", pfx, path->depth, buf);
213 /* called recursively */
214 static bool __parse_nid_path(struct hda_codec *codec,
215 hda_nid_t from_nid, hda_nid_t to_nid,
216 int with_aa_mix, struct nid_path *path, int depth)
218 struct hda_gen_spec *spec = codec->spec;
219 const hda_nid_t *conn;
222 if (to_nid == spec->mixer_nid) {
223 if (with_aa_mix == HDA_PARSE_NO_AAMIX)
225 with_aa_mix = HDA_PARSE_ALL; /* mark aa-mix is included */
228 nums = snd_hda_get_conn_list(codec, to_nid, &conn);
229 for (i = 0; i < nums; i++) {
230 if (conn[i] != from_nid) {
231 /* special case: when from_nid is 0,
232 * try to find an empty DAC
235 get_wcaps_type(get_wcaps(codec, conn[i])) != AC_WID_AUD_OUT ||
236 is_dac_already_used(codec, conn[i]))
239 /* aa-mix is requested but not included? */
240 if (!(spec->mixer_nid && with_aa_mix == HDA_PARSE_ONLY_AAMIX))
243 if (depth >= MAX_NID_PATH_DEPTH)
245 for (i = 0; i < nums; i++) {
247 type = get_wcaps_type(get_wcaps(codec, conn[i]));
248 if (type == AC_WID_AUD_OUT || type == AC_WID_AUD_IN ||
251 if (__parse_nid_path(codec, from_nid, conn[i],
252 with_aa_mix, path, depth + 1))
258 path->path[path->depth] = conn[i];
259 if (conn[i] == spec->mixer_nid)
260 path->with_aa_mix = true;
261 path->idx[path->depth + 1] = i;
262 if (nums > 1 && get_wcaps_type(get_wcaps(codec, to_nid)) != AC_WID_AUD_MIX)
263 path->multi[path->depth + 1] = 1;
268 /* parse the widget path from the given nid to the target nid;
269 * when @from_nid is 0, try to find an empty DAC;
270 * when @with_aa_mix is HDA_PARSE_NO_AAMIX, paths with spec->mixer_nid are
271 * excluded, only the paths that don't go through the mixer will be chosen.
272 * when @with_aa_mix is HDA_PARSE_ONLY_AAMIX, only the paths going through
273 * spec->mixer_nid will be chosen.
274 * when @with_aa_mix is HDA_PARSE_ALL, no special handling about mixer widget.
276 bool snd_hda_parse_nid_path(struct hda_codec *codec, hda_nid_t from_nid,
277 hda_nid_t to_nid, int with_aa_mix,
278 struct nid_path *path)
280 if (__parse_nid_path(codec, from_nid, to_nid, with_aa_mix, path, 1)) {
281 path->path[path->depth] = to_nid;
287 EXPORT_SYMBOL_HDA(snd_hda_parse_nid_path);
290 * parse the path between the given NIDs and add to the path list.
291 * if no valid path is found, return NULL
294 snd_hda_add_new_path(struct hda_codec *codec, hda_nid_t from_nid,
295 hda_nid_t to_nid, int with_aa_mix)
297 struct hda_gen_spec *spec = codec->spec;
298 struct nid_path *path;
300 if (from_nid && to_nid && !is_reachable_path(codec, from_nid, to_nid))
303 /* check whether the path has been already added */
304 path = get_nid_path(codec, from_nid, to_nid, with_aa_mix);
308 path = snd_array_new(&spec->paths);
311 memset(path, 0, sizeof(*path));
312 if (snd_hda_parse_nid_path(codec, from_nid, to_nid, with_aa_mix, path))
318 EXPORT_SYMBOL_HDA(snd_hda_add_new_path);
320 /* look for an empty DAC slot */
321 static hda_nid_t look_for_dac(struct hda_codec *codec, hda_nid_t pin,
324 struct hda_gen_spec *spec = codec->spec;
328 for (i = 0; i < spec->num_all_dacs; i++) {
329 hda_nid_t nid = spec->all_dacs[i];
330 if (!nid || is_dac_already_used(codec, nid))
332 cap_digital = !!(get_wcaps(codec, nid) & AC_WCAP_DIGITAL);
333 if (is_digital != cap_digital)
335 if (is_reachable_path(codec, nid, pin))
341 /* replace the channels in the composed amp value with the given number */
342 static unsigned int amp_val_replace_channels(unsigned int val, unsigned int chs)
344 val &= ~(0x3U << 16);
349 /* check whether the widget has the given amp capability for the direction */
350 static bool check_amp_caps(struct hda_codec *codec, hda_nid_t nid,
351 int dir, unsigned int bits)
355 if (get_wcaps(codec, nid) & (1 << (dir + 1)))
356 if (query_amp_caps(codec, nid, dir) & bits)
361 #define nid_has_mute(codec, nid, dir) \
362 check_amp_caps(codec, nid, dir, AC_AMPCAP_MUTE)
363 #define nid_has_volume(codec, nid, dir) \
364 check_amp_caps(codec, nid, dir, AC_AMPCAP_NUM_STEPS)
366 /* look for a widget suitable for assigning a mute switch in the path */
367 static hda_nid_t look_for_out_mute_nid(struct hda_codec *codec,
368 struct nid_path *path)
372 for (i = path->depth - 1; i >= 0; i--) {
373 if (nid_has_mute(codec, path->path[i], HDA_OUTPUT))
374 return path->path[i];
375 if (i != path->depth - 1 && i != 0 &&
376 nid_has_mute(codec, path->path[i], HDA_INPUT))
377 return path->path[i];
382 /* look for a widget suitable for assigning a volume ctl in the path */
383 static hda_nid_t look_for_out_vol_nid(struct hda_codec *codec,
384 struct nid_path *path)
388 for (i = path->depth - 1; i >= 0; i--) {
389 if (nid_has_volume(codec, path->path[i], HDA_OUTPUT))
390 return path->path[i];
396 * path activation / deactivation
399 /* can have the amp-in capability? */
400 static bool has_amp_in(struct hda_codec *codec, struct nid_path *path, int idx)
402 hda_nid_t nid = path->path[idx];
403 unsigned int caps = get_wcaps(codec, nid);
404 unsigned int type = get_wcaps_type(caps);
406 if (!(caps & AC_WCAP_IN_AMP))
408 if (type == AC_WID_PIN && idx > 0) /* only for input pins */
413 /* can have the amp-out capability? */
414 static bool has_amp_out(struct hda_codec *codec, struct nid_path *path, int idx)
416 hda_nid_t nid = path->path[idx];
417 unsigned int caps = get_wcaps(codec, nid);
418 unsigned int type = get_wcaps_type(caps);
420 if (!(caps & AC_WCAP_OUT_AMP))
422 if (type == AC_WID_PIN && !idx) /* only for output pins */
427 /* check whether the given (nid,dir,idx) is active */
428 static bool is_active_nid(struct hda_codec *codec, hda_nid_t nid,
429 unsigned int idx, unsigned int dir)
431 struct hda_gen_spec *spec = codec->spec;
434 for (n = 0; n < spec->paths.used; n++) {
435 struct nid_path *path = snd_array_elem(&spec->paths, n);
438 for (i = 0; i < path->depth; i++) {
439 if (path->path[i] == nid) {
440 if (dir == HDA_OUTPUT || path->idx[i] == idx)
449 /* get the default amp value for the target state */
450 static int get_amp_val_to_activate(struct hda_codec *codec, hda_nid_t nid,
451 int dir, bool enable)
454 unsigned int val = 0;
456 caps = query_amp_caps(codec, nid, dir);
457 if (caps & AC_AMPCAP_NUM_STEPS) {
460 val = (caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT;
462 if (caps & AC_AMPCAP_MUTE) {
469 /* initialize the amp value (only at the first time) */
470 static void init_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx)
472 int val = get_amp_val_to_activate(codec, nid, dir, false);
473 snd_hda_codec_amp_init_stereo(codec, nid, dir, idx, 0xff, val);
476 static void activate_amp(struct hda_codec *codec, hda_nid_t nid, int dir,
477 int idx, bool enable)
480 if (is_ctl_associated(codec, nid, dir, idx) ||
481 (!enable && is_active_nid(codec, nid, dir, idx)))
483 val = get_amp_val_to_activate(codec, nid, dir, enable);
484 snd_hda_codec_amp_stereo(codec, nid, dir, idx, 0xff, val);
487 static void activate_amp_out(struct hda_codec *codec, struct nid_path *path,
490 hda_nid_t nid = path->path[i];
491 init_amp(codec, nid, HDA_OUTPUT, 0);
492 activate_amp(codec, nid, HDA_OUTPUT, 0, enable);
495 static void activate_amp_in(struct hda_codec *codec, struct nid_path *path,
496 int i, bool enable, bool add_aamix)
498 struct hda_gen_spec *spec = codec->spec;
499 const hda_nid_t *conn;
502 hda_nid_t nid = path->path[i];
504 nums = snd_hda_get_conn_list(codec, nid, &conn);
505 type = get_wcaps_type(get_wcaps(codec, nid));
506 if (type == AC_WID_PIN ||
507 (type == AC_WID_AUD_IN && codec->single_adc_amp)) {
513 for (n = 0; n < nums; n++)
514 init_amp(codec, nid, HDA_INPUT, n);
516 if (is_ctl_associated(codec, nid, HDA_INPUT, idx))
519 /* here is a little bit tricky in comparison with activate_amp_out();
520 * when aa-mixer is available, we need to enable the path as well
522 for (n = 0; n < nums; n++) {
523 if (n != idx && (!add_aamix || conn[n] != spec->mixer_nid))
525 activate_amp(codec, nid, HDA_INPUT, n, enable);
529 /* activate or deactivate the given path
530 * if @add_aamix is set, enable the input from aa-mix NID as well (if any)
532 void snd_hda_activate_path(struct hda_codec *codec, struct nid_path *path,
533 bool enable, bool add_aamix)
538 path->active = false;
540 for (i = path->depth - 1; i >= 0; i--) {
541 if (enable && path->multi[i])
542 snd_hda_codec_write_cache(codec, path->path[i], 0,
543 AC_VERB_SET_CONNECT_SEL,
545 if (has_amp_in(codec, path, i))
546 activate_amp_in(codec, path, i, enable, add_aamix);
547 if (has_amp_out(codec, path, i))
548 activate_amp_out(codec, path, i, enable);
554 EXPORT_SYMBOL_HDA(snd_hda_activate_path);
556 /* turn on/off EAPD on the given pin */
557 static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable)
559 struct hda_gen_spec *spec = codec->spec;
560 if (spec->own_eapd_ctl ||
561 !(snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD))
565 snd_hda_codec_update_cache(codec, pin, 0,
566 AC_VERB_SET_EAPD_BTLENABLE,
567 enable ? 0x02 : 0x00);
572 * Helper functions for creating mixer ctl elements
580 static const struct snd_kcontrol_new control_templates[] = {
581 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
582 HDA_CODEC_MUTE(NULL, 0, 0, 0),
583 HDA_BIND_MUTE(NULL, 0, 0, 0),
586 /* add dynamic controls from template */
587 static int add_control(struct hda_gen_spec *spec, int type, const char *name,
588 int cidx, unsigned long val)
590 struct snd_kcontrol_new *knew;
592 knew = snd_hda_gen_add_kctl(spec, name, &control_templates[type]);
596 if (get_amp_nid_(val))
597 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
598 knew->private_value = val;
602 static int add_control_with_pfx(struct hda_gen_spec *spec, int type,
603 const char *pfx, const char *dir,
604 const char *sfx, int cidx, unsigned long val)
607 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
608 return add_control(spec, type, name, cidx, val);
611 #define add_pb_vol_ctrl(spec, type, pfx, val) \
612 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", 0, val)
613 #define add_pb_sw_ctrl(spec, type, pfx, val) \
614 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", 0, val)
615 #define __add_pb_vol_ctrl(spec, type, pfx, cidx, val) \
616 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", cidx, val)
617 #define __add_pb_sw_ctrl(spec, type, pfx, cidx, val) \
618 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", cidx, val)
620 static int add_vol_ctl(struct hda_codec *codec, const char *pfx, int cidx,
621 unsigned int chs, struct nid_path *path)
626 val = path->ctls[NID_PATH_VOL_CTL];
629 val = amp_val_replace_channels(val, chs);
630 return __add_pb_vol_ctrl(codec->spec, HDA_CTL_WIDGET_VOL, pfx, cidx, val);
633 /* return the channel bits suitable for the given path->ctls[] */
634 static int get_default_ch_nums(struct hda_codec *codec, struct nid_path *path,
637 int chs = 1; /* mono (left only) */
639 hda_nid_t nid = get_amp_nid_(path->ctls[type]);
640 if (nid && (get_wcaps(codec, nid) & AC_WCAP_STEREO))
641 chs = 3; /* stereo */
646 static int add_stereo_vol(struct hda_codec *codec, const char *pfx, int cidx,
647 struct nid_path *path)
649 int chs = get_default_ch_nums(codec, path, NID_PATH_VOL_CTL);
650 return add_vol_ctl(codec, pfx, cidx, chs, path);
653 /* create a mute-switch for the given mixer widget;
654 * if it has multiple sources (e.g. DAC and loopback), create a bind-mute
656 static int add_sw_ctl(struct hda_codec *codec, const char *pfx, int cidx,
657 unsigned int chs, struct nid_path *path)
660 int type = HDA_CTL_WIDGET_MUTE;
664 val = path->ctls[NID_PATH_MUTE_CTL];
667 val = amp_val_replace_channels(val, chs);
668 if (get_amp_direction_(val) == HDA_INPUT) {
669 hda_nid_t nid = get_amp_nid_(val);
670 int nums = snd_hda_get_num_conns(codec, nid);
672 type = HDA_CTL_BIND_MUTE;
676 return __add_pb_sw_ctrl(codec->spec, type, pfx, cidx, val);
679 static int add_stereo_sw(struct hda_codec *codec, const char *pfx,
680 int cidx, struct nid_path *path)
682 int chs = get_default_ch_nums(codec, path, NID_PATH_MUTE_CTL);
683 return add_sw_ctl(codec, pfx, cidx, chs, path);
686 static const char * const channel_name[4] = {
687 "Front", "Surround", "CLFE", "Side"
690 /* give some appropriate ctl name prefix for the given line out channel */
691 static const char *get_line_out_pfx(struct hda_gen_spec *spec, int ch,
692 bool can_be_master, int *index)
694 struct auto_pin_cfg *cfg = &spec->autocfg;
697 if (cfg->line_outs == 1 && !spec->multi_ios &&
698 !cfg->hp_outs && !cfg->speaker_outs && can_be_master)
699 return spec->vmaster_mute.hook ? "PCM" : "Master";
701 /* if there is really a single DAC used in the whole output paths,
702 * use it master (or "PCM" if a vmaster hook is present)
704 if (spec->multiout.num_dacs == 1 && !spec->mixer_nid &&
705 !spec->multiout.hp_out_nid[0] && !spec->multiout.extra_out_nid[0])
706 return spec->vmaster_mute.hook ? "PCM" : "Master";
708 switch (cfg->line_out_type) {
709 case AUTO_PIN_SPEAKER_OUT:
710 if (cfg->line_outs == 1)
712 if (cfg->line_outs == 2)
713 return ch ? "Bass Speaker" : "Speaker";
715 case AUTO_PIN_HP_OUT:
716 /* for multi-io case, only the primary out */
717 if (ch && spec->multi_ios)
722 if (cfg->line_outs == 1 && !spec->multi_ios)
726 if (ch >= ARRAY_SIZE(channel_name)) {
731 return channel_name[ch];
738 /* badness definition */
740 /* No primary DAC is found for the main output */
741 BAD_NO_PRIMARY_DAC = 0x10000,
742 /* No DAC is found for the extra output */
744 /* No possible multi-ios */
745 BAD_MULTI_IO = 0x103,
746 /* No individual DAC for extra output */
747 BAD_NO_EXTRA_DAC = 0x102,
748 /* No individual DAC for extra surrounds */
749 BAD_NO_EXTRA_SURR_DAC = 0x101,
750 /* Primary DAC shared with main surrounds */
751 BAD_SHARED_SURROUND = 0x100,
752 /* Primary DAC shared with main CLFE */
753 BAD_SHARED_CLFE = 0x10,
754 /* Primary DAC shared with extra surrounds */
755 BAD_SHARED_EXTRA_SURROUND = 0x10,
756 /* Volume widget is shared */
757 BAD_SHARED_VOL = 0x10,
760 /* look for widgets in the given path which are appropriate for
761 * volume and mute controls, and assign the values to ctls[].
763 * When no appropriate widget is found in the path, the badness value
764 * is incremented depending on the situation. The function returns the
765 * total badness for both volume and mute controls.
767 static int assign_out_path_ctls(struct hda_codec *codec, struct nid_path *path)
774 return BAD_SHARED_VOL * 2;
776 if (path->ctls[NID_PATH_VOL_CTL] ||
777 path->ctls[NID_PATH_MUTE_CTL])
778 return 0; /* already evaluated */
780 nid = look_for_out_vol_nid(codec, path);
782 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
783 if (is_ctl_used(codec, val, NID_PATH_VOL_CTL))
784 badness += BAD_SHARED_VOL;
786 path->ctls[NID_PATH_VOL_CTL] = val;
788 badness += BAD_SHARED_VOL;
789 nid = look_for_out_mute_nid(codec, path);
791 unsigned int wid_type = get_wcaps_type(get_wcaps(codec, nid));
792 if (wid_type == AC_WID_PIN || wid_type == AC_WID_AUD_OUT ||
793 nid_has_mute(codec, nid, HDA_OUTPUT))
794 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
796 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT);
797 if (is_ctl_used(codec, val, NID_PATH_MUTE_CTL))
798 badness += BAD_SHARED_VOL;
800 path->ctls[NID_PATH_MUTE_CTL] = val;
802 badness += BAD_SHARED_VOL;
806 struct badness_table {
807 int no_primary_dac; /* no primary DAC */
808 int no_dac; /* no secondary DACs */
809 int shared_primary; /* primary DAC is shared with main output */
810 int shared_surr; /* secondary DAC shared with main or primary */
811 int shared_clfe; /* third DAC shared with main or primary */
812 int shared_surr_main; /* secondary DAC sahred with main/DAC0 */
815 static struct badness_table main_out_badness = {
816 .no_primary_dac = BAD_NO_PRIMARY_DAC,
817 .no_dac = BAD_NO_DAC,
818 .shared_primary = BAD_NO_PRIMARY_DAC,
819 .shared_surr = BAD_SHARED_SURROUND,
820 .shared_clfe = BAD_SHARED_CLFE,
821 .shared_surr_main = BAD_SHARED_SURROUND,
824 static struct badness_table extra_out_badness = {
825 .no_primary_dac = BAD_NO_DAC,
826 .no_dac = BAD_NO_DAC,
827 .shared_primary = BAD_NO_EXTRA_DAC,
828 .shared_surr = BAD_SHARED_EXTRA_SURROUND,
829 .shared_clfe = BAD_SHARED_EXTRA_SURROUND,
830 .shared_surr_main = BAD_NO_EXTRA_SURR_DAC,
833 /* get the DAC of the primary output corresponding to the given array index */
834 static hda_nid_t get_primary_out(struct hda_codec *codec, int idx)
836 struct hda_gen_spec *spec = codec->spec;
837 struct auto_pin_cfg *cfg = &spec->autocfg;
839 if (cfg->line_outs > idx)
840 return spec->private_dac_nids[idx];
841 idx -= cfg->line_outs;
842 if (spec->multi_ios > idx)
843 return spec->multi_io[idx].dac;
847 /* return the DAC if it's reachable, otherwise zero */
848 static inline hda_nid_t try_dac(struct hda_codec *codec,
849 hda_nid_t dac, hda_nid_t pin)
851 return is_reachable_path(codec, dac, pin) ? dac : 0;
854 /* try to assign DACs to pins and return the resultant badness */
855 static int try_assign_dacs(struct hda_codec *codec, int num_outs,
856 const hda_nid_t *pins, hda_nid_t *dacs,
858 const struct badness_table *bad)
860 struct hda_gen_spec *spec = codec->spec;
868 for (i = 0; i < num_outs; i++) {
869 struct nid_path *path;
870 hda_nid_t pin = pins[i];
872 path = snd_hda_get_path_from_idx(codec, path_idx[i]);
874 badness += assign_out_path_ctls(codec, path);
878 dacs[i] = look_for_dac(codec, pin, false);
879 if (!dacs[i] && !i) {
880 for (j = 1; j < num_outs; j++) {
881 if (is_reachable_path(codec, dacs[j], pin)) {
892 dac = try_dac(codec, get_primary_out(codec, i), pin);
894 dac = try_dac(codec, dacs[0], pin);
896 dac = try_dac(codec, get_primary_out(codec, i), pin);
899 badness += bad->shared_primary;
901 badness += bad->shared_surr;
903 badness += bad->shared_clfe;
904 } else if (is_reachable_path(codec, spec->private_dac_nids[0], pin)) {
905 dac = spec->private_dac_nids[0];
906 badness += bad->shared_surr_main;
908 badness += bad->no_primary_dac;
910 badness += bad->no_dac;
912 path = snd_hda_add_new_path(codec, dac, pin, HDA_PARSE_NO_AAMIX);
913 if (!path && !i && spec->mixer_nid) {
915 path = snd_hda_add_new_path(codec, dac, pin, HDA_PARSE_ALL);
920 print_nid_path("output", path);
922 path_idx[i] = snd_hda_get_path_idx(codec, path);
923 badness += assign_out_path_ctls(codec, path);
930 /* return NID if the given pin has only a single connection to a certain DAC */
931 static hda_nid_t get_dac_if_single(struct hda_codec *codec, hda_nid_t pin)
933 struct hda_gen_spec *spec = codec->spec;
935 hda_nid_t nid_found = 0;
937 for (i = 0; i < spec->num_all_dacs; i++) {
938 hda_nid_t nid = spec->all_dacs[i];
939 if (!nid || is_dac_already_used(codec, nid))
941 if (is_reachable_path(codec, nid, pin)) {
950 /* check whether the given pin can be a multi-io pin */
951 static bool can_be_multiio_pin(struct hda_codec *codec,
952 unsigned int location, hda_nid_t nid)
954 unsigned int defcfg, caps;
956 defcfg = snd_hda_codec_get_pincfg(codec, nid);
957 if (get_defcfg_connect(defcfg) != AC_JACK_PORT_COMPLEX)
959 if (location && get_defcfg_location(defcfg) != location)
961 caps = snd_hda_query_pin_caps(codec, nid);
962 if (!(caps & AC_PINCAP_OUT))
967 /* count the number of input pins that are capable to be multi-io */
968 static int count_multiio_pins(struct hda_codec *codec, hda_nid_t reference_pin)
970 struct hda_gen_spec *spec = codec->spec;
971 struct auto_pin_cfg *cfg = &spec->autocfg;
972 unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin);
973 unsigned int location = get_defcfg_location(defcfg);
977 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
978 for (i = 0; i < cfg->num_inputs; i++) {
979 if (cfg->inputs[i].type != type)
981 if (can_be_multiio_pin(codec, location,
992 * When hardwired is set, try to fill ony hardwired pins, and returns
993 * zero if any pins are filled, non-zero if nothing found.
994 * When hardwired is off, try to fill possible input pins, and returns
997 static int fill_multi_ios(struct hda_codec *codec,
998 hda_nid_t reference_pin,
1001 struct hda_gen_spec *spec = codec->spec;
1002 struct auto_pin_cfg *cfg = &spec->autocfg;
1003 int type, i, j, num_pins, old_pins;
1004 unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin);
1005 unsigned int location = get_defcfg_location(defcfg);
1007 struct nid_path *path;
1009 old_pins = spec->multi_ios;
1013 num_pins = count_multiio_pins(codec, reference_pin);
1017 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
1018 for (i = 0; i < cfg->num_inputs; i++) {
1019 hda_nid_t nid = cfg->inputs[i].pin;
1022 if (cfg->inputs[i].type != type)
1024 if (!can_be_multiio_pin(codec, location, nid))
1026 for (j = 0; j < spec->multi_ios; j++) {
1027 if (nid == spec->multi_io[j].pin)
1030 if (j < spec->multi_ios)
1034 dac = get_dac_if_single(codec, nid);
1036 dac = look_for_dac(codec, nid, false);
1041 path = snd_hda_add_new_path(codec, dac, nid, HDA_PARSE_NO_AAMIX);
1046 print_nid_path("multiio", path);
1047 spec->multi_io[spec->multi_ios].pin = nid;
1048 spec->multi_io[spec->multi_ios].dac = dac;
1049 spec->out_paths[cfg->line_outs + spec->multi_ios] =
1050 snd_hda_get_path_idx(codec, path);
1052 if (spec->multi_ios >= 2)
1058 badness = BAD_MULTI_IO;
1059 if (old_pins == spec->multi_ios) {
1061 return 1; /* nothing found */
1063 return badness; /* no badness if nothing found */
1065 if (!hardwired && spec->multi_ios < 2) {
1066 /* cancel newly assigned paths */
1067 spec->paths.used -= spec->multi_ios - old_pins;
1068 spec->multi_ios = old_pins;
1072 /* assign volume and mute controls */
1073 for (i = old_pins; i < spec->multi_ios; i++) {
1074 path = snd_hda_get_path_from_idx(codec, spec->out_paths[cfg->line_outs + i]);
1075 badness += assign_out_path_ctls(codec, path);
1081 /* map DACs for all pins in the list if they are single connections */
1082 static bool map_singles(struct hda_codec *codec, int outs,
1083 const hda_nid_t *pins, hda_nid_t *dacs, int *path_idx)
1085 struct hda_gen_spec *spec = codec->spec;
1088 for (i = 0; i < outs; i++) {
1089 struct nid_path *path;
1093 dac = get_dac_if_single(codec, pins[i]);
1096 path = snd_hda_add_new_path(codec, dac, pins[i], HDA_PARSE_NO_AAMIX);
1097 if (!path && !i && spec->mixer_nid)
1098 path = snd_hda_add_new_path(codec, dac, pins[i], HDA_PARSE_ALL);
1102 print_nid_path("output", path);
1103 path->active = true;
1104 path_idx[i] = snd_hda_get_path_idx(codec, path);
1110 /* create a new path including aamix if available, and return its index */
1111 static int check_aamix_out_path(struct hda_codec *codec, int path_idx)
1113 struct nid_path *path;
1115 path = snd_hda_get_path_from_idx(codec, path_idx);
1116 if (!path || !path->depth || path->with_aa_mix)
1118 path = snd_hda_add_new_path(codec, path->path[0],
1119 path->path[path->depth - 1],
1120 HDA_PARSE_ONLY_AAMIX);
1123 print_nid_path("output-aamix", path);
1124 path->active = false; /* unused as default */
1125 return snd_hda_get_path_idx(codec, path);
1128 /* fill the empty entries in the dac array for speaker/hp with the
1129 * shared dac pointed by the paths
1131 static void refill_shared_dacs(struct hda_codec *codec, int num_outs,
1132 hda_nid_t *dacs, int *path_idx)
1134 struct nid_path *path;
1137 for (i = 0; i < num_outs; i++) {
1140 path = snd_hda_get_path_from_idx(codec, path_idx[i]);
1143 dacs[i] = path->path[0];
1147 /* fill in the dac_nids table from the parsed pin configuration */
1148 static int fill_and_eval_dacs(struct hda_codec *codec,
1149 bool fill_hardwired,
1150 bool fill_mio_first)
1152 struct hda_gen_spec *spec = codec->spec;
1153 struct auto_pin_cfg *cfg = &spec->autocfg;
1154 int i, err, badness;
1156 /* set num_dacs once to full for look_for_dac() */
1157 spec->multiout.num_dacs = cfg->line_outs;
1158 spec->multiout.dac_nids = spec->private_dac_nids;
1159 memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids));
1160 memset(spec->multiout.hp_out_nid, 0, sizeof(spec->multiout.hp_out_nid));
1161 memset(spec->multiout.extra_out_nid, 0, sizeof(spec->multiout.extra_out_nid));
1162 spec->multi_ios = 0;
1163 snd_array_free(&spec->paths);
1165 /* clear path indices */
1166 memset(spec->out_paths, 0, sizeof(spec->out_paths));
1167 memset(spec->hp_paths, 0, sizeof(spec->hp_paths));
1168 memset(spec->speaker_paths, 0, sizeof(spec->speaker_paths));
1169 memset(spec->aamix_out_paths, 0, sizeof(spec->aamix_out_paths));
1170 memset(spec->digout_paths, 0, sizeof(spec->digout_paths));
1171 memset(spec->loopback_paths, 0, sizeof(spec->loopback_paths));
1172 memset(&spec->digin_path, 0, sizeof(spec->digin_path));
1176 /* fill hard-wired DACs first */
1177 if (fill_hardwired) {
1180 mapped = map_singles(codec, cfg->line_outs,
1182 spec->private_dac_nids,
1184 mapped |= map_singles(codec, cfg->hp_outs,
1186 spec->multiout.hp_out_nid,
1188 mapped |= map_singles(codec, cfg->speaker_outs,
1190 spec->multiout.extra_out_nid,
1191 spec->speaker_paths);
1192 if (fill_mio_first && cfg->line_outs == 1 &&
1193 cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1194 err = fill_multi_ios(codec, cfg->line_out_pins[0], true);
1201 badness += try_assign_dacs(codec, cfg->line_outs, cfg->line_out_pins,
1202 spec->private_dac_nids, spec->out_paths,
1205 if (fill_mio_first &&
1206 cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1207 /* try to fill multi-io first */
1208 err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
1211 /* we don't count badness at this stage yet */
1214 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
1215 err = try_assign_dacs(codec, cfg->hp_outs, cfg->hp_pins,
1216 spec->multiout.hp_out_nid,
1218 &extra_out_badness);
1223 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1224 err = try_assign_dacs(codec, cfg->speaker_outs,
1226 spec->multiout.extra_out_nid,
1227 spec->speaker_paths,
1228 &extra_out_badness);
1233 if (cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1234 err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
1240 if (spec->mixer_nid) {
1241 spec->aamix_out_paths[0] =
1242 check_aamix_out_path(codec, spec->out_paths[0]);
1243 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1244 spec->aamix_out_paths[1] =
1245 check_aamix_out_path(codec, spec->hp_paths[0]);
1246 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1247 spec->aamix_out_paths[2] =
1248 check_aamix_out_path(codec, spec->speaker_paths[0]);
1251 if (cfg->hp_outs && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
1252 if (count_multiio_pins(codec, cfg->hp_pins[0]) >= 2)
1253 spec->multi_ios = 1; /* give badness */
1255 /* re-count num_dacs and squash invalid entries */
1256 spec->multiout.num_dacs = 0;
1257 for (i = 0; i < cfg->line_outs; i++) {
1258 if (spec->private_dac_nids[i])
1259 spec->multiout.num_dacs++;
1261 memmove(spec->private_dac_nids + i,
1262 spec->private_dac_nids + i + 1,
1263 sizeof(hda_nid_t) * (cfg->line_outs - i - 1));
1264 spec->private_dac_nids[cfg->line_outs - 1] = 0;
1268 spec->ext_channel_count = spec->min_channel_count =
1269 spec->multiout.num_dacs;
1271 if (spec->multi_ios == 2) {
1272 for (i = 0; i < 2; i++)
1273 spec->private_dac_nids[spec->multiout.num_dacs++] =
1274 spec->multi_io[i].dac;
1275 } else if (spec->multi_ios) {
1276 spec->multi_ios = 0;
1277 badness += BAD_MULTI_IO;
1280 /* re-fill the shared DAC for speaker / headphone */
1281 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1282 refill_shared_dacs(codec, cfg->hp_outs,
1283 spec->multiout.hp_out_nid,
1285 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1286 refill_shared_dacs(codec, cfg->speaker_outs,
1287 spec->multiout.extra_out_nid,
1288 spec->speaker_paths);
1293 #define DEBUG_BADNESS
1295 #ifdef DEBUG_BADNESS
1296 #define debug_badness snd_printdd
1298 #define debug_badness(...)
1301 static void debug_show_configs(struct hda_gen_spec *spec, struct auto_pin_cfg *cfg)
1303 debug_badness("multi_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1304 cfg->line_out_pins[0], cfg->line_out_pins[1],
1305 cfg->line_out_pins[2], cfg->line_out_pins[3],
1306 spec->multiout.dac_nids[0],
1307 spec->multiout.dac_nids[1],
1308 spec->multiout.dac_nids[2],
1309 spec->multiout.dac_nids[3]);
1310 if (spec->multi_ios > 0)
1311 debug_badness("multi_ios(%d) = %x/%x : %x/%x\n",
1313 spec->multi_io[0].pin, spec->multi_io[1].pin,
1314 spec->multi_io[0].dac, spec->multi_io[1].dac);
1315 debug_badness("hp_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1316 cfg->hp_pins[0], cfg->hp_pins[1],
1317 cfg->hp_pins[2], cfg->hp_pins[3],
1318 spec->multiout.hp_out_nid[0],
1319 spec->multiout.hp_out_nid[1],
1320 spec->multiout.hp_out_nid[2],
1321 spec->multiout.hp_out_nid[3]);
1322 debug_badness("spk_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1323 cfg->speaker_pins[0], cfg->speaker_pins[1],
1324 cfg->speaker_pins[2], cfg->speaker_pins[3],
1325 spec->multiout.extra_out_nid[0],
1326 spec->multiout.extra_out_nid[1],
1327 spec->multiout.extra_out_nid[2],
1328 spec->multiout.extra_out_nid[3]);
1331 /* find all available DACs of the codec */
1332 static void fill_all_dac_nids(struct hda_codec *codec)
1334 struct hda_gen_spec *spec = codec->spec;
1336 hda_nid_t nid = codec->start_nid;
1338 spec->num_all_dacs = 0;
1339 memset(spec->all_dacs, 0, sizeof(spec->all_dacs));
1340 for (i = 0; i < codec->num_nodes; i++, nid++) {
1341 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_AUD_OUT)
1343 if (spec->num_all_dacs >= ARRAY_SIZE(spec->all_dacs)) {
1344 snd_printk(KERN_ERR "hda: Too many DACs!\n");
1347 spec->all_dacs[spec->num_all_dacs++] = nid;
1351 static int parse_output_paths(struct hda_codec *codec)
1353 struct hda_gen_spec *spec = codec->spec;
1354 struct auto_pin_cfg *cfg = &spec->autocfg;
1355 struct auto_pin_cfg *best_cfg;
1356 int best_badness = INT_MAX;
1358 bool fill_hardwired = true, fill_mio_first = true;
1359 bool best_wired = true, best_mio = true;
1360 bool hp_spk_swapped = false;
1362 fill_all_dac_nids(codec);
1364 best_cfg = kmalloc(sizeof(*best_cfg), GFP_KERNEL);
1370 badness = fill_and_eval_dacs(codec, fill_hardwired,
1376 debug_badness("==> lo_type=%d, wired=%d, mio=%d, badness=0x%x\n",
1377 cfg->line_out_type, fill_hardwired, fill_mio_first,
1379 debug_show_configs(spec, cfg);
1380 if (badness < best_badness) {
1381 best_badness = badness;
1383 best_wired = fill_hardwired;
1384 best_mio = fill_mio_first;
1388 fill_mio_first = !fill_mio_first;
1389 if (!fill_mio_first)
1391 fill_hardwired = !fill_hardwired;
1392 if (!fill_hardwired)
1396 hp_spk_swapped = true;
1397 if (cfg->speaker_outs > 0 &&
1398 cfg->line_out_type == AUTO_PIN_HP_OUT) {
1399 cfg->hp_outs = cfg->line_outs;
1400 memcpy(cfg->hp_pins, cfg->line_out_pins,
1401 sizeof(cfg->hp_pins));
1402 cfg->line_outs = cfg->speaker_outs;
1403 memcpy(cfg->line_out_pins, cfg->speaker_pins,
1404 sizeof(cfg->speaker_pins));
1405 cfg->speaker_outs = 0;
1406 memset(cfg->speaker_pins, 0, sizeof(cfg->speaker_pins));
1407 cfg->line_out_type = AUTO_PIN_SPEAKER_OUT;
1408 fill_hardwired = true;
1411 if (cfg->hp_outs > 0 &&
1412 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
1413 cfg->speaker_outs = cfg->line_outs;
1414 memcpy(cfg->speaker_pins, cfg->line_out_pins,
1415 sizeof(cfg->speaker_pins));
1416 cfg->line_outs = cfg->hp_outs;
1417 memcpy(cfg->line_out_pins, cfg->hp_pins,
1418 sizeof(cfg->hp_pins));
1420 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
1421 cfg->line_out_type = AUTO_PIN_HP_OUT;
1422 fill_hardwired = true;
1429 debug_badness("==> restoring best_cfg\n");
1431 fill_and_eval_dacs(codec, best_wired, best_mio);
1433 debug_badness("==> Best config: lo_type=%d, wired=%d, mio=%d\n",
1434 cfg->line_out_type, best_wired, best_mio);
1435 debug_show_configs(spec, cfg);
1437 if (cfg->line_out_pins[0]) {
1438 struct nid_path *path;
1439 path = snd_hda_get_path_from_idx(codec, spec->out_paths[0]);
1441 spec->vmaster_nid = look_for_out_vol_nid(codec, path);
1448 /* add playback controls from the parsed DAC table */
1449 static int create_multi_out_ctls(struct hda_codec *codec,
1450 const struct auto_pin_cfg *cfg)
1452 struct hda_gen_spec *spec = codec->spec;
1453 int i, err, noutputs;
1455 noutputs = cfg->line_outs;
1456 if (spec->multi_ios > 0 && cfg->line_outs < 3)
1457 noutputs += spec->multi_ios;
1459 for (i = 0; i < noutputs; i++) {
1462 struct nid_path *path;
1464 if (i >= cfg->line_outs) {
1466 name = channel_name[i];
1468 name = get_line_out_pfx(spec, i, true, &index);
1471 path = snd_hda_get_path_from_idx(codec, spec->out_paths[i]);
1474 if (!name || !strcmp(name, "CLFE")) {
1476 err = add_vol_ctl(codec, "Center", 0, 1, path);
1479 err = add_vol_ctl(codec, "LFE", 0, 2, path);
1482 err = add_sw_ctl(codec, "Center", 0, 1, path);
1485 err = add_sw_ctl(codec, "LFE", 0, 2, path);
1489 err = add_stereo_vol(codec, name, index, path);
1492 err = add_stereo_sw(codec, name, index, path);
1500 static int create_extra_out(struct hda_codec *codec, int path_idx,
1501 const char *pfx, int cidx)
1503 struct nid_path *path;
1506 path = snd_hda_get_path_from_idx(codec, path_idx);
1509 err = add_stereo_vol(codec, pfx, cidx, path);
1512 err = add_stereo_sw(codec, pfx, cidx, path);
1518 /* add playback controls for speaker and HP outputs */
1519 static int create_extra_outs(struct hda_codec *codec, int num_pins,
1520 const int *paths, const char *pfx)
1524 for (i = 0; i < num_pins; i++) {
1529 if (num_pins == 2 && i == 1 && !strcmp(pfx, "Speaker"))
1530 name = "Bass Speaker";
1531 else if (num_pins >= 3) {
1532 snprintf(tmp, sizeof(tmp), "%s %s",
1533 pfx, channel_name[i]);
1539 err = create_extra_out(codec, paths[i], name, idx);
1546 static int create_hp_out_ctls(struct hda_codec *codec)
1548 struct hda_gen_spec *spec = codec->spec;
1549 return create_extra_outs(codec, spec->autocfg.hp_outs,
1554 static int create_speaker_out_ctls(struct hda_codec *codec)
1556 struct hda_gen_spec *spec = codec->spec;
1557 return create_extra_outs(codec, spec->autocfg.speaker_outs,
1558 spec->speaker_paths,
1563 * independent HP controls
1566 static int indep_hp_info(struct snd_kcontrol *kcontrol,
1567 struct snd_ctl_elem_info *uinfo)
1569 return snd_hda_enum_bool_helper_info(kcontrol, uinfo);
1572 static int indep_hp_get(struct snd_kcontrol *kcontrol,
1573 struct snd_ctl_elem_value *ucontrol)
1575 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1576 struct hda_gen_spec *spec = codec->spec;
1577 ucontrol->value.enumerated.item[0] = spec->indep_hp_enabled;
1581 static int indep_hp_put(struct snd_kcontrol *kcontrol,
1582 struct snd_ctl_elem_value *ucontrol)
1584 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1585 struct hda_gen_spec *spec = codec->spec;
1586 unsigned int select = ucontrol->value.enumerated.item[0];
1589 mutex_lock(&spec->pcm_mutex);
1590 if (spec->active_streams) {
1595 if (spec->indep_hp_enabled != select) {
1596 spec->indep_hp_enabled = select;
1597 if (spec->indep_hp_enabled)
1598 spec->multiout.hp_out_nid[0] = 0;
1600 spec->multiout.hp_out_nid[0] = spec->alt_dac_nid;
1604 mutex_unlock(&spec->pcm_mutex);
1608 static const struct snd_kcontrol_new indep_hp_ctl = {
1609 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1610 .name = "Independent HP",
1611 .info = indep_hp_info,
1612 .get = indep_hp_get,
1613 .put = indep_hp_put,
1617 static int create_indep_hp_ctls(struct hda_codec *codec)
1619 struct hda_gen_spec *spec = codec->spec;
1621 if (!spec->indep_hp)
1623 if (!spec->multiout.hp_out_nid[0]) {
1628 spec->indep_hp_enabled = false;
1629 spec->alt_dac_nid = spec->multiout.hp_out_nid[0];
1630 if (!snd_hda_gen_add_kctl(spec, NULL, &indep_hp_ctl))
1636 * channel mode enum control
1639 static int ch_mode_info(struct snd_kcontrol *kcontrol,
1640 struct snd_ctl_elem_info *uinfo)
1642 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1643 struct hda_gen_spec *spec = codec->spec;
1646 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1648 uinfo->value.enumerated.items = spec->multi_ios + 1;
1649 if (uinfo->value.enumerated.item > spec->multi_ios)
1650 uinfo->value.enumerated.item = spec->multi_ios;
1651 chs = uinfo->value.enumerated.item * 2 + spec->min_channel_count;
1652 sprintf(uinfo->value.enumerated.name, "%dch", chs);
1656 static int ch_mode_get(struct snd_kcontrol *kcontrol,
1657 struct snd_ctl_elem_value *ucontrol)
1659 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1660 struct hda_gen_spec *spec = codec->spec;
1661 ucontrol->value.enumerated.item[0] =
1662 (spec->ext_channel_count - spec->min_channel_count) / 2;
1666 static inline struct nid_path *
1667 get_multiio_path(struct hda_codec *codec, int idx)
1669 struct hda_gen_spec *spec = codec->spec;
1670 return snd_hda_get_path_from_idx(codec,
1671 spec->out_paths[spec->autocfg.line_outs + idx]);
1674 static int set_multi_io(struct hda_codec *codec, int idx, bool output)
1676 struct hda_gen_spec *spec = codec->spec;
1677 hda_nid_t nid = spec->multi_io[idx].pin;
1678 struct nid_path *path;
1680 path = get_multiio_path(codec, idx);
1684 if (path->active == output)
1688 snd_hda_set_pin_ctl_cache(codec, nid, PIN_OUT);
1689 snd_hda_activate_path(codec, path, true, true);
1690 set_pin_eapd(codec, nid, true);
1692 set_pin_eapd(codec, nid, false);
1693 snd_hda_activate_path(codec, path, false, true);
1694 snd_hda_set_pin_ctl_cache(codec, nid,
1695 spec->multi_io[idx].ctl_in);
1700 static int ch_mode_put(struct snd_kcontrol *kcontrol,
1701 struct snd_ctl_elem_value *ucontrol)
1703 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1704 struct hda_gen_spec *spec = codec->spec;
1707 ch = ucontrol->value.enumerated.item[0];
1708 if (ch < 0 || ch > spec->multi_ios)
1710 if (ch == (spec->ext_channel_count - spec->min_channel_count) / 2)
1712 spec->ext_channel_count = ch * 2 + spec->min_channel_count;
1713 for (i = 0; i < spec->multi_ios; i++)
1714 set_multi_io(codec, i, i < ch);
1715 spec->multiout.max_channels = max(spec->ext_channel_count,
1716 spec->const_channel_count);
1717 if (spec->need_dac_fix)
1718 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
1722 static const struct snd_kcontrol_new channel_mode_enum = {
1723 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1724 .name = "Channel Mode",
1725 .info = ch_mode_info,
1730 static int create_multi_channel_mode(struct hda_codec *codec)
1732 struct hda_gen_spec *spec = codec->spec;
1734 if (spec->multi_ios > 0) {
1735 if (!snd_hda_gen_add_kctl(spec, NULL, &channel_mode_enum))
1742 * aamix loopback enable/disable switch
1745 #define loopback_mixing_info indep_hp_info
1747 static int loopback_mixing_get(struct snd_kcontrol *kcontrol,
1748 struct snd_ctl_elem_value *ucontrol)
1750 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1751 struct hda_gen_spec *spec = codec->spec;
1752 ucontrol->value.enumerated.item[0] = spec->aamix_mode;
1756 static void update_aamix_paths(struct hda_codec *codec, bool do_mix,
1757 int nomix_path_idx, int mix_path_idx)
1759 struct nid_path *nomix_path, *mix_path;
1761 nomix_path = snd_hda_get_path_from_idx(codec, nomix_path_idx);
1762 mix_path = snd_hda_get_path_from_idx(codec, mix_path_idx);
1763 if (!nomix_path || !mix_path)
1766 snd_hda_activate_path(codec, nomix_path, false, true);
1767 snd_hda_activate_path(codec, mix_path, true, true);
1769 snd_hda_activate_path(codec, mix_path, false, true);
1770 snd_hda_activate_path(codec, nomix_path, true, true);
1774 static int loopback_mixing_put(struct snd_kcontrol *kcontrol,
1775 struct snd_ctl_elem_value *ucontrol)
1777 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1778 struct hda_gen_spec *spec = codec->spec;
1779 unsigned int val = ucontrol->value.enumerated.item[0];
1781 if (val == spec->aamix_mode)
1783 spec->aamix_mode = val;
1784 update_aamix_paths(codec, val, spec->out_paths[0],
1785 spec->aamix_out_paths[0]);
1786 update_aamix_paths(codec, val, spec->hp_paths[0],
1787 spec->aamix_out_paths[1]);
1788 update_aamix_paths(codec, val, spec->speaker_paths[0],
1789 spec->aamix_out_paths[2]);
1793 static const struct snd_kcontrol_new loopback_mixing_enum = {
1794 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1795 .name = "Loopback Mixing",
1796 .info = loopback_mixing_info,
1797 .get = loopback_mixing_get,
1798 .put = loopback_mixing_put,
1801 static int create_loopback_mixing_ctl(struct hda_codec *codec)
1803 struct hda_gen_spec *spec = codec->spec;
1805 if (!spec->mixer_nid)
1807 if (!(spec->aamix_out_paths[0] || spec->aamix_out_paths[1] ||
1808 spec->aamix_out_paths[2]))
1810 if (!snd_hda_gen_add_kctl(spec, NULL, &loopback_mixing_enum))
1816 * shared headphone/mic handling
1819 static void call_update_outputs(struct hda_codec *codec);
1821 /* for shared I/O, change the pin-control accordingly */
1822 static void update_shared_mic_hp(struct hda_codec *codec, bool set_as_mic)
1824 struct hda_gen_spec *spec = codec->spec;
1826 hda_nid_t pin = spec->autocfg.inputs[1].pin;
1827 /* NOTE: this assumes that there are only two inputs, the
1828 * first is the real internal mic and the second is HP/mic jack.
1831 val = snd_hda_get_default_vref(codec, pin);
1833 /* This pin does not have vref caps - let's enable vref on pin 0x18
1834 instead, as suggested by Realtek */
1835 if (val == AC_PINCTL_VREF_HIZ && spec->shared_mic_vref_pin) {
1836 const hda_nid_t vref_pin = spec->shared_mic_vref_pin;
1837 unsigned int vref_val = snd_hda_get_default_vref(codec, vref_pin);
1838 if (vref_val != AC_PINCTL_VREF_HIZ)
1839 snd_hda_set_pin_ctl_cache(codec, vref_pin,
1840 PIN_IN | (set_as_mic ? vref_val : 0));
1843 val = set_as_mic ? val | PIN_IN : PIN_HP;
1844 snd_hda_set_pin_ctl_cache(codec, pin, val);
1846 spec->automute_speaker = !set_as_mic;
1847 call_update_outputs(codec);
1850 /* create a shared input with the headphone out */
1851 static int create_shared_input(struct hda_codec *codec)
1853 struct hda_gen_spec *spec = codec->spec;
1854 struct auto_pin_cfg *cfg = &spec->autocfg;
1855 unsigned int defcfg;
1858 /* only one internal input pin? */
1859 if (cfg->num_inputs != 1)
1861 defcfg = snd_hda_codec_get_pincfg(codec, cfg->inputs[0].pin);
1862 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
1865 if (cfg->hp_outs == 1 && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
1866 nid = cfg->hp_pins[0]; /* OK, we have a single HP-out */
1867 else if (cfg->line_outs == 1 && cfg->line_out_type == AUTO_PIN_HP_OUT)
1868 nid = cfg->line_out_pins[0]; /* OK, we have a single line-out */
1870 return 0; /* both not available */
1872 if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_IN))
1873 return 0; /* no input */
1875 cfg->inputs[1].pin = nid;
1876 cfg->inputs[1].type = AUTO_PIN_MIC;
1877 cfg->num_inputs = 2;
1878 spec->shared_mic_hp = 1;
1879 snd_printdd("hda-codec: Enable shared I/O jack on NID 0x%x\n", nid);
1889 /* add the powersave loopback-list entry */
1890 static void add_loopback_list(struct hda_gen_spec *spec, hda_nid_t mix, int idx)
1892 struct hda_amp_list *list;
1894 if (spec->num_loopbacks >= ARRAY_SIZE(spec->loopback_list) - 1)
1896 list = spec->loopback_list + spec->num_loopbacks;
1898 list->dir = HDA_INPUT;
1900 spec->num_loopbacks++;
1901 spec->loopback.amplist = spec->loopback_list;
1904 #define add_loopback_list(spec, mix, idx) /* NOP */
1907 /* create input playback/capture controls for the given pin */
1908 static int new_analog_input(struct hda_codec *codec, int input_idx,
1909 hda_nid_t pin, const char *ctlname, int ctlidx,
1912 struct hda_gen_spec *spec = codec->spec;
1913 struct nid_path *path;
1917 if (!nid_has_volume(codec, mix_nid, HDA_INPUT) &&
1918 !nid_has_mute(codec, mix_nid, HDA_INPUT))
1919 return 0; /* no need for analog loopback */
1921 path = snd_hda_add_new_path(codec, pin, mix_nid, HDA_PARSE_ALL);
1924 print_nid_path("loopback", path);
1925 spec->loopback_paths[input_idx] = snd_hda_get_path_idx(codec, path);
1927 idx = path->idx[path->depth - 1];
1928 if (nid_has_volume(codec, mix_nid, HDA_INPUT)) {
1929 val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
1930 err = __add_pb_vol_ctrl(spec, HDA_CTL_WIDGET_VOL, ctlname, ctlidx, val);
1933 path->ctls[NID_PATH_VOL_CTL] = val;
1936 if (nid_has_mute(codec, mix_nid, HDA_INPUT)) {
1937 val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
1938 err = __add_pb_sw_ctrl(spec, HDA_CTL_WIDGET_MUTE, ctlname, ctlidx, val);
1941 path->ctls[NID_PATH_MUTE_CTL] = val;
1944 path->active = true;
1945 add_loopback_list(spec, mix_nid, idx);
1949 static int is_input_pin(struct hda_codec *codec, hda_nid_t nid)
1951 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
1952 return (pincap & AC_PINCAP_IN) != 0;
1955 /* Parse the codec tree and retrieve ADCs */
1956 static int fill_adc_nids(struct hda_codec *codec)
1958 struct hda_gen_spec *spec = codec->spec;
1960 hda_nid_t *adc_nids = spec->adc_nids;
1961 int max_nums = ARRAY_SIZE(spec->adc_nids);
1964 nid = codec->start_nid;
1965 for (i = 0; i < codec->num_nodes; i++, nid++) {
1966 unsigned int caps = get_wcaps(codec, nid);
1967 int type = get_wcaps_type(caps);
1969 if (type != AC_WID_AUD_IN || (caps & AC_WCAP_DIGITAL))
1971 adc_nids[nums] = nid;
1972 if (++nums >= max_nums)
1975 spec->num_adc_nids = nums;
1979 /* filter out invalid adc_nids that don't give all active input pins;
1980 * if needed, check whether dynamic ADC-switching is available
1982 static int check_dyn_adc_switch(struct hda_codec *codec)
1984 struct hda_gen_spec *spec = codec->spec;
1985 struct hda_input_mux *imux = &spec->input_mux;
1986 hda_nid_t adc_nids[ARRAY_SIZE(spec->adc_nids)];
1992 for (n = 0; n < spec->num_adc_nids; n++) {
1993 adc = spec->adc_nids[n];
1994 for (i = 0; i < imux->num_items; i++) {
1995 pin = spec->imux_pins[i];
1996 if (!is_reachable_path(codec, pin, adc))
1999 if (i >= imux->num_items)
2000 adc_nids[nums++] = adc;
2004 if (spec->shared_mic_hp) {
2005 spec->shared_mic_hp = 0;
2006 imux->num_items = 1;
2010 /* check whether ADC-switch is possible */
2011 for (i = 0; i < imux->num_items; i++) {
2012 pin = spec->imux_pins[i];
2013 for (n = 0; n < spec->num_adc_nids; n++) {
2014 adc = spec->adc_nids[n];
2015 if (is_reachable_path(codec, pin, adc)) {
2016 spec->dyn_adc_idx[i] = n;
2022 snd_printdd("hda-codec: enabling ADC switching\n");
2023 spec->dyn_adc_switch = 1;
2024 } else if (nums != spec->num_adc_nids) {
2025 memcpy(spec->adc_nids, adc_nids, nums * sizeof(hda_nid_t));
2026 spec->num_adc_nids = nums;
2029 if (imux->num_items == 1 || spec->shared_mic_hp) {
2030 snd_printdd("hda-codec: reducing to a single ADC\n");
2031 spec->num_adc_nids = 1; /* reduce to a single ADC */
2034 /* single index for individual volumes ctls */
2035 if (!spec->dyn_adc_switch && spec->multi_cap_vol)
2036 spec->num_adc_nids = 1;
2042 * create playback/capture controls for input pins
2044 static int create_input_ctls(struct hda_codec *codec)
2046 struct hda_gen_spec *spec = codec->spec;
2047 const struct auto_pin_cfg *cfg = &spec->autocfg;
2048 hda_nid_t mixer = spec->mixer_nid;
2049 struct hda_input_mux *imux = &spec->input_mux;
2051 int i, c, err, type_idx = 0;
2052 const char *prev_label = NULL;
2054 num_adcs = fill_adc_nids(codec);
2058 for (i = 0; i < cfg->num_inputs; i++) {
2063 pin = cfg->inputs[i].pin;
2064 if (!is_input_pin(codec, pin))
2067 label = hda_get_autocfg_input_label(codec, cfg, i);
2068 if (spec->shared_mic_hp && !strcmp(label, "Misc"))
2069 label = "Headphone Mic";
2070 if (prev_label && !strcmp(label, prev_label))
2077 if (is_reachable_path(codec, pin, mixer)) {
2078 err = new_analog_input(codec, i, pin,
2079 label, type_idx, mixer);
2086 for (c = 0; c < num_adcs; c++) {
2087 struct nid_path *path;
2088 hda_nid_t adc = spec->adc_nids[c];
2090 if (!is_reachable_path(codec, pin, adc))
2092 path = snd_array_new(&spec->paths);
2095 memset(path, 0, sizeof(*path));
2096 if (!snd_hda_parse_nid_path(codec, pin, adc, HDA_PARSE_ALL, path)) {
2098 "invalid input path 0x%x -> 0x%x\n",
2103 print_nid_path("input", path);
2106 spec->imux_pins[imux->num_items] = pin;
2107 snd_hda_add_imux_item(imux, label,
2108 imux->num_items, NULL);
2122 /* get the ADC NID corresponding to the given index */
2123 static hda_nid_t get_adc_nid(struct hda_codec *codec, int adc_idx, int imux_idx)
2125 struct hda_gen_spec *spec = codec->spec;
2126 if (spec->dyn_adc_switch)
2127 adc_idx = spec->dyn_adc_idx[imux_idx];
2128 return spec->adc_nids[adc_idx];
2131 static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
2134 static int mux_enum_info(struct snd_kcontrol *kcontrol,
2135 struct snd_ctl_elem_info *uinfo)
2137 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2138 struct hda_gen_spec *spec = codec->spec;
2139 return snd_hda_input_mux_info(&spec->input_mux, uinfo);
2142 static int mux_enum_get(struct snd_kcontrol *kcontrol,
2143 struct snd_ctl_elem_value *ucontrol)
2145 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2146 struct hda_gen_spec *spec = codec->spec;
2147 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2149 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
2153 static int mux_enum_put(struct snd_kcontrol *kcontrol,
2154 struct snd_ctl_elem_value *ucontrol)
2156 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2157 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2158 return mux_select(codec, adc_idx,
2159 ucontrol->value.enumerated.item[0]);
2162 static const struct snd_kcontrol_new cap_src_temp = {
2163 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2164 .name = "Input Source",
2165 .info = mux_enum_info,
2166 .get = mux_enum_get,
2167 .put = mux_enum_put,
2171 * capture volume and capture switch ctls
2174 typedef int (*put_call_t)(struct snd_kcontrol *kcontrol,
2175 struct snd_ctl_elem_value *ucontrol);
2177 /* call the given amp update function for all amps in the imux list at once */
2178 static int cap_put_caller(struct snd_kcontrol *kcontrol,
2179 struct snd_ctl_elem_value *ucontrol,
2180 put_call_t func, int type)
2182 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2183 struct hda_gen_spec *spec = codec->spec;
2184 const struct hda_input_mux *imux;
2185 struct nid_path *path;
2186 int i, adc_idx, err = 0;
2188 imux = &spec->input_mux;
2189 adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2190 mutex_lock(&codec->control_mutex);
2191 /* we use the cache-only update at first since multiple input paths
2192 * may shared the same amp; by updating only caches, the redundant
2193 * writes to hardware can be reduced.
2195 codec->cached_write = 1;
2196 for (i = 0; i < imux->num_items; i++) {
2197 path = snd_hda_get_nid_path(codec, spec->imux_pins[i],
2198 get_adc_nid(codec, adc_idx, i));
2199 if (!path->ctls[type])
2201 kcontrol->private_value = path->ctls[type];
2202 err = func(kcontrol, ucontrol);
2207 codec->cached_write = 0;
2208 mutex_unlock(&codec->control_mutex);
2209 snd_hda_codec_flush_amp_cache(codec); /* flush the updates */
2210 if (err >= 0 && spec->cap_sync_hook)
2211 spec->cap_sync_hook(codec);
2215 /* capture volume ctl callbacks */
2216 #define cap_vol_info snd_hda_mixer_amp_volume_info
2217 #define cap_vol_get snd_hda_mixer_amp_volume_get
2218 #define cap_vol_tlv snd_hda_mixer_amp_tlv
2220 static int cap_vol_put(struct snd_kcontrol *kcontrol,
2221 struct snd_ctl_elem_value *ucontrol)
2223 return cap_put_caller(kcontrol, ucontrol,
2224 snd_hda_mixer_amp_volume_put,
2228 static const struct snd_kcontrol_new cap_vol_temp = {
2229 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2230 .name = "Capture Volume",
2231 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
2232 SNDRV_CTL_ELEM_ACCESS_TLV_READ |
2233 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK),
2234 .info = cap_vol_info,
2237 .tlv = { .c = cap_vol_tlv },
2240 /* capture switch ctl callbacks */
2241 #define cap_sw_info snd_ctl_boolean_stereo_info
2242 #define cap_sw_get snd_hda_mixer_amp_switch_get
2244 static int cap_sw_put(struct snd_kcontrol *kcontrol,
2245 struct snd_ctl_elem_value *ucontrol)
2247 return cap_put_caller(kcontrol, ucontrol,
2248 snd_hda_mixer_amp_switch_put,
2252 static const struct snd_kcontrol_new cap_sw_temp = {
2253 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2254 .name = "Capture Switch",
2255 .info = cap_sw_info,
2260 static int parse_capvol_in_path(struct hda_codec *codec, struct nid_path *path)
2265 path->ctls[NID_PATH_VOL_CTL] = path->ctls[NID_PATH_MUTE_CTL] = 0;
2266 for (depth = 0; depth < 3; depth++) {
2267 if (depth >= path->depth)
2269 i = path->depth - depth - 1;
2270 nid = path->path[i];
2271 if (!path->ctls[NID_PATH_VOL_CTL]) {
2272 if (nid_has_volume(codec, nid, HDA_OUTPUT))
2273 path->ctls[NID_PATH_VOL_CTL] =
2274 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
2275 else if (nid_has_volume(codec, nid, HDA_INPUT)) {
2276 int idx = path->idx[i];
2277 if (!depth && codec->single_adc_amp)
2279 path->ctls[NID_PATH_VOL_CTL] =
2280 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
2283 if (!path->ctls[NID_PATH_MUTE_CTL]) {
2284 if (nid_has_mute(codec, nid, HDA_OUTPUT))
2285 path->ctls[NID_PATH_MUTE_CTL] =
2286 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
2287 else if (nid_has_mute(codec, nid, HDA_INPUT)) {
2288 int idx = path->idx[i];
2289 if (!depth && codec->single_adc_amp)
2291 path->ctls[NID_PATH_MUTE_CTL] =
2292 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
2299 static bool is_inv_dmic_pin(struct hda_codec *codec, hda_nid_t nid)
2301 struct hda_gen_spec *spec = codec->spec;
2302 struct auto_pin_cfg *cfg = &spec->autocfg;
2306 if (!spec->inv_dmic_split)
2308 for (i = 0; i < cfg->num_inputs; i++) {
2309 if (cfg->inputs[i].pin != nid)
2311 if (cfg->inputs[i].type != AUTO_PIN_MIC)
2313 val = snd_hda_codec_get_pincfg(codec, nid);
2314 return snd_hda_get_input_pin_attr(val) == INPUT_PIN_ATTR_INT;
2319 static int add_single_cap_ctl(struct hda_codec *codec, const char *label,
2320 int idx, bool is_switch, unsigned int ctl,
2323 struct hda_gen_spec *spec = codec->spec;
2325 int type = is_switch ? HDA_CTL_WIDGET_MUTE : HDA_CTL_WIDGET_VOL;
2326 const char *sfx = is_switch ? "Switch" : "Volume";
2327 unsigned int chs = inv_dmic ? 1 : 3;
2334 snprintf(tmpname, sizeof(tmpname),
2335 "%s Capture %s", label, sfx);
2337 snprintf(tmpname, sizeof(tmpname),
2339 err = add_control(spec, type, tmpname, idx,
2340 amp_val_replace_channels(ctl, chs));
2341 if (err < 0 || !inv_dmic)
2344 /* Make independent right kcontrol */
2346 snprintf(tmpname, sizeof(tmpname),
2347 "Inverted %s Capture %s", label, sfx);
2349 snprintf(tmpname, sizeof(tmpname),
2350 "Inverted Capture %s", sfx);
2351 return add_control(spec, type, tmpname, idx,
2352 amp_val_replace_channels(ctl, 2));
2355 /* create single (and simple) capture volume and switch controls */
2356 static int create_single_cap_vol_ctl(struct hda_codec *codec, int idx,
2357 unsigned int vol_ctl, unsigned int sw_ctl,
2361 err = add_single_cap_ctl(codec, NULL, idx, false, vol_ctl, inv_dmic);
2364 err = add_single_cap_ctl(codec, NULL, idx, true, sw_ctl, inv_dmic);
2370 /* create bound capture volume and switch controls */
2371 static int create_bind_cap_vol_ctl(struct hda_codec *codec, int idx,
2372 unsigned int vol_ctl, unsigned int sw_ctl)
2374 struct hda_gen_spec *spec = codec->spec;
2375 struct snd_kcontrol_new *knew;
2378 knew = snd_hda_gen_add_kctl(spec, NULL, &cap_vol_temp);
2382 knew->private_value = vol_ctl;
2383 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2386 knew = snd_hda_gen_add_kctl(spec, NULL, &cap_sw_temp);
2390 knew->private_value = sw_ctl;
2391 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2396 /* return the vol ctl when used first in the imux list */
2397 static unsigned int get_first_cap_ctl(struct hda_codec *codec, int idx, int type)
2399 struct hda_gen_spec *spec = codec->spec;
2400 struct nid_path *path;
2404 path = snd_hda_get_nid_path(codec, spec->imux_pins[idx],
2405 get_adc_nid(codec, 0, idx));
2408 ctl = path->ctls[type];
2411 for (i = 0; i < idx - 1; i++) {
2412 path = snd_hda_get_nid_path(codec, spec->imux_pins[i],
2413 get_adc_nid(codec, 0, i));
2414 if (path && path->ctls[type] == ctl)
2420 /* create individual capture volume and switch controls per input */
2421 static int create_multi_cap_vol_ctl(struct hda_codec *codec)
2423 struct hda_gen_spec *spec = codec->spec;
2424 struct hda_input_mux *imux = &spec->input_mux;
2425 int i, err, type, type_idx = 0;
2426 const char *prev_label = NULL;
2428 for (i = 0; i < imux->num_items; i++) {
2431 label = hda_get_autocfg_input_label(codec, &spec->autocfg, i);
2432 if (prev_label && !strcmp(label, prev_label))
2437 inv_dmic = is_inv_dmic_pin(codec, spec->imux_pins[i]);
2439 for (type = 0; type < 2; type++) {
2440 err = add_single_cap_ctl(codec, label, type_idx, type,
2441 get_first_cap_ctl(codec, i, type),
2450 static int create_capture_mixers(struct hda_codec *codec)
2452 struct hda_gen_spec *spec = codec->spec;
2453 struct hda_input_mux *imux = &spec->input_mux;
2454 int i, n, nums, err;
2456 if (spec->dyn_adc_switch)
2459 nums = spec->num_adc_nids;
2461 if (!spec->auto_mic && imux->num_items > 1) {
2462 struct snd_kcontrol_new *knew;
2464 name = nums > 1 ? "Input Source" : "Capture Source";
2465 knew = snd_hda_gen_add_kctl(spec, name, &cap_src_temp);
2471 for (n = 0; n < nums; n++) {
2473 bool inv_dmic = false;
2477 for (i = 0; i < imux->num_items; i++) {
2478 struct nid_path *path;
2479 path = snd_hda_get_nid_path(codec, spec->imux_pins[i],
2480 get_adc_nid(codec, n, i));
2483 parse_capvol_in_path(codec, path);
2485 vol = path->ctls[NID_PATH_VOL_CTL];
2486 else if (vol != path->ctls[NID_PATH_VOL_CTL])
2489 sw = path->ctls[NID_PATH_MUTE_CTL];
2490 else if (sw != path->ctls[NID_PATH_MUTE_CTL])
2492 if (is_inv_dmic_pin(codec, spec->imux_pins[i]))
2497 err = create_single_cap_vol_ctl(codec, n, vol, sw,
2499 else if (!spec->multi_cap_vol)
2500 err = create_bind_cap_vol_ctl(codec, n, vol, sw);
2502 err = create_multi_cap_vol_ctl(codec);
2511 * add mic boosts if needed
2513 static int parse_mic_boost(struct hda_codec *codec)
2515 struct hda_gen_spec *spec = codec->spec;
2516 struct auto_pin_cfg *cfg = &spec->autocfg;
2520 const char *prev_label = NULL;
2522 for (i = 0; i < cfg->num_inputs; i++) {
2523 if (cfg->inputs[i].type > AUTO_PIN_MIC)
2525 nid = cfg->inputs[i].pin;
2526 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) {
2528 char boost_label[44];
2529 struct nid_path *path;
2532 label = hda_get_autocfg_input_label(codec, cfg, i);
2533 if (spec->shared_mic_hp && !strcmp(label, "Misc"))
2534 label = "Headphone Mic";
2535 if (prev_label && !strcmp(label, prev_label))
2541 snprintf(boost_label, sizeof(boost_label),
2542 "%s Boost Volume", label);
2543 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT);
2544 err = add_control(spec, HDA_CTL_WIDGET_VOL,
2545 boost_label, type_idx, val);
2549 path = snd_hda_get_nid_path(codec, nid, 0);
2551 path->ctls[NID_PATH_BOOST_CTL] = val;
2558 * parse digital I/Os and set up NIDs in BIOS auto-parse mode
2560 static void parse_digital(struct hda_codec *codec)
2562 struct hda_gen_spec *spec = codec->spec;
2563 struct nid_path *path;
2567 /* support multiple SPDIFs; the secondary is set up as a slave */
2569 for (i = 0; i < spec->autocfg.dig_outs; i++) {
2570 hda_nid_t pin = spec->autocfg.dig_out_pins[i];
2571 dig_nid = look_for_dac(codec, pin, true);
2574 path = snd_hda_add_new_path(codec, dig_nid, pin, HDA_PARSE_ALL);
2577 print_nid_path("digout", path);
2578 path->active = true;
2579 spec->digout_paths[i] = snd_hda_get_path_idx(codec, path);
2581 spec->multiout.dig_out_nid = dig_nid;
2582 spec->dig_out_type = spec->autocfg.dig_out_type[0];
2584 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
2585 if (nums >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
2587 spec->slave_dig_outs[nums - 1] = dig_nid;
2592 if (spec->autocfg.dig_in_pin) {
2593 dig_nid = codec->start_nid;
2594 for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
2595 unsigned int wcaps = get_wcaps(codec, dig_nid);
2596 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
2598 if (!(wcaps & AC_WCAP_DIGITAL))
2600 path = snd_hda_add_new_path(codec,
2601 spec->autocfg.dig_in_pin,
2602 dig_nid, HDA_PARSE_ALL);
2604 print_nid_path("digin", path);
2605 path->active = true;
2606 spec->dig_in_nid = dig_nid;
2607 spec->digin_path = snd_hda_get_path_idx(codec, path);
2616 * input MUX handling
2619 static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur);
2621 /* select the given imux item; either unmute exclusively or select the route */
2622 static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
2625 struct hda_gen_spec *spec = codec->spec;
2626 const struct hda_input_mux *imux;
2627 struct nid_path *path;
2629 imux = &spec->input_mux;
2630 if (!imux->num_items)
2633 if (idx >= imux->num_items)
2634 idx = imux->num_items - 1;
2635 if (spec->cur_mux[adc_idx] == idx)
2638 path = snd_hda_get_nid_path(codec,
2639 spec->imux_pins[spec->cur_mux[adc_idx]],
2640 spec->adc_nids[adc_idx]);
2644 snd_hda_activate_path(codec, path, false, false);
2646 spec->cur_mux[adc_idx] = idx;
2648 if (spec->shared_mic_hp)
2649 update_shared_mic_hp(codec, spec->cur_mux[adc_idx]);
2651 if (spec->dyn_adc_switch)
2652 dyn_adc_pcm_resetup(codec, idx);
2654 path = snd_hda_get_nid_path(codec, spec->imux_pins[idx],
2655 get_adc_nid(codec, adc_idx, idx));
2660 snd_hda_activate_path(codec, path, true, false);
2661 if (spec->cap_sync_hook)
2662 spec->cap_sync_hook(codec);
2668 * Jack detections for HP auto-mute and mic-switch
2671 /* check each pin in the given array; returns true if any of them is plugged */
2672 static bool detect_jacks(struct hda_codec *codec, int num_pins, hda_nid_t *pins)
2676 for (i = 0; i < num_pins; i++) {
2677 hda_nid_t nid = pins[i];
2680 present |= snd_hda_jack_detect(codec, nid);
2685 /* standard HP/line-out auto-mute helper */
2686 static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins,
2687 bool mute, bool hp_out)
2689 struct hda_gen_spec *spec = codec->spec;
2690 unsigned int pin_bits = mute ? 0 : (hp_out ? PIN_HP : PIN_OUT);
2693 for (i = 0; i < num_pins; i++) {
2694 hda_nid_t nid = pins[i];
2698 /* don't reset VREF value in case it's controlling
2699 * the amp (see alc861_fixup_asus_amp_vref_0f())
2701 if (spec->keep_vref_in_automute) {
2702 val = snd_hda_codec_read(codec, nid, 0,
2703 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
2708 snd_hda_set_pin_ctl_cache(codec, nid, val);
2709 set_pin_eapd(codec, nid, !mute);
2713 /* Toggle outputs muting */
2714 void snd_hda_gen_update_outputs(struct hda_codec *codec)
2716 struct hda_gen_spec *spec = codec->spec;
2719 /* Control HP pins/amps depending on master_mute state;
2720 * in general, HP pins/amps control should be enabled in all cases,
2721 * but currently set only for master_mute, just to be safe
2723 if (!spec->shared_mic_hp) /* don't change HP-pin when shared with mic */
2724 do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
2725 spec->autocfg.hp_pins, spec->master_mute, true);
2727 if (!spec->automute_speaker)
2730 on = spec->hp_jack_present | spec->line_jack_present;
2731 on |= spec->master_mute;
2732 do_automute(codec, ARRAY_SIZE(spec->autocfg.speaker_pins),
2733 spec->autocfg.speaker_pins, on, false);
2735 /* toggle line-out mutes if needed, too */
2736 /* if LO is a copy of either HP or Speaker, don't need to handle it */
2737 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0] ||
2738 spec->autocfg.line_out_pins[0] == spec->autocfg.speaker_pins[0])
2740 if (!spec->automute_lo)
2743 on = spec->hp_jack_present;
2744 on |= spec->master_mute;
2745 do_automute(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
2746 spec->autocfg.line_out_pins, on, false);
2748 EXPORT_SYMBOL_HDA(snd_hda_gen_update_outputs);
2750 static void call_update_outputs(struct hda_codec *codec)
2752 struct hda_gen_spec *spec = codec->spec;
2753 if (spec->automute_hook)
2754 spec->automute_hook(codec);
2756 snd_hda_gen_update_outputs(codec);
2759 /* standard HP-automute helper */
2760 void snd_hda_gen_hp_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)
2762 struct hda_gen_spec *spec = codec->spec;
2764 spec->hp_jack_present =
2765 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
2766 spec->autocfg.hp_pins);
2767 if (!spec->detect_hp || (!spec->automute_speaker && !spec->automute_lo))
2769 call_update_outputs(codec);
2771 EXPORT_SYMBOL_HDA(snd_hda_gen_hp_automute);
2773 /* standard line-out-automute helper */
2774 void snd_hda_gen_line_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)
2776 struct hda_gen_spec *spec = codec->spec;
2778 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
2780 /* check LO jack only when it's different from HP */
2781 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0])
2784 spec->line_jack_present =
2785 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
2786 spec->autocfg.line_out_pins);
2787 if (!spec->automute_speaker || !spec->detect_lo)
2789 call_update_outputs(codec);
2791 EXPORT_SYMBOL_HDA(snd_hda_gen_line_automute);
2793 /* standard mic auto-switch helper */
2794 void snd_hda_gen_mic_autoswitch(struct hda_codec *codec, struct hda_jack_tbl *jack)
2796 struct hda_gen_spec *spec = codec->spec;
2799 if (!spec->auto_mic)
2802 for (i = spec->am_num_entries - 1; i > 0; i--) {
2803 if (snd_hda_jack_detect(codec, spec->am_entry[i].pin)) {
2804 mux_select(codec, 0, spec->am_entry[i].idx);
2808 mux_select(codec, 0, spec->am_entry[0].idx);
2810 EXPORT_SYMBOL_HDA(snd_hda_gen_mic_autoswitch);
2813 * Auto-Mute mode mixer enum support
2815 static int automute_mode_info(struct snd_kcontrol *kcontrol,
2816 struct snd_ctl_elem_info *uinfo)
2818 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2819 struct hda_gen_spec *spec = codec->spec;
2820 static const char * const texts3[] = {
2821 "Disabled", "Speaker Only", "Line Out+Speaker"
2824 if (spec->automute_speaker_possible && spec->automute_lo_possible)
2825 return snd_hda_enum_helper_info(kcontrol, uinfo, 3, texts3);
2826 return snd_hda_enum_bool_helper_info(kcontrol, uinfo);
2829 static int automute_mode_get(struct snd_kcontrol *kcontrol,
2830 struct snd_ctl_elem_value *ucontrol)
2832 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2833 struct hda_gen_spec *spec = codec->spec;
2834 unsigned int val = 0;
2835 if (spec->automute_speaker)
2837 if (spec->automute_lo)
2840 ucontrol->value.enumerated.item[0] = val;
2844 static int automute_mode_put(struct snd_kcontrol *kcontrol,
2845 struct snd_ctl_elem_value *ucontrol)
2847 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2848 struct hda_gen_spec *spec = codec->spec;
2850 switch (ucontrol->value.enumerated.item[0]) {
2852 if (!spec->automute_speaker && !spec->automute_lo)
2854 spec->automute_speaker = 0;
2855 spec->automute_lo = 0;
2858 if (spec->automute_speaker_possible) {
2859 if (!spec->automute_lo && spec->automute_speaker)
2861 spec->automute_speaker = 1;
2862 spec->automute_lo = 0;
2863 } else if (spec->automute_lo_possible) {
2864 if (spec->automute_lo)
2866 spec->automute_lo = 1;
2871 if (!spec->automute_lo_possible || !spec->automute_speaker_possible)
2873 if (spec->automute_speaker && spec->automute_lo)
2875 spec->automute_speaker = 1;
2876 spec->automute_lo = 1;
2881 call_update_outputs(codec);
2885 static const struct snd_kcontrol_new automute_mode_enum = {
2886 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2887 .name = "Auto-Mute Mode",
2888 .info = automute_mode_info,
2889 .get = automute_mode_get,
2890 .put = automute_mode_put,
2893 static int add_automute_mode_enum(struct hda_codec *codec)
2895 struct hda_gen_spec *spec = codec->spec;
2897 if (!snd_hda_gen_add_kctl(spec, NULL, &automute_mode_enum))
2903 * Check the availability of HP/line-out auto-mute;
2904 * Set up appropriately if really supported
2906 static int check_auto_mute_availability(struct hda_codec *codec)
2908 struct hda_gen_spec *spec = codec->spec;
2909 struct auto_pin_cfg *cfg = &spec->autocfg;
2913 if (cfg->hp_pins[0])
2915 if (cfg->line_out_pins[0])
2917 if (cfg->speaker_pins[0])
2919 if (present < 2) /* need two different output types */
2922 if (!cfg->speaker_pins[0] &&
2923 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
2924 memcpy(cfg->speaker_pins, cfg->line_out_pins,
2925 sizeof(cfg->speaker_pins));
2926 cfg->speaker_outs = cfg->line_outs;
2929 if (!cfg->hp_pins[0] &&
2930 cfg->line_out_type == AUTO_PIN_HP_OUT) {
2931 memcpy(cfg->hp_pins, cfg->line_out_pins,
2932 sizeof(cfg->hp_pins));
2933 cfg->hp_outs = cfg->line_outs;
2936 for (i = 0; i < cfg->hp_outs; i++) {
2937 hda_nid_t nid = cfg->hp_pins[i];
2938 if (!is_jack_detectable(codec, nid))
2940 snd_printdd("hda-codec: Enable HP auto-muting on NID 0x%x\n",
2942 snd_hda_jack_detect_enable_callback(codec, nid, HDA_GEN_HP_EVENT,
2943 spec->hp_automute_hook ?
2944 spec->hp_automute_hook :
2945 snd_hda_gen_hp_automute);
2946 spec->detect_hp = 1;
2949 if (cfg->line_out_type == AUTO_PIN_LINE_OUT && cfg->line_outs) {
2950 if (cfg->speaker_outs)
2951 for (i = 0; i < cfg->line_outs; i++) {
2952 hda_nid_t nid = cfg->line_out_pins[i];
2953 if (!is_jack_detectable(codec, nid))
2955 snd_printdd("hda-codec: Enable Line-Out auto-muting on NID 0x%x\n", nid);
2956 snd_hda_jack_detect_enable_callback(codec, nid,
2957 HDA_GEN_FRONT_EVENT,
2958 spec->line_automute_hook ?
2959 spec->line_automute_hook :
2960 snd_hda_gen_line_automute);
2961 spec->detect_lo = 1;
2963 spec->automute_lo_possible = spec->detect_hp;
2966 spec->automute_speaker_possible = cfg->speaker_outs &&
2967 (spec->detect_hp || spec->detect_lo);
2969 spec->automute_lo = spec->automute_lo_possible;
2970 spec->automute_speaker = spec->automute_speaker_possible;
2972 if (spec->automute_speaker_possible || spec->automute_lo_possible) {
2973 /* create a control for automute mode */
2974 err = add_automute_mode_enum(codec);
2981 /* return the position of NID in the list, or -1 if not found */
2982 static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
2985 for (i = 0; i < nums; i++)
2991 /* check whether all auto-mic pins are valid; setup indices if OK */
2992 static bool auto_mic_check_imux(struct hda_codec *codec)
2994 struct hda_gen_spec *spec = codec->spec;
2995 const struct hda_input_mux *imux;
2998 imux = &spec->input_mux;
2999 for (i = 0; i < spec->am_num_entries; i++) {
3000 spec->am_entry[i].idx =
3001 find_idx_in_nid_list(spec->am_entry[i].pin,
3002 spec->imux_pins, imux->num_items);
3003 if (spec->am_entry[i].idx < 0)
3004 return false; /* no corresponding imux */
3007 /* we don't need the jack detection for the first pin */
3008 for (i = 1; i < spec->am_num_entries; i++)
3009 snd_hda_jack_detect_enable_callback(codec,
3010 spec->am_entry[i].pin,
3012 spec->mic_autoswitch_hook ?
3013 spec->mic_autoswitch_hook :
3014 snd_hda_gen_mic_autoswitch);
3018 static int compare_attr(const void *ap, const void *bp)
3020 const struct automic_entry *a = ap;
3021 const struct automic_entry *b = bp;
3022 return (int)(a->attr - b->attr);
3026 * Check the availability of auto-mic switch;
3027 * Set up if really supported
3029 static int check_auto_mic_availability(struct hda_codec *codec)
3031 struct hda_gen_spec *spec = codec->spec;
3032 struct auto_pin_cfg *cfg = &spec->autocfg;
3038 for (i = 0; i < cfg->num_inputs; i++) {
3039 hda_nid_t nid = cfg->inputs[i].pin;
3041 attr = snd_hda_codec_get_pincfg(codec, nid);
3042 attr = snd_hda_get_input_pin_attr(attr);
3043 if (types & (1 << attr))
3044 return 0; /* already occupied */
3046 case INPUT_PIN_ATTR_INT:
3047 if (cfg->inputs[i].type != AUTO_PIN_MIC)
3048 return 0; /* invalid type */
3050 case INPUT_PIN_ATTR_UNUSED:
3051 return 0; /* invalid entry */
3053 if (cfg->inputs[i].type > AUTO_PIN_LINE_IN)
3054 return 0; /* invalid type */
3055 if (!spec->line_in_auto_switch &&
3056 cfg->inputs[i].type != AUTO_PIN_MIC)
3057 return 0; /* only mic is allowed */
3058 if (!is_jack_detectable(codec, nid))
3059 return 0; /* no unsol support */
3062 if (num_pins >= MAX_AUTO_MIC_PINS)
3064 types |= (1 << attr);
3065 spec->am_entry[num_pins].pin = nid;
3066 spec->am_entry[num_pins].attr = attr;
3073 spec->am_num_entries = num_pins;
3074 /* sort the am_entry in the order of attr so that the pin with a
3075 * higher attr will be selected when the jack is plugged.
3077 sort(spec->am_entry, num_pins, sizeof(spec->am_entry[0]),
3078 compare_attr, NULL);
3080 if (!auto_mic_check_imux(codec))
3084 spec->num_adc_nids = 1;
3085 spec->cur_mux[0] = spec->am_entry[0].idx;
3086 snd_printdd("hda-codec: Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n",
3087 spec->am_entry[0].pin,
3088 spec->am_entry[1].pin,
3089 spec->am_entry[2].pin);
3096 * Parse the given BIOS configuration and set up the hda_gen_spec
3098 * return 1 if successful, 0 if the proper config is not found,
3099 * or a negative error code
3101 int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
3102 struct auto_pin_cfg *cfg)
3104 struct hda_gen_spec *spec = codec->spec;
3107 if (cfg != &spec->autocfg) {
3108 spec->autocfg = *cfg;
3109 cfg = &spec->autocfg;
3112 if (!cfg->line_outs) {
3113 if (cfg->dig_outs || cfg->dig_in_pin) {
3114 spec->multiout.max_channels = 2;
3115 spec->no_analog = 1;
3118 return 0; /* can't find valid BIOS pin config */
3121 if (!spec->no_primary_hp &&
3122 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT &&
3123 cfg->line_outs <= cfg->hp_outs) {
3124 /* use HP as primary out */
3125 cfg->speaker_outs = cfg->line_outs;
3126 memcpy(cfg->speaker_pins, cfg->line_out_pins,
3127 sizeof(cfg->speaker_pins));
3128 cfg->line_outs = cfg->hp_outs;
3129 memcpy(cfg->line_out_pins, cfg->hp_pins, sizeof(cfg->hp_pins));
3131 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
3132 cfg->line_out_type = AUTO_PIN_HP_OUT;
3135 err = parse_output_paths(codec);
3138 err = create_multi_channel_mode(codec);
3141 err = create_multi_out_ctls(codec, cfg);
3144 err = create_hp_out_ctls(codec);
3147 err = create_speaker_out_ctls(codec);
3150 err = create_indep_hp_ctls(codec);
3153 err = create_loopback_mixing_ctl(codec);
3156 err = create_shared_input(codec);
3159 err = create_input_ctls(codec);
3163 spec->const_channel_count = spec->ext_channel_count;
3164 /* check the multiple speaker and headphone pins */
3165 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
3166 spec->const_channel_count = max(spec->const_channel_count,
3167 cfg->speaker_outs * 2);
3168 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
3169 spec->const_channel_count = max(spec->const_channel_count,
3171 spec->multiout.max_channels = max(spec->ext_channel_count,
3172 spec->const_channel_count);
3174 err = check_auto_mute_availability(codec);
3178 err = check_dyn_adc_switch(codec);
3182 if (!spec->shared_mic_hp) {
3183 err = check_auto_mic_availability(codec);
3188 err = create_capture_mixers(codec);
3192 err = parse_mic_boost(codec);
3197 parse_digital(codec);
3201 EXPORT_SYMBOL_HDA(snd_hda_gen_parse_auto_config);
3205 * Build control elements
3208 /* slave controls for virtual master */
3209 static const char * const slave_pfxs[] = {
3210 "Front", "Surround", "Center", "LFE", "Side",
3211 "Headphone", "Speaker", "Mono", "Line Out",
3212 "CLFE", "Bass Speaker", "PCM",
3213 "Speaker Front", "Speaker Surround", "Speaker CLFE", "Speaker Side",
3214 "Headphone Front", "Headphone Surround", "Headphone CLFE",
3219 int snd_hda_gen_build_controls(struct hda_codec *codec)
3221 struct hda_gen_spec *spec = codec->spec;
3224 if (spec->kctls.used) {
3225 err = snd_hda_add_new_ctls(codec, spec->kctls.list);
3230 if (spec->multiout.dig_out_nid) {
3231 err = snd_hda_create_dig_out_ctls(codec,
3232 spec->multiout.dig_out_nid,
3233 spec->multiout.dig_out_nid,
3234 spec->pcm_rec[1].pcm_type);
3237 if (!spec->no_analog) {
3238 err = snd_hda_create_spdif_share_sw(codec,
3242 spec->multiout.share_spdif = 1;
3245 if (spec->dig_in_nid) {
3246 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
3251 /* if we have no master control, let's create it */
3252 if (!spec->no_analog &&
3253 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
3254 unsigned int vmaster_tlv[4];
3255 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
3256 HDA_OUTPUT, vmaster_tlv);
3257 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
3258 vmaster_tlv, slave_pfxs,
3263 if (!spec->no_analog &&
3264 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
3265 err = __snd_hda_add_vmaster(codec, "Master Playback Switch",
3268 true, &spec->vmaster_mute.sw_kctl);
3271 if (spec->vmaster_mute.hook)
3272 snd_hda_add_vmaster_hook(codec, &spec->vmaster_mute,
3273 spec->vmaster_mute_enum);
3276 free_kctls(spec); /* no longer needed */
3278 if (spec->shared_mic_hp) {
3280 int nid = spec->autocfg.inputs[1].pin;
3281 err = snd_hda_jack_add_kctl(codec, nid, "Headphone Mic", 0);
3284 err = snd_hda_jack_detect_enable(codec, nid, 0);
3289 err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
3295 EXPORT_SYMBOL_HDA(snd_hda_gen_build_controls);
3302 static void call_pcm_playback_hook(struct hda_pcm_stream *hinfo,
3303 struct hda_codec *codec,
3304 struct snd_pcm_substream *substream,
3307 struct hda_gen_spec *spec = codec->spec;
3308 if (spec->pcm_playback_hook)
3309 spec->pcm_playback_hook(hinfo, codec, substream, action);
3313 * Analog playback callbacks
3315 static int playback_pcm_open(struct hda_pcm_stream *hinfo,
3316 struct hda_codec *codec,
3317 struct snd_pcm_substream *substream)
3319 struct hda_gen_spec *spec = codec->spec;
3322 mutex_lock(&spec->pcm_mutex);
3323 err = snd_hda_multi_out_analog_open(codec,
3324 &spec->multiout, substream,
3327 spec->active_streams |= 1 << STREAM_MULTI_OUT;
3328 call_pcm_playback_hook(hinfo, codec, substream,
3329 HDA_GEN_PCM_ACT_OPEN);
3331 mutex_unlock(&spec->pcm_mutex);
3335 static int playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3336 struct hda_codec *codec,
3337 unsigned int stream_tag,
3338 unsigned int format,
3339 struct snd_pcm_substream *substream)
3341 struct hda_gen_spec *spec = codec->spec;
3344 err = snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3345 stream_tag, format, substream);
3347 call_pcm_playback_hook(hinfo, codec, substream,
3348 HDA_GEN_PCM_ACT_PREPARE);
3352 static int playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3353 struct hda_codec *codec,
3354 struct snd_pcm_substream *substream)
3356 struct hda_gen_spec *spec = codec->spec;
3359 err = snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3361 call_pcm_playback_hook(hinfo, codec, substream,
3362 HDA_GEN_PCM_ACT_CLEANUP);
3366 static int playback_pcm_close(struct hda_pcm_stream *hinfo,
3367 struct hda_codec *codec,
3368 struct snd_pcm_substream *substream)
3370 struct hda_gen_spec *spec = codec->spec;
3371 mutex_lock(&spec->pcm_mutex);
3372 spec->active_streams &= ~(1 << STREAM_MULTI_OUT);
3373 call_pcm_playback_hook(hinfo, codec, substream,
3374 HDA_GEN_PCM_ACT_CLOSE);
3375 mutex_unlock(&spec->pcm_mutex);
3379 static int alt_playback_pcm_open(struct hda_pcm_stream *hinfo,
3380 struct hda_codec *codec,
3381 struct snd_pcm_substream *substream)
3383 struct hda_gen_spec *spec = codec->spec;
3386 mutex_lock(&spec->pcm_mutex);
3387 if (!spec->indep_hp_enabled)
3390 spec->active_streams |= 1 << STREAM_INDEP_HP;
3391 call_pcm_playback_hook(hinfo, codec, substream,
3392 HDA_GEN_PCM_ACT_OPEN);
3393 mutex_unlock(&spec->pcm_mutex);
3397 static int alt_playback_pcm_close(struct hda_pcm_stream *hinfo,
3398 struct hda_codec *codec,
3399 struct snd_pcm_substream *substream)
3401 struct hda_gen_spec *spec = codec->spec;
3402 mutex_lock(&spec->pcm_mutex);
3403 spec->active_streams &= ~(1 << STREAM_INDEP_HP);
3404 call_pcm_playback_hook(hinfo, codec, substream,
3405 HDA_GEN_PCM_ACT_CLOSE);
3406 mutex_unlock(&spec->pcm_mutex);
3410 static int alt_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3411 struct hda_codec *codec,
3412 unsigned int stream_tag,
3413 unsigned int format,
3414 struct snd_pcm_substream *substream)
3416 snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format);
3417 call_pcm_playback_hook(hinfo, codec, substream,
3418 HDA_GEN_PCM_ACT_PREPARE);
3422 static int alt_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3423 struct hda_codec *codec,
3424 struct snd_pcm_substream *substream)
3426 snd_hda_codec_cleanup_stream(codec, hinfo->nid);
3427 call_pcm_playback_hook(hinfo, codec, substream,
3428 HDA_GEN_PCM_ACT_CLEANUP);
3435 static int dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3436 struct hda_codec *codec,
3437 struct snd_pcm_substream *substream)
3439 struct hda_gen_spec *spec = codec->spec;
3440 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3443 static int dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3444 struct hda_codec *codec,
3445 unsigned int stream_tag,
3446 unsigned int format,
3447 struct snd_pcm_substream *substream)
3449 struct hda_gen_spec *spec = codec->spec;
3450 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3451 stream_tag, format, substream);
3454 static int dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3455 struct hda_codec *codec,
3456 struct snd_pcm_substream *substream)
3458 struct hda_gen_spec *spec = codec->spec;
3459 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3462 static int dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3463 struct hda_codec *codec,
3464 struct snd_pcm_substream *substream)
3466 struct hda_gen_spec *spec = codec->spec;
3467 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3473 static int alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3474 struct hda_codec *codec,
3475 unsigned int stream_tag,
3476 unsigned int format,
3477 struct snd_pcm_substream *substream)
3479 struct hda_gen_spec *spec = codec->spec;
3481 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3482 stream_tag, 0, format);
3486 static int alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3487 struct hda_codec *codec,
3488 struct snd_pcm_substream *substream)
3490 struct hda_gen_spec *spec = codec->spec;
3492 snd_hda_codec_cleanup_stream(codec,
3493 spec->adc_nids[substream->number + 1]);
3499 static const struct hda_pcm_stream pcm_analog_playback = {
3503 /* NID is set in build_pcms */
3505 .open = playback_pcm_open,
3506 .close = playback_pcm_close,
3507 .prepare = playback_pcm_prepare,
3508 .cleanup = playback_pcm_cleanup
3512 static const struct hda_pcm_stream pcm_analog_capture = {
3516 /* NID is set in build_pcms */
3519 static const struct hda_pcm_stream pcm_analog_alt_playback = {
3523 /* NID is set in build_pcms */
3525 .open = alt_playback_pcm_open,
3526 .close = alt_playback_pcm_close,
3527 .prepare = alt_playback_pcm_prepare,
3528 .cleanup = alt_playback_pcm_cleanup
3532 static const struct hda_pcm_stream pcm_analog_alt_capture = {
3533 .substreams = 2, /* can be overridden */
3536 /* NID is set in build_pcms */
3538 .prepare = alt_capture_pcm_prepare,
3539 .cleanup = alt_capture_pcm_cleanup
3543 static const struct hda_pcm_stream pcm_digital_playback = {
3547 /* NID is set in build_pcms */
3549 .open = dig_playback_pcm_open,
3550 .close = dig_playback_pcm_close,
3551 .prepare = dig_playback_pcm_prepare,
3552 .cleanup = dig_playback_pcm_cleanup
3556 static const struct hda_pcm_stream pcm_digital_capture = {
3560 /* NID is set in build_pcms */
3563 /* Used by build_pcms to flag that a PCM has no playback stream */
3564 static const struct hda_pcm_stream pcm_null_stream = {
3571 * dynamic changing ADC PCM streams
3573 static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur)
3575 struct hda_gen_spec *spec = codec->spec;
3576 hda_nid_t new_adc = spec->adc_nids[spec->dyn_adc_idx[cur]];
3578 if (spec->cur_adc && spec->cur_adc != new_adc) {
3579 /* stream is running, let's swap the current ADC */
3580 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
3581 spec->cur_adc = new_adc;
3582 snd_hda_codec_setup_stream(codec, new_adc,
3583 spec->cur_adc_stream_tag, 0,
3584 spec->cur_adc_format);
3590 /* analog capture with dynamic dual-adc changes */
3591 static int dyn_adc_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3592 struct hda_codec *codec,
3593 unsigned int stream_tag,
3594 unsigned int format,
3595 struct snd_pcm_substream *substream)
3597 struct hda_gen_spec *spec = codec->spec;
3598 spec->cur_adc = spec->adc_nids[spec->dyn_adc_idx[spec->cur_mux[0]]];
3599 spec->cur_adc_stream_tag = stream_tag;
3600 spec->cur_adc_format = format;
3601 snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
3605 static int dyn_adc_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3606 struct hda_codec *codec,
3607 struct snd_pcm_substream *substream)
3609 struct hda_gen_spec *spec = codec->spec;
3610 snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
3615 static const struct hda_pcm_stream dyn_adc_pcm_analog_capture = {
3619 .nid = 0, /* fill later */
3621 .prepare = dyn_adc_capture_pcm_prepare,
3622 .cleanup = dyn_adc_capture_pcm_cleanup
3626 static void fill_pcm_stream_name(char *str, size_t len, const char *sfx,
3627 const char *chip_name)
3633 strlcpy(str, chip_name, len);
3635 /* drop non-alnum chars after a space */
3636 for (p = strchr(str, ' '); p; p = strchr(p + 1, ' ')) {
3637 if (!isalnum(p[1])) {
3642 strlcat(str, sfx, len);
3645 /* build PCM streams based on the parsed results */
3646 int snd_hda_gen_build_pcms(struct hda_codec *codec)
3648 struct hda_gen_spec *spec = codec->spec;
3649 struct hda_pcm *info = spec->pcm_rec;
3650 const struct hda_pcm_stream *p;
3651 bool have_multi_adcs;
3653 codec->num_pcms = 1;
3654 codec->pcm_info = info;
3656 if (spec->no_analog)
3659 fill_pcm_stream_name(spec->stream_name_analog,
3660 sizeof(spec->stream_name_analog),
3661 " Analog", codec->chip_name);
3662 info->name = spec->stream_name_analog;
3664 if (spec->multiout.num_dacs > 0) {
3665 p = spec->stream_analog_playback;
3667 p = &pcm_analog_playback;
3668 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3669 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3670 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
3671 spec->multiout.max_channels;
3672 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT &&
3673 spec->autocfg.line_outs == 2)
3674 info->stream[SNDRV_PCM_STREAM_PLAYBACK].chmap =
3677 if (spec->num_adc_nids) {
3678 p = spec->stream_analog_capture;
3680 if (spec->dyn_adc_switch)
3681 p = &dyn_adc_pcm_analog_capture;
3683 p = &pcm_analog_capture;
3685 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3686 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3690 /* SPDIF for stream index #1 */
3691 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3692 fill_pcm_stream_name(spec->stream_name_digital,
3693 sizeof(spec->stream_name_digital),
3694 " Digital", codec->chip_name);
3695 codec->num_pcms = 2;
3696 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3697 info = spec->pcm_rec + 1;
3698 info->name = spec->stream_name_digital;
3699 if (spec->dig_out_type)
3700 info->pcm_type = spec->dig_out_type;
3702 info->pcm_type = HDA_PCM_TYPE_SPDIF;
3703 if (spec->multiout.dig_out_nid) {
3704 p = spec->stream_digital_playback;
3706 p = &pcm_digital_playback;
3707 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3708 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3710 if (spec->dig_in_nid) {
3711 p = spec->stream_digital_capture;
3713 p = &pcm_digital_capture;
3714 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3715 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3719 if (spec->no_analog)
3722 /* If the use of more than one ADC is requested for the current
3723 * model, configure a second analog capture-only PCM.
3725 have_multi_adcs = (spec->num_adc_nids > 1) &&
3726 !spec->dyn_adc_switch && !spec->auto_mic;
3727 /* Additional Analaog capture for index #2 */
3728 if (spec->alt_dac_nid || have_multi_adcs) {
3729 codec->num_pcms = 3;
3730 info = spec->pcm_rec + 2;
3731 info->name = spec->stream_name_analog;
3732 if (spec->alt_dac_nid) {
3733 p = spec->stream_analog_alt_playback;
3735 p = &pcm_analog_alt_playback;
3736 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3737 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3740 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3742 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3744 if (have_multi_adcs) {
3745 p = spec->stream_analog_alt_capture;
3747 p = &pcm_analog_alt_capture;
3748 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3749 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3751 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3752 spec->num_adc_nids - 1;
3754 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3756 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3762 EXPORT_SYMBOL_HDA(snd_hda_gen_build_pcms);
3766 * Standard auto-parser initializations
3769 /* configure the given path as a proper output */
3770 static void set_output_and_unmute(struct hda_codec *codec,
3771 int pin_type, int path_idx)
3773 struct nid_path *path;
3776 path = snd_hda_get_path_from_idx(codec, path_idx);
3777 if (!path || !path->depth)
3779 pin = path->path[path->depth - 1];
3780 snd_hda_set_pin_ctl_cache(codec, pin, pin_type);
3781 snd_hda_activate_path(codec, path, path->active, true);
3782 set_pin_eapd(codec, pin, path->active);
3785 /* initialize primary output paths */
3786 static void init_multi_out(struct hda_codec *codec)
3788 struct hda_gen_spec *spec = codec->spec;
3792 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)
3797 for (i = 0; i < spec->autocfg.line_outs; i++)
3798 set_output_and_unmute(codec, pin_type, spec->out_paths[i]);
3802 static void __init_extra_out(struct hda_codec *codec, int num_outs,
3803 int *paths, int type)
3807 for (i = 0; i < num_outs; i++)
3808 set_output_and_unmute(codec, type, paths[i]);
3811 /* initialize hp and speaker paths */
3812 static void init_extra_out(struct hda_codec *codec)
3814 struct hda_gen_spec *spec = codec->spec;
3816 if (spec->autocfg.line_out_type != AUTO_PIN_HP_OUT)
3817 __init_extra_out(codec, spec->autocfg.hp_outs,
3818 spec->hp_paths, PIN_HP);
3819 if (spec->autocfg.line_out_type != AUTO_PIN_SPEAKER_OUT)
3820 __init_extra_out(codec, spec->autocfg.speaker_outs,
3821 spec->speaker_paths, PIN_OUT);
3824 /* initialize multi-io paths */
3825 static void init_multi_io(struct hda_codec *codec)
3827 struct hda_gen_spec *spec = codec->spec;
3830 for (i = 0; i < spec->multi_ios; i++) {
3831 hda_nid_t pin = spec->multi_io[i].pin;
3832 struct nid_path *path;
3833 path = get_multiio_path(codec, i);
3836 if (!spec->multi_io[i].ctl_in)
3837 spec->multi_io[i].ctl_in =
3838 snd_hda_codec_update_cache(codec, pin, 0,
3839 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3840 snd_hda_activate_path(codec, path, path->active, true);
3844 /* set up the input pin config, depending on the given auto-pin type */
3845 static void set_input_pin(struct hda_codec *codec, hda_nid_t nid,
3848 unsigned int val = PIN_IN;
3849 if (auto_pin_type == AUTO_PIN_MIC)
3850 val |= snd_hda_get_default_vref(codec, nid);
3851 snd_hda_set_pin_ctl_cache(codec, nid, val);
3854 /* set up input pins and loopback paths */
3855 static void init_analog_input(struct hda_codec *codec)
3857 struct hda_gen_spec *spec = codec->spec;
3858 struct auto_pin_cfg *cfg = &spec->autocfg;
3861 for (i = 0; i < cfg->num_inputs; i++) {
3862 hda_nid_t nid = cfg->inputs[i].pin;
3863 if (is_input_pin(codec, nid))
3864 set_input_pin(codec, nid, cfg->inputs[i].type);
3866 /* init loopback inputs */
3867 if (spec->mixer_nid) {
3868 struct nid_path *path;
3869 path = snd_hda_get_path_from_idx(codec, spec->loopback_paths[i]);
3871 snd_hda_activate_path(codec, path,
3872 path->active, false);
3877 /* initialize ADC paths */
3878 static void init_input_src(struct hda_codec *codec)
3880 struct hda_gen_spec *spec = codec->spec;
3881 struct hda_input_mux *imux = &spec->input_mux;
3882 struct nid_path *path;
3885 if (spec->dyn_adc_switch)
3888 nums = spec->num_adc_nids;
3890 for (c = 0; c < nums; c++) {
3891 for (i = 0; i < imux->num_items; i++) {
3892 path = snd_hda_get_nid_path(codec, spec->imux_pins[i],
3893 get_adc_nid(codec, c, i));
3895 bool active = path->active;
3896 if (i == spec->cur_mux[c])
3898 snd_hda_activate_path(codec, path, active, false);
3903 if (spec->shared_mic_hp)
3904 update_shared_mic_hp(codec, spec->cur_mux[0]);
3906 if (spec->cap_sync_hook)
3907 spec->cap_sync_hook(codec);
3910 /* set right pin controls for digital I/O */
3911 static void init_digital(struct hda_codec *codec)
3913 struct hda_gen_spec *spec = codec->spec;
3917 for (i = 0; i < spec->autocfg.dig_outs; i++)
3918 set_output_and_unmute(codec, PIN_OUT, spec->digout_paths[i]);
3919 pin = spec->autocfg.dig_in_pin;
3921 struct nid_path *path;
3922 snd_hda_set_pin_ctl_cache(codec, pin, PIN_IN);
3923 path = snd_hda_get_path_from_idx(codec, spec->digin_path);
3925 snd_hda_activate_path(codec, path, path->active, false);
3929 /* clear unsol-event tags on unused pins; Conexant codecs seem to leave
3930 * invalid unsol tags by some reason
3932 static void clear_unsol_on_unused_pins(struct hda_codec *codec)
3936 for (i = 0; i < codec->init_pins.used; i++) {
3937 struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
3938 hda_nid_t nid = pin->nid;
3939 if (is_jack_detectable(codec, nid) &&
3940 !snd_hda_jack_tbl_get(codec, nid))
3941 snd_hda_codec_update_cache(codec, nid, 0,
3942 AC_VERB_SET_UNSOLICITED_ENABLE, 0);
3947 * initialize the generic spec;
3948 * this can be put as patch_ops.init function
3950 int snd_hda_gen_init(struct hda_codec *codec)
3952 struct hda_gen_spec *spec = codec->spec;
3954 if (spec->init_hook)
3955 spec->init_hook(codec);
3957 snd_hda_apply_verbs(codec);
3959 codec->cached_write = 1;
3961 init_multi_out(codec);
3962 init_extra_out(codec);
3963 init_multi_io(codec);
3964 init_analog_input(codec);
3965 init_input_src(codec);
3966 init_digital(codec);
3968 clear_unsol_on_unused_pins(codec);
3970 /* call init functions of standard auto-mute helpers */
3971 snd_hda_gen_hp_automute(codec, NULL);
3972 snd_hda_gen_line_automute(codec, NULL);
3973 snd_hda_gen_mic_autoswitch(codec, NULL);
3975 snd_hda_codec_flush_amp_cache(codec);
3976 snd_hda_codec_flush_cmd_cache(codec);
3978 if (spec->vmaster_mute.sw_kctl && spec->vmaster_mute.hook)
3979 snd_hda_sync_vmaster_hook(&spec->vmaster_mute);
3981 hda_call_check_power_status(codec, 0x01);
3984 EXPORT_SYMBOL_HDA(snd_hda_gen_init);
3987 * free the generic spec;
3988 * this can be put as patch_ops.free function
3990 void snd_hda_gen_free(struct hda_codec *codec)
3992 snd_hda_gen_spec_free(codec->spec);
3996 EXPORT_SYMBOL_HDA(snd_hda_gen_free);
4000 * check the loopback power save state;
4001 * this can be put as patch_ops.check_power_status function
4003 int snd_hda_gen_check_power_status(struct hda_codec *codec, hda_nid_t nid)
4005 struct hda_gen_spec *spec = codec->spec;
4006 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
4008 EXPORT_SYMBOL_HDA(snd_hda_gen_check_power_status);
4013 * the generic codec support
4016 static const struct hda_codec_ops generic_patch_ops = {
4017 .build_controls = snd_hda_gen_build_controls,
4018 .build_pcms = snd_hda_gen_build_pcms,
4019 .init = snd_hda_gen_init,
4020 .free = snd_hda_gen_free,
4021 .unsol_event = snd_hda_jack_unsol_event,
4023 .check_power_status = snd_hda_gen_check_power_status,
4027 int snd_hda_parse_generic_codec(struct hda_codec *codec)
4029 struct hda_gen_spec *spec;
4032 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4035 snd_hda_gen_spec_init(spec);
4038 err = snd_hda_parse_pin_defcfg(codec, &spec->autocfg, NULL, 0);
4042 err = snd_hda_gen_parse_auto_config(codec, &spec->autocfg);
4046 codec->patch_ops = generic_patch_ops;
4050 snd_hda_gen_free(codec);
4053 EXPORT_SYMBOL_HDA(snd_hda_parse_generic_codec);