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 in the dac_nids table from the parsed pin configuration */
1129 static int fill_and_eval_dacs(struct hda_codec *codec,
1130 bool fill_hardwired,
1131 bool fill_mio_first)
1133 struct hda_gen_spec *spec = codec->spec;
1134 struct auto_pin_cfg *cfg = &spec->autocfg;
1135 int i, err, badness;
1137 /* set num_dacs once to full for look_for_dac() */
1138 spec->multiout.num_dacs = cfg->line_outs;
1139 spec->multiout.dac_nids = spec->private_dac_nids;
1140 memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids));
1141 memset(spec->multiout.hp_out_nid, 0, sizeof(spec->multiout.hp_out_nid));
1142 memset(spec->multiout.extra_out_nid, 0, sizeof(spec->multiout.extra_out_nid));
1143 spec->multi_ios = 0;
1144 snd_array_free(&spec->paths);
1146 /* clear path indices */
1147 memset(spec->out_paths, 0, sizeof(spec->out_paths));
1148 memset(spec->hp_paths, 0, sizeof(spec->hp_paths));
1149 memset(spec->speaker_paths, 0, sizeof(spec->speaker_paths));
1150 memset(spec->aamix_out_paths, 0, sizeof(spec->aamix_out_paths));
1151 memset(spec->digout_paths, 0, sizeof(spec->digout_paths));
1152 memset(spec->loopback_paths, 0, sizeof(spec->loopback_paths));
1153 memset(&spec->digin_path, 0, sizeof(spec->digin_path));
1157 /* fill hard-wired DACs first */
1158 if (fill_hardwired) {
1161 mapped = map_singles(codec, cfg->line_outs,
1163 spec->private_dac_nids,
1165 mapped |= map_singles(codec, cfg->hp_outs,
1167 spec->multiout.hp_out_nid,
1169 mapped |= map_singles(codec, cfg->speaker_outs,
1171 spec->multiout.extra_out_nid,
1172 spec->speaker_paths);
1173 if (fill_mio_first && cfg->line_outs == 1 &&
1174 cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1175 err = fill_multi_ios(codec, cfg->line_out_pins[0], true);
1182 badness += try_assign_dacs(codec, cfg->line_outs, cfg->line_out_pins,
1183 spec->private_dac_nids, spec->out_paths,
1186 /* re-count num_dacs and squash invalid entries */
1187 spec->multiout.num_dacs = 0;
1188 for (i = 0; i < cfg->line_outs; i++) {
1189 if (spec->private_dac_nids[i])
1190 spec->multiout.num_dacs++;
1192 memmove(spec->private_dac_nids + i,
1193 spec->private_dac_nids + i + 1,
1194 sizeof(hda_nid_t) * (cfg->line_outs - i - 1));
1195 spec->private_dac_nids[cfg->line_outs - 1] = 0;
1199 if (fill_mio_first &&
1200 cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1201 /* try to fill multi-io first */
1202 err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
1205 /* we don't count badness at this stage yet */
1208 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
1209 err = try_assign_dacs(codec, cfg->hp_outs, cfg->hp_pins,
1210 spec->multiout.hp_out_nid,
1212 &extra_out_badness);
1217 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1218 err = try_assign_dacs(codec, cfg->speaker_outs,
1220 spec->multiout.extra_out_nid,
1221 spec->speaker_paths,
1222 &extra_out_badness);
1227 if (cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1228 err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
1234 if (spec->mixer_nid) {
1235 spec->aamix_out_paths[0] =
1236 check_aamix_out_path(codec, spec->out_paths[0]);
1237 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1238 spec->aamix_out_paths[1] =
1239 check_aamix_out_path(codec, spec->hp_paths[0]);
1240 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1241 spec->aamix_out_paths[2] =
1242 check_aamix_out_path(codec, spec->speaker_paths[0]);
1245 if (cfg->hp_outs && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
1246 if (count_multiio_pins(codec, cfg->hp_pins[0]) >= 2)
1247 spec->multi_ios = 1; /* give badness */
1249 if (spec->multi_ios == 2) {
1250 for (i = 0; i < 2; i++)
1251 spec->private_dac_nids[spec->multiout.num_dacs++] =
1252 spec->multi_io[i].dac;
1253 spec->ext_channel_count = 2;
1254 } else if (spec->multi_ios) {
1255 spec->multi_ios = 0;
1256 badness += BAD_MULTI_IO;
1262 #define DEBUG_BADNESS
1264 #ifdef DEBUG_BADNESS
1265 #define debug_badness snd_printdd
1267 #define debug_badness(...)
1270 static void debug_show_configs(struct hda_gen_spec *spec, struct auto_pin_cfg *cfg)
1272 debug_badness("multi_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1273 cfg->line_out_pins[0], cfg->line_out_pins[1],
1274 cfg->line_out_pins[2], cfg->line_out_pins[3],
1275 spec->multiout.dac_nids[0],
1276 spec->multiout.dac_nids[1],
1277 spec->multiout.dac_nids[2],
1278 spec->multiout.dac_nids[3]);
1279 if (spec->multi_ios > 0)
1280 debug_badness("multi_ios(%d) = %x/%x : %x/%x\n",
1282 spec->multi_io[0].pin, spec->multi_io[1].pin,
1283 spec->multi_io[0].dac, spec->multi_io[1].dac);
1284 debug_badness("hp_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1285 cfg->hp_pins[0], cfg->hp_pins[1],
1286 cfg->hp_pins[2], cfg->hp_pins[3],
1287 spec->multiout.hp_out_nid[0],
1288 spec->multiout.hp_out_nid[1],
1289 spec->multiout.hp_out_nid[2],
1290 spec->multiout.hp_out_nid[3]);
1291 debug_badness("spk_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1292 cfg->speaker_pins[0], cfg->speaker_pins[1],
1293 cfg->speaker_pins[2], cfg->speaker_pins[3],
1294 spec->multiout.extra_out_nid[0],
1295 spec->multiout.extra_out_nid[1],
1296 spec->multiout.extra_out_nid[2],
1297 spec->multiout.extra_out_nid[3]);
1300 /* find all available DACs of the codec */
1301 static void fill_all_dac_nids(struct hda_codec *codec)
1303 struct hda_gen_spec *spec = codec->spec;
1305 hda_nid_t nid = codec->start_nid;
1307 spec->num_all_dacs = 0;
1308 memset(spec->all_dacs, 0, sizeof(spec->all_dacs));
1309 for (i = 0; i < codec->num_nodes; i++, nid++) {
1310 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_AUD_OUT)
1312 if (spec->num_all_dacs >= ARRAY_SIZE(spec->all_dacs)) {
1313 snd_printk(KERN_ERR "hda: Too many DACs!\n");
1316 spec->all_dacs[spec->num_all_dacs++] = nid;
1320 static int parse_output_paths(struct hda_codec *codec)
1322 struct hda_gen_spec *spec = codec->spec;
1323 struct auto_pin_cfg *cfg = &spec->autocfg;
1324 struct auto_pin_cfg *best_cfg;
1325 int best_badness = INT_MAX;
1327 bool fill_hardwired = true, fill_mio_first = true;
1328 bool best_wired = true, best_mio = true;
1329 bool hp_spk_swapped = false;
1331 fill_all_dac_nids(codec);
1333 best_cfg = kmalloc(sizeof(*best_cfg), GFP_KERNEL);
1339 badness = fill_and_eval_dacs(codec, fill_hardwired,
1345 debug_badness("==> lo_type=%d, wired=%d, mio=%d, badness=0x%x\n",
1346 cfg->line_out_type, fill_hardwired, fill_mio_first,
1348 debug_show_configs(spec, cfg);
1349 if (badness < best_badness) {
1350 best_badness = badness;
1352 best_wired = fill_hardwired;
1353 best_mio = fill_mio_first;
1357 fill_mio_first = !fill_mio_first;
1358 if (!fill_mio_first)
1360 fill_hardwired = !fill_hardwired;
1361 if (!fill_hardwired)
1365 hp_spk_swapped = true;
1366 if (cfg->speaker_outs > 0 &&
1367 cfg->line_out_type == AUTO_PIN_HP_OUT) {
1368 cfg->hp_outs = cfg->line_outs;
1369 memcpy(cfg->hp_pins, cfg->line_out_pins,
1370 sizeof(cfg->hp_pins));
1371 cfg->line_outs = cfg->speaker_outs;
1372 memcpy(cfg->line_out_pins, cfg->speaker_pins,
1373 sizeof(cfg->speaker_pins));
1374 cfg->speaker_outs = 0;
1375 memset(cfg->speaker_pins, 0, sizeof(cfg->speaker_pins));
1376 cfg->line_out_type = AUTO_PIN_SPEAKER_OUT;
1377 fill_hardwired = true;
1380 if (cfg->hp_outs > 0 &&
1381 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
1382 cfg->speaker_outs = cfg->line_outs;
1383 memcpy(cfg->speaker_pins, cfg->line_out_pins,
1384 sizeof(cfg->speaker_pins));
1385 cfg->line_outs = cfg->hp_outs;
1386 memcpy(cfg->line_out_pins, cfg->hp_pins,
1387 sizeof(cfg->hp_pins));
1389 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
1390 cfg->line_out_type = AUTO_PIN_HP_OUT;
1391 fill_hardwired = true;
1398 debug_badness("==> restoring best_cfg\n");
1400 fill_and_eval_dacs(codec, best_wired, best_mio);
1402 debug_badness("==> Best config: lo_type=%d, wired=%d, mio=%d\n",
1403 cfg->line_out_type, best_wired, best_mio);
1404 debug_show_configs(spec, cfg);
1406 if (cfg->line_out_pins[0]) {
1407 struct nid_path *path;
1408 path = snd_hda_get_path_from_idx(codec, spec->out_paths[0]);
1410 spec->vmaster_nid = look_for_out_vol_nid(codec, path);
1417 /* add playback controls from the parsed DAC table */
1418 static int create_multi_out_ctls(struct hda_codec *codec,
1419 const struct auto_pin_cfg *cfg)
1421 struct hda_gen_spec *spec = codec->spec;
1422 int i, err, noutputs;
1424 noutputs = cfg->line_outs;
1425 if (spec->multi_ios > 0 && cfg->line_outs < 3)
1426 noutputs += spec->multi_ios;
1428 for (i = 0; i < noutputs; i++) {
1431 struct nid_path *path;
1433 if (i >= cfg->line_outs) {
1435 name = channel_name[i];
1437 name = get_line_out_pfx(spec, i, true, &index);
1440 path = snd_hda_get_path_from_idx(codec, spec->out_paths[i]);
1443 if (!name || !strcmp(name, "CLFE")) {
1445 err = add_vol_ctl(codec, "Center", 0, 1, path);
1448 err = add_vol_ctl(codec, "LFE", 0, 2, path);
1451 err = add_sw_ctl(codec, "Center", 0, 1, path);
1454 err = add_sw_ctl(codec, "LFE", 0, 2, path);
1458 err = add_stereo_vol(codec, name, index, path);
1461 err = add_stereo_sw(codec, name, index, path);
1469 static int create_extra_out(struct hda_codec *codec, int path_idx,
1470 const char *pfx, int cidx)
1472 struct nid_path *path;
1475 path = snd_hda_get_path_from_idx(codec, path_idx);
1478 err = add_stereo_vol(codec, pfx, cidx, path);
1481 err = add_stereo_sw(codec, pfx, cidx, path);
1487 /* add playback controls for speaker and HP outputs */
1488 static int create_extra_outs(struct hda_codec *codec, int num_pins,
1489 const int *paths, const char *pfx)
1493 for (i = 0; i < num_pins; i++) {
1498 if (num_pins == 2 && i == 1 && !strcmp(pfx, "Speaker"))
1499 name = "Bass Speaker";
1500 else if (num_pins >= 3) {
1501 snprintf(tmp, sizeof(tmp), "%s %s",
1502 pfx, channel_name[i]);
1508 err = create_extra_out(codec, paths[i], name, idx);
1515 static int create_hp_out_ctls(struct hda_codec *codec)
1517 struct hda_gen_spec *spec = codec->spec;
1518 return create_extra_outs(codec, spec->autocfg.hp_outs,
1523 static int create_speaker_out_ctls(struct hda_codec *codec)
1525 struct hda_gen_spec *spec = codec->spec;
1526 return create_extra_outs(codec, spec->autocfg.speaker_outs,
1527 spec->speaker_paths,
1532 * independent HP controls
1535 static int indep_hp_info(struct snd_kcontrol *kcontrol,
1536 struct snd_ctl_elem_info *uinfo)
1538 return snd_hda_enum_bool_helper_info(kcontrol, uinfo);
1541 static int indep_hp_get(struct snd_kcontrol *kcontrol,
1542 struct snd_ctl_elem_value *ucontrol)
1544 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1545 struct hda_gen_spec *spec = codec->spec;
1546 ucontrol->value.enumerated.item[0] = spec->indep_hp_enabled;
1550 static int indep_hp_put(struct snd_kcontrol *kcontrol,
1551 struct snd_ctl_elem_value *ucontrol)
1553 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1554 struct hda_gen_spec *spec = codec->spec;
1555 unsigned int select = ucontrol->value.enumerated.item[0];
1558 mutex_lock(&spec->pcm_mutex);
1559 if (spec->active_streams) {
1564 if (spec->indep_hp_enabled != select) {
1565 spec->indep_hp_enabled = select;
1566 if (spec->indep_hp_enabled)
1567 spec->multiout.hp_out_nid[0] = 0;
1569 spec->multiout.hp_out_nid[0] = spec->alt_dac_nid;
1573 mutex_unlock(&spec->pcm_mutex);
1577 static const struct snd_kcontrol_new indep_hp_ctl = {
1578 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1579 .name = "Independent HP",
1580 .info = indep_hp_info,
1581 .get = indep_hp_get,
1582 .put = indep_hp_put,
1586 static int create_indep_hp_ctls(struct hda_codec *codec)
1588 struct hda_gen_spec *spec = codec->spec;
1590 if (!spec->indep_hp)
1592 if (!spec->multiout.hp_out_nid[0]) {
1597 spec->indep_hp_enabled = false;
1598 spec->alt_dac_nid = spec->multiout.hp_out_nid[0];
1599 if (!snd_hda_gen_add_kctl(spec, NULL, &indep_hp_ctl))
1605 * channel mode enum control
1608 static int ch_mode_info(struct snd_kcontrol *kcontrol,
1609 struct snd_ctl_elem_info *uinfo)
1611 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1612 struct hda_gen_spec *spec = codec->spec;
1614 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1616 uinfo->value.enumerated.items = spec->multi_ios + 1;
1617 if (uinfo->value.enumerated.item > spec->multi_ios)
1618 uinfo->value.enumerated.item = spec->multi_ios;
1619 sprintf(uinfo->value.enumerated.name, "%dch",
1620 (uinfo->value.enumerated.item + 1) * 2);
1624 static int ch_mode_get(struct snd_kcontrol *kcontrol,
1625 struct snd_ctl_elem_value *ucontrol)
1627 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1628 struct hda_gen_spec *spec = codec->spec;
1629 ucontrol->value.enumerated.item[0] = (spec->ext_channel_count - 1) / 2;
1633 static inline struct nid_path *
1634 get_multiio_path(struct hda_codec *codec, int idx)
1636 struct hda_gen_spec *spec = codec->spec;
1637 return snd_hda_get_path_from_idx(codec,
1638 spec->out_paths[spec->autocfg.line_outs + idx]);
1641 static int set_multi_io(struct hda_codec *codec, int idx, bool output)
1643 struct hda_gen_spec *spec = codec->spec;
1644 hda_nid_t nid = spec->multi_io[idx].pin;
1645 struct nid_path *path;
1647 path = get_multiio_path(codec, idx);
1651 if (path->active == output)
1655 snd_hda_set_pin_ctl_cache(codec, nid, PIN_OUT);
1656 snd_hda_activate_path(codec, path, true, true);
1657 set_pin_eapd(codec, nid, true);
1659 set_pin_eapd(codec, nid, false);
1660 snd_hda_activate_path(codec, path, false, true);
1661 snd_hda_set_pin_ctl_cache(codec, nid,
1662 spec->multi_io[idx].ctl_in);
1667 static int ch_mode_put(struct snd_kcontrol *kcontrol,
1668 struct snd_ctl_elem_value *ucontrol)
1670 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1671 struct hda_gen_spec *spec = codec->spec;
1674 ch = ucontrol->value.enumerated.item[0];
1675 if (ch < 0 || ch > spec->multi_ios)
1677 if (ch == (spec->ext_channel_count - 1) / 2)
1679 spec->ext_channel_count = (ch + 1) * 2;
1680 for (i = 0; i < spec->multi_ios; i++)
1681 set_multi_io(codec, i, i < ch);
1682 spec->multiout.max_channels = max(spec->ext_channel_count,
1683 spec->const_channel_count);
1684 if (spec->need_dac_fix)
1685 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
1689 static const struct snd_kcontrol_new channel_mode_enum = {
1690 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1691 .name = "Channel Mode",
1692 .info = ch_mode_info,
1697 static int create_multi_channel_mode(struct hda_codec *codec)
1699 struct hda_gen_spec *spec = codec->spec;
1701 if (spec->multi_ios > 0) {
1702 if (!snd_hda_gen_add_kctl(spec, NULL, &channel_mode_enum))
1709 * aamix loopback enable/disable switch
1712 #define loopback_mixing_info indep_hp_info
1714 static int loopback_mixing_get(struct snd_kcontrol *kcontrol,
1715 struct snd_ctl_elem_value *ucontrol)
1717 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1718 struct hda_gen_spec *spec = codec->spec;
1719 ucontrol->value.enumerated.item[0] = spec->aamix_mode;
1723 static void update_aamix_paths(struct hda_codec *codec, bool do_mix,
1724 int nomix_path_idx, int mix_path_idx)
1726 struct nid_path *nomix_path, *mix_path;
1728 nomix_path = snd_hda_get_path_from_idx(codec, nomix_path_idx);
1729 mix_path = snd_hda_get_path_from_idx(codec, mix_path_idx);
1730 if (!nomix_path || !mix_path)
1733 snd_hda_activate_path(codec, nomix_path, false, true);
1734 snd_hda_activate_path(codec, mix_path, true, true);
1736 snd_hda_activate_path(codec, mix_path, false, true);
1737 snd_hda_activate_path(codec, nomix_path, true, true);
1741 static int loopback_mixing_put(struct snd_kcontrol *kcontrol,
1742 struct snd_ctl_elem_value *ucontrol)
1744 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1745 struct hda_gen_spec *spec = codec->spec;
1746 unsigned int val = ucontrol->value.enumerated.item[0];
1748 if (val == spec->aamix_mode)
1750 spec->aamix_mode = val;
1751 update_aamix_paths(codec, val, spec->out_paths[0],
1752 spec->aamix_out_paths[0]);
1753 update_aamix_paths(codec, val, spec->hp_paths[0],
1754 spec->aamix_out_paths[1]);
1755 update_aamix_paths(codec, val, spec->speaker_paths[0],
1756 spec->aamix_out_paths[2]);
1760 static const struct snd_kcontrol_new loopback_mixing_enum = {
1761 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1762 .name = "Loopback Mixing",
1763 .info = loopback_mixing_info,
1764 .get = loopback_mixing_get,
1765 .put = loopback_mixing_put,
1768 static int create_loopback_mixing_ctl(struct hda_codec *codec)
1770 struct hda_gen_spec *spec = codec->spec;
1772 if (!spec->mixer_nid)
1774 if (!(spec->aamix_out_paths[0] || spec->aamix_out_paths[1] ||
1775 spec->aamix_out_paths[2]))
1777 if (!snd_hda_gen_add_kctl(spec, NULL, &loopback_mixing_enum))
1783 * shared headphone/mic handling
1786 static void call_update_outputs(struct hda_codec *codec);
1788 /* for shared I/O, change the pin-control accordingly */
1789 static void update_shared_mic_hp(struct hda_codec *codec, bool set_as_mic)
1791 struct hda_gen_spec *spec = codec->spec;
1793 hda_nid_t pin = spec->autocfg.inputs[1].pin;
1794 /* NOTE: this assumes that there are only two inputs, the
1795 * first is the real internal mic and the second is HP/mic jack.
1798 val = snd_hda_get_default_vref(codec, pin);
1800 /* This pin does not have vref caps - let's enable vref on pin 0x18
1801 instead, as suggested by Realtek */
1802 if (val == AC_PINCTL_VREF_HIZ && spec->shared_mic_vref_pin) {
1803 const hda_nid_t vref_pin = spec->shared_mic_vref_pin;
1804 unsigned int vref_val = snd_hda_get_default_vref(codec, vref_pin);
1805 if (vref_val != AC_PINCTL_VREF_HIZ)
1806 snd_hda_set_pin_ctl_cache(codec, vref_pin,
1807 PIN_IN | (set_as_mic ? vref_val : 0));
1810 val = set_as_mic ? val | PIN_IN : PIN_HP;
1811 snd_hda_set_pin_ctl_cache(codec, pin, val);
1813 spec->automute_speaker = !set_as_mic;
1814 call_update_outputs(codec);
1817 /* create a shared input with the headphone out */
1818 static int create_shared_input(struct hda_codec *codec)
1820 struct hda_gen_spec *spec = codec->spec;
1821 struct auto_pin_cfg *cfg = &spec->autocfg;
1822 unsigned int defcfg;
1825 /* only one internal input pin? */
1826 if (cfg->num_inputs != 1)
1828 defcfg = snd_hda_codec_get_pincfg(codec, cfg->inputs[0].pin);
1829 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
1832 if (cfg->hp_outs == 1 && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
1833 nid = cfg->hp_pins[0]; /* OK, we have a single HP-out */
1834 else if (cfg->line_outs == 1 && cfg->line_out_type == AUTO_PIN_HP_OUT)
1835 nid = cfg->line_out_pins[0]; /* OK, we have a single line-out */
1837 return 0; /* both not available */
1839 if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_IN))
1840 return 0; /* no input */
1842 cfg->inputs[1].pin = nid;
1843 cfg->inputs[1].type = AUTO_PIN_MIC;
1844 cfg->num_inputs = 2;
1845 spec->shared_mic_hp = 1;
1846 snd_printdd("hda-codec: Enable shared I/O jack on NID 0x%x\n", nid);
1856 /* add the powersave loopback-list entry */
1857 static void add_loopback_list(struct hda_gen_spec *spec, hda_nid_t mix, int idx)
1859 struct hda_amp_list *list;
1861 if (spec->num_loopbacks >= ARRAY_SIZE(spec->loopback_list) - 1)
1863 list = spec->loopback_list + spec->num_loopbacks;
1865 list->dir = HDA_INPUT;
1867 spec->num_loopbacks++;
1868 spec->loopback.amplist = spec->loopback_list;
1871 #define add_loopback_list(spec, mix, idx) /* NOP */
1874 /* create input playback/capture controls for the given pin */
1875 static int new_analog_input(struct hda_codec *codec, int input_idx,
1876 hda_nid_t pin, const char *ctlname, int ctlidx,
1879 struct hda_gen_spec *spec = codec->spec;
1880 struct nid_path *path;
1884 if (!nid_has_volume(codec, mix_nid, HDA_INPUT) &&
1885 !nid_has_mute(codec, mix_nid, HDA_INPUT))
1886 return 0; /* no need for analog loopback */
1888 path = snd_hda_add_new_path(codec, pin, mix_nid, HDA_PARSE_ALL);
1891 print_nid_path("loopback", path);
1892 spec->loopback_paths[input_idx] = snd_hda_get_path_idx(codec, path);
1894 idx = path->idx[path->depth - 1];
1895 if (nid_has_volume(codec, mix_nid, HDA_INPUT)) {
1896 val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
1897 err = __add_pb_vol_ctrl(spec, HDA_CTL_WIDGET_VOL, ctlname, ctlidx, val);
1900 path->ctls[NID_PATH_VOL_CTL] = val;
1903 if (nid_has_mute(codec, mix_nid, HDA_INPUT)) {
1904 val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
1905 err = __add_pb_sw_ctrl(spec, HDA_CTL_WIDGET_MUTE, ctlname, ctlidx, val);
1908 path->ctls[NID_PATH_MUTE_CTL] = val;
1911 path->active = true;
1912 add_loopback_list(spec, mix_nid, idx);
1916 static int is_input_pin(struct hda_codec *codec, hda_nid_t nid)
1918 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
1919 return (pincap & AC_PINCAP_IN) != 0;
1922 /* Parse the codec tree and retrieve ADCs */
1923 static int fill_adc_nids(struct hda_codec *codec)
1925 struct hda_gen_spec *spec = codec->spec;
1927 hda_nid_t *adc_nids = spec->adc_nids;
1928 int max_nums = ARRAY_SIZE(spec->adc_nids);
1931 nid = codec->start_nid;
1932 for (i = 0; i < codec->num_nodes; i++, nid++) {
1933 unsigned int caps = get_wcaps(codec, nid);
1934 int type = get_wcaps_type(caps);
1936 if (type != AC_WID_AUD_IN || (caps & AC_WCAP_DIGITAL))
1938 adc_nids[nums] = nid;
1939 if (++nums >= max_nums)
1942 spec->num_adc_nids = nums;
1946 /* filter out invalid adc_nids that don't give all active input pins;
1947 * if needed, check whether dynamic ADC-switching is available
1949 static int check_dyn_adc_switch(struct hda_codec *codec)
1951 struct hda_gen_spec *spec = codec->spec;
1952 struct hda_input_mux *imux = &spec->input_mux;
1953 hda_nid_t adc_nids[ARRAY_SIZE(spec->adc_nids)];
1959 for (n = 0; n < spec->num_adc_nids; n++) {
1960 adc = spec->adc_nids[n];
1961 for (i = 0; i < imux->num_items; i++) {
1962 pin = spec->imux_pins[i];
1963 if (!is_reachable_path(codec, pin, adc))
1966 if (i >= imux->num_items)
1967 adc_nids[nums++] = adc;
1971 if (spec->shared_mic_hp) {
1972 spec->shared_mic_hp = 0;
1973 imux->num_items = 1;
1977 /* check whether ADC-switch is possible */
1978 for (i = 0; i < imux->num_items; i++) {
1979 pin = spec->imux_pins[i];
1980 for (n = 0; n < spec->num_adc_nids; n++) {
1981 adc = spec->adc_nids[n];
1982 if (is_reachable_path(codec, pin, adc)) {
1983 spec->dyn_adc_idx[i] = n;
1989 snd_printdd("hda-codec: enabling ADC switching\n");
1990 spec->dyn_adc_switch = 1;
1991 } else if (nums != spec->num_adc_nids) {
1992 memcpy(spec->adc_nids, adc_nids, nums * sizeof(hda_nid_t));
1993 spec->num_adc_nids = nums;
1996 if (imux->num_items == 1 || spec->shared_mic_hp) {
1997 snd_printdd("hda-codec: reducing to a single ADC\n");
1998 spec->num_adc_nids = 1; /* reduce to a single ADC */
2001 /* single index for individual volumes ctls */
2002 if (!spec->dyn_adc_switch && spec->multi_cap_vol)
2003 spec->num_adc_nids = 1;
2009 * create playback/capture controls for input pins
2011 static int create_input_ctls(struct hda_codec *codec)
2013 struct hda_gen_spec *spec = codec->spec;
2014 const struct auto_pin_cfg *cfg = &spec->autocfg;
2015 hda_nid_t mixer = spec->mixer_nid;
2016 struct hda_input_mux *imux = &spec->input_mux;
2018 int i, c, err, type_idx = 0;
2019 const char *prev_label = NULL;
2021 num_adcs = fill_adc_nids(codec);
2025 for (i = 0; i < cfg->num_inputs; i++) {
2030 pin = cfg->inputs[i].pin;
2031 if (!is_input_pin(codec, pin))
2034 label = hda_get_autocfg_input_label(codec, cfg, i);
2035 if (spec->shared_mic_hp && !strcmp(label, "Misc"))
2036 label = "Headphone Mic";
2037 if (prev_label && !strcmp(label, prev_label))
2044 if (is_reachable_path(codec, pin, mixer)) {
2045 err = new_analog_input(codec, i, pin,
2046 label, type_idx, mixer);
2053 for (c = 0; c < num_adcs; c++) {
2054 struct nid_path *path;
2055 hda_nid_t adc = spec->adc_nids[c];
2057 if (!is_reachable_path(codec, pin, adc))
2059 path = snd_array_new(&spec->paths);
2062 memset(path, 0, sizeof(*path));
2063 if (!snd_hda_parse_nid_path(codec, pin, adc, HDA_PARSE_ALL, path)) {
2065 "invalid input path 0x%x -> 0x%x\n",
2070 print_nid_path("input", path);
2073 spec->imux_pins[imux->num_items] = pin;
2074 snd_hda_add_imux_item(imux, label,
2075 imux->num_items, NULL);
2089 /* get the ADC NID corresponding to the given index */
2090 static hda_nid_t get_adc_nid(struct hda_codec *codec, int adc_idx, int imux_idx)
2092 struct hda_gen_spec *spec = codec->spec;
2093 if (spec->dyn_adc_switch)
2094 adc_idx = spec->dyn_adc_idx[imux_idx];
2095 return spec->adc_nids[adc_idx];
2098 static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
2101 static int mux_enum_info(struct snd_kcontrol *kcontrol,
2102 struct snd_ctl_elem_info *uinfo)
2104 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2105 struct hda_gen_spec *spec = codec->spec;
2106 return snd_hda_input_mux_info(&spec->input_mux, uinfo);
2109 static int mux_enum_get(struct snd_kcontrol *kcontrol,
2110 struct snd_ctl_elem_value *ucontrol)
2112 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2113 struct hda_gen_spec *spec = codec->spec;
2114 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2116 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
2120 static int mux_enum_put(struct snd_kcontrol *kcontrol,
2121 struct snd_ctl_elem_value *ucontrol)
2123 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2124 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2125 return mux_select(codec, adc_idx,
2126 ucontrol->value.enumerated.item[0]);
2129 static const struct snd_kcontrol_new cap_src_temp = {
2130 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2131 .name = "Input Source",
2132 .info = mux_enum_info,
2133 .get = mux_enum_get,
2134 .put = mux_enum_put,
2138 * capture volume and capture switch ctls
2141 typedef int (*put_call_t)(struct snd_kcontrol *kcontrol,
2142 struct snd_ctl_elem_value *ucontrol);
2144 /* call the given amp update function for all amps in the imux list at once */
2145 static int cap_put_caller(struct snd_kcontrol *kcontrol,
2146 struct snd_ctl_elem_value *ucontrol,
2147 put_call_t func, int type)
2149 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2150 struct hda_gen_spec *spec = codec->spec;
2151 const struct hda_input_mux *imux;
2152 struct nid_path *path;
2153 int i, adc_idx, err = 0;
2155 imux = &spec->input_mux;
2156 adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2157 mutex_lock(&codec->control_mutex);
2158 /* we use the cache-only update at first since multiple input paths
2159 * may shared the same amp; by updating only caches, the redundant
2160 * writes to hardware can be reduced.
2162 codec->cached_write = 1;
2163 for (i = 0; i < imux->num_items; i++) {
2164 path = snd_hda_get_nid_path(codec, spec->imux_pins[i],
2165 get_adc_nid(codec, adc_idx, i));
2166 if (!path->ctls[type])
2168 kcontrol->private_value = path->ctls[type];
2169 err = func(kcontrol, ucontrol);
2174 codec->cached_write = 0;
2175 mutex_unlock(&codec->control_mutex);
2176 snd_hda_codec_flush_amp_cache(codec); /* flush the updates */
2177 if (err >= 0 && spec->cap_sync_hook)
2178 spec->cap_sync_hook(codec);
2182 /* capture volume ctl callbacks */
2183 #define cap_vol_info snd_hda_mixer_amp_volume_info
2184 #define cap_vol_get snd_hda_mixer_amp_volume_get
2185 #define cap_vol_tlv snd_hda_mixer_amp_tlv
2187 static int cap_vol_put(struct snd_kcontrol *kcontrol,
2188 struct snd_ctl_elem_value *ucontrol)
2190 return cap_put_caller(kcontrol, ucontrol,
2191 snd_hda_mixer_amp_volume_put,
2195 static const struct snd_kcontrol_new cap_vol_temp = {
2196 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2197 .name = "Capture Volume",
2198 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
2199 SNDRV_CTL_ELEM_ACCESS_TLV_READ |
2200 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK),
2201 .info = cap_vol_info,
2204 .tlv = { .c = cap_vol_tlv },
2207 /* capture switch ctl callbacks */
2208 #define cap_sw_info snd_ctl_boolean_stereo_info
2209 #define cap_sw_get snd_hda_mixer_amp_switch_get
2211 static int cap_sw_put(struct snd_kcontrol *kcontrol,
2212 struct snd_ctl_elem_value *ucontrol)
2214 return cap_put_caller(kcontrol, ucontrol,
2215 snd_hda_mixer_amp_switch_put,
2219 static const struct snd_kcontrol_new cap_sw_temp = {
2220 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2221 .name = "Capture Switch",
2222 .info = cap_sw_info,
2227 static int parse_capvol_in_path(struct hda_codec *codec, struct nid_path *path)
2232 path->ctls[NID_PATH_VOL_CTL] = path->ctls[NID_PATH_MUTE_CTL] = 0;
2233 for (depth = 0; depth < 3; depth++) {
2234 if (depth >= path->depth)
2236 i = path->depth - depth - 1;
2237 nid = path->path[i];
2238 if (!path->ctls[NID_PATH_VOL_CTL]) {
2239 if (nid_has_volume(codec, nid, HDA_OUTPUT))
2240 path->ctls[NID_PATH_VOL_CTL] =
2241 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
2242 else if (nid_has_volume(codec, nid, HDA_INPUT)) {
2243 int idx = path->idx[i];
2244 if (!depth && codec->single_adc_amp)
2246 path->ctls[NID_PATH_VOL_CTL] =
2247 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
2250 if (!path->ctls[NID_PATH_MUTE_CTL]) {
2251 if (nid_has_mute(codec, nid, HDA_OUTPUT))
2252 path->ctls[NID_PATH_MUTE_CTL] =
2253 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
2254 else if (nid_has_mute(codec, nid, HDA_INPUT)) {
2255 int idx = path->idx[i];
2256 if (!depth && codec->single_adc_amp)
2258 path->ctls[NID_PATH_MUTE_CTL] =
2259 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
2266 static bool is_inv_dmic_pin(struct hda_codec *codec, hda_nid_t nid)
2268 struct hda_gen_spec *spec = codec->spec;
2269 struct auto_pin_cfg *cfg = &spec->autocfg;
2273 if (!spec->inv_dmic_split)
2275 for (i = 0; i < cfg->num_inputs; i++) {
2276 if (cfg->inputs[i].pin != nid)
2278 if (cfg->inputs[i].type != AUTO_PIN_MIC)
2280 val = snd_hda_codec_get_pincfg(codec, nid);
2281 return snd_hda_get_input_pin_attr(val) == INPUT_PIN_ATTR_INT;
2286 static int add_single_cap_ctl(struct hda_codec *codec, const char *label,
2287 int idx, bool is_switch, unsigned int ctl,
2290 struct hda_gen_spec *spec = codec->spec;
2292 int type = is_switch ? HDA_CTL_WIDGET_MUTE : HDA_CTL_WIDGET_VOL;
2293 const char *sfx = is_switch ? "Switch" : "Volume";
2294 unsigned int chs = inv_dmic ? 1 : 3;
2301 snprintf(tmpname, sizeof(tmpname),
2302 "%s Capture %s", label, sfx);
2304 snprintf(tmpname, sizeof(tmpname),
2306 err = add_control(spec, type, tmpname, idx,
2307 amp_val_replace_channels(ctl, chs));
2308 if (err < 0 || !inv_dmic)
2311 /* Make independent right kcontrol */
2313 snprintf(tmpname, sizeof(tmpname),
2314 "Inverted %s Capture %s", label, sfx);
2316 snprintf(tmpname, sizeof(tmpname),
2317 "Inverted Capture %s", sfx);
2318 return add_control(spec, type, tmpname, idx,
2319 amp_val_replace_channels(ctl, 2));
2322 /* create single (and simple) capture volume and switch controls */
2323 static int create_single_cap_vol_ctl(struct hda_codec *codec, int idx,
2324 unsigned int vol_ctl, unsigned int sw_ctl,
2328 err = add_single_cap_ctl(codec, NULL, idx, false, vol_ctl, inv_dmic);
2331 err = add_single_cap_ctl(codec, NULL, idx, true, sw_ctl, inv_dmic);
2337 /* create bound capture volume and switch controls */
2338 static int create_bind_cap_vol_ctl(struct hda_codec *codec, int idx,
2339 unsigned int vol_ctl, unsigned int sw_ctl)
2341 struct hda_gen_spec *spec = codec->spec;
2342 struct snd_kcontrol_new *knew;
2345 knew = snd_hda_gen_add_kctl(spec, NULL, &cap_vol_temp);
2349 knew->private_value = vol_ctl;
2350 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2353 knew = snd_hda_gen_add_kctl(spec, NULL, &cap_sw_temp);
2357 knew->private_value = sw_ctl;
2358 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2363 /* return the vol ctl when used first in the imux list */
2364 static unsigned int get_first_cap_ctl(struct hda_codec *codec, int idx, int type)
2366 struct hda_gen_spec *spec = codec->spec;
2367 struct nid_path *path;
2371 path = snd_hda_get_nid_path(codec, spec->imux_pins[idx],
2372 get_adc_nid(codec, 0, idx));
2375 ctl = path->ctls[type];
2378 for (i = 0; i < idx - 1; i++) {
2379 path = snd_hda_get_nid_path(codec, spec->imux_pins[i],
2380 get_adc_nid(codec, 0, i));
2381 if (path && path->ctls[type] == ctl)
2387 /* create individual capture volume and switch controls per input */
2388 static int create_multi_cap_vol_ctl(struct hda_codec *codec)
2390 struct hda_gen_spec *spec = codec->spec;
2391 struct hda_input_mux *imux = &spec->input_mux;
2392 int i, err, type, type_idx = 0;
2393 const char *prev_label = NULL;
2395 for (i = 0; i < imux->num_items; i++) {
2398 label = hda_get_autocfg_input_label(codec, &spec->autocfg, i);
2399 if (prev_label && !strcmp(label, prev_label))
2404 inv_dmic = is_inv_dmic_pin(codec, spec->imux_pins[i]);
2406 for (type = 0; type < 2; type++) {
2407 err = add_single_cap_ctl(codec, label, type_idx, type,
2408 get_first_cap_ctl(codec, i, type),
2417 static int create_capture_mixers(struct hda_codec *codec)
2419 struct hda_gen_spec *spec = codec->spec;
2420 struct hda_input_mux *imux = &spec->input_mux;
2421 int i, n, nums, err;
2423 if (spec->dyn_adc_switch)
2426 nums = spec->num_adc_nids;
2428 if (!spec->auto_mic && imux->num_items > 1) {
2429 struct snd_kcontrol_new *knew;
2431 name = nums > 1 ? "Input Source" : "Capture Source";
2432 knew = snd_hda_gen_add_kctl(spec, name, &cap_src_temp);
2438 for (n = 0; n < nums; n++) {
2440 bool inv_dmic = false;
2444 for (i = 0; i < imux->num_items; i++) {
2445 struct nid_path *path;
2446 path = snd_hda_get_nid_path(codec, spec->imux_pins[i],
2447 get_adc_nid(codec, n, i));
2450 parse_capvol_in_path(codec, path);
2452 vol = path->ctls[NID_PATH_VOL_CTL];
2453 else if (vol != path->ctls[NID_PATH_VOL_CTL])
2456 sw = path->ctls[NID_PATH_MUTE_CTL];
2457 else if (sw != path->ctls[NID_PATH_MUTE_CTL])
2459 if (is_inv_dmic_pin(codec, spec->imux_pins[i]))
2464 err = create_single_cap_vol_ctl(codec, n, vol, sw,
2466 else if (!spec->multi_cap_vol)
2467 err = create_bind_cap_vol_ctl(codec, n, vol, sw);
2469 err = create_multi_cap_vol_ctl(codec);
2478 * add mic boosts if needed
2480 static int parse_mic_boost(struct hda_codec *codec)
2482 struct hda_gen_spec *spec = codec->spec;
2483 struct auto_pin_cfg *cfg = &spec->autocfg;
2487 const char *prev_label = NULL;
2489 for (i = 0; i < cfg->num_inputs; i++) {
2490 if (cfg->inputs[i].type > AUTO_PIN_MIC)
2492 nid = cfg->inputs[i].pin;
2493 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) {
2495 char boost_label[44];
2496 struct nid_path *path;
2499 label = hda_get_autocfg_input_label(codec, cfg, i);
2500 if (spec->shared_mic_hp && !strcmp(label, "Misc"))
2501 label = "Headphone Mic";
2502 if (prev_label && !strcmp(label, prev_label))
2508 snprintf(boost_label, sizeof(boost_label),
2509 "%s Boost Volume", label);
2510 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT);
2511 err = add_control(spec, HDA_CTL_WIDGET_VOL,
2512 boost_label, type_idx, val);
2516 path = snd_hda_get_nid_path(codec, nid, 0);
2518 path->ctls[NID_PATH_BOOST_CTL] = val;
2525 * parse digital I/Os and set up NIDs in BIOS auto-parse mode
2527 static void parse_digital(struct hda_codec *codec)
2529 struct hda_gen_spec *spec = codec->spec;
2530 struct nid_path *path;
2534 /* support multiple SPDIFs; the secondary is set up as a slave */
2536 for (i = 0; i < spec->autocfg.dig_outs; i++) {
2537 hda_nid_t pin = spec->autocfg.dig_out_pins[i];
2538 dig_nid = look_for_dac(codec, pin, true);
2541 path = snd_hda_add_new_path(codec, dig_nid, pin, HDA_PARSE_ALL);
2544 print_nid_path("digout", path);
2545 path->active = true;
2546 spec->digout_paths[i] = snd_hda_get_path_idx(codec, path);
2548 spec->multiout.dig_out_nid = dig_nid;
2549 spec->dig_out_type = spec->autocfg.dig_out_type[0];
2551 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
2552 if (nums >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
2554 spec->slave_dig_outs[nums - 1] = dig_nid;
2559 if (spec->autocfg.dig_in_pin) {
2560 dig_nid = codec->start_nid;
2561 for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
2562 unsigned int wcaps = get_wcaps(codec, dig_nid);
2563 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
2565 if (!(wcaps & AC_WCAP_DIGITAL))
2567 path = snd_hda_add_new_path(codec,
2568 spec->autocfg.dig_in_pin,
2569 dig_nid, HDA_PARSE_ALL);
2571 print_nid_path("digin", path);
2572 path->active = true;
2573 spec->dig_in_nid = dig_nid;
2574 spec->digin_path = snd_hda_get_path_idx(codec, path);
2583 * input MUX handling
2586 static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur);
2588 /* select the given imux item; either unmute exclusively or select the route */
2589 static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
2592 struct hda_gen_spec *spec = codec->spec;
2593 const struct hda_input_mux *imux;
2594 struct nid_path *path;
2596 imux = &spec->input_mux;
2597 if (!imux->num_items)
2600 if (idx >= imux->num_items)
2601 idx = imux->num_items - 1;
2602 if (spec->cur_mux[adc_idx] == idx)
2605 path = snd_hda_get_nid_path(codec,
2606 spec->imux_pins[spec->cur_mux[adc_idx]],
2607 spec->adc_nids[adc_idx]);
2611 snd_hda_activate_path(codec, path, false, false);
2613 spec->cur_mux[adc_idx] = idx;
2615 if (spec->shared_mic_hp)
2616 update_shared_mic_hp(codec, spec->cur_mux[adc_idx]);
2618 if (spec->dyn_adc_switch)
2619 dyn_adc_pcm_resetup(codec, idx);
2621 path = snd_hda_get_nid_path(codec, spec->imux_pins[idx],
2622 get_adc_nid(codec, adc_idx, idx));
2627 snd_hda_activate_path(codec, path, true, false);
2628 if (spec->cap_sync_hook)
2629 spec->cap_sync_hook(codec);
2635 * Jack detections for HP auto-mute and mic-switch
2638 /* check each pin in the given array; returns true if any of them is plugged */
2639 static bool detect_jacks(struct hda_codec *codec, int num_pins, hda_nid_t *pins)
2643 for (i = 0; i < num_pins; i++) {
2644 hda_nid_t nid = pins[i];
2647 present |= snd_hda_jack_detect(codec, nid);
2652 /* standard HP/line-out auto-mute helper */
2653 static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins,
2654 bool mute, bool hp_out)
2656 struct hda_gen_spec *spec = codec->spec;
2657 unsigned int pin_bits = mute ? 0 : (hp_out ? PIN_HP : PIN_OUT);
2660 for (i = 0; i < num_pins; i++) {
2661 hda_nid_t nid = pins[i];
2665 /* don't reset VREF value in case it's controlling
2666 * the amp (see alc861_fixup_asus_amp_vref_0f())
2668 if (spec->keep_vref_in_automute) {
2669 val = snd_hda_codec_read(codec, nid, 0,
2670 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
2675 snd_hda_set_pin_ctl_cache(codec, nid, val);
2676 set_pin_eapd(codec, nid, !mute);
2680 /* Toggle outputs muting */
2681 void snd_hda_gen_update_outputs(struct hda_codec *codec)
2683 struct hda_gen_spec *spec = codec->spec;
2686 /* Control HP pins/amps depending on master_mute state;
2687 * in general, HP pins/amps control should be enabled in all cases,
2688 * but currently set only for master_mute, just to be safe
2690 if (!spec->shared_mic_hp) /* don't change HP-pin when shared with mic */
2691 do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
2692 spec->autocfg.hp_pins, spec->master_mute, true);
2694 if (!spec->automute_speaker)
2697 on = spec->hp_jack_present | spec->line_jack_present;
2698 on |= spec->master_mute;
2699 do_automute(codec, ARRAY_SIZE(spec->autocfg.speaker_pins),
2700 spec->autocfg.speaker_pins, on, false);
2702 /* toggle line-out mutes if needed, too */
2703 /* if LO is a copy of either HP or Speaker, don't need to handle it */
2704 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0] ||
2705 spec->autocfg.line_out_pins[0] == spec->autocfg.speaker_pins[0])
2707 if (!spec->automute_lo)
2710 on = spec->hp_jack_present;
2711 on |= spec->master_mute;
2712 do_automute(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
2713 spec->autocfg.line_out_pins, on, false);
2715 EXPORT_SYMBOL_HDA(snd_hda_gen_update_outputs);
2717 static void call_update_outputs(struct hda_codec *codec)
2719 struct hda_gen_spec *spec = codec->spec;
2720 if (spec->automute_hook)
2721 spec->automute_hook(codec);
2723 snd_hda_gen_update_outputs(codec);
2726 /* standard HP-automute helper */
2727 void snd_hda_gen_hp_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)
2729 struct hda_gen_spec *spec = codec->spec;
2731 spec->hp_jack_present =
2732 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
2733 spec->autocfg.hp_pins);
2734 if (!spec->detect_hp || (!spec->automute_speaker && !spec->automute_lo))
2736 call_update_outputs(codec);
2738 EXPORT_SYMBOL_HDA(snd_hda_gen_hp_automute);
2740 /* standard line-out-automute helper */
2741 void snd_hda_gen_line_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)
2743 struct hda_gen_spec *spec = codec->spec;
2745 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
2747 /* check LO jack only when it's different from HP */
2748 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0])
2751 spec->line_jack_present =
2752 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
2753 spec->autocfg.line_out_pins);
2754 if (!spec->automute_speaker || !spec->detect_lo)
2756 call_update_outputs(codec);
2758 EXPORT_SYMBOL_HDA(snd_hda_gen_line_automute);
2760 /* standard mic auto-switch helper */
2761 void snd_hda_gen_mic_autoswitch(struct hda_codec *codec, struct hda_jack_tbl *jack)
2763 struct hda_gen_spec *spec = codec->spec;
2766 if (!spec->auto_mic)
2769 for (i = spec->am_num_entries - 1; i > 0; i--) {
2770 if (snd_hda_jack_detect(codec, spec->am_entry[i].pin)) {
2771 mux_select(codec, 0, spec->am_entry[i].idx);
2775 mux_select(codec, 0, spec->am_entry[0].idx);
2777 EXPORT_SYMBOL_HDA(snd_hda_gen_mic_autoswitch);
2780 * Auto-Mute mode mixer enum support
2782 static int automute_mode_info(struct snd_kcontrol *kcontrol,
2783 struct snd_ctl_elem_info *uinfo)
2785 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2786 struct hda_gen_spec *spec = codec->spec;
2787 static const char * const texts3[] = {
2788 "Disabled", "Speaker Only", "Line Out+Speaker"
2791 if (spec->automute_speaker_possible && spec->automute_lo_possible)
2792 return snd_hda_enum_helper_info(kcontrol, uinfo, 3, texts3);
2793 return snd_hda_enum_bool_helper_info(kcontrol, uinfo);
2796 static int automute_mode_get(struct snd_kcontrol *kcontrol,
2797 struct snd_ctl_elem_value *ucontrol)
2799 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2800 struct hda_gen_spec *spec = codec->spec;
2801 unsigned int val = 0;
2802 if (spec->automute_speaker)
2804 if (spec->automute_lo)
2807 ucontrol->value.enumerated.item[0] = val;
2811 static int automute_mode_put(struct snd_kcontrol *kcontrol,
2812 struct snd_ctl_elem_value *ucontrol)
2814 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2815 struct hda_gen_spec *spec = codec->spec;
2817 switch (ucontrol->value.enumerated.item[0]) {
2819 if (!spec->automute_speaker && !spec->automute_lo)
2821 spec->automute_speaker = 0;
2822 spec->automute_lo = 0;
2825 if (spec->automute_speaker_possible) {
2826 if (!spec->automute_lo && spec->automute_speaker)
2828 spec->automute_speaker = 1;
2829 spec->automute_lo = 0;
2830 } else if (spec->automute_lo_possible) {
2831 if (spec->automute_lo)
2833 spec->automute_lo = 1;
2838 if (!spec->automute_lo_possible || !spec->automute_speaker_possible)
2840 if (spec->automute_speaker && spec->automute_lo)
2842 spec->automute_speaker = 1;
2843 spec->automute_lo = 1;
2848 call_update_outputs(codec);
2852 static const struct snd_kcontrol_new automute_mode_enum = {
2853 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2854 .name = "Auto-Mute Mode",
2855 .info = automute_mode_info,
2856 .get = automute_mode_get,
2857 .put = automute_mode_put,
2860 static int add_automute_mode_enum(struct hda_codec *codec)
2862 struct hda_gen_spec *spec = codec->spec;
2864 if (!snd_hda_gen_add_kctl(spec, NULL, &automute_mode_enum))
2870 * Check the availability of HP/line-out auto-mute;
2871 * Set up appropriately if really supported
2873 static int check_auto_mute_availability(struct hda_codec *codec)
2875 struct hda_gen_spec *spec = codec->spec;
2876 struct auto_pin_cfg *cfg = &spec->autocfg;
2880 if (cfg->hp_pins[0])
2882 if (cfg->line_out_pins[0])
2884 if (cfg->speaker_pins[0])
2886 if (present < 2) /* need two different output types */
2889 if (!cfg->speaker_pins[0] &&
2890 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
2891 memcpy(cfg->speaker_pins, cfg->line_out_pins,
2892 sizeof(cfg->speaker_pins));
2893 cfg->speaker_outs = cfg->line_outs;
2896 if (!cfg->hp_pins[0] &&
2897 cfg->line_out_type == AUTO_PIN_HP_OUT) {
2898 memcpy(cfg->hp_pins, cfg->line_out_pins,
2899 sizeof(cfg->hp_pins));
2900 cfg->hp_outs = cfg->line_outs;
2903 for (i = 0; i < cfg->hp_outs; i++) {
2904 hda_nid_t nid = cfg->hp_pins[i];
2905 if (!is_jack_detectable(codec, nid))
2907 snd_printdd("hda-codec: Enable HP auto-muting on NID 0x%x\n",
2909 snd_hda_jack_detect_enable_callback(codec, nid, HDA_GEN_HP_EVENT,
2910 spec->hp_automute_hook ?
2911 spec->hp_automute_hook :
2912 snd_hda_gen_hp_automute);
2913 spec->detect_hp = 1;
2916 if (cfg->line_out_type == AUTO_PIN_LINE_OUT && cfg->line_outs) {
2917 if (cfg->speaker_outs)
2918 for (i = 0; i < cfg->line_outs; i++) {
2919 hda_nid_t nid = cfg->line_out_pins[i];
2920 if (!is_jack_detectable(codec, nid))
2922 snd_printdd("hda-codec: Enable Line-Out auto-muting on NID 0x%x\n", nid);
2923 snd_hda_jack_detect_enable_callback(codec, nid,
2924 HDA_GEN_FRONT_EVENT,
2925 spec->line_automute_hook ?
2926 spec->line_automute_hook :
2927 snd_hda_gen_line_automute);
2928 spec->detect_lo = 1;
2930 spec->automute_lo_possible = spec->detect_hp;
2933 spec->automute_speaker_possible = cfg->speaker_outs &&
2934 (spec->detect_hp || spec->detect_lo);
2936 spec->automute_lo = spec->automute_lo_possible;
2937 spec->automute_speaker = spec->automute_speaker_possible;
2939 if (spec->automute_speaker_possible || spec->automute_lo_possible) {
2940 /* create a control for automute mode */
2941 err = add_automute_mode_enum(codec);
2948 /* return the position of NID in the list, or -1 if not found */
2949 static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
2952 for (i = 0; i < nums; i++)
2958 /* check whether all auto-mic pins are valid; setup indices if OK */
2959 static bool auto_mic_check_imux(struct hda_codec *codec)
2961 struct hda_gen_spec *spec = codec->spec;
2962 const struct hda_input_mux *imux;
2965 imux = &spec->input_mux;
2966 for (i = 0; i < spec->am_num_entries; i++) {
2967 spec->am_entry[i].idx =
2968 find_idx_in_nid_list(spec->am_entry[i].pin,
2969 spec->imux_pins, imux->num_items);
2970 if (spec->am_entry[i].idx < 0)
2971 return false; /* no corresponding imux */
2974 /* we don't need the jack detection for the first pin */
2975 for (i = 1; i < spec->am_num_entries; i++)
2976 snd_hda_jack_detect_enable_callback(codec,
2977 spec->am_entry[i].pin,
2979 spec->mic_autoswitch_hook ?
2980 spec->mic_autoswitch_hook :
2981 snd_hda_gen_mic_autoswitch);
2985 static int compare_attr(const void *ap, const void *bp)
2987 const struct automic_entry *a = ap;
2988 const struct automic_entry *b = bp;
2989 return (int)(a->attr - b->attr);
2993 * Check the availability of auto-mic switch;
2994 * Set up if really supported
2996 static int check_auto_mic_availability(struct hda_codec *codec)
2998 struct hda_gen_spec *spec = codec->spec;
2999 struct auto_pin_cfg *cfg = &spec->autocfg;
3005 for (i = 0; i < cfg->num_inputs; i++) {
3006 hda_nid_t nid = cfg->inputs[i].pin;
3008 attr = snd_hda_codec_get_pincfg(codec, nid);
3009 attr = snd_hda_get_input_pin_attr(attr);
3010 if (types & (1 << attr))
3011 return 0; /* already occupied */
3013 case INPUT_PIN_ATTR_INT:
3014 if (cfg->inputs[i].type != AUTO_PIN_MIC)
3015 return 0; /* invalid type */
3017 case INPUT_PIN_ATTR_UNUSED:
3018 return 0; /* invalid entry */
3020 if (cfg->inputs[i].type > AUTO_PIN_LINE_IN)
3021 return 0; /* invalid type */
3022 if (!spec->line_in_auto_switch &&
3023 cfg->inputs[i].type != AUTO_PIN_MIC)
3024 return 0; /* only mic is allowed */
3025 if (!is_jack_detectable(codec, nid))
3026 return 0; /* no unsol support */
3029 if (num_pins >= MAX_AUTO_MIC_PINS)
3031 types |= (1 << attr);
3032 spec->am_entry[num_pins].pin = nid;
3033 spec->am_entry[num_pins].attr = attr;
3040 spec->am_num_entries = num_pins;
3041 /* sort the am_entry in the order of attr so that the pin with a
3042 * higher attr will be selected when the jack is plugged.
3044 sort(spec->am_entry, num_pins, sizeof(spec->am_entry[0]),
3045 compare_attr, NULL);
3047 if (!auto_mic_check_imux(codec))
3051 spec->num_adc_nids = 1;
3052 spec->cur_mux[0] = spec->am_entry[0].idx;
3053 snd_printdd("hda-codec: Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n",
3054 spec->am_entry[0].pin,
3055 spec->am_entry[1].pin,
3056 spec->am_entry[2].pin);
3063 * Parse the given BIOS configuration and set up the hda_gen_spec
3065 * return 1 if successful, 0 if the proper config is not found,
3066 * or a negative error code
3068 int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
3069 struct auto_pin_cfg *cfg)
3071 struct hda_gen_spec *spec = codec->spec;
3074 if (cfg != &spec->autocfg) {
3075 spec->autocfg = *cfg;
3076 cfg = &spec->autocfg;
3079 if (!cfg->line_outs) {
3080 if (cfg->dig_outs || cfg->dig_in_pin) {
3081 spec->multiout.max_channels = 2;
3082 spec->no_analog = 1;
3085 return 0; /* can't find valid BIOS pin config */
3088 if (!spec->no_primary_hp &&
3089 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT &&
3090 cfg->line_outs <= cfg->hp_outs) {
3091 /* use HP as primary out */
3092 cfg->speaker_outs = cfg->line_outs;
3093 memcpy(cfg->speaker_pins, cfg->line_out_pins,
3094 sizeof(cfg->speaker_pins));
3095 cfg->line_outs = cfg->hp_outs;
3096 memcpy(cfg->line_out_pins, cfg->hp_pins, sizeof(cfg->hp_pins));
3098 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
3099 cfg->line_out_type = AUTO_PIN_HP_OUT;
3102 err = parse_output_paths(codec);
3105 err = create_multi_channel_mode(codec);
3108 err = create_multi_out_ctls(codec, cfg);
3111 err = create_hp_out_ctls(codec);
3114 err = create_speaker_out_ctls(codec);
3117 err = create_indep_hp_ctls(codec);
3120 err = create_loopback_mixing_ctl(codec);
3123 err = create_shared_input(codec);
3126 err = create_input_ctls(codec);
3130 /* check the multiple speaker pins */
3131 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
3132 spec->const_channel_count = cfg->line_outs * 2;
3134 spec->const_channel_count = cfg->speaker_outs * 2;
3136 if (spec->multi_ios > 0)
3137 spec->multiout.max_channels = max(spec->ext_channel_count,
3138 spec->const_channel_count);
3140 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
3142 err = check_auto_mute_availability(codec);
3146 err = check_dyn_adc_switch(codec);
3150 if (!spec->shared_mic_hp) {
3151 err = check_auto_mic_availability(codec);
3156 err = create_capture_mixers(codec);
3160 err = parse_mic_boost(codec);
3165 parse_digital(codec);
3169 EXPORT_SYMBOL_HDA(snd_hda_gen_parse_auto_config);
3173 * Build control elements
3176 /* slave controls for virtual master */
3177 static const char * const slave_pfxs[] = {
3178 "Front", "Surround", "Center", "LFE", "Side",
3179 "Headphone", "Speaker", "Mono", "Line Out",
3180 "CLFE", "Bass Speaker", "PCM",
3181 "Speaker Front", "Speaker Surround", "Speaker CLFE", "Speaker Side",
3182 "Headphone Front", "Headphone Surround", "Headphone CLFE",
3187 int snd_hda_gen_build_controls(struct hda_codec *codec)
3189 struct hda_gen_spec *spec = codec->spec;
3192 if (spec->kctls.used) {
3193 err = snd_hda_add_new_ctls(codec, spec->kctls.list);
3198 if (spec->multiout.dig_out_nid) {
3199 err = snd_hda_create_dig_out_ctls(codec,
3200 spec->multiout.dig_out_nid,
3201 spec->multiout.dig_out_nid,
3202 spec->pcm_rec[1].pcm_type);
3205 if (!spec->no_analog) {
3206 err = snd_hda_create_spdif_share_sw(codec,
3210 spec->multiout.share_spdif = 1;
3213 if (spec->dig_in_nid) {
3214 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
3219 /* if we have no master control, let's create it */
3220 if (!spec->no_analog &&
3221 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
3222 unsigned int vmaster_tlv[4];
3223 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
3224 HDA_OUTPUT, vmaster_tlv);
3225 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
3226 vmaster_tlv, slave_pfxs,
3231 if (!spec->no_analog &&
3232 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
3233 err = __snd_hda_add_vmaster(codec, "Master Playback Switch",
3236 true, &spec->vmaster_mute.sw_kctl);
3239 if (spec->vmaster_mute.hook)
3240 snd_hda_add_vmaster_hook(codec, &spec->vmaster_mute,
3241 spec->vmaster_mute_enum);
3244 free_kctls(spec); /* no longer needed */
3246 if (spec->shared_mic_hp) {
3248 int nid = spec->autocfg.inputs[1].pin;
3249 err = snd_hda_jack_add_kctl(codec, nid, "Headphone Mic", 0);
3252 err = snd_hda_jack_detect_enable(codec, nid, 0);
3257 err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
3263 EXPORT_SYMBOL_HDA(snd_hda_gen_build_controls);
3270 static void call_pcm_playback_hook(struct hda_pcm_stream *hinfo,
3271 struct hda_codec *codec,
3272 struct snd_pcm_substream *substream,
3275 struct hda_gen_spec *spec = codec->spec;
3276 if (spec->pcm_playback_hook)
3277 spec->pcm_playback_hook(hinfo, codec, substream, action);
3281 * Analog playback callbacks
3283 static int playback_pcm_open(struct hda_pcm_stream *hinfo,
3284 struct hda_codec *codec,
3285 struct snd_pcm_substream *substream)
3287 struct hda_gen_spec *spec = codec->spec;
3290 mutex_lock(&spec->pcm_mutex);
3291 err = snd_hda_multi_out_analog_open(codec,
3292 &spec->multiout, substream,
3295 spec->active_streams |= 1 << STREAM_MULTI_OUT;
3296 call_pcm_playback_hook(hinfo, codec, substream,
3297 HDA_GEN_PCM_ACT_OPEN);
3299 mutex_unlock(&spec->pcm_mutex);
3303 static int playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3304 struct hda_codec *codec,
3305 unsigned int stream_tag,
3306 unsigned int format,
3307 struct snd_pcm_substream *substream)
3309 struct hda_gen_spec *spec = codec->spec;
3312 err = snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3313 stream_tag, format, substream);
3315 call_pcm_playback_hook(hinfo, codec, substream,
3316 HDA_GEN_PCM_ACT_PREPARE);
3320 static int playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3321 struct hda_codec *codec,
3322 struct snd_pcm_substream *substream)
3324 struct hda_gen_spec *spec = codec->spec;
3327 err = snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3329 call_pcm_playback_hook(hinfo, codec, substream,
3330 HDA_GEN_PCM_ACT_CLEANUP);
3334 static int playback_pcm_close(struct hda_pcm_stream *hinfo,
3335 struct hda_codec *codec,
3336 struct snd_pcm_substream *substream)
3338 struct hda_gen_spec *spec = codec->spec;
3339 mutex_lock(&spec->pcm_mutex);
3340 spec->active_streams &= ~(1 << STREAM_MULTI_OUT);
3341 call_pcm_playback_hook(hinfo, codec, substream,
3342 HDA_GEN_PCM_ACT_CLOSE);
3343 mutex_unlock(&spec->pcm_mutex);
3347 static int alt_playback_pcm_open(struct hda_pcm_stream *hinfo,
3348 struct hda_codec *codec,
3349 struct snd_pcm_substream *substream)
3351 struct hda_gen_spec *spec = codec->spec;
3354 mutex_lock(&spec->pcm_mutex);
3355 if (!spec->indep_hp_enabled)
3358 spec->active_streams |= 1 << STREAM_INDEP_HP;
3359 call_pcm_playback_hook(hinfo, codec, substream,
3360 HDA_GEN_PCM_ACT_OPEN);
3361 mutex_unlock(&spec->pcm_mutex);
3365 static int alt_playback_pcm_close(struct hda_pcm_stream *hinfo,
3366 struct hda_codec *codec,
3367 struct snd_pcm_substream *substream)
3369 struct hda_gen_spec *spec = codec->spec;
3370 mutex_lock(&spec->pcm_mutex);
3371 spec->active_streams &= ~(1 << STREAM_INDEP_HP);
3372 call_pcm_playback_hook(hinfo, codec, substream,
3373 HDA_GEN_PCM_ACT_CLOSE);
3374 mutex_unlock(&spec->pcm_mutex);
3378 static int alt_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3379 struct hda_codec *codec,
3380 unsigned int stream_tag,
3381 unsigned int format,
3382 struct snd_pcm_substream *substream)
3384 snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format);
3385 call_pcm_playback_hook(hinfo, codec, substream,
3386 HDA_GEN_PCM_ACT_PREPARE);
3390 static int alt_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3391 struct hda_codec *codec,
3392 struct snd_pcm_substream *substream)
3394 snd_hda_codec_cleanup_stream(codec, hinfo->nid);
3395 call_pcm_playback_hook(hinfo, codec, substream,
3396 HDA_GEN_PCM_ACT_CLEANUP);
3403 static int dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3404 struct hda_codec *codec,
3405 struct snd_pcm_substream *substream)
3407 struct hda_gen_spec *spec = codec->spec;
3408 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3411 static int dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3412 struct hda_codec *codec,
3413 unsigned int stream_tag,
3414 unsigned int format,
3415 struct snd_pcm_substream *substream)
3417 struct hda_gen_spec *spec = codec->spec;
3418 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3419 stream_tag, format, substream);
3422 static int dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3423 struct hda_codec *codec,
3424 struct snd_pcm_substream *substream)
3426 struct hda_gen_spec *spec = codec->spec;
3427 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3430 static int dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3431 struct hda_codec *codec,
3432 struct snd_pcm_substream *substream)
3434 struct hda_gen_spec *spec = codec->spec;
3435 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3441 static int alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3442 struct hda_codec *codec,
3443 unsigned int stream_tag,
3444 unsigned int format,
3445 struct snd_pcm_substream *substream)
3447 struct hda_gen_spec *spec = codec->spec;
3449 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3450 stream_tag, 0, format);
3454 static int alt_capture_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;
3460 snd_hda_codec_cleanup_stream(codec,
3461 spec->adc_nids[substream->number + 1]);
3467 static const struct hda_pcm_stream pcm_analog_playback = {
3471 /* NID is set in build_pcms */
3473 .open = playback_pcm_open,
3474 .close = playback_pcm_close,
3475 .prepare = playback_pcm_prepare,
3476 .cleanup = playback_pcm_cleanup
3480 static const struct hda_pcm_stream pcm_analog_capture = {
3484 /* NID is set in build_pcms */
3487 static const struct hda_pcm_stream pcm_analog_alt_playback = {
3491 /* NID is set in build_pcms */
3493 .open = alt_playback_pcm_open,
3494 .close = alt_playback_pcm_close,
3495 .prepare = alt_playback_pcm_prepare,
3496 .cleanup = alt_playback_pcm_cleanup
3500 static const struct hda_pcm_stream pcm_analog_alt_capture = {
3501 .substreams = 2, /* can be overridden */
3504 /* NID is set in build_pcms */
3506 .prepare = alt_capture_pcm_prepare,
3507 .cleanup = alt_capture_pcm_cleanup
3511 static const struct hda_pcm_stream pcm_digital_playback = {
3515 /* NID is set in build_pcms */
3517 .open = dig_playback_pcm_open,
3518 .close = dig_playback_pcm_close,
3519 .prepare = dig_playback_pcm_prepare,
3520 .cleanup = dig_playback_pcm_cleanup
3524 static const struct hda_pcm_stream pcm_digital_capture = {
3528 /* NID is set in build_pcms */
3531 /* Used by build_pcms to flag that a PCM has no playback stream */
3532 static const struct hda_pcm_stream pcm_null_stream = {
3539 * dynamic changing ADC PCM streams
3541 static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur)
3543 struct hda_gen_spec *spec = codec->spec;
3544 hda_nid_t new_adc = spec->adc_nids[spec->dyn_adc_idx[cur]];
3546 if (spec->cur_adc && spec->cur_adc != new_adc) {
3547 /* stream is running, let's swap the current ADC */
3548 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
3549 spec->cur_adc = new_adc;
3550 snd_hda_codec_setup_stream(codec, new_adc,
3551 spec->cur_adc_stream_tag, 0,
3552 spec->cur_adc_format);
3558 /* analog capture with dynamic dual-adc changes */
3559 static int dyn_adc_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3560 struct hda_codec *codec,
3561 unsigned int stream_tag,
3562 unsigned int format,
3563 struct snd_pcm_substream *substream)
3565 struct hda_gen_spec *spec = codec->spec;
3566 spec->cur_adc = spec->adc_nids[spec->dyn_adc_idx[spec->cur_mux[0]]];
3567 spec->cur_adc_stream_tag = stream_tag;
3568 spec->cur_adc_format = format;
3569 snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
3573 static int dyn_adc_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3574 struct hda_codec *codec,
3575 struct snd_pcm_substream *substream)
3577 struct hda_gen_spec *spec = codec->spec;
3578 snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
3583 static const struct hda_pcm_stream dyn_adc_pcm_analog_capture = {
3587 .nid = 0, /* fill later */
3589 .prepare = dyn_adc_capture_pcm_prepare,
3590 .cleanup = dyn_adc_capture_pcm_cleanup
3594 static void fill_pcm_stream_name(char *str, size_t len, const char *sfx,
3595 const char *chip_name)
3601 strlcpy(str, chip_name, len);
3603 /* drop non-alnum chars after a space */
3604 for (p = strchr(str, ' '); p; p = strchr(p + 1, ' ')) {
3605 if (!isalnum(p[1])) {
3610 strlcat(str, sfx, len);
3613 /* build PCM streams based on the parsed results */
3614 int snd_hda_gen_build_pcms(struct hda_codec *codec)
3616 struct hda_gen_spec *spec = codec->spec;
3617 struct hda_pcm *info = spec->pcm_rec;
3618 const struct hda_pcm_stream *p;
3619 bool have_multi_adcs;
3621 codec->num_pcms = 1;
3622 codec->pcm_info = info;
3624 if (spec->no_analog)
3627 fill_pcm_stream_name(spec->stream_name_analog,
3628 sizeof(spec->stream_name_analog),
3629 " Analog", codec->chip_name);
3630 info->name = spec->stream_name_analog;
3632 if (spec->multiout.num_dacs > 0) {
3633 p = spec->stream_analog_playback;
3635 p = &pcm_analog_playback;
3636 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3637 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3638 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
3639 spec->multiout.max_channels;
3640 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT &&
3641 spec->autocfg.line_outs == 2)
3642 info->stream[SNDRV_PCM_STREAM_PLAYBACK].chmap =
3645 if (spec->num_adc_nids) {
3646 p = spec->stream_analog_capture;
3648 if (spec->dyn_adc_switch)
3649 p = &dyn_adc_pcm_analog_capture;
3651 p = &pcm_analog_capture;
3653 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3654 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3658 /* SPDIF for stream index #1 */
3659 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3660 fill_pcm_stream_name(spec->stream_name_digital,
3661 sizeof(spec->stream_name_digital),
3662 " Digital", codec->chip_name);
3663 codec->num_pcms = 2;
3664 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3665 info = spec->pcm_rec + 1;
3666 info->name = spec->stream_name_digital;
3667 if (spec->dig_out_type)
3668 info->pcm_type = spec->dig_out_type;
3670 info->pcm_type = HDA_PCM_TYPE_SPDIF;
3671 if (spec->multiout.dig_out_nid) {
3672 p = spec->stream_digital_playback;
3674 p = &pcm_digital_playback;
3675 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3676 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3678 if (spec->dig_in_nid) {
3679 p = spec->stream_digital_capture;
3681 p = &pcm_digital_capture;
3682 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3683 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3687 if (spec->no_analog)
3690 /* If the use of more than one ADC is requested for the current
3691 * model, configure a second analog capture-only PCM.
3693 have_multi_adcs = (spec->num_adc_nids > 1) &&
3694 !spec->dyn_adc_switch && !spec->auto_mic;
3695 /* Additional Analaog capture for index #2 */
3696 if (spec->alt_dac_nid || have_multi_adcs) {
3697 codec->num_pcms = 3;
3698 info = spec->pcm_rec + 2;
3699 info->name = spec->stream_name_analog;
3700 if (spec->alt_dac_nid) {
3701 p = spec->stream_analog_alt_playback;
3703 p = &pcm_analog_alt_playback;
3704 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3705 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3708 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3710 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3712 if (have_multi_adcs) {
3713 p = spec->stream_analog_alt_capture;
3715 p = &pcm_analog_alt_capture;
3716 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3717 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3719 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3720 spec->num_adc_nids - 1;
3722 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3724 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3730 EXPORT_SYMBOL_HDA(snd_hda_gen_build_pcms);
3734 * Standard auto-parser initializations
3737 /* configure the given path as a proper output */
3738 static void set_output_and_unmute(struct hda_codec *codec,
3739 int pin_type, int path_idx)
3741 struct nid_path *path;
3744 path = snd_hda_get_path_from_idx(codec, path_idx);
3745 if (!path || !path->depth)
3747 pin = path->path[path->depth - 1];
3748 snd_hda_set_pin_ctl_cache(codec, pin, pin_type);
3749 snd_hda_activate_path(codec, path, path->active, true);
3750 set_pin_eapd(codec, pin, path->active);
3753 /* initialize primary output paths */
3754 static void init_multi_out(struct hda_codec *codec)
3756 struct hda_gen_spec *spec = codec->spec;
3760 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)
3765 for (i = 0; i < spec->autocfg.line_outs; i++)
3766 set_output_and_unmute(codec, pin_type, spec->out_paths[i]);
3770 static void __init_extra_out(struct hda_codec *codec, int num_outs,
3771 int *paths, int type)
3775 for (i = 0; i < num_outs; i++)
3776 set_output_and_unmute(codec, type, paths[i]);
3779 /* initialize hp and speaker paths */
3780 static void init_extra_out(struct hda_codec *codec)
3782 struct hda_gen_spec *spec = codec->spec;
3784 if (spec->autocfg.line_out_type != AUTO_PIN_HP_OUT)
3785 __init_extra_out(codec, spec->autocfg.hp_outs,
3786 spec->hp_paths, PIN_HP);
3787 if (spec->autocfg.line_out_type != AUTO_PIN_SPEAKER_OUT)
3788 __init_extra_out(codec, spec->autocfg.speaker_outs,
3789 spec->speaker_paths, PIN_OUT);
3792 /* initialize multi-io paths */
3793 static void init_multi_io(struct hda_codec *codec)
3795 struct hda_gen_spec *spec = codec->spec;
3798 for (i = 0; i < spec->multi_ios; i++) {
3799 hda_nid_t pin = spec->multi_io[i].pin;
3800 struct nid_path *path;
3801 path = get_multiio_path(codec, i);
3804 if (!spec->multi_io[i].ctl_in)
3805 spec->multi_io[i].ctl_in =
3806 snd_hda_codec_update_cache(codec, pin, 0,
3807 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3808 snd_hda_activate_path(codec, path, path->active, true);
3812 /* set up the input pin config, depending on the given auto-pin type */
3813 static void set_input_pin(struct hda_codec *codec, hda_nid_t nid,
3816 unsigned int val = PIN_IN;
3817 if (auto_pin_type == AUTO_PIN_MIC)
3818 val |= snd_hda_get_default_vref(codec, nid);
3819 snd_hda_set_pin_ctl_cache(codec, nid, val);
3822 /* set up input pins and loopback paths */
3823 static void init_analog_input(struct hda_codec *codec)
3825 struct hda_gen_spec *spec = codec->spec;
3826 struct auto_pin_cfg *cfg = &spec->autocfg;
3829 for (i = 0; i < cfg->num_inputs; i++) {
3830 hda_nid_t nid = cfg->inputs[i].pin;
3831 if (is_input_pin(codec, nid))
3832 set_input_pin(codec, nid, cfg->inputs[i].type);
3834 /* init loopback inputs */
3835 if (spec->mixer_nid) {
3836 struct nid_path *path;
3837 path = snd_hda_get_path_from_idx(codec, spec->loopback_paths[i]);
3839 snd_hda_activate_path(codec, path,
3840 path->active, false);
3845 /* initialize ADC paths */
3846 static void init_input_src(struct hda_codec *codec)
3848 struct hda_gen_spec *spec = codec->spec;
3849 struct hda_input_mux *imux = &spec->input_mux;
3850 struct nid_path *path;
3853 if (spec->dyn_adc_switch)
3856 nums = spec->num_adc_nids;
3858 for (c = 0; c < nums; c++) {
3859 for (i = 0; i < imux->num_items; i++) {
3860 path = snd_hda_get_nid_path(codec, spec->imux_pins[i],
3861 get_adc_nid(codec, c, i));
3863 bool active = path->active;
3864 if (i == spec->cur_mux[c])
3866 snd_hda_activate_path(codec, path, active, false);
3871 if (spec->shared_mic_hp)
3872 update_shared_mic_hp(codec, spec->cur_mux[0]);
3874 if (spec->cap_sync_hook)
3875 spec->cap_sync_hook(codec);
3878 /* set right pin controls for digital I/O */
3879 static void init_digital(struct hda_codec *codec)
3881 struct hda_gen_spec *spec = codec->spec;
3885 for (i = 0; i < spec->autocfg.dig_outs; i++)
3886 set_output_and_unmute(codec, PIN_OUT, spec->digout_paths[i]);
3887 pin = spec->autocfg.dig_in_pin;
3889 struct nid_path *path;
3890 snd_hda_set_pin_ctl_cache(codec, pin, PIN_IN);
3891 path = snd_hda_get_path_from_idx(codec, spec->digin_path);
3893 snd_hda_activate_path(codec, path, path->active, false);
3897 /* clear unsol-event tags on unused pins; Conexant codecs seem to leave
3898 * invalid unsol tags by some reason
3900 static void clear_unsol_on_unused_pins(struct hda_codec *codec)
3904 for (i = 0; i < codec->init_pins.used; i++) {
3905 struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
3906 hda_nid_t nid = pin->nid;
3907 if (is_jack_detectable(codec, nid) &&
3908 !snd_hda_jack_tbl_get(codec, nid))
3909 snd_hda_codec_update_cache(codec, nid, 0,
3910 AC_VERB_SET_UNSOLICITED_ENABLE, 0);
3915 * initialize the generic spec;
3916 * this can be put as patch_ops.init function
3918 int snd_hda_gen_init(struct hda_codec *codec)
3920 struct hda_gen_spec *spec = codec->spec;
3922 if (spec->init_hook)
3923 spec->init_hook(codec);
3925 snd_hda_apply_verbs(codec);
3927 codec->cached_write = 1;
3929 init_multi_out(codec);
3930 init_extra_out(codec);
3931 init_multi_io(codec);
3932 init_analog_input(codec);
3933 init_input_src(codec);
3934 init_digital(codec);
3936 clear_unsol_on_unused_pins(codec);
3938 /* call init functions of standard auto-mute helpers */
3939 snd_hda_gen_hp_automute(codec, NULL);
3940 snd_hda_gen_line_automute(codec, NULL);
3941 snd_hda_gen_mic_autoswitch(codec, NULL);
3943 snd_hda_codec_flush_amp_cache(codec);
3944 snd_hda_codec_flush_cmd_cache(codec);
3946 if (spec->vmaster_mute.sw_kctl && spec->vmaster_mute.hook)
3947 snd_hda_sync_vmaster_hook(&spec->vmaster_mute);
3949 hda_call_check_power_status(codec, 0x01);
3952 EXPORT_SYMBOL_HDA(snd_hda_gen_init);
3955 * free the generic spec;
3956 * this can be put as patch_ops.free function
3958 void snd_hda_gen_free(struct hda_codec *codec)
3960 snd_hda_gen_spec_free(codec->spec);
3964 EXPORT_SYMBOL_HDA(snd_hda_gen_free);
3968 * check the loopback power save state;
3969 * this can be put as patch_ops.check_power_status function
3971 int snd_hda_gen_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3973 struct hda_gen_spec *spec = codec->spec;
3974 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3976 EXPORT_SYMBOL_HDA(snd_hda_gen_check_power_status);
3981 * the generic codec support
3984 static const struct hda_codec_ops generic_patch_ops = {
3985 .build_controls = snd_hda_gen_build_controls,
3986 .build_pcms = snd_hda_gen_build_pcms,
3987 .init = snd_hda_gen_init,
3988 .free = snd_hda_gen_free,
3989 .unsol_event = snd_hda_jack_unsol_event,
3991 .check_power_status = snd_hda_gen_check_power_status,
3995 int snd_hda_parse_generic_codec(struct hda_codec *codec)
3997 struct hda_gen_spec *spec;
4000 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4003 snd_hda_gen_spec_init(spec);
4006 err = snd_hda_parse_pin_defcfg(codec, &spec->autocfg, NULL, 0);
4010 err = snd_hda_gen_parse_auto_config(codec, &spec->autocfg);
4014 codec->patch_ops = generic_patch_ops;
4018 snd_hda_gen_free(codec);
4021 EXPORT_SYMBOL_HDA(snd_hda_parse_generic_codec);