1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <linux/init.h>
24#include <linux/slab.h>
25#include <linux/export.h>
26#include <linux/sort.h>
27#include <linux/delay.h>
28#include <linux/ctype.h>
29#include <linux/string.h>
30#include <linux/bitops.h>
31#include <linux/module.h>
32#include <sound/core.h>
33#include <sound/jack.h>
34#include <sound/tlv.h>
35#include "hda_codec.h"
36#include "hda_local.h"
37#include "hda_auto_parser.h"
38#include "hda_jack.h"
39#include "hda_beep.h"
40#include "hda_generic.h"
41
42
43
44
45
46
47
48
49int snd_hda_gen_spec_init(struct hda_gen_spec *spec)
50{
51 snd_array_init(&spec->kctls, sizeof(struct snd_kcontrol_new), 32);
52 snd_array_init(&spec->paths, sizeof(struct nid_path), 8);
53 snd_array_init(&spec->loopback_list, sizeof(struct hda_amp_list), 8);
54 mutex_init(&spec->pcm_mutex);
55 return 0;
56}
57EXPORT_SYMBOL_GPL(snd_hda_gen_spec_init);
58
59
60
61
62
63
64
65
66
67
68
69
70struct snd_kcontrol_new *
71snd_hda_gen_add_kctl(struct hda_gen_spec *spec, const char *name,
72 const struct snd_kcontrol_new *temp)
73{
74 struct snd_kcontrol_new *knew = snd_array_new(&spec->kctls);
75 if (!knew)
76 return NULL;
77 *knew = *temp;
78 if (name)
79 knew->name = kstrdup(name, GFP_KERNEL);
80 else if (knew->name)
81 knew->name = kstrdup(knew->name, GFP_KERNEL);
82 if (!knew->name)
83 return NULL;
84 return knew;
85}
86EXPORT_SYMBOL_GPL(snd_hda_gen_add_kctl);
87
88static void free_kctls(struct hda_gen_spec *spec)
89{
90 if (spec->kctls.list) {
91 struct snd_kcontrol_new *kctl = spec->kctls.list;
92 int i;
93 for (i = 0; i < spec->kctls.used; i++)
94 kfree(kctl[i].name);
95 }
96 snd_array_free(&spec->kctls);
97}
98
99static void snd_hda_gen_spec_free(struct hda_gen_spec *spec)
100{
101 if (!spec)
102 return;
103 free_kctls(spec);
104 snd_array_free(&spec->paths);
105 snd_array_free(&spec->loopback_list);
106}
107
108
109
110
111static void parse_user_hints(struct hda_codec *codec)
112{
113 struct hda_gen_spec *spec = codec->spec;
114 int val;
115
116 val = snd_hda_get_bool_hint(codec, "jack_detect");
117 if (val >= 0)
118 codec->no_jack_detect = !val;
119 val = snd_hda_get_bool_hint(codec, "inv_jack_detect");
120 if (val >= 0)
121 codec->inv_jack_detect = !!val;
122 val = snd_hda_get_bool_hint(codec, "trigger_sense");
123 if (val >= 0)
124 codec->no_trigger_sense = !val;
125 val = snd_hda_get_bool_hint(codec, "inv_eapd");
126 if (val >= 0)
127 codec->inv_eapd = !!val;
128 val = snd_hda_get_bool_hint(codec, "pcm_format_first");
129 if (val >= 0)
130 codec->pcm_format_first = !!val;
131 val = snd_hda_get_bool_hint(codec, "sticky_stream");
132 if (val >= 0)
133 codec->no_sticky_stream = !val;
134 val = snd_hda_get_bool_hint(codec, "spdif_status_reset");
135 if (val >= 0)
136 codec->spdif_status_reset = !!val;
137 val = snd_hda_get_bool_hint(codec, "pin_amp_workaround");
138 if (val >= 0)
139 codec->pin_amp_workaround = !!val;
140 val = snd_hda_get_bool_hint(codec, "single_adc_amp");
141 if (val >= 0)
142 codec->single_adc_amp = !!val;
143 val = snd_hda_get_bool_hint(codec, "power_save_node");
144 if (val >= 0)
145 codec->power_save_node = !!val;
146
147 val = snd_hda_get_bool_hint(codec, "auto_mute");
148 if (val >= 0)
149 spec->suppress_auto_mute = !val;
150 val = snd_hda_get_bool_hint(codec, "auto_mic");
151 if (val >= 0)
152 spec->suppress_auto_mic = !val;
153 val = snd_hda_get_bool_hint(codec, "line_in_auto_switch");
154 if (val >= 0)
155 spec->line_in_auto_switch = !!val;
156 val = snd_hda_get_bool_hint(codec, "auto_mute_via_amp");
157 if (val >= 0)
158 spec->auto_mute_via_amp = !!val;
159 val = snd_hda_get_bool_hint(codec, "need_dac_fix");
160 if (val >= 0)
161 spec->need_dac_fix = !!val;
162 val = snd_hda_get_bool_hint(codec, "primary_hp");
163 if (val >= 0)
164 spec->no_primary_hp = !val;
165 val = snd_hda_get_bool_hint(codec, "multi_io");
166 if (val >= 0)
167 spec->no_multi_io = !val;
168 val = snd_hda_get_bool_hint(codec, "multi_cap_vol");
169 if (val >= 0)
170 spec->multi_cap_vol = !!val;
171 val = snd_hda_get_bool_hint(codec, "inv_dmic_split");
172 if (val >= 0)
173 spec->inv_dmic_split = !!val;
174 val = snd_hda_get_bool_hint(codec, "indep_hp");
175 if (val >= 0)
176 spec->indep_hp = !!val;
177 val = snd_hda_get_bool_hint(codec, "add_stereo_mix_input");
178 if (val >= 0)
179 spec->add_stereo_mix_input = !!val;
180
181 val = snd_hda_get_bool_hint(codec, "add_out_jack_modes");
182 if (val >= 0)
183 spec->add_jack_modes = !!val;
184 val = snd_hda_get_bool_hint(codec, "add_in_jack_modes");
185 if (val >= 0)
186 spec->add_jack_modes = !!val;
187 val = snd_hda_get_bool_hint(codec, "add_jack_modes");
188 if (val >= 0)
189 spec->add_jack_modes = !!val;
190 val = snd_hda_get_bool_hint(codec, "power_down_unused");
191 if (val >= 0)
192 spec->power_down_unused = !!val;
193 val = snd_hda_get_bool_hint(codec, "add_hp_mic");
194 if (val >= 0)
195 spec->hp_mic = !!val;
196 val = snd_hda_get_bool_hint(codec, "hp_mic_detect");
197 if (val >= 0)
198 spec->suppress_hp_mic_detect = !val;
199 val = snd_hda_get_bool_hint(codec, "vmaster");
200 if (val >= 0)
201 spec->suppress_vmaster = !val;
202
203 if (!snd_hda_get_int_hint(codec, "mixer_nid", &val))
204 spec->mixer_nid = val;
205}
206
207
208
209
210
211#define update_pin_ctl(codec, pin, val) \
212 snd_hda_codec_update_cache(codec, pin, 0, \
213 AC_VERB_SET_PIN_WIDGET_CONTROL, val)
214
215
216static inline void restore_pin_ctl(struct hda_codec *codec, hda_nid_t pin)
217{
218 update_pin_ctl(codec, pin, snd_hda_codec_get_pin_target(codec, pin));
219}
220
221
222static void set_pin_target(struct hda_codec *codec, hda_nid_t pin,
223 unsigned int val, bool do_write)
224{
225 if (!pin)
226 return;
227 val = snd_hda_correct_pin_ctl(codec, pin, val);
228 snd_hda_codec_set_pin_target(codec, pin, val);
229 if (do_write)
230 update_pin_ctl(codec, pin, val);
231}
232
233
234static void set_pin_targets(struct hda_codec *codec, int num_pins,
235 hda_nid_t *pins, unsigned int val)
236{
237 int i;
238 for (i = 0; i < num_pins; i++)
239 set_pin_target(codec, pins[i], val, false);
240}
241
242
243
244
245
246
247static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
248{
249 int i;
250 for (i = 0; i < nums; i++)
251 if (list[i] == nid)
252 return i;
253 return -1;
254}
255
256
257static bool is_nid_contained(struct nid_path *path, hda_nid_t nid)
258{
259 return find_idx_in_nid_list(nid, path->path, path->depth) >= 0;
260}
261
262static struct nid_path *get_nid_path(struct hda_codec *codec,
263 hda_nid_t from_nid, hda_nid_t to_nid,
264 int anchor_nid)
265{
266 struct hda_gen_spec *spec = codec->spec;
267 int i;
268
269 for (i = 0; i < spec->paths.used; i++) {
270 struct nid_path *path = snd_array_elem(&spec->paths, i);
271 if (path->depth <= 0)
272 continue;
273 if ((!from_nid || path->path[0] == from_nid) &&
274 (!to_nid || path->path[path->depth - 1] == to_nid)) {
275 if (!anchor_nid ||
276 (anchor_nid > 0 && is_nid_contained(path, anchor_nid)) ||
277 (anchor_nid < 0 && !is_nid_contained(path, anchor_nid)))
278 return path;
279 }
280 }
281 return NULL;
282}
283
284
285
286
287
288
289
290
291
292
293int snd_hda_get_path_idx(struct hda_codec *codec, struct nid_path *path)
294{
295 struct hda_gen_spec *spec = codec->spec;
296 struct nid_path *array = spec->paths.list;
297 ssize_t idx;
298
299 if (!spec->paths.used)
300 return 0;
301 idx = path - array;
302 if (idx < 0 || idx >= spec->paths.used)
303 return 0;
304 return idx + 1;
305}
306EXPORT_SYMBOL_GPL(snd_hda_get_path_idx);
307
308
309
310
311
312
313
314struct nid_path *snd_hda_get_path_from_idx(struct hda_codec *codec, int idx)
315{
316 struct hda_gen_spec *spec = codec->spec;
317
318 if (idx <= 0 || idx > spec->paths.used)
319 return NULL;
320 return snd_array_elem(&spec->paths, idx - 1);
321}
322EXPORT_SYMBOL_GPL(snd_hda_get_path_from_idx);
323
324
325static bool is_dac_already_used(struct hda_codec *codec, hda_nid_t nid)
326{
327 struct hda_gen_spec *spec = codec->spec;
328 int i;
329
330 for (i = 0; i < spec->paths.used; i++) {
331 struct nid_path *path = snd_array_elem(&spec->paths, i);
332 if (path->path[0] == nid)
333 return true;
334 }
335 return false;
336}
337
338
339static bool is_reachable_path(struct hda_codec *codec,
340 hda_nid_t from_nid, hda_nid_t to_nid)
341{
342 if (!from_nid || !to_nid)
343 return false;
344 return snd_hda_get_conn_index(codec, to_nid, from_nid, true) >= 0;
345}
346
347
348#define AMP_VAL_COMPARE_MASK (0xffff | (1U << 18) | (0x0f << 19))
349
350
351static bool is_ctl_used(struct hda_codec *codec, unsigned int val, int type)
352{
353 struct hda_gen_spec *spec = codec->spec;
354 int i;
355
356 val &= AMP_VAL_COMPARE_MASK;
357 for (i = 0; i < spec->paths.used; i++) {
358 struct nid_path *path = snd_array_elem(&spec->paths, i);
359 if ((path->ctls[type] & AMP_VAL_COMPARE_MASK) == val)
360 return true;
361 }
362 return false;
363}
364
365
366static bool is_ctl_associated(struct hda_codec *codec, hda_nid_t nid,
367 int dir, int idx, int type)
368{
369 unsigned int val = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
370 return is_ctl_used(codec, val, type);
371}
372
373static void print_nid_path(struct hda_codec *codec,
374 const char *pfx, struct nid_path *path)
375{
376 char buf[40];
377 char *pos = buf;
378 int i;
379
380 *pos = 0;
381 for (i = 0; i < path->depth; i++)
382 pos += scnprintf(pos, sizeof(buf) - (pos - buf), "%s%02x",
383 pos != buf ? ":" : "",
384 path->path[i]);
385
386 codec_dbg(codec, "%s path: depth=%d '%s'\n", pfx, path->depth, buf);
387}
388
389
390static bool __parse_nid_path(struct hda_codec *codec,
391 hda_nid_t from_nid, hda_nid_t to_nid,
392 int anchor_nid, struct nid_path *path,
393 int depth)
394{
395 const hda_nid_t *conn;
396 int i, nums;
397
398 if (to_nid == anchor_nid)
399 anchor_nid = 0;
400 else if (to_nid == (hda_nid_t)(-anchor_nid))
401 return false;
402
403 nums = snd_hda_get_conn_list(codec, to_nid, &conn);
404 for (i = 0; i < nums; i++) {
405 if (conn[i] != from_nid) {
406
407
408
409 if (from_nid ||
410 get_wcaps_type(get_wcaps(codec, conn[i])) != AC_WID_AUD_OUT ||
411 is_dac_already_used(codec, conn[i]))
412 continue;
413 }
414
415 if (anchor_nid <= 0)
416 goto found;
417 }
418 if (depth >= MAX_NID_PATH_DEPTH)
419 return false;
420 for (i = 0; i < nums; i++) {
421 unsigned int type;
422 type = get_wcaps_type(get_wcaps(codec, conn[i]));
423 if (type == AC_WID_AUD_OUT || type == AC_WID_AUD_IN ||
424 type == AC_WID_PIN)
425 continue;
426 if (__parse_nid_path(codec, from_nid, conn[i],
427 anchor_nid, path, depth + 1))
428 goto found;
429 }
430 return false;
431
432 found:
433 path->path[path->depth] = conn[i];
434 path->idx[path->depth + 1] = i;
435 if (nums > 1 && get_wcaps_type(get_wcaps(codec, to_nid)) != AC_WID_AUD_MIX)
436 path->multi[path->depth + 1] = 1;
437 path->depth++;
438 return true;
439}
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460static bool snd_hda_parse_nid_path(struct hda_codec *codec, hda_nid_t from_nid,
461 hda_nid_t to_nid, int anchor_nid,
462 struct nid_path *path)
463{
464 if (__parse_nid_path(codec, from_nid, to_nid, anchor_nid, path, 1)) {
465 path->path[path->depth] = to_nid;
466 path->depth++;
467 return true;
468 }
469 return false;
470}
471
472
473
474
475
476
477
478
479
480
481
482struct nid_path *
483snd_hda_add_new_path(struct hda_codec *codec, hda_nid_t from_nid,
484 hda_nid_t to_nid, int anchor_nid)
485{
486 struct hda_gen_spec *spec = codec->spec;
487 struct nid_path *path;
488
489 if (from_nid && to_nid && !is_reachable_path(codec, from_nid, to_nid))
490 return NULL;
491
492
493 path = get_nid_path(codec, from_nid, to_nid, anchor_nid);
494 if (path)
495 return path;
496
497 path = snd_array_new(&spec->paths);
498 if (!path)
499 return NULL;
500 memset(path, 0, sizeof(*path));
501 if (snd_hda_parse_nid_path(codec, from_nid, to_nid, anchor_nid, path))
502 return path;
503
504 spec->paths.used--;
505 return NULL;
506}
507EXPORT_SYMBOL_GPL(snd_hda_add_new_path);
508
509
510static void invalidate_nid_path(struct hda_codec *codec, int idx)
511{
512 struct nid_path *path = snd_hda_get_path_from_idx(codec, idx);
513 if (!path)
514 return;
515 memset(path, 0, sizeof(*path));
516}
517
518
519static hda_nid_t get_preferred_dac(struct hda_codec *codec, hda_nid_t pin)
520{
521 struct hda_gen_spec *spec = codec->spec;
522 const hda_nid_t *list = spec->preferred_dacs;
523
524 if (!list)
525 return 0;
526 for (; *list; list += 2)
527 if (*list == pin)
528 return list[1];
529 return 0;
530}
531
532
533static hda_nid_t look_for_dac(struct hda_codec *codec, hda_nid_t pin,
534 bool is_digital)
535{
536 struct hda_gen_spec *spec = codec->spec;
537 bool cap_digital;
538 int i;
539
540 for (i = 0; i < spec->num_all_dacs; i++) {
541 hda_nid_t nid = spec->all_dacs[i];
542 if (!nid || is_dac_already_used(codec, nid))
543 continue;
544 cap_digital = !!(get_wcaps(codec, nid) & AC_WCAP_DIGITAL);
545 if (is_digital != cap_digital)
546 continue;
547 if (is_reachable_path(codec, nid, pin))
548 return nid;
549 }
550 return 0;
551}
552
553
554static unsigned int amp_val_replace_channels(unsigned int val, unsigned int chs)
555{
556 val &= ~(0x3U << 16);
557 val |= chs << 16;
558 return val;
559}
560
561static bool same_amp_caps(struct hda_codec *codec, hda_nid_t nid1,
562 hda_nid_t nid2, int dir)
563{
564 if (!(get_wcaps(codec, nid1) & (1 << (dir + 1))))
565 return !(get_wcaps(codec, nid2) & (1 << (dir + 1)));
566 return (query_amp_caps(codec, nid1, dir) ==
567 query_amp_caps(codec, nid2, dir));
568}
569
570
571static hda_nid_t look_for_out_mute_nid(struct hda_codec *codec,
572 struct nid_path *path)
573{
574 int i;
575
576 for (i = path->depth - 1; i >= 0; i--) {
577 if (nid_has_mute(codec, path->path[i], HDA_OUTPUT))
578 return path->path[i];
579 if (i != path->depth - 1 && i != 0 &&
580 nid_has_mute(codec, path->path[i], HDA_INPUT))
581 return path->path[i];
582 }
583 return 0;
584}
585
586
587static hda_nid_t look_for_out_vol_nid(struct hda_codec *codec,
588 struct nid_path *path)
589{
590 struct hda_gen_spec *spec = codec->spec;
591 int i;
592
593 for (i = path->depth - 1; i >= 0; i--) {
594 hda_nid_t nid = path->path[i];
595 if ((spec->out_vol_mask >> nid) & 1)
596 continue;
597 if (nid_has_volume(codec, nid, HDA_OUTPUT))
598 return nid;
599 }
600 return 0;
601}
602
603
604
605
606
607
608static bool has_amp_in(struct hda_codec *codec, struct nid_path *path, int idx)
609{
610 hda_nid_t nid = path->path[idx];
611 unsigned int caps = get_wcaps(codec, nid);
612 unsigned int type = get_wcaps_type(caps);
613
614 if (!(caps & AC_WCAP_IN_AMP))
615 return false;
616 if (type == AC_WID_PIN && idx > 0)
617 return false;
618 return true;
619}
620
621
622static bool has_amp_out(struct hda_codec *codec, struct nid_path *path, int idx)
623{
624 hda_nid_t nid = path->path[idx];
625 unsigned int caps = get_wcaps(codec, nid);
626 unsigned int type = get_wcaps_type(caps);
627
628 if (!(caps & AC_WCAP_OUT_AMP))
629 return false;
630 if (type == AC_WID_PIN && !idx)
631 return false;
632 return true;
633}
634
635
636static bool is_active_nid(struct hda_codec *codec, hda_nid_t nid,
637 unsigned int dir, unsigned int idx)
638{
639 struct hda_gen_spec *spec = codec->spec;
640 int type = get_wcaps_type(get_wcaps(codec, nid));
641 int i, n;
642
643 if (nid == codec->core.afg)
644 return true;
645
646 for (n = 0; n < spec->paths.used; n++) {
647 struct nid_path *path = snd_array_elem(&spec->paths, n);
648 if (!path->active)
649 continue;
650 if (codec->power_save_node) {
651 if (!path->stream_enabled)
652 continue;
653
654 if (!(path->pin_enabled || path->pin_fixed) &&
655 type != AC_WID_AUD_OUT && type != AC_WID_AUD_IN)
656 continue;
657 }
658 for (i = 0; i < path->depth; i++) {
659 if (path->path[i] == nid) {
660 if (dir == HDA_OUTPUT || idx == -1 ||
661 path->idx[i] == idx)
662 return true;
663 break;
664 }
665 }
666 }
667 return false;
668}
669
670
671#define is_active_nid_for_any(codec, nid) \
672 is_active_nid(codec, nid, HDA_OUTPUT, -1)
673
674
675static int get_amp_val_to_activate(struct hda_codec *codec, hda_nid_t nid,
676 int dir, unsigned int caps, bool enable)
677{
678 unsigned int val = 0;
679
680 if (caps & AC_AMPCAP_NUM_STEPS) {
681
682 if (enable)
683 val = (caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT;
684 }
685 if (caps & (AC_AMPCAP_MUTE | AC_AMPCAP_MIN_MUTE)) {
686 if (!enable)
687 val |= HDA_AMP_MUTE;
688 }
689 return val;
690}
691
692
693static bool is_stereo_amps(struct hda_codec *codec, hda_nid_t nid, int dir)
694{
695 unsigned int wcaps = get_wcaps(codec, nid);
696 hda_nid_t conn;
697
698 if (wcaps & AC_WCAP_STEREO)
699 return true;
700 if (dir != HDA_INPUT || get_wcaps_type(wcaps) != AC_WID_AUD_MIX)
701 return false;
702 if (snd_hda_get_num_conns(codec, nid) != 1)
703 return false;
704 if (snd_hda_get_connections(codec, nid, &conn, 1) < 0)
705 return false;
706 return !!(get_wcaps(codec, conn) & AC_WCAP_STEREO);
707}
708
709
710static void init_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx)
711{
712 unsigned int caps = query_amp_caps(codec, nid, dir);
713 int val = get_amp_val_to_activate(codec, nid, dir, caps, false);
714
715 if (is_stereo_amps(codec, nid, dir))
716 snd_hda_codec_amp_init_stereo(codec, nid, dir, idx, 0xff, val);
717 else
718 snd_hda_codec_amp_init(codec, nid, 0, dir, idx, 0xff, val);
719}
720
721
722static int update_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx,
723 unsigned int mask, unsigned int val)
724{
725 if (is_stereo_amps(codec, nid, dir))
726 return snd_hda_codec_amp_stereo(codec, nid, dir, idx,
727 mask, val);
728 else
729 return snd_hda_codec_amp_update(codec, nid, 0, dir, idx,
730 mask, val);
731}
732
733
734
735
736static unsigned int get_amp_mask_to_modify(struct hda_codec *codec,
737 hda_nid_t nid, int dir, int idx,
738 unsigned int caps)
739{
740 unsigned int mask = 0xff;
741
742 if (caps & (AC_AMPCAP_MUTE | AC_AMPCAP_MIN_MUTE)) {
743 if (is_ctl_associated(codec, nid, dir, idx, NID_PATH_MUTE_CTL))
744 mask &= ~0x80;
745 }
746 if (caps & AC_AMPCAP_NUM_STEPS) {
747 if (is_ctl_associated(codec, nid, dir, idx, NID_PATH_VOL_CTL) ||
748 is_ctl_associated(codec, nid, dir, idx, NID_PATH_BOOST_CTL))
749 mask &= ~0x7f;
750 }
751 return mask;
752}
753
754static void activate_amp(struct hda_codec *codec, hda_nid_t nid, int dir,
755 int idx, int idx_to_check, bool enable)
756{
757 unsigned int caps;
758 unsigned int mask, val;
759
760 caps = query_amp_caps(codec, nid, dir);
761 val = get_amp_val_to_activate(codec, nid, dir, caps, enable);
762 mask = get_amp_mask_to_modify(codec, nid, dir, idx_to_check, caps);
763 if (!mask)
764 return;
765
766 val &= mask;
767 update_amp(codec, nid, dir, idx, mask, val);
768}
769
770static void check_and_activate_amp(struct hda_codec *codec, hda_nid_t nid,
771 int dir, int idx, int idx_to_check,
772 bool enable)
773{
774
775 if (!enable && is_active_nid(codec, nid, dir, idx_to_check))
776 return;
777 activate_amp(codec, nid, dir, idx, idx_to_check, enable);
778}
779
780static void activate_amp_out(struct hda_codec *codec, struct nid_path *path,
781 int i, bool enable)
782{
783 hda_nid_t nid = path->path[i];
784 init_amp(codec, nid, HDA_OUTPUT, 0);
785 check_and_activate_amp(codec, nid, HDA_OUTPUT, 0, 0, enable);
786}
787
788static void activate_amp_in(struct hda_codec *codec, struct nid_path *path,
789 int i, bool enable, bool add_aamix)
790{
791 struct hda_gen_spec *spec = codec->spec;
792 const hda_nid_t *conn;
793 int n, nums, idx;
794 int type;
795 hda_nid_t nid = path->path[i];
796
797 nums = snd_hda_get_conn_list(codec, nid, &conn);
798 type = get_wcaps_type(get_wcaps(codec, nid));
799 if (type == AC_WID_PIN ||
800 (type == AC_WID_AUD_IN && codec->single_adc_amp)) {
801 nums = 1;
802 idx = 0;
803 } else
804 idx = path->idx[i];
805
806 for (n = 0; n < nums; n++)
807 init_amp(codec, nid, HDA_INPUT, n);
808
809
810
811
812 for (n = 0; n < nums; n++) {
813 if (n != idx) {
814 if (conn[n] != spec->mixer_merge_nid)
815 continue;
816
817 if (!add_aamix) {
818 activate_amp(codec, nid, HDA_INPUT, n, n, false);
819 continue;
820 }
821 }
822 check_and_activate_amp(codec, nid, HDA_INPUT, n, idx, enable);
823 }
824}
825
826
827static hda_nid_t path_power_update(struct hda_codec *codec,
828 struct nid_path *path,
829 bool allow_powerdown)
830{
831 hda_nid_t nid, changed = 0;
832 int i, state, power;
833
834 for (i = 0; i < path->depth; i++) {
835 nid = path->path[i];
836 if (!(get_wcaps(codec, nid) & AC_WCAP_POWER))
837 continue;
838 if (nid == codec->core.afg)
839 continue;
840 if (!allow_powerdown || is_active_nid_for_any(codec, nid))
841 state = AC_PWRST_D0;
842 else
843 state = AC_PWRST_D3;
844 power = snd_hda_codec_read(codec, nid, 0,
845 AC_VERB_GET_POWER_STATE, 0);
846 if (power != (state | (state << 4))) {
847 snd_hda_codec_write(codec, nid, 0,
848 AC_VERB_SET_POWER_STATE, state);
849 changed = nid;
850
851
852
853
854
855
856#if 0
857 if (state == AC_PWRST_D0)
858 snd_hdac_regmap_sync_node(&codec->core, nid);
859#endif
860 }
861 }
862 return changed;
863}
864
865
866static void sync_power_state_change(struct hda_codec *codec, hda_nid_t nid)
867{
868 if (nid) {
869 msleep(10);
870 snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_POWER_STATE, 0);
871 }
872}
873
874
875
876
877
878
879
880
881
882
883void snd_hda_activate_path(struct hda_codec *codec, struct nid_path *path,
884 bool enable, bool add_aamix)
885{
886 struct hda_gen_spec *spec = codec->spec;
887 int i;
888
889 path->active = enable;
890
891
892 if (enable && (spec->power_down_unused || codec->power_save_node))
893 path_power_update(codec, path, codec->power_save_node);
894
895 for (i = path->depth - 1; i >= 0; i--) {
896 hda_nid_t nid = path->path[i];
897
898 if (enable && path->multi[i])
899 snd_hda_codec_update_cache(codec, nid, 0,
900 AC_VERB_SET_CONNECT_SEL,
901 path->idx[i]);
902 if (has_amp_in(codec, path, i))
903 activate_amp_in(codec, path, i, enable, add_aamix);
904 if (has_amp_out(codec, path, i))
905 activate_amp_out(codec, path, i, enable);
906 }
907}
908EXPORT_SYMBOL_GPL(snd_hda_activate_path);
909
910
911static void path_power_down_sync(struct hda_codec *codec, struct nid_path *path)
912{
913 struct hda_gen_spec *spec = codec->spec;
914
915 if (!(spec->power_down_unused || codec->power_save_node) || path->active)
916 return;
917 sync_power_state_change(codec, path_power_update(codec, path, true));
918}
919
920
921static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable)
922{
923 struct hda_gen_spec *spec = codec->spec;
924 if (spec->own_eapd_ctl ||
925 !(snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD))
926 return;
927 if (spec->keep_eapd_on && !enable)
928 return;
929 if (codec->inv_eapd)
930 enable = !enable;
931 snd_hda_codec_update_cache(codec, pin, 0,
932 AC_VERB_SET_EAPD_BTLENABLE,
933 enable ? 0x02 : 0x00);
934}
935
936
937static void resume_path_from_idx(struct hda_codec *codec, int path_idx)
938{
939 struct nid_path *path = snd_hda_get_path_from_idx(codec, path_idx);
940 if (path)
941 snd_hda_activate_path(codec, path, path->active, false);
942}
943
944
945
946
947
948
949static int hda_gen_mixer_mute_put(struct snd_kcontrol *kcontrol,
950 struct snd_ctl_elem_value *ucontrol);
951static int hda_gen_bind_mute_put(struct snd_kcontrol *kcontrol,
952 struct snd_ctl_elem_value *ucontrol);
953
954enum {
955 HDA_CTL_WIDGET_VOL,
956 HDA_CTL_WIDGET_MUTE,
957 HDA_CTL_BIND_MUTE,
958};
959static const struct snd_kcontrol_new control_templates[] = {
960 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
961
962 {
963 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
964 .subdevice = HDA_SUBDEV_AMP_FLAG,
965 .info = snd_hda_mixer_amp_switch_info,
966 .get = snd_hda_mixer_amp_switch_get,
967 .put = hda_gen_mixer_mute_put,
968 .private_value = HDA_COMPOSE_AMP_VAL(0, 3, 0, 0),
969 },
970 {
971 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
972 .info = snd_hda_mixer_amp_switch_info,
973 .get = snd_hda_mixer_bind_switch_get,
974 .put = hda_gen_bind_mute_put,
975 .private_value = HDA_COMPOSE_AMP_VAL(0, 3, 0, 0),
976 },
977};
978
979
980static struct snd_kcontrol_new *
981add_control(struct hda_gen_spec *spec, int type, const char *name,
982 int cidx, unsigned long val)
983{
984 struct snd_kcontrol_new *knew;
985
986 knew = snd_hda_gen_add_kctl(spec, name, &control_templates[type]);
987 if (!knew)
988 return NULL;
989 knew->index = cidx;
990 if (get_amp_nid_(val))
991 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
992 knew->private_value = val;
993 return knew;
994}
995
996static int add_control_with_pfx(struct hda_gen_spec *spec, int type,
997 const char *pfx, const char *dir,
998 const char *sfx, int cidx, unsigned long val)
999{
1000 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1001 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
1002 if (!add_control(spec, type, name, cidx, val))
1003 return -ENOMEM;
1004 return 0;
1005}
1006
1007#define add_pb_vol_ctrl(spec, type, pfx, val) \
1008 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", 0, val)
1009#define add_pb_sw_ctrl(spec, type, pfx, val) \
1010 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", 0, val)
1011#define __add_pb_vol_ctrl(spec, type, pfx, cidx, val) \
1012 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", cidx, val)
1013#define __add_pb_sw_ctrl(spec, type, pfx, cidx, val) \
1014 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", cidx, val)
1015
1016static int add_vol_ctl(struct hda_codec *codec, const char *pfx, int cidx,
1017 unsigned int chs, struct nid_path *path)
1018{
1019 unsigned int val;
1020 if (!path)
1021 return 0;
1022 val = path->ctls[NID_PATH_VOL_CTL];
1023 if (!val)
1024 return 0;
1025 val = amp_val_replace_channels(val, chs);
1026 return __add_pb_vol_ctrl(codec->spec, HDA_CTL_WIDGET_VOL, pfx, cidx, val);
1027}
1028
1029
1030static int get_default_ch_nums(struct hda_codec *codec, struct nid_path *path,
1031 int type)
1032{
1033 int chs = 1;
1034 if (path) {
1035 hda_nid_t nid = get_amp_nid_(path->ctls[type]);
1036 if (nid && (get_wcaps(codec, nid) & AC_WCAP_STEREO))
1037 chs = 3;
1038 }
1039 return chs;
1040}
1041
1042static int add_stereo_vol(struct hda_codec *codec, const char *pfx, int cidx,
1043 struct nid_path *path)
1044{
1045 int chs = get_default_ch_nums(codec, path, NID_PATH_VOL_CTL);
1046 return add_vol_ctl(codec, pfx, cidx, chs, path);
1047}
1048
1049
1050
1051
1052static int add_sw_ctl(struct hda_codec *codec, const char *pfx, int cidx,
1053 unsigned int chs, struct nid_path *path)
1054{
1055 unsigned int val;
1056 int type = HDA_CTL_WIDGET_MUTE;
1057
1058 if (!path)
1059 return 0;
1060 val = path->ctls[NID_PATH_MUTE_CTL];
1061 if (!val)
1062 return 0;
1063 val = amp_val_replace_channels(val, chs);
1064 if (get_amp_direction_(val) == HDA_INPUT) {
1065 hda_nid_t nid = get_amp_nid_(val);
1066 int nums = snd_hda_get_num_conns(codec, nid);
1067 if (nums > 1) {
1068 type = HDA_CTL_BIND_MUTE;
1069 val |= nums << 19;
1070 }
1071 }
1072 return __add_pb_sw_ctrl(codec->spec, type, pfx, cidx, val);
1073}
1074
1075static int add_stereo_sw(struct hda_codec *codec, const char *pfx,
1076 int cidx, struct nid_path *path)
1077{
1078 int chs = get_default_ch_nums(codec, path, NID_PATH_MUTE_CTL);
1079 return add_sw_ctl(codec, pfx, cidx, chs, path);
1080}
1081
1082
1083static void sync_auto_mute_bits(struct snd_kcontrol *kcontrol,
1084 struct snd_ctl_elem_value *ucontrol)
1085{
1086 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1087 struct hda_gen_spec *spec = codec->spec;
1088
1089 if (spec->auto_mute_via_amp) {
1090 hda_nid_t nid = get_amp_nid(kcontrol);
1091 bool enabled = !((spec->mute_bits >> nid) & 1);
1092 ucontrol->value.integer.value[0] &= enabled;
1093 ucontrol->value.integer.value[1] &= enabled;
1094 }
1095}
1096
1097static int hda_gen_mixer_mute_put(struct snd_kcontrol *kcontrol,
1098 struct snd_ctl_elem_value *ucontrol)
1099{
1100 sync_auto_mute_bits(kcontrol, ucontrol);
1101 return snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
1102}
1103
1104static int hda_gen_bind_mute_put(struct snd_kcontrol *kcontrol,
1105 struct snd_ctl_elem_value *ucontrol)
1106{
1107 sync_auto_mute_bits(kcontrol, ucontrol);
1108 return snd_hda_mixer_bind_switch_put(kcontrol, ucontrol);
1109}
1110
1111
1112static bool path_has_mixer(struct hda_codec *codec, int path_idx, int ctl_type)
1113{
1114 struct nid_path *path = snd_hda_get_path_from_idx(codec, path_idx);
1115 return path && path->ctls[ctl_type];
1116}
1117
1118static const char * const channel_name[4] = {
1119 "Front", "Surround", "CLFE", "Side"
1120};
1121
1122
1123static const char *get_line_out_pfx(struct hda_codec *codec, int ch,
1124 int *index, int ctl_type)
1125{
1126 struct hda_gen_spec *spec = codec->spec;
1127 struct auto_pin_cfg *cfg = &spec->autocfg;
1128
1129 *index = 0;
1130 if (cfg->line_outs == 1 && !spec->multi_ios &&
1131 !codec->force_pin_prefix &&
1132 !cfg->hp_outs && !cfg->speaker_outs)
1133 return spec->vmaster_mute.hook ? "PCM" : "Master";
1134
1135
1136
1137
1138 if (spec->multiout.num_dacs == 1 && !spec->mixer_nid &&
1139 !codec->force_pin_prefix &&
1140 !spec->multiout.hp_out_nid[0] && !spec->multiout.extra_out_nid[0])
1141 return spec->vmaster_mute.hook ? "PCM" : "Master";
1142
1143
1144 if (ch >= cfg->line_outs)
1145 return channel_name[ch];
1146
1147 switch (cfg->line_out_type) {
1148 case AUTO_PIN_SPEAKER_OUT:
1149
1150
1151
1152 if (!ch && cfg->hp_outs &&
1153 !path_has_mixer(codec, spec->hp_paths[0], ctl_type))
1154 break;
1155 if (cfg->line_outs == 1)
1156 return "Speaker";
1157 if (cfg->line_outs == 2)
1158 return ch ? "Bass Speaker" : "Speaker";
1159 break;
1160 case AUTO_PIN_HP_OUT:
1161
1162
1163
1164 if (!ch && cfg->speaker_outs &&
1165 !path_has_mixer(codec, spec->speaker_paths[0], ctl_type))
1166 break;
1167
1168 if (ch && spec->multi_ios)
1169 break;
1170 *index = ch;
1171 return "Headphone";
1172 case AUTO_PIN_LINE_OUT:
1173
1174
1175 if (!ch && cfg->speaker_outs && cfg->hp_outs) {
1176 bool hp_lo_shared = !path_has_mixer(codec, spec->hp_paths[0], ctl_type);
1177 bool spk_lo_shared = !path_has_mixer(codec, spec->speaker_paths[0], ctl_type);
1178 if (hp_lo_shared && spk_lo_shared)
1179 return spec->vmaster_mute.hook ? "PCM" : "Master";
1180 if (hp_lo_shared)
1181 return "Headphone+LO";
1182 if (spk_lo_shared)
1183 return "Speaker+LO";
1184 }
1185 }
1186
1187
1188 if (cfg->line_outs == 1 && !spec->multi_ios)
1189 return "Line Out";
1190
1191 if (ch >= ARRAY_SIZE(channel_name)) {
1192 snd_BUG();
1193 return "PCM";
1194 }
1195
1196 return channel_name[ch];
1197}
1198
1199
1200
1201
1202
1203
1204enum {
1205
1206 BAD_NO_PRIMARY_DAC = 0x10000,
1207
1208 BAD_NO_DAC = 0x4000,
1209
1210 BAD_MULTI_IO = 0x120,
1211
1212 BAD_NO_EXTRA_DAC = 0x102,
1213
1214 BAD_NO_EXTRA_SURR_DAC = 0x101,
1215
1216 BAD_SHARED_SURROUND = 0x100,
1217
1218 BAD_NO_INDEP_HP = 0x10,
1219
1220 BAD_SHARED_CLFE = 0x10,
1221
1222 BAD_SHARED_EXTRA_SURROUND = 0x10,
1223
1224 BAD_SHARED_VOL = 0x10,
1225};
1226
1227
1228
1229
1230
1231
1232
1233
1234static int assign_out_path_ctls(struct hda_codec *codec, struct nid_path *path)
1235{
1236 struct hda_gen_spec *spec = codec->spec;
1237 hda_nid_t nid;
1238 unsigned int val;
1239 int badness = 0;
1240
1241 if (!path)
1242 return BAD_SHARED_VOL * 2;
1243
1244 if (path->ctls[NID_PATH_VOL_CTL] ||
1245 path->ctls[NID_PATH_MUTE_CTL])
1246 return 0;
1247
1248 nid = look_for_out_vol_nid(codec, path);
1249 if (nid) {
1250 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
1251 if (spec->dac_min_mute)
1252 val |= HDA_AMP_VAL_MIN_MUTE;
1253 if (is_ctl_used(codec, val, NID_PATH_VOL_CTL))
1254 badness += BAD_SHARED_VOL;
1255 else
1256 path->ctls[NID_PATH_VOL_CTL] = val;
1257 } else
1258 badness += BAD_SHARED_VOL;
1259 nid = look_for_out_mute_nid(codec, path);
1260 if (nid) {
1261 unsigned int wid_type = get_wcaps_type(get_wcaps(codec, nid));
1262 if (wid_type == AC_WID_PIN || wid_type == AC_WID_AUD_OUT ||
1263 nid_has_mute(codec, nid, HDA_OUTPUT))
1264 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
1265 else
1266 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT);
1267 if (is_ctl_used(codec, val, NID_PATH_MUTE_CTL))
1268 badness += BAD_SHARED_VOL;
1269 else
1270 path->ctls[NID_PATH_MUTE_CTL] = val;
1271 } else
1272 badness += BAD_SHARED_VOL;
1273 return badness;
1274}
1275
1276const struct badness_table hda_main_out_badness = {
1277 .no_primary_dac = BAD_NO_PRIMARY_DAC,
1278 .no_dac = BAD_NO_DAC,
1279 .shared_primary = BAD_NO_PRIMARY_DAC,
1280 .shared_surr = BAD_SHARED_SURROUND,
1281 .shared_clfe = BAD_SHARED_CLFE,
1282 .shared_surr_main = BAD_SHARED_SURROUND,
1283};
1284EXPORT_SYMBOL_GPL(hda_main_out_badness);
1285
1286const struct badness_table hda_extra_out_badness = {
1287 .no_primary_dac = BAD_NO_DAC,
1288 .no_dac = BAD_NO_DAC,
1289 .shared_primary = BAD_NO_EXTRA_DAC,
1290 .shared_surr = BAD_SHARED_EXTRA_SURROUND,
1291 .shared_clfe = BAD_SHARED_EXTRA_SURROUND,
1292 .shared_surr_main = BAD_NO_EXTRA_SURR_DAC,
1293};
1294EXPORT_SYMBOL_GPL(hda_extra_out_badness);
1295
1296
1297static hda_nid_t get_primary_out(struct hda_codec *codec, int idx)
1298{
1299 struct hda_gen_spec *spec = codec->spec;
1300 struct auto_pin_cfg *cfg = &spec->autocfg;
1301
1302 if (cfg->line_outs > idx)
1303 return spec->private_dac_nids[idx];
1304 idx -= cfg->line_outs;
1305 if (spec->multi_ios > idx)
1306 return spec->multi_io[idx].dac;
1307 return 0;
1308}
1309
1310
1311static inline hda_nid_t try_dac(struct hda_codec *codec,
1312 hda_nid_t dac, hda_nid_t pin)
1313{
1314 return is_reachable_path(codec, dac, pin) ? dac : 0;
1315}
1316
1317
1318static int try_assign_dacs(struct hda_codec *codec, int num_outs,
1319 const hda_nid_t *pins, hda_nid_t *dacs,
1320 int *path_idx,
1321 const struct badness_table *bad)
1322{
1323 struct hda_gen_spec *spec = codec->spec;
1324 int i, j;
1325 int badness = 0;
1326 hda_nid_t dac;
1327
1328 if (!num_outs)
1329 return 0;
1330
1331 for (i = 0; i < num_outs; i++) {
1332 struct nid_path *path;
1333 hda_nid_t pin = pins[i];
1334
1335 path = snd_hda_get_path_from_idx(codec, path_idx[i]);
1336 if (path) {
1337 badness += assign_out_path_ctls(codec, path);
1338 continue;
1339 }
1340
1341 dacs[i] = get_preferred_dac(codec, pin);
1342 if (dacs[i]) {
1343 if (is_dac_already_used(codec, dacs[i]))
1344 badness += bad->shared_primary;
1345 }
1346
1347 if (!dacs[i])
1348 dacs[i] = look_for_dac(codec, pin, false);
1349 if (!dacs[i] && !i) {
1350
1351 for (j = 1; j < num_outs; j++) {
1352 if (is_reachable_path(codec, dacs[j], pin)) {
1353 dacs[0] = dacs[j];
1354 dacs[j] = 0;
1355 invalidate_nid_path(codec, path_idx[j]);
1356 path_idx[j] = 0;
1357 break;
1358 }
1359 }
1360 }
1361 dac = dacs[i];
1362 if (!dac) {
1363 if (num_outs > 2)
1364 dac = try_dac(codec, get_primary_out(codec, i), pin);
1365 if (!dac)
1366 dac = try_dac(codec, dacs[0], pin);
1367 if (!dac)
1368 dac = try_dac(codec, get_primary_out(codec, i), pin);
1369 if (dac) {
1370 if (!i)
1371 badness += bad->shared_primary;
1372 else if (i == 1)
1373 badness += bad->shared_surr;
1374 else
1375 badness += bad->shared_clfe;
1376 } else if (is_reachable_path(codec, spec->private_dac_nids[0], pin)) {
1377 dac = spec->private_dac_nids[0];
1378 badness += bad->shared_surr_main;
1379 } else if (!i)
1380 badness += bad->no_primary_dac;
1381 else
1382 badness += bad->no_dac;
1383 }
1384 if (!dac)
1385 continue;
1386 path = snd_hda_add_new_path(codec, dac, pin, -spec->mixer_nid);
1387 if (!path && !i && spec->mixer_nid) {
1388
1389 path = snd_hda_add_new_path(codec, dac, pin, 0);
1390 }
1391 if (!path) {
1392 dac = dacs[i] = 0;
1393 badness += bad->no_dac;
1394 } else {
1395
1396 path->active = true;
1397 path_idx[i] = snd_hda_get_path_idx(codec, path);
1398 badness += assign_out_path_ctls(codec, path);
1399 }
1400 }
1401
1402 return badness;
1403}
1404
1405
1406static hda_nid_t get_dac_if_single(struct hda_codec *codec, hda_nid_t pin)
1407{
1408 struct hda_gen_spec *spec = codec->spec;
1409 int i;
1410 hda_nid_t nid_found = 0;
1411
1412 for (i = 0; i < spec->num_all_dacs; i++) {
1413 hda_nid_t nid = spec->all_dacs[i];
1414 if (!nid || is_dac_already_used(codec, nid))
1415 continue;
1416 if (is_reachable_path(codec, nid, pin)) {
1417 if (nid_found)
1418 return 0;
1419 nid_found = nid;
1420 }
1421 }
1422 return nid_found;
1423}
1424
1425
1426static bool can_be_multiio_pin(struct hda_codec *codec,
1427 unsigned int location, hda_nid_t nid)
1428{
1429 unsigned int defcfg, caps;
1430
1431 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1432 if (get_defcfg_connect(defcfg) != AC_JACK_PORT_COMPLEX)
1433 return false;
1434 if (location && get_defcfg_location(defcfg) != location)
1435 return false;
1436 caps = snd_hda_query_pin_caps(codec, nid);
1437 if (!(caps & AC_PINCAP_OUT))
1438 return false;
1439 return true;
1440}
1441
1442
1443static int count_multiio_pins(struct hda_codec *codec, hda_nid_t reference_pin)
1444{
1445 struct hda_gen_spec *spec = codec->spec;
1446 struct auto_pin_cfg *cfg = &spec->autocfg;
1447 unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin);
1448 unsigned int location = get_defcfg_location(defcfg);
1449 int type, i;
1450 int num_pins = 0;
1451
1452 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
1453 for (i = 0; i < cfg->num_inputs; i++) {
1454 if (cfg->inputs[i].type != type)
1455 continue;
1456 if (can_be_multiio_pin(codec, location,
1457 cfg->inputs[i].pin))
1458 num_pins++;
1459 }
1460 }
1461 return num_pins;
1462}
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472static int fill_multi_ios(struct hda_codec *codec,
1473 hda_nid_t reference_pin,
1474 bool hardwired)
1475{
1476 struct hda_gen_spec *spec = codec->spec;
1477 struct auto_pin_cfg *cfg = &spec->autocfg;
1478 int type, i, j, num_pins, old_pins;
1479 unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin);
1480 unsigned int location = get_defcfg_location(defcfg);
1481 int badness = 0;
1482 struct nid_path *path;
1483
1484 old_pins = spec->multi_ios;
1485 if (old_pins >= 2)
1486 goto end_fill;
1487
1488 num_pins = count_multiio_pins(codec, reference_pin);
1489 if (num_pins < 2)
1490 goto end_fill;
1491
1492 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
1493 for (i = 0; i < cfg->num_inputs; i++) {
1494 hda_nid_t nid = cfg->inputs[i].pin;
1495 hda_nid_t dac = 0;
1496
1497 if (cfg->inputs[i].type != type)
1498 continue;
1499 if (!can_be_multiio_pin(codec, location, nid))
1500 continue;
1501 for (j = 0; j < spec->multi_ios; j++) {
1502 if (nid == spec->multi_io[j].pin)
1503 break;
1504 }
1505 if (j < spec->multi_ios)
1506 continue;
1507
1508 if (hardwired)
1509 dac = get_dac_if_single(codec, nid);
1510 else if (!dac)
1511 dac = look_for_dac(codec, nid, false);
1512 if (!dac) {
1513 badness++;
1514 continue;
1515 }
1516 path = snd_hda_add_new_path(codec, dac, nid,
1517 -spec->mixer_nid);
1518 if (!path) {
1519 badness++;
1520 continue;
1521 }
1522
1523 spec->multi_io[spec->multi_ios].pin = nid;
1524 spec->multi_io[spec->multi_ios].dac = dac;
1525 spec->out_paths[cfg->line_outs + spec->multi_ios] =
1526 snd_hda_get_path_idx(codec, path);
1527 spec->multi_ios++;
1528 if (spec->multi_ios >= 2)
1529 break;
1530 }
1531 }
1532 end_fill:
1533 if (badness)
1534 badness = BAD_MULTI_IO;
1535 if (old_pins == spec->multi_ios) {
1536 if (hardwired)
1537 return 1;
1538 else
1539 return badness;
1540 }
1541 if (!hardwired && spec->multi_ios < 2) {
1542
1543 spec->paths.used -= spec->multi_ios - old_pins;
1544 spec->multi_ios = old_pins;
1545 return badness;
1546 }
1547
1548
1549 for (i = old_pins; i < spec->multi_ios; i++) {
1550 path = snd_hda_get_path_from_idx(codec, spec->out_paths[cfg->line_outs + i]);
1551 badness += assign_out_path_ctls(codec, path);
1552 }
1553
1554 return badness;
1555}
1556
1557
1558static bool map_singles(struct hda_codec *codec, int outs,
1559 const hda_nid_t *pins, hda_nid_t *dacs, int *path_idx)
1560{
1561 struct hda_gen_spec *spec = codec->spec;
1562 int i;
1563 bool found = false;
1564 for (i = 0; i < outs; i++) {
1565 struct nid_path *path;
1566 hda_nid_t dac;
1567 if (dacs[i])
1568 continue;
1569 dac = get_dac_if_single(codec, pins[i]);
1570 if (!dac)
1571 continue;
1572 path = snd_hda_add_new_path(codec, dac, pins[i],
1573 -spec->mixer_nid);
1574 if (!path && !i && spec->mixer_nid)
1575 path = snd_hda_add_new_path(codec, dac, pins[i], 0);
1576 if (path) {
1577 dacs[i] = dac;
1578 found = true;
1579
1580 path->active = true;
1581 path_idx[i] = snd_hda_get_path_idx(codec, path);
1582 }
1583 }
1584 return found;
1585}
1586
1587static inline bool has_aamix_out_paths(struct hda_gen_spec *spec)
1588{
1589 return spec->aamix_out_paths[0] || spec->aamix_out_paths[1] ||
1590 spec->aamix_out_paths[2];
1591}
1592
1593
1594static int check_aamix_out_path(struct hda_codec *codec, int path_idx)
1595{
1596 struct hda_gen_spec *spec = codec->spec;
1597 struct nid_path *path;
1598 hda_nid_t path_dac, dac, pin;
1599
1600 path = snd_hda_get_path_from_idx(codec, path_idx);
1601 if (!path || !path->depth ||
1602 is_nid_contained(path, spec->mixer_nid))
1603 return 0;
1604 path_dac = path->path[0];
1605 dac = spec->private_dac_nids[0];
1606 pin = path->path[path->depth - 1];
1607 path = snd_hda_add_new_path(codec, dac, pin, spec->mixer_nid);
1608 if (!path) {
1609 if (dac != path_dac)
1610 dac = path_dac;
1611 else if (spec->multiout.hp_out_nid[0])
1612 dac = spec->multiout.hp_out_nid[0];
1613 else if (spec->multiout.extra_out_nid[0])
1614 dac = spec->multiout.extra_out_nid[0];
1615 else
1616 dac = 0;
1617 if (dac)
1618 path = snd_hda_add_new_path(codec, dac, pin,
1619 spec->mixer_nid);
1620 }
1621 if (!path)
1622 return 0;
1623
1624 path->active = false;
1625 path->pin_fixed = true;
1626 return snd_hda_get_path_idx(codec, path);
1627}
1628
1629
1630static bool indep_hp_possible(struct hda_codec *codec)
1631{
1632 struct hda_gen_spec *spec = codec->spec;
1633 struct auto_pin_cfg *cfg = &spec->autocfg;
1634 struct nid_path *path;
1635 int i, idx;
1636
1637 if (cfg->line_out_type == AUTO_PIN_HP_OUT)
1638 idx = spec->out_paths[0];
1639 else
1640 idx = spec->hp_paths[0];
1641 path = snd_hda_get_path_from_idx(codec, idx);
1642 if (!path)
1643 return false;
1644
1645
1646 if (!spec->mixer_nid || !is_nid_contained(path, spec->mixer_nid))
1647 return true;
1648
1649
1650 for (i = 0; i < cfg->line_outs; i++) {
1651 if (spec->out_paths[i] == idx)
1652 break;
1653 path = snd_hda_get_path_from_idx(codec, spec->out_paths[i]);
1654 if (path && is_nid_contained(path, spec->mixer_nid))
1655 return false;
1656 }
1657 for (i = 0; i < cfg->speaker_outs; i++) {
1658 path = snd_hda_get_path_from_idx(codec, spec->speaker_paths[i]);
1659 if (path && is_nid_contained(path, spec->mixer_nid))
1660 return false;
1661 }
1662
1663 return true;
1664}
1665
1666
1667
1668
1669static void refill_shared_dacs(struct hda_codec *codec, int num_outs,
1670 hda_nid_t *dacs, int *path_idx)
1671{
1672 struct nid_path *path;
1673 int i;
1674
1675 for (i = 0; i < num_outs; i++) {
1676 if (dacs[i])
1677 continue;
1678 path = snd_hda_get_path_from_idx(codec, path_idx[i]);
1679 if (!path)
1680 continue;
1681 dacs[i] = path->path[0];
1682 }
1683}
1684
1685
1686static int fill_and_eval_dacs(struct hda_codec *codec,
1687 bool fill_hardwired,
1688 bool fill_mio_first)
1689{
1690 struct hda_gen_spec *spec = codec->spec;
1691 struct auto_pin_cfg *cfg = &spec->autocfg;
1692 int i, err, badness;
1693
1694
1695 spec->multiout.num_dacs = cfg->line_outs;
1696 spec->multiout.dac_nids = spec->private_dac_nids;
1697 memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids));
1698 memset(spec->multiout.hp_out_nid, 0, sizeof(spec->multiout.hp_out_nid));
1699 memset(spec->multiout.extra_out_nid, 0, sizeof(spec->multiout.extra_out_nid));
1700 spec->multi_ios = 0;
1701 snd_array_free(&spec->paths);
1702
1703
1704 memset(spec->out_paths, 0, sizeof(spec->out_paths));
1705 memset(spec->hp_paths, 0, sizeof(spec->hp_paths));
1706 memset(spec->speaker_paths, 0, sizeof(spec->speaker_paths));
1707 memset(spec->aamix_out_paths, 0, sizeof(spec->aamix_out_paths));
1708 memset(spec->digout_paths, 0, sizeof(spec->digout_paths));
1709 memset(spec->input_paths, 0, sizeof(spec->input_paths));
1710 memset(spec->loopback_paths, 0, sizeof(spec->loopback_paths));
1711 memset(&spec->digin_path, 0, sizeof(spec->digin_path));
1712
1713 badness = 0;
1714
1715
1716 if (fill_hardwired) {
1717 bool mapped;
1718 do {
1719 mapped = map_singles(codec, cfg->line_outs,
1720 cfg->line_out_pins,
1721 spec->private_dac_nids,
1722 spec->out_paths);
1723 mapped |= map_singles(codec, cfg->hp_outs,
1724 cfg->hp_pins,
1725 spec->multiout.hp_out_nid,
1726 spec->hp_paths);
1727 mapped |= map_singles(codec, cfg->speaker_outs,
1728 cfg->speaker_pins,
1729 spec->multiout.extra_out_nid,
1730 spec->speaker_paths);
1731 if (!spec->no_multi_io &&
1732 fill_mio_first && cfg->line_outs == 1 &&
1733 cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1734 err = fill_multi_ios(codec, cfg->line_out_pins[0], true);
1735 if (!err)
1736 mapped = true;
1737 }
1738 } while (mapped);
1739 }
1740
1741 badness += try_assign_dacs(codec, cfg->line_outs, cfg->line_out_pins,
1742 spec->private_dac_nids, spec->out_paths,
1743 spec->main_out_badness);
1744
1745 if (!spec->no_multi_io && fill_mio_first &&
1746 cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1747
1748 err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
1749 if (err < 0)
1750 return err;
1751
1752 }
1753
1754 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
1755 err = try_assign_dacs(codec, cfg->hp_outs, cfg->hp_pins,
1756 spec->multiout.hp_out_nid,
1757 spec->hp_paths,
1758 spec->extra_out_badness);
1759 if (err < 0)
1760 return err;
1761 badness += err;
1762 }
1763 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1764 err = try_assign_dacs(codec, cfg->speaker_outs,
1765 cfg->speaker_pins,
1766 spec->multiout.extra_out_nid,
1767 spec->speaker_paths,
1768 spec->extra_out_badness);
1769 if (err < 0)
1770 return err;
1771 badness += err;
1772 }
1773 if (!spec->no_multi_io &&
1774 cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1775 err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
1776 if (err < 0)
1777 return err;
1778 badness += err;
1779 }
1780
1781 if (spec->mixer_nid) {
1782 spec->aamix_out_paths[0] =
1783 check_aamix_out_path(codec, spec->out_paths[0]);
1784 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1785 spec->aamix_out_paths[1] =
1786 check_aamix_out_path(codec, spec->hp_paths[0]);
1787 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1788 spec->aamix_out_paths[2] =
1789 check_aamix_out_path(codec, spec->speaker_paths[0]);
1790 }
1791
1792 if (!spec->no_multi_io &&
1793 cfg->hp_outs && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
1794 if (count_multiio_pins(codec, cfg->hp_pins[0]) >= 2)
1795 spec->multi_ios = 1;
1796
1797
1798 spec->multiout.num_dacs = 0;
1799 for (i = 0; i < cfg->line_outs; i++) {
1800 if (spec->private_dac_nids[i])
1801 spec->multiout.num_dacs++;
1802 else {
1803 memmove(spec->private_dac_nids + i,
1804 spec->private_dac_nids + i + 1,
1805 sizeof(hda_nid_t) * (cfg->line_outs - i - 1));
1806 spec->private_dac_nids[cfg->line_outs - 1] = 0;
1807 }
1808 }
1809
1810 spec->ext_channel_count = spec->min_channel_count =
1811 spec->multiout.num_dacs * 2;
1812
1813 if (spec->multi_ios == 2) {
1814 for (i = 0; i < 2; i++)
1815 spec->private_dac_nids[spec->multiout.num_dacs++] =
1816 spec->multi_io[i].dac;
1817 } else if (spec->multi_ios) {
1818 spec->multi_ios = 0;
1819 badness += BAD_MULTI_IO;
1820 }
1821
1822 if (spec->indep_hp && !indep_hp_possible(codec))
1823 badness += BAD_NO_INDEP_HP;
1824
1825
1826 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1827 refill_shared_dacs(codec, cfg->hp_outs,
1828 spec->multiout.hp_out_nid,
1829 spec->hp_paths);
1830 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1831 refill_shared_dacs(codec, cfg->speaker_outs,
1832 spec->multiout.extra_out_nid,
1833 spec->speaker_paths);
1834
1835 return badness;
1836}
1837
1838#define DEBUG_BADNESS
1839
1840#ifdef DEBUG_BADNESS
1841#define debug_badness(fmt, ...) \
1842 codec_dbg(codec, fmt, ##__VA_ARGS__)
1843#else
1844#define debug_badness(fmt, ...) \
1845 do { if (0) codec_dbg(codec, fmt, ##__VA_ARGS__); } while (0)
1846#endif
1847
1848#ifdef DEBUG_BADNESS
1849static inline void print_nid_path_idx(struct hda_codec *codec,
1850 const char *pfx, int idx)
1851{
1852 struct nid_path *path;
1853
1854 path = snd_hda_get_path_from_idx(codec, idx);
1855 if (path)
1856 print_nid_path(codec, pfx, path);
1857}
1858
1859static void debug_show_configs(struct hda_codec *codec,
1860 struct auto_pin_cfg *cfg)
1861{
1862 struct hda_gen_spec *spec = codec->spec;
1863 static const char * const lo_type[3] = { "LO", "SP", "HP" };
1864 int i;
1865
1866 debug_badness("multi_outs = %x/%x/%x/%x : %x/%x/%x/%x (type %s)\n",
1867 cfg->line_out_pins[0], cfg->line_out_pins[1],
1868 cfg->line_out_pins[2], cfg->line_out_pins[3],
1869 spec->multiout.dac_nids[0],
1870 spec->multiout.dac_nids[1],
1871 spec->multiout.dac_nids[2],
1872 spec->multiout.dac_nids[3],
1873 lo_type[cfg->line_out_type]);
1874 for (i = 0; i < cfg->line_outs; i++)
1875 print_nid_path_idx(codec, " out", spec->out_paths[i]);
1876 if (spec->multi_ios > 0)
1877 debug_badness("multi_ios(%d) = %x/%x : %x/%x\n",
1878 spec->multi_ios,
1879 spec->multi_io[0].pin, spec->multi_io[1].pin,
1880 spec->multi_io[0].dac, spec->multi_io[1].dac);
1881 for (i = 0; i < spec->multi_ios; i++)
1882 print_nid_path_idx(codec, " mio",
1883 spec->out_paths[cfg->line_outs + i]);
1884 if (cfg->hp_outs)
1885 debug_badness("hp_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1886 cfg->hp_pins[0], cfg->hp_pins[1],
1887 cfg->hp_pins[2], cfg->hp_pins[3],
1888 spec->multiout.hp_out_nid[0],
1889 spec->multiout.hp_out_nid[1],
1890 spec->multiout.hp_out_nid[2],
1891 spec->multiout.hp_out_nid[3]);
1892 for (i = 0; i < cfg->hp_outs; i++)
1893 print_nid_path_idx(codec, " hp ", spec->hp_paths[i]);
1894 if (cfg->speaker_outs)
1895 debug_badness("spk_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1896 cfg->speaker_pins[0], cfg->speaker_pins[1],
1897 cfg->speaker_pins[2], cfg->speaker_pins[3],
1898 spec->multiout.extra_out_nid[0],
1899 spec->multiout.extra_out_nid[1],
1900 spec->multiout.extra_out_nid[2],
1901 spec->multiout.extra_out_nid[3]);
1902 for (i = 0; i < cfg->speaker_outs; i++)
1903 print_nid_path_idx(codec, " spk", spec->speaker_paths[i]);
1904 for (i = 0; i < 3; i++)
1905 print_nid_path_idx(codec, " mix", spec->aamix_out_paths[i]);
1906}
1907#else
1908#define debug_show_configs(codec, cfg)
1909#endif
1910
1911
1912static void fill_all_dac_nids(struct hda_codec *codec)
1913{
1914 struct hda_gen_spec *spec = codec->spec;
1915 hda_nid_t nid;
1916
1917 spec->num_all_dacs = 0;
1918 memset(spec->all_dacs, 0, sizeof(spec->all_dacs));
1919 for_each_hda_codec_node(nid, codec) {
1920 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_AUD_OUT)
1921 continue;
1922 if (spec->num_all_dacs >= ARRAY_SIZE(spec->all_dacs)) {
1923 codec_err(codec, "Too many DACs!\n");
1924 break;
1925 }
1926 spec->all_dacs[spec->num_all_dacs++] = nid;
1927 }
1928}
1929
1930static int parse_output_paths(struct hda_codec *codec)
1931{
1932 struct hda_gen_spec *spec = codec->spec;
1933 struct auto_pin_cfg *cfg = &spec->autocfg;
1934 struct auto_pin_cfg *best_cfg;
1935 unsigned int val;
1936 int best_badness = INT_MAX;
1937 int badness;
1938 bool fill_hardwired = true, fill_mio_first = true;
1939 bool best_wired = true, best_mio = true;
1940 bool hp_spk_swapped = false;
1941
1942 best_cfg = kmalloc(sizeof(*best_cfg), GFP_KERNEL);
1943 if (!best_cfg)
1944 return -ENOMEM;
1945 *best_cfg = *cfg;
1946
1947 for (;;) {
1948 badness = fill_and_eval_dacs(codec, fill_hardwired,
1949 fill_mio_first);
1950 if (badness < 0) {
1951 kfree(best_cfg);
1952 return badness;
1953 }
1954 debug_badness("==> lo_type=%d, wired=%d, mio=%d, badness=0x%x\n",
1955 cfg->line_out_type, fill_hardwired, fill_mio_first,
1956 badness);
1957 debug_show_configs(codec, cfg);
1958 if (badness < best_badness) {
1959 best_badness = badness;
1960 *best_cfg = *cfg;
1961 best_wired = fill_hardwired;
1962 best_mio = fill_mio_first;
1963 }
1964 if (!badness)
1965 break;
1966 fill_mio_first = !fill_mio_first;
1967 if (!fill_mio_first)
1968 continue;
1969 fill_hardwired = !fill_hardwired;
1970 if (!fill_hardwired)
1971 continue;
1972 if (hp_spk_swapped)
1973 break;
1974 hp_spk_swapped = true;
1975 if (cfg->speaker_outs > 0 &&
1976 cfg->line_out_type == AUTO_PIN_HP_OUT) {
1977 cfg->hp_outs = cfg->line_outs;
1978 memcpy(cfg->hp_pins, cfg->line_out_pins,
1979 sizeof(cfg->hp_pins));
1980 cfg->line_outs = cfg->speaker_outs;
1981 memcpy(cfg->line_out_pins, cfg->speaker_pins,
1982 sizeof(cfg->speaker_pins));
1983 cfg->speaker_outs = 0;
1984 memset(cfg->speaker_pins, 0, sizeof(cfg->speaker_pins));
1985 cfg->line_out_type = AUTO_PIN_SPEAKER_OUT;
1986 fill_hardwired = true;
1987 continue;
1988 }
1989 if (cfg->hp_outs > 0 &&
1990 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
1991 cfg->speaker_outs = cfg->line_outs;
1992 memcpy(cfg->speaker_pins, cfg->line_out_pins,
1993 sizeof(cfg->speaker_pins));
1994 cfg->line_outs = cfg->hp_outs;
1995 memcpy(cfg->line_out_pins, cfg->hp_pins,
1996 sizeof(cfg->hp_pins));
1997 cfg->hp_outs = 0;
1998 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
1999 cfg->line_out_type = AUTO_PIN_HP_OUT;
2000 fill_hardwired = true;
2001 continue;
2002 }
2003 break;
2004 }
2005
2006 if (badness) {
2007 debug_badness("==> restoring best_cfg\n");
2008 *cfg = *best_cfg;
2009 fill_and_eval_dacs(codec, best_wired, best_mio);
2010 }
2011 debug_badness("==> Best config: lo_type=%d, wired=%d, mio=%d\n",
2012 cfg->line_out_type, best_wired, best_mio);
2013 debug_show_configs(codec, cfg);
2014
2015 if (cfg->line_out_pins[0]) {
2016 struct nid_path *path;
2017 path = snd_hda_get_path_from_idx(codec, spec->out_paths[0]);
2018 if (path)
2019 spec->vmaster_nid = look_for_out_vol_nid(codec, path);
2020 if (spec->vmaster_nid) {
2021 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
2022 HDA_OUTPUT, spec->vmaster_tlv);
2023 if (spec->dac_min_mute)
2024 spec->vmaster_tlv[3] |= TLV_DB_SCALE_MUTE;
2025 }
2026 }
2027
2028
2029 if (spec->prefer_hp_amp || cfg->line_out_type == AUTO_PIN_HP_OUT)
2030 val = PIN_HP;
2031 else
2032 val = PIN_OUT;
2033 set_pin_targets(codec, cfg->line_outs, cfg->line_out_pins, val);
2034 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
2035 set_pin_targets(codec, cfg->hp_outs, cfg->hp_pins, PIN_HP);
2036 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
2037 val = spec->prefer_hp_amp ? PIN_HP : PIN_OUT;
2038 set_pin_targets(codec, cfg->speaker_outs,
2039 cfg->speaker_pins, val);
2040 }
2041
2042
2043 if (spec->indep_hp && !indep_hp_possible(codec))
2044 spec->indep_hp = 0;
2045
2046 kfree(best_cfg);
2047 return 0;
2048}
2049
2050
2051static int create_multi_out_ctls(struct hda_codec *codec,
2052 const struct auto_pin_cfg *cfg)
2053{
2054 struct hda_gen_spec *spec = codec->spec;
2055 int i, err, noutputs;
2056
2057 noutputs = cfg->line_outs;
2058 if (spec->multi_ios > 0 && cfg->line_outs < 3)
2059 noutputs += spec->multi_ios;
2060
2061 for (i = 0; i < noutputs; i++) {
2062 const char *name;
2063 int index;
2064 struct nid_path *path;
2065
2066 path = snd_hda_get_path_from_idx(codec, spec->out_paths[i]);
2067 if (!path)
2068 continue;
2069
2070 name = get_line_out_pfx(codec, i, &index, NID_PATH_VOL_CTL);
2071 if (!name || !strcmp(name, "CLFE")) {
2072
2073 err = add_vol_ctl(codec, "Center", 0, 1, path);
2074 if (err < 0)
2075 return err;
2076 err = add_vol_ctl(codec, "LFE", 0, 2, path);
2077 if (err < 0)
2078 return err;
2079 } else {
2080 err = add_stereo_vol(codec, name, index, path);
2081 if (err < 0)
2082 return err;
2083 }
2084
2085 name = get_line_out_pfx(codec, i, &index, NID_PATH_MUTE_CTL);
2086 if (!name || !strcmp(name, "CLFE")) {
2087 err = add_sw_ctl(codec, "Center", 0, 1, path);
2088 if (err < 0)
2089 return err;
2090 err = add_sw_ctl(codec, "LFE", 0, 2, path);
2091 if (err < 0)
2092 return err;
2093 } else {
2094 err = add_stereo_sw(codec, name, index, path);
2095 if (err < 0)
2096 return err;
2097 }
2098 }
2099 return 0;
2100}
2101
2102static int create_extra_out(struct hda_codec *codec, int path_idx,
2103 const char *pfx, int cidx)
2104{
2105 struct nid_path *path;
2106 int err;
2107
2108 path = snd_hda_get_path_from_idx(codec, path_idx);
2109 if (!path)
2110 return 0;
2111 err = add_stereo_vol(codec, pfx, cidx, path);
2112 if (err < 0)
2113 return err;
2114 err = add_stereo_sw(codec, pfx, cidx, path);
2115 if (err < 0)
2116 return err;
2117 return 0;
2118}
2119
2120
2121static int create_extra_outs(struct hda_codec *codec, int num_pins,
2122 const int *paths, const char *pfx)
2123{
2124 int i;
2125
2126 for (i = 0; i < num_pins; i++) {
2127 const char *name;
2128 char tmp[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
2129 int err, idx = 0;
2130
2131 if (num_pins == 2 && i == 1 && !strcmp(pfx, "Speaker"))
2132 name = "Bass Speaker";
2133 else if (num_pins >= 3) {
2134 snprintf(tmp, sizeof(tmp), "%s %s",
2135 pfx, channel_name[i]);
2136 name = tmp;
2137 } else {
2138 name = pfx;
2139 idx = i;
2140 }
2141 err = create_extra_out(codec, paths[i], name, idx);
2142 if (err < 0)
2143 return err;
2144 }
2145 return 0;
2146}
2147
2148static int create_hp_out_ctls(struct hda_codec *codec)
2149{
2150 struct hda_gen_spec *spec = codec->spec;
2151 return create_extra_outs(codec, spec->autocfg.hp_outs,
2152 spec->hp_paths,
2153 "Headphone");
2154}
2155
2156static int create_speaker_out_ctls(struct hda_codec *codec)
2157{
2158 struct hda_gen_spec *spec = codec->spec;
2159 return create_extra_outs(codec, spec->autocfg.speaker_outs,
2160 spec->speaker_paths,
2161 "Speaker");
2162}
2163
2164
2165
2166
2167
2168static void call_hp_automute(struct hda_codec *codec,
2169 struct hda_jack_callback *jack);
2170static int indep_hp_info(struct snd_kcontrol *kcontrol,
2171 struct snd_ctl_elem_info *uinfo)
2172{
2173 return snd_hda_enum_bool_helper_info(kcontrol, uinfo);
2174}
2175
2176static int indep_hp_get(struct snd_kcontrol *kcontrol,
2177 struct snd_ctl_elem_value *ucontrol)
2178{
2179 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2180 struct hda_gen_spec *spec = codec->spec;
2181 ucontrol->value.enumerated.item[0] = spec->indep_hp_enabled;
2182 return 0;
2183}
2184
2185static void update_aamix_paths(struct hda_codec *codec, bool do_mix,
2186 int nomix_path_idx, int mix_path_idx,
2187 int out_type);
2188
2189static int indep_hp_put(struct snd_kcontrol *kcontrol,
2190 struct snd_ctl_elem_value *ucontrol)
2191{
2192 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2193 struct hda_gen_spec *spec = codec->spec;
2194 unsigned int select = ucontrol->value.enumerated.item[0];
2195 int ret = 0;
2196
2197 mutex_lock(&spec->pcm_mutex);
2198 if (spec->active_streams) {
2199 ret = -EBUSY;
2200 goto unlock;
2201 }
2202
2203 if (spec->indep_hp_enabled != select) {
2204 hda_nid_t *dacp;
2205 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)
2206 dacp = &spec->private_dac_nids[0];
2207 else
2208 dacp = &spec->multiout.hp_out_nid[0];
2209
2210
2211 if (spec->have_aamix_ctl) {
2212 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)
2213 update_aamix_paths(codec, spec->aamix_mode,
2214 spec->out_paths[0],
2215 spec->aamix_out_paths[0],
2216 spec->autocfg.line_out_type);
2217 else
2218 update_aamix_paths(codec, spec->aamix_mode,
2219 spec->hp_paths[0],
2220 spec->aamix_out_paths[1],
2221 AUTO_PIN_HP_OUT);
2222 }
2223
2224 spec->indep_hp_enabled = select;
2225 if (spec->indep_hp_enabled)
2226 *dacp = 0;
2227 else
2228 *dacp = spec->alt_dac_nid;
2229
2230 call_hp_automute(codec, NULL);
2231 ret = 1;
2232 }
2233 unlock:
2234 mutex_unlock(&spec->pcm_mutex);
2235 return ret;
2236}
2237
2238static const struct snd_kcontrol_new indep_hp_ctl = {
2239 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2240 .name = "Independent HP",
2241 .info = indep_hp_info,
2242 .get = indep_hp_get,
2243 .put = indep_hp_put,
2244};
2245
2246
2247static int create_indep_hp_ctls(struct hda_codec *codec)
2248{
2249 struct hda_gen_spec *spec = codec->spec;
2250 hda_nid_t dac;
2251
2252 if (!spec->indep_hp)
2253 return 0;
2254 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)
2255 dac = spec->multiout.dac_nids[0];
2256 else
2257 dac = spec->multiout.hp_out_nid[0];
2258 if (!dac) {
2259 spec->indep_hp = 0;
2260 return 0;
2261 }
2262
2263 spec->indep_hp_enabled = false;
2264 spec->alt_dac_nid = dac;
2265 if (!snd_hda_gen_add_kctl(spec, NULL, &indep_hp_ctl))
2266 return -ENOMEM;
2267 return 0;
2268}
2269
2270
2271
2272
2273
2274static int ch_mode_info(struct snd_kcontrol *kcontrol,
2275 struct snd_ctl_elem_info *uinfo)
2276{
2277 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2278 struct hda_gen_spec *spec = codec->spec;
2279 int chs;
2280
2281 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2282 uinfo->count = 1;
2283 uinfo->value.enumerated.items = spec->multi_ios + 1;
2284 if (uinfo->value.enumerated.item > spec->multi_ios)
2285 uinfo->value.enumerated.item = spec->multi_ios;
2286 chs = uinfo->value.enumerated.item * 2 + spec->min_channel_count;
2287 sprintf(uinfo->value.enumerated.name, "%dch", chs);
2288 return 0;
2289}
2290
2291static int ch_mode_get(struct snd_kcontrol *kcontrol,
2292 struct snd_ctl_elem_value *ucontrol)
2293{
2294 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2295 struct hda_gen_spec *spec = codec->spec;
2296 ucontrol->value.enumerated.item[0] =
2297 (spec->ext_channel_count - spec->min_channel_count) / 2;
2298 return 0;
2299}
2300
2301static inline struct nid_path *
2302get_multiio_path(struct hda_codec *codec, int idx)
2303{
2304 struct hda_gen_spec *spec = codec->spec;
2305 return snd_hda_get_path_from_idx(codec,
2306 spec->out_paths[spec->autocfg.line_outs + idx]);
2307}
2308
2309static void update_automute_all(struct hda_codec *codec);
2310
2311
2312
2313
2314static bool aamix_default(struct hda_gen_spec *spec)
2315{
2316 return !spec->have_aamix_ctl || spec->aamix_mode;
2317}
2318
2319static int set_multi_io(struct hda_codec *codec, int idx, bool output)
2320{
2321 struct hda_gen_spec *spec = codec->spec;
2322 hda_nid_t nid = spec->multi_io[idx].pin;
2323 struct nid_path *path;
2324
2325 path = get_multiio_path(codec, idx);
2326 if (!path)
2327 return -EINVAL;
2328
2329 if (path->active == output)
2330 return 0;
2331
2332 if (output) {
2333 set_pin_target(codec, nid, PIN_OUT, true);
2334 snd_hda_activate_path(codec, path, true, aamix_default(spec));
2335 set_pin_eapd(codec, nid, true);
2336 } else {
2337 set_pin_eapd(codec, nid, false);
2338 snd_hda_activate_path(codec, path, false, aamix_default(spec));
2339 set_pin_target(codec, nid, spec->multi_io[idx].ctl_in, true);
2340 path_power_down_sync(codec, path);
2341 }
2342
2343
2344 update_automute_all(codec);
2345
2346 return 0;
2347}
2348
2349static int ch_mode_put(struct snd_kcontrol *kcontrol,
2350 struct snd_ctl_elem_value *ucontrol)
2351{
2352 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2353 struct hda_gen_spec *spec = codec->spec;
2354 int i, ch;
2355
2356 ch = ucontrol->value.enumerated.item[0];
2357 if (ch < 0 || ch > spec->multi_ios)
2358 return -EINVAL;
2359 if (ch == (spec->ext_channel_count - spec->min_channel_count) / 2)
2360 return 0;
2361 spec->ext_channel_count = ch * 2 + spec->min_channel_count;
2362 for (i = 0; i < spec->multi_ios; i++)
2363 set_multi_io(codec, i, i < ch);
2364 spec->multiout.max_channels = max(spec->ext_channel_count,
2365 spec->const_channel_count);
2366 if (spec->need_dac_fix)
2367 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
2368 return 1;
2369}
2370
2371static const struct snd_kcontrol_new channel_mode_enum = {
2372 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2373 .name = "Channel Mode",
2374 .info = ch_mode_info,
2375 .get = ch_mode_get,
2376 .put = ch_mode_put,
2377};
2378
2379static int create_multi_channel_mode(struct hda_codec *codec)
2380{
2381 struct hda_gen_spec *spec = codec->spec;
2382
2383 if (spec->multi_ios > 0) {
2384 if (!snd_hda_gen_add_kctl(spec, NULL, &channel_mode_enum))
2385 return -ENOMEM;
2386 }
2387 return 0;
2388}
2389
2390
2391
2392
2393
2394#define loopback_mixing_info indep_hp_info
2395
2396static int loopback_mixing_get(struct snd_kcontrol *kcontrol,
2397 struct snd_ctl_elem_value *ucontrol)
2398{
2399 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2400 struct hda_gen_spec *spec = codec->spec;
2401 ucontrol->value.enumerated.item[0] = spec->aamix_mode;
2402 return 0;
2403}
2404
2405static void update_aamix_paths(struct hda_codec *codec, bool do_mix,
2406 int nomix_path_idx, int mix_path_idx,
2407 int out_type)
2408{
2409 struct hda_gen_spec *spec = codec->spec;
2410 struct nid_path *nomix_path, *mix_path;
2411
2412 nomix_path = snd_hda_get_path_from_idx(codec, nomix_path_idx);
2413 mix_path = snd_hda_get_path_from_idx(codec, mix_path_idx);
2414 if (!nomix_path || !mix_path)
2415 return;
2416
2417
2418
2419
2420 if (out_type == AUTO_PIN_HP_OUT && spec->indep_hp_enabled &&
2421 mix_path->path[0] != spec->alt_dac_nid)
2422 do_mix = false;
2423
2424 if (do_mix) {
2425 snd_hda_activate_path(codec, nomix_path, false, true);
2426 snd_hda_activate_path(codec, mix_path, true, true);
2427 path_power_down_sync(codec, nomix_path);
2428 } else {
2429 snd_hda_activate_path(codec, mix_path, false, false);
2430 snd_hda_activate_path(codec, nomix_path, true, false);
2431 path_power_down_sync(codec, mix_path);
2432 }
2433}
2434
2435
2436static void update_output_paths(struct hda_codec *codec, int num_outs,
2437 const int *paths)
2438{
2439 struct hda_gen_spec *spec = codec->spec;
2440 struct nid_path *path;
2441 int i;
2442
2443 for (i = 0; i < num_outs; i++) {
2444 path = snd_hda_get_path_from_idx(codec, paths[i]);
2445 if (path)
2446 snd_hda_activate_path(codec, path, path->active,
2447 spec->aamix_mode);
2448 }
2449}
2450
2451static int loopback_mixing_put(struct snd_kcontrol *kcontrol,
2452 struct snd_ctl_elem_value *ucontrol)
2453{
2454 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2455 struct hda_gen_spec *spec = codec->spec;
2456 const struct auto_pin_cfg *cfg = &spec->autocfg;
2457 unsigned int val = ucontrol->value.enumerated.item[0];
2458
2459 if (val == spec->aamix_mode)
2460 return 0;
2461 spec->aamix_mode = val;
2462 if (has_aamix_out_paths(spec)) {
2463 update_aamix_paths(codec, val, spec->out_paths[0],
2464 spec->aamix_out_paths[0],
2465 cfg->line_out_type);
2466 update_aamix_paths(codec, val, spec->hp_paths[0],
2467 spec->aamix_out_paths[1],
2468 AUTO_PIN_HP_OUT);
2469 update_aamix_paths(codec, val, spec->speaker_paths[0],
2470 spec->aamix_out_paths[2],
2471 AUTO_PIN_SPEAKER_OUT);
2472 } else {
2473 update_output_paths(codec, cfg->line_outs, spec->out_paths);
2474 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
2475 update_output_paths(codec, cfg->hp_outs, spec->hp_paths);
2476 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
2477 update_output_paths(codec, cfg->speaker_outs,
2478 spec->speaker_paths);
2479 }
2480 return 1;
2481}
2482
2483static const struct snd_kcontrol_new loopback_mixing_enum = {
2484 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2485 .name = "Loopback Mixing",
2486 .info = loopback_mixing_info,
2487 .get = loopback_mixing_get,
2488 .put = loopback_mixing_put,
2489};
2490
2491static int create_loopback_mixing_ctl(struct hda_codec *codec)
2492{
2493 struct hda_gen_spec *spec = codec->spec;
2494
2495 if (!spec->mixer_nid)
2496 return 0;
2497 if (!snd_hda_gen_add_kctl(spec, NULL, &loopback_mixing_enum))
2498 return -ENOMEM;
2499 spec->have_aamix_ctl = 1;
2500 return 0;
2501}
2502
2503
2504
2505
2506
2507static void call_update_outputs(struct hda_codec *codec);
2508
2509
2510static void update_hp_mic(struct hda_codec *codec, int adc_mux, bool force)
2511{
2512 struct hda_gen_spec *spec = codec->spec;
2513 bool as_mic;
2514 unsigned int val;
2515 hda_nid_t pin;
2516
2517 pin = spec->hp_mic_pin;
2518 as_mic = spec->cur_mux[adc_mux] == spec->hp_mic_mux_idx;
2519
2520 if (!force) {
2521 val = snd_hda_codec_get_pin_target(codec, pin);
2522 if (as_mic) {
2523 if (val & PIN_IN)
2524 return;
2525 } else {
2526 if (val & PIN_OUT)
2527 return;
2528 }
2529 }
2530
2531 val = snd_hda_get_default_vref(codec, pin);
2532
2533
2534
2535 if (val == AC_PINCTL_VREF_HIZ && spec->shared_mic_vref_pin) {
2536 const hda_nid_t vref_pin = spec->shared_mic_vref_pin;
2537 unsigned int vref_val = snd_hda_get_default_vref(codec, vref_pin);
2538 if (vref_val != AC_PINCTL_VREF_HIZ)
2539 snd_hda_set_pin_ctl_cache(codec, vref_pin,
2540 PIN_IN | (as_mic ? vref_val : 0));
2541 }
2542
2543 if (!spec->hp_mic_jack_modes) {
2544 if (as_mic)
2545 val |= PIN_IN;
2546 else
2547 val = PIN_HP;
2548 set_pin_target(codec, pin, val, true);
2549 call_hp_automute(codec, NULL);
2550 }
2551}
2552
2553
2554static int create_hp_mic(struct hda_codec *codec)
2555{
2556 struct hda_gen_spec *spec = codec->spec;
2557 struct auto_pin_cfg *cfg = &spec->autocfg;
2558 unsigned int defcfg;
2559 hda_nid_t nid;
2560
2561 if (!spec->hp_mic) {
2562 if (spec->suppress_hp_mic_detect)
2563 return 0;
2564
2565
2566
2567 if (cfg->num_inputs > 1)
2568 return 0;
2569 else if (cfg->num_inputs == 1) {
2570 defcfg = snd_hda_codec_get_pincfg(codec, cfg->inputs[0].pin);
2571 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
2572 return 0;
2573 }
2574 }
2575
2576 spec->hp_mic = 0;
2577 if (cfg->num_inputs >= AUTO_CFG_MAX_INS)
2578 return 0;
2579
2580 nid = 0;
2581 if (cfg->line_out_type == AUTO_PIN_HP_OUT && cfg->line_outs > 0)
2582 nid = cfg->line_out_pins[0];
2583 else if (cfg->hp_outs > 0)
2584 nid = cfg->hp_pins[0];
2585 if (!nid)
2586 return 0;
2587
2588 if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_IN))
2589 return 0;
2590
2591 cfg->inputs[cfg->num_inputs].pin = nid;
2592 cfg->inputs[cfg->num_inputs].type = AUTO_PIN_MIC;
2593 cfg->inputs[cfg->num_inputs].is_headphone_mic = 1;
2594 cfg->num_inputs++;
2595 spec->hp_mic = 1;
2596 spec->hp_mic_pin = nid;
2597
2598 spec->suppress_auto_mic = 1;
2599 codec_dbg(codec, "Enable shared I/O jack on NID 0x%x\n", nid);
2600 return 0;
2601}
2602
2603
2604
2605
2606
2607static int create_hp_mic_jack_mode(struct hda_codec *codec, hda_nid_t pin);
2608
2609static const char * const out_jack_texts[] = {
2610 "Line Out", "Headphone Out",
2611};
2612
2613static int out_jack_mode_info(struct snd_kcontrol *kcontrol,
2614 struct snd_ctl_elem_info *uinfo)
2615{
2616 return snd_hda_enum_helper_info(kcontrol, uinfo, 2, out_jack_texts);
2617}
2618
2619static int out_jack_mode_get(struct snd_kcontrol *kcontrol,
2620 struct snd_ctl_elem_value *ucontrol)
2621{
2622 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2623 hda_nid_t nid = kcontrol->private_value;
2624 if (snd_hda_codec_get_pin_target(codec, nid) == PIN_HP)
2625 ucontrol->value.enumerated.item[0] = 1;
2626 else
2627 ucontrol->value.enumerated.item[0] = 0;
2628 return 0;
2629}
2630
2631static int out_jack_mode_put(struct snd_kcontrol *kcontrol,
2632 struct snd_ctl_elem_value *ucontrol)
2633{
2634 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2635 hda_nid_t nid = kcontrol->private_value;
2636 unsigned int val;
2637
2638 val = ucontrol->value.enumerated.item[0] ? PIN_HP : PIN_OUT;
2639 if (snd_hda_codec_get_pin_target(codec, nid) == val)
2640 return 0;
2641 snd_hda_set_pin_ctl_cache(codec, nid, val);
2642 return 1;
2643}
2644
2645static const struct snd_kcontrol_new out_jack_mode_enum = {
2646 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2647 .info = out_jack_mode_info,
2648 .get = out_jack_mode_get,
2649 .put = out_jack_mode_put,
2650};
2651
2652static bool find_kctl_name(struct hda_codec *codec, const char *name, int idx)
2653{
2654 struct hda_gen_spec *spec = codec->spec;
2655 int i;
2656
2657 for (i = 0; i < spec->kctls.used; i++) {
2658 struct snd_kcontrol_new *kctl = snd_array_elem(&spec->kctls, i);
2659 if (!strcmp(kctl->name, name) && kctl->index == idx)
2660 return true;
2661 }
2662 return false;
2663}
2664
2665static void get_jack_mode_name(struct hda_codec *codec, hda_nid_t pin,
2666 char *name, size_t name_len)
2667{
2668 struct hda_gen_spec *spec = codec->spec;
2669 int idx = 0;
2670
2671 snd_hda_get_pin_label(codec, pin, &spec->autocfg, name, name_len, &idx);
2672 strlcat(name, " Jack Mode", name_len);
2673
2674 for (; find_kctl_name(codec, name, idx); idx++)
2675 ;
2676}
2677
2678static int get_out_jack_num_items(struct hda_codec *codec, hda_nid_t pin)
2679{
2680 struct hda_gen_spec *spec = codec->spec;
2681 if (spec->add_jack_modes) {
2682 unsigned int pincap = snd_hda_query_pin_caps(codec, pin);
2683 if ((pincap & AC_PINCAP_OUT) && (pincap & AC_PINCAP_HP_DRV))
2684 return 2;
2685 }
2686 return 1;
2687}
2688
2689static int create_out_jack_modes(struct hda_codec *codec, int num_pins,
2690 hda_nid_t *pins)
2691{
2692 struct hda_gen_spec *spec = codec->spec;
2693 int i;
2694
2695 for (i = 0; i < num_pins; i++) {
2696 hda_nid_t pin = pins[i];
2697 if (pin == spec->hp_mic_pin)
2698 continue;
2699 if (get_out_jack_num_items(codec, pin) > 1) {
2700 struct snd_kcontrol_new *knew;
2701 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
2702 get_jack_mode_name(codec, pin, name, sizeof(name));
2703 knew = snd_hda_gen_add_kctl(spec, name,
2704 &out_jack_mode_enum);
2705 if (!knew)
2706 return -ENOMEM;
2707 knew->private_value = pin;
2708 }
2709 }
2710
2711 return 0;
2712}
2713
2714
2715
2716
2717
2718
2719#define NUM_VREFS 6
2720
2721static const char * const vref_texts[NUM_VREFS] = {
2722 "Line In", "Mic 50pc Bias", "Mic 0V Bias",
2723 "", "Mic 80pc Bias", "Mic 100pc Bias"
2724};
2725
2726static unsigned int get_vref_caps(struct hda_codec *codec, hda_nid_t pin)
2727{
2728 unsigned int pincap;
2729
2730 pincap = snd_hda_query_pin_caps(codec, pin);
2731 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
2732
2733 pincap &= ~(AC_PINCAP_VREF_GRD | AC_PINCAP_VREF_100);
2734 return pincap;
2735}
2736
2737
2738static int get_vref_idx(unsigned int vref_caps, unsigned int item_idx)
2739{
2740 unsigned int i, n = 0;
2741
2742 for (i = 0; i < NUM_VREFS; i++) {
2743 if (vref_caps & (1 << i)) {
2744 if (n == item_idx)
2745 return i;
2746 n++;
2747 }
2748 }
2749 return 0;
2750}
2751
2752
2753static int cvt_from_vref_idx(unsigned int vref_caps, unsigned int idx)
2754{
2755 unsigned int i, n = 0;
2756
2757 for (i = 0; i < NUM_VREFS; i++) {
2758 if (i == idx)
2759 return n;
2760 if (vref_caps & (1 << i))
2761 n++;
2762 }
2763 return 0;
2764}
2765
2766static int in_jack_mode_info(struct snd_kcontrol *kcontrol,
2767 struct snd_ctl_elem_info *uinfo)
2768{
2769 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2770 hda_nid_t nid = kcontrol->private_value;
2771 unsigned int vref_caps = get_vref_caps(codec, nid);
2772
2773 snd_hda_enum_helper_info(kcontrol, uinfo, hweight32(vref_caps),
2774 vref_texts);
2775
2776 strcpy(uinfo->value.enumerated.name,
2777 vref_texts[get_vref_idx(vref_caps, uinfo->value.enumerated.item)]);
2778 return 0;
2779}
2780
2781static int in_jack_mode_get(struct snd_kcontrol *kcontrol,
2782 struct snd_ctl_elem_value *ucontrol)
2783{
2784 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2785 hda_nid_t nid = kcontrol->private_value;
2786 unsigned int vref_caps = get_vref_caps(codec, nid);
2787 unsigned int idx;
2788
2789 idx = snd_hda_codec_get_pin_target(codec, nid) & AC_PINCTL_VREFEN;
2790 ucontrol->value.enumerated.item[0] = cvt_from_vref_idx(vref_caps, idx);
2791 return 0;
2792}
2793
2794static int in_jack_mode_put(struct snd_kcontrol *kcontrol,
2795 struct snd_ctl_elem_value *ucontrol)
2796{
2797 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2798 hda_nid_t nid = kcontrol->private_value;
2799 unsigned int vref_caps = get_vref_caps(codec, nid);
2800 unsigned int val, idx;
2801
2802 val = snd_hda_codec_get_pin_target(codec, nid);
2803 idx = cvt_from_vref_idx(vref_caps, val & AC_PINCTL_VREFEN);
2804 if (idx == ucontrol->value.enumerated.item[0])
2805 return 0;
2806
2807 val &= ~AC_PINCTL_VREFEN;
2808 val |= get_vref_idx(vref_caps, ucontrol->value.enumerated.item[0]);
2809 snd_hda_set_pin_ctl_cache(codec, nid, val);
2810 return 1;
2811}
2812
2813static const struct snd_kcontrol_new in_jack_mode_enum = {
2814 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2815 .info = in_jack_mode_info,
2816 .get = in_jack_mode_get,
2817 .put = in_jack_mode_put,
2818};
2819
2820static int get_in_jack_num_items(struct hda_codec *codec, hda_nid_t pin)
2821{
2822 struct hda_gen_spec *spec = codec->spec;
2823 int nitems = 0;
2824 if (spec->add_jack_modes)
2825 nitems = hweight32(get_vref_caps(codec, pin));
2826 return nitems ? nitems : 1;
2827}
2828
2829static int create_in_jack_mode(struct hda_codec *codec, hda_nid_t pin)
2830{
2831 struct hda_gen_spec *spec = codec->spec;
2832 struct snd_kcontrol_new *knew;
2833 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
2834 unsigned int defcfg;
2835
2836 if (pin == spec->hp_mic_pin)
2837 return 0;
2838
2839
2840 defcfg = snd_hda_codec_get_pincfg(codec, pin);
2841 if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
2842 return 0;
2843
2844
2845 if (get_in_jack_num_items(codec, pin) <= 1)
2846 return 0;
2847
2848 get_jack_mode_name(codec, pin, name, sizeof(name));
2849 knew = snd_hda_gen_add_kctl(spec, name, &in_jack_mode_enum);
2850 if (!knew)
2851 return -ENOMEM;
2852 knew->private_value = pin;
2853 return 0;
2854}
2855
2856
2857
2858
2859static int hp_mic_jack_mode_info(struct snd_kcontrol *kcontrol,
2860 struct snd_ctl_elem_info *uinfo)
2861{
2862 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2863 hda_nid_t nid = kcontrol->private_value;
2864 int out_jacks = get_out_jack_num_items(codec, nid);
2865 int in_jacks = get_in_jack_num_items(codec, nid);
2866 const char *text = NULL;
2867 int idx;
2868
2869 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2870 uinfo->count = 1;
2871 uinfo->value.enumerated.items = out_jacks + in_jacks;
2872 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2873 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
2874 idx = uinfo->value.enumerated.item;
2875 if (idx < out_jacks) {
2876 if (out_jacks > 1)
2877 text = out_jack_texts[idx];
2878 else
2879 text = "Headphone Out";
2880 } else {
2881 idx -= out_jacks;
2882 if (in_jacks > 1) {
2883 unsigned int vref_caps = get_vref_caps(codec, nid);
2884 text = vref_texts[get_vref_idx(vref_caps, idx)];
2885 } else
2886 text = "Mic In";
2887 }
2888
2889 strcpy(uinfo->value.enumerated.name, text);
2890 return 0;
2891}
2892
2893static int get_cur_hp_mic_jack_mode(struct hda_codec *codec, hda_nid_t nid)
2894{
2895 int out_jacks = get_out_jack_num_items(codec, nid);
2896 int in_jacks = get_in_jack_num_items(codec, nid);
2897 unsigned int val = snd_hda_codec_get_pin_target(codec, nid);
2898 int idx = 0;
2899
2900 if (val & PIN_OUT) {
2901 if (out_jacks > 1 && val == PIN_HP)
2902 idx = 1;
2903 } else if (val & PIN_IN) {
2904 idx = out_jacks;
2905 if (in_jacks > 1) {
2906 unsigned int vref_caps = get_vref_caps(codec, nid);
2907 val &= AC_PINCTL_VREFEN;
2908 idx += cvt_from_vref_idx(vref_caps, val);
2909 }
2910 }
2911 return idx;
2912}
2913
2914static int hp_mic_jack_mode_get(struct snd_kcontrol *kcontrol,
2915 struct snd_ctl_elem_value *ucontrol)
2916{
2917 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2918 hda_nid_t nid = kcontrol->private_value;
2919 ucontrol->value.enumerated.item[0] =
2920 get_cur_hp_mic_jack_mode(codec, nid);
2921 return 0;
2922}
2923
2924static int hp_mic_jack_mode_put(struct snd_kcontrol *kcontrol,
2925 struct snd_ctl_elem_value *ucontrol)
2926{
2927 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2928 hda_nid_t nid = kcontrol->private_value;
2929 int out_jacks = get_out_jack_num_items(codec, nid);
2930 int in_jacks = get_in_jack_num_items(codec, nid);
2931 unsigned int val, oldval, idx;
2932
2933 oldval = get_cur_hp_mic_jack_mode(codec, nid);
2934 idx = ucontrol->value.enumerated.item[0];
2935 if (oldval == idx)
2936 return 0;
2937
2938 if (idx < out_jacks) {
2939 if (out_jacks > 1)
2940 val = idx ? PIN_HP : PIN_OUT;
2941 else
2942 val = PIN_HP;
2943 } else {
2944 idx -= out_jacks;
2945 if (in_jacks > 1) {
2946 unsigned int vref_caps = get_vref_caps(codec, nid);
2947 val = snd_hda_codec_get_pin_target(codec, nid);
2948 val &= ~(AC_PINCTL_VREFEN | PIN_HP);
2949 val |= get_vref_idx(vref_caps, idx) | PIN_IN;
2950 } else
2951 val = snd_hda_get_default_vref(codec, nid) | PIN_IN;
2952 }
2953 snd_hda_set_pin_ctl_cache(codec, nid, val);
2954 call_hp_automute(codec, NULL);
2955
2956 return 1;
2957}
2958
2959static const struct snd_kcontrol_new hp_mic_jack_mode_enum = {
2960 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2961 .info = hp_mic_jack_mode_info,
2962 .get = hp_mic_jack_mode_get,
2963 .put = hp_mic_jack_mode_put,
2964};
2965
2966static int create_hp_mic_jack_mode(struct hda_codec *codec, hda_nid_t pin)
2967{
2968 struct hda_gen_spec *spec = codec->spec;
2969 struct snd_kcontrol_new *knew;
2970
2971 knew = snd_hda_gen_add_kctl(spec, "Headphone Mic Jack Mode",
2972 &hp_mic_jack_mode_enum);
2973 if (!knew)
2974 return -ENOMEM;
2975 knew->private_value = pin;
2976 spec->hp_mic_jack_modes = 1;
2977 return 0;
2978}
2979
2980
2981
2982
2983
2984
2985static int add_loopback_list(struct hda_gen_spec *spec, hda_nid_t mix, int idx)
2986{
2987 struct hda_amp_list *list;
2988
2989 list = snd_array_new(&spec->loopback_list);
2990 if (!list)
2991 return -ENOMEM;
2992 list->nid = mix;
2993 list->dir = HDA_INPUT;
2994 list->idx = idx;
2995 spec->loopback.amplist = spec->loopback_list.list;
2996 return 0;
2997}
2998
2999
3000
3001
3002static bool look_for_mix_leaf_ctls(struct hda_codec *codec, hda_nid_t mix_nid,
3003 hda_nid_t pin, unsigned int *mix_val,
3004 unsigned int *mute_val)
3005{
3006 int idx, num_conns;
3007 const hda_nid_t *list;
3008 hda_nid_t nid;
3009
3010 idx = snd_hda_get_conn_index(codec, mix_nid, pin, true);
3011 if (idx < 0)
3012 return false;
3013
3014 *mix_val = *mute_val = 0;
3015 if (nid_has_volume(codec, mix_nid, HDA_INPUT))
3016 *mix_val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
3017 if (nid_has_mute(codec, mix_nid, HDA_INPUT))
3018 *mute_val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
3019 if (*mix_val && *mute_val)
3020 return true;
3021
3022
3023 num_conns = snd_hda_get_conn_list(codec, mix_nid, &list);
3024 if (num_conns < idx)
3025 return false;
3026 nid = list[idx];
3027 if (!*mix_val && nid_has_volume(codec, nid, HDA_OUTPUT) &&
3028 !is_ctl_associated(codec, nid, HDA_OUTPUT, 0, NID_PATH_VOL_CTL))
3029 *mix_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
3030 if (!*mute_val && nid_has_mute(codec, nid, HDA_OUTPUT) &&
3031 !is_ctl_associated(codec, nid, HDA_OUTPUT, 0, NID_PATH_MUTE_CTL))
3032 *mute_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
3033
3034 return *mix_val || *mute_val;
3035}
3036
3037
3038static int new_analog_input(struct hda_codec *codec, int input_idx,
3039 hda_nid_t pin, const char *ctlname, int ctlidx,
3040 hda_nid_t mix_nid)
3041{
3042 struct hda_gen_spec *spec = codec->spec;
3043 struct nid_path *path;
3044 unsigned int mix_val, mute_val;
3045 int err, idx;
3046
3047 if (!look_for_mix_leaf_ctls(codec, mix_nid, pin, &mix_val, &mute_val))
3048 return 0;
3049
3050 path = snd_hda_add_new_path(codec, pin, mix_nid, 0);
3051 if (!path)
3052 return -EINVAL;
3053 print_nid_path(codec, "loopback", path);
3054 spec->loopback_paths[input_idx] = snd_hda_get_path_idx(codec, path);
3055
3056 idx = path->idx[path->depth - 1];
3057 if (mix_val) {
3058 err = __add_pb_vol_ctrl(spec, HDA_CTL_WIDGET_VOL, ctlname, ctlidx, mix_val);
3059 if (err < 0)
3060 return err;
3061 path->ctls[NID_PATH_VOL_CTL] = mix_val;
3062 }
3063
3064 if (mute_val) {
3065 err = __add_pb_sw_ctrl(spec, HDA_CTL_WIDGET_MUTE, ctlname, ctlidx, mute_val);
3066 if (err < 0)
3067 return err;
3068 path->ctls[NID_PATH_MUTE_CTL] = mute_val;
3069 }
3070
3071 path->active = true;
3072 path->stream_enabled = true;
3073 err = add_loopback_list(spec, mix_nid, idx);
3074 if (err < 0)
3075 return err;
3076
3077 if (spec->mixer_nid != spec->mixer_merge_nid &&
3078 !spec->loopback_merge_path) {
3079 path = snd_hda_add_new_path(codec, spec->mixer_nid,
3080 spec->mixer_merge_nid, 0);
3081 if (path) {
3082 print_nid_path(codec, "loopback-merge", path);
3083 path->active = true;
3084 path->pin_fixed = true;
3085 path->stream_enabled = true;
3086 spec->loopback_merge_path =
3087 snd_hda_get_path_idx(codec, path);
3088 }
3089 }
3090
3091 return 0;
3092}
3093
3094static int is_input_pin(struct hda_codec *codec, hda_nid_t nid)
3095{
3096 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
3097 return (pincap & AC_PINCAP_IN) != 0;
3098}
3099
3100
3101static int fill_adc_nids(struct hda_codec *codec)
3102{
3103 struct hda_gen_spec *spec = codec->spec;
3104 hda_nid_t nid;
3105 hda_nid_t *adc_nids = spec->adc_nids;
3106 int max_nums = ARRAY_SIZE(spec->adc_nids);
3107 int nums = 0;
3108
3109 for_each_hda_codec_node(nid, codec) {
3110 unsigned int caps = get_wcaps(codec, nid);
3111 int type = get_wcaps_type(caps);
3112
3113 if (type != AC_WID_AUD_IN || (caps & AC_WCAP_DIGITAL))
3114 continue;
3115 adc_nids[nums] = nid;
3116 if (++nums >= max_nums)
3117 break;
3118 }
3119 spec->num_adc_nids = nums;
3120
3121
3122 spec->num_all_adcs = nums;
3123 memcpy(spec->all_adcs, spec->adc_nids, nums * sizeof(hda_nid_t));
3124
3125 return nums;
3126}
3127
3128
3129
3130
3131static int check_dyn_adc_switch(struct hda_codec *codec)
3132{
3133 struct hda_gen_spec *spec = codec->spec;
3134 struct hda_input_mux *imux = &spec->input_mux;
3135 unsigned int ok_bits;
3136 int i, n, nums;
3137
3138 nums = 0;
3139 ok_bits = 0;
3140 for (n = 0; n < spec->num_adc_nids; n++) {
3141 for (i = 0; i < imux->num_items; i++) {
3142 if (!spec->input_paths[i][n])
3143 break;
3144 }
3145 if (i >= imux->num_items) {
3146 ok_bits |= (1 << n);
3147 nums++;
3148 }
3149 }
3150
3151 if (!ok_bits) {
3152
3153 for (i = 0; i < imux->num_items; i++) {
3154 for (n = 0; n < spec->num_adc_nids; n++) {
3155 if (spec->input_paths[i][n]) {
3156 spec->dyn_adc_idx[i] = n;
3157 break;
3158 }
3159 }
3160 }
3161
3162 codec_dbg(codec, "enabling ADC switching\n");
3163 spec->dyn_adc_switch = 1;
3164 } else if (nums != spec->num_adc_nids) {
3165
3166 nums = 0;
3167 for (n = 0; n < spec->num_adc_nids; n++) {
3168 if (!(ok_bits & (1 << n)))
3169 continue;
3170 if (n != nums) {
3171 spec->adc_nids[nums] = spec->adc_nids[n];
3172 for (i = 0; i < imux->num_items; i++) {
3173 invalidate_nid_path(codec,
3174 spec->input_paths[i][nums]);
3175 spec->input_paths[i][nums] =
3176 spec->input_paths[i][n];
3177 }
3178 }
3179 nums++;
3180 }
3181 spec->num_adc_nids = nums;
3182 }
3183
3184 if (imux->num_items == 1 ||
3185 (imux->num_items == 2 && spec->hp_mic)) {
3186 codec_dbg(codec, "reducing to a single ADC\n");
3187 spec->num_adc_nids = 1;
3188 }
3189
3190
3191 if (!spec->dyn_adc_switch && spec->multi_cap_vol)
3192 spec->num_adc_nids = 1;
3193
3194 return 0;
3195}
3196
3197
3198static int parse_capture_source(struct hda_codec *codec, hda_nid_t pin,
3199 int cfg_idx, int num_adcs,
3200 const char *label, int anchor)
3201{
3202 struct hda_gen_spec *spec = codec->spec;
3203 struct hda_input_mux *imux = &spec->input_mux;
3204 int imux_idx = imux->num_items;
3205 bool imux_added = false;
3206 int c;
3207
3208 for (c = 0; c < num_adcs; c++) {
3209 struct nid_path *path;
3210 hda_nid_t adc = spec->adc_nids[c];
3211
3212 if (!is_reachable_path(codec, pin, adc))
3213 continue;
3214 path = snd_hda_add_new_path(codec, pin, adc, anchor);
3215 if (!path)
3216 continue;
3217 print_nid_path(codec, "input", path);
3218 spec->input_paths[imux_idx][c] =
3219 snd_hda_get_path_idx(codec, path);
3220
3221 if (!imux_added) {
3222 if (spec->hp_mic_pin == pin)
3223 spec->hp_mic_mux_idx = imux->num_items;
3224 spec->imux_pins[imux->num_items] = pin;
3225 snd_hda_add_imux_item(codec, imux, label, cfg_idx, NULL);
3226 imux_added = true;
3227 if (spec->dyn_adc_switch)
3228 spec->dyn_adc_idx[imux_idx] = c;
3229 }
3230 }
3231
3232 return 0;
3233}
3234
3235
3236
3237
3238
3239
3240static int fill_input_pin_labels(struct hda_codec *codec)
3241{
3242 struct hda_gen_spec *spec = codec->spec;
3243 const struct auto_pin_cfg *cfg = &spec->autocfg;
3244 int i;
3245
3246 for (i = 0; i < cfg->num_inputs; i++) {
3247 hda_nid_t pin = cfg->inputs[i].pin;
3248 const char *label;
3249 int j, idx;
3250
3251 if (!is_input_pin(codec, pin))
3252 continue;
3253
3254 label = hda_get_autocfg_input_label(codec, cfg, i);
3255 idx = 0;
3256 for (j = i - 1; j >= 0; j--) {
3257 if (spec->input_labels[j] &&
3258 !strcmp(spec->input_labels[j], label)) {
3259 idx = spec->input_label_idxs[j] + 1;
3260 break;
3261 }
3262 }
3263
3264 spec->input_labels[i] = label;
3265 spec->input_label_idxs[i] = idx;
3266 }
3267
3268 return 0;
3269}
3270
3271#define CFG_IDX_MIX 99
3272
3273static int create_input_ctls(struct hda_codec *codec)
3274{
3275 struct hda_gen_spec *spec = codec->spec;
3276 const struct auto_pin_cfg *cfg = &spec->autocfg;
3277 hda_nid_t mixer = spec->mixer_nid;
3278 int num_adcs;
3279 int i, err;
3280 unsigned int val;
3281
3282 num_adcs = fill_adc_nids(codec);
3283 if (num_adcs < 0)
3284 return 0;
3285
3286 err = fill_input_pin_labels(codec);
3287 if (err < 0)
3288 return err;
3289
3290 for (i = 0; i < cfg->num_inputs; i++) {
3291 hda_nid_t pin;
3292
3293 pin = cfg->inputs[i].pin;
3294 if (!is_input_pin(codec, pin))
3295 continue;
3296
3297 val = PIN_IN;
3298 if (cfg->inputs[i].type == AUTO_PIN_MIC)
3299 val |= snd_hda_get_default_vref(codec, pin);
3300 if (pin != spec->hp_mic_pin &&
3301 !snd_hda_codec_get_pin_target(codec, pin))
3302 set_pin_target(codec, pin, val, false);
3303
3304 if (mixer) {
3305 if (is_reachable_path(codec, pin, mixer)) {
3306 err = new_analog_input(codec, i, pin,
3307 spec->input_labels[i],
3308 spec->input_label_idxs[i],
3309 mixer);
3310 if (err < 0)
3311 return err;
3312 }
3313 }
3314
3315 err = parse_capture_source(codec, pin, i, num_adcs,
3316 spec->input_labels[i], -mixer);
3317 if (err < 0)
3318 return err;
3319
3320 if (spec->add_jack_modes) {
3321 err = create_in_jack_mode(codec, pin);
3322 if (err < 0)
3323 return err;
3324 }
3325 }
3326
3327
3328 if (mixer && spec->add_stereo_mix_input == HDA_HINT_STEREO_MIX_ENABLE) {
3329 err = parse_capture_source(codec, mixer, CFG_IDX_MIX, num_adcs,
3330 "Stereo Mix", 0);
3331 if (err < 0)
3332 return err;
3333 else
3334 spec->suppress_auto_mic = 1;
3335 }
3336
3337 return 0;
3338}
3339
3340
3341
3342
3343
3344
3345
3346static struct nid_path *get_input_path(struct hda_codec *codec, int adc_idx, int imux_idx)
3347{
3348 struct hda_gen_spec *spec = codec->spec;
3349 if (imux_idx < 0 || imux_idx >= HDA_MAX_NUM_INPUTS) {
3350 snd_BUG();
3351 return NULL;
3352 }
3353 if (spec->dyn_adc_switch)
3354 adc_idx = spec->dyn_adc_idx[imux_idx];
3355 if (adc_idx < 0 || adc_idx >= AUTO_CFG_MAX_INS) {
3356 snd_BUG();
3357 return NULL;
3358 }
3359 return snd_hda_get_path_from_idx(codec, spec->input_paths[imux_idx][adc_idx]);
3360}
3361
3362static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
3363 unsigned int idx);
3364
3365static int mux_enum_info(struct snd_kcontrol *kcontrol,
3366 struct snd_ctl_elem_info *uinfo)
3367{
3368 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3369 struct hda_gen_spec *spec = codec->spec;
3370 return snd_hda_input_mux_info(&spec->input_mux, uinfo);
3371}
3372
3373static int mux_enum_get(struct snd_kcontrol *kcontrol,
3374 struct snd_ctl_elem_value *ucontrol)
3375{
3376 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3377 struct hda_gen_spec *spec = codec->spec;
3378
3379 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
3380
3381 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
3382 return 0;
3383}
3384
3385static int mux_enum_put(struct snd_kcontrol *kcontrol,
3386 struct snd_ctl_elem_value *ucontrol)
3387{
3388 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3389 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
3390 return mux_select(codec, adc_idx,
3391 ucontrol->value.enumerated.item[0]);
3392}
3393
3394static const struct snd_kcontrol_new cap_src_temp = {
3395 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3396 .name = "Input Source",
3397 .info = mux_enum_info,
3398 .get = mux_enum_get,
3399 .put = mux_enum_put,
3400};
3401
3402
3403
3404
3405
3406typedef int (*put_call_t)(struct snd_kcontrol *kcontrol,
3407 struct snd_ctl_elem_value *ucontrol);
3408
3409
3410static int cap_put_caller(struct snd_kcontrol *kcontrol,
3411 struct snd_ctl_elem_value *ucontrol,
3412 put_call_t func, int type)
3413{
3414 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3415 struct hda_gen_spec *spec = codec->spec;
3416 const struct hda_input_mux *imux;
3417 struct nid_path *path;
3418 int i, adc_idx, err = 0;
3419
3420 imux = &spec->input_mux;
3421 adc_idx = kcontrol->id.index;
3422 mutex_lock(&codec->control_mutex);
3423 for (i = 0; i < imux->num_items; i++) {
3424 path = get_input_path(codec, adc_idx, i);
3425 if (!path || !path->ctls[type])
3426 continue;
3427 kcontrol->private_value = path->ctls[type];
3428 err = func(kcontrol, ucontrol);
3429 if (err < 0)
3430 break;
3431 }
3432 mutex_unlock(&codec->control_mutex);
3433 if (err >= 0 && spec->cap_sync_hook)
3434 spec->cap_sync_hook(codec, kcontrol, ucontrol);
3435 return err;
3436}
3437
3438
3439#define cap_vol_info snd_hda_mixer_amp_volume_info
3440#define cap_vol_get snd_hda_mixer_amp_volume_get
3441#define cap_vol_tlv snd_hda_mixer_amp_tlv
3442
3443static int cap_vol_put(struct snd_kcontrol *kcontrol,
3444 struct snd_ctl_elem_value *ucontrol)
3445{
3446 return cap_put_caller(kcontrol, ucontrol,
3447 snd_hda_mixer_amp_volume_put,
3448 NID_PATH_VOL_CTL);
3449}
3450
3451static const struct snd_kcontrol_new cap_vol_temp = {
3452 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3453 .name = "Capture Volume",
3454 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
3455 SNDRV_CTL_ELEM_ACCESS_TLV_READ |
3456 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK),
3457 .info = cap_vol_info,
3458 .get = cap_vol_get,
3459 .put = cap_vol_put,
3460 .tlv = { .c = cap_vol_tlv },
3461};
3462
3463
3464#define cap_sw_info snd_ctl_boolean_stereo_info
3465#define cap_sw_get snd_hda_mixer_amp_switch_get
3466
3467static int cap_sw_put(struct snd_kcontrol *kcontrol,
3468 struct snd_ctl_elem_value *ucontrol)
3469{
3470 return cap_put_caller(kcontrol, ucontrol,
3471 snd_hda_mixer_amp_switch_put,
3472 NID_PATH_MUTE_CTL);
3473}
3474
3475static const struct snd_kcontrol_new cap_sw_temp = {
3476 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3477 .name = "Capture Switch",
3478 .info = cap_sw_info,
3479 .get = cap_sw_get,
3480 .put = cap_sw_put,
3481};
3482
3483static int parse_capvol_in_path(struct hda_codec *codec, struct nid_path *path)
3484{
3485 hda_nid_t nid;
3486 int i, depth;
3487
3488 path->ctls[NID_PATH_VOL_CTL] = path->ctls[NID_PATH_MUTE_CTL] = 0;
3489 for (depth = 0; depth < 3; depth++) {
3490 if (depth >= path->depth)
3491 return -EINVAL;
3492 i = path->depth - depth - 1;
3493 nid = path->path[i];
3494 if (!path->ctls[NID_PATH_VOL_CTL]) {
3495 if (nid_has_volume(codec, nid, HDA_OUTPUT))
3496 path->ctls[NID_PATH_VOL_CTL] =
3497 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
3498 else if (nid_has_volume(codec, nid, HDA_INPUT)) {
3499 int idx = path->idx[i];
3500 if (!depth && codec->single_adc_amp)
3501 idx = 0;
3502 path->ctls[NID_PATH_VOL_CTL] =
3503 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
3504 }
3505 }
3506 if (!path->ctls[NID_PATH_MUTE_CTL]) {
3507 if (nid_has_mute(codec, nid, HDA_OUTPUT))
3508 path->ctls[NID_PATH_MUTE_CTL] =
3509 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
3510 else if (nid_has_mute(codec, nid, HDA_INPUT)) {
3511 int idx = path->idx[i];
3512 if (!depth && codec->single_adc_amp)
3513 idx = 0;
3514 path->ctls[NID_PATH_MUTE_CTL] =
3515 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
3516 }
3517 }
3518 }
3519 return 0;
3520}
3521
3522static bool is_inv_dmic_pin(struct hda_codec *codec, hda_nid_t nid)
3523{
3524 struct hda_gen_spec *spec = codec->spec;
3525 struct auto_pin_cfg *cfg = &spec->autocfg;
3526 unsigned int val;
3527 int i;
3528
3529 if (!spec->inv_dmic_split)
3530 return false;
3531 for (i = 0; i < cfg->num_inputs; i++) {
3532 if (cfg->inputs[i].pin != nid)
3533 continue;
3534 if (cfg->inputs[i].type != AUTO_PIN_MIC)
3535 return false;
3536 val = snd_hda_codec_get_pincfg(codec, nid);
3537 return snd_hda_get_input_pin_attr(val) == INPUT_PIN_ATTR_INT;
3538 }
3539 return false;
3540}
3541
3542
3543static int cap_single_sw_put(struct snd_kcontrol *kcontrol,
3544 struct snd_ctl_elem_value *ucontrol)
3545{
3546 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3547 struct hda_gen_spec *spec = codec->spec;
3548 int ret;
3549
3550 ret = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
3551 if (ret < 0)
3552 return ret;
3553
3554 if (spec->cap_sync_hook)
3555 spec->cap_sync_hook(codec, kcontrol, ucontrol);
3556
3557 return ret;
3558}
3559
3560static int add_single_cap_ctl(struct hda_codec *codec, const char *label,
3561 int idx, bool is_switch, unsigned int ctl,
3562 bool inv_dmic)
3563{
3564 struct hda_gen_spec *spec = codec->spec;
3565 char tmpname[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
3566 int type = is_switch ? HDA_CTL_WIDGET_MUTE : HDA_CTL_WIDGET_VOL;
3567 const char *sfx = is_switch ? "Switch" : "Volume";
3568 unsigned int chs = inv_dmic ? 1 : 3;
3569 struct snd_kcontrol_new *knew;
3570
3571 if (!ctl)
3572 return 0;
3573
3574 if (label)
3575 snprintf(tmpname, sizeof(tmpname),
3576 "%s Capture %s", label, sfx);
3577 else
3578 snprintf(tmpname, sizeof(tmpname),
3579 "Capture %s", sfx);
3580 knew = add_control(spec, type, tmpname, idx,
3581 amp_val_replace_channels(ctl, chs));
3582 if (!knew)
3583 return -ENOMEM;
3584 if (is_switch)
3585 knew->put = cap_single_sw_put;
3586 if (!inv_dmic)
3587 return 0;
3588
3589
3590 if (label)
3591 snprintf(tmpname, sizeof(tmpname),
3592 "Inverted %s Capture %s", label, sfx);
3593 else
3594 snprintf(tmpname, sizeof(tmpname),
3595 "Inverted Capture %s", sfx);
3596 knew = add_control(spec, type, tmpname, idx,
3597 amp_val_replace_channels(ctl, 2));
3598 if (!knew)
3599 return -ENOMEM;
3600 if (is_switch)
3601 knew->put = cap_single_sw_put;
3602 return 0;
3603}
3604
3605
3606static int create_single_cap_vol_ctl(struct hda_codec *codec, int idx,
3607 unsigned int vol_ctl, unsigned int sw_ctl,
3608 bool inv_dmic)
3609{
3610 int err;
3611 err = add_single_cap_ctl(codec, NULL, idx, false, vol_ctl, inv_dmic);
3612 if (err < 0)
3613 return err;
3614 err = add_single_cap_ctl(codec, NULL, idx, true, sw_ctl, inv_dmic);
3615 if (err < 0)
3616 return err;
3617 return 0;
3618}
3619
3620
3621static int create_bind_cap_vol_ctl(struct hda_codec *codec, int idx,
3622 unsigned int vol_ctl, unsigned int sw_ctl)
3623{
3624 struct hda_gen_spec *spec = codec->spec;
3625 struct snd_kcontrol_new *knew;
3626
3627 if (vol_ctl) {
3628 knew = snd_hda_gen_add_kctl(spec, NULL, &cap_vol_temp);
3629 if (!knew)
3630 return -ENOMEM;
3631 knew->index = idx;
3632 knew->private_value = vol_ctl;
3633 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
3634 }
3635 if (sw_ctl) {
3636 knew = snd_hda_gen_add_kctl(spec, NULL, &cap_sw_temp);
3637 if (!knew)
3638 return -ENOMEM;
3639 knew->index = idx;
3640 knew->private_value = sw_ctl;
3641 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
3642 }
3643 return 0;
3644}
3645
3646
3647static unsigned int get_first_cap_ctl(struct hda_codec *codec, int idx, int type)
3648{
3649 struct nid_path *path;
3650 unsigned int ctl;
3651 int i;
3652
3653 path = get_input_path(codec, 0, idx);
3654 if (!path)
3655 return 0;
3656 ctl = path->ctls[type];
3657 if (!ctl)
3658 return 0;
3659 for (i = 0; i < idx - 1; i++) {
3660 path = get_input_path(codec, 0, i);
3661 if (path && path->ctls[type] == ctl)
3662 return 0;
3663 }
3664 return ctl;
3665}
3666
3667
3668static int create_multi_cap_vol_ctl(struct hda_codec *codec)
3669{
3670 struct hda_gen_spec *spec = codec->spec;
3671 struct hda_input_mux *imux = &spec->input_mux;
3672 int i, err, type;
3673
3674 for (i = 0; i < imux->num_items; i++) {
3675 bool inv_dmic;
3676 int idx;
3677
3678 idx = imux->items[i].index;
3679 if (idx >= spec->autocfg.num_inputs)
3680 continue;
3681 inv_dmic = is_inv_dmic_pin(codec, spec->imux_pins[i]);
3682
3683 for (type = 0; type < 2; type++) {
3684 err = add_single_cap_ctl(codec,
3685 spec->input_labels[idx],
3686 spec->input_label_idxs[idx],
3687 type,
3688 get_first_cap_ctl(codec, i, type),
3689 inv_dmic);
3690 if (err < 0)
3691 return err;
3692 }
3693 }
3694 return 0;
3695}
3696
3697static int create_capture_mixers(struct hda_codec *codec)
3698{
3699 struct hda_gen_spec *spec = codec->spec;
3700 struct hda_input_mux *imux = &spec->input_mux;
3701 int i, n, nums, err;
3702
3703 if (spec->dyn_adc_switch)
3704 nums = 1;
3705 else
3706 nums = spec->num_adc_nids;
3707
3708 if (!spec->auto_mic && imux->num_items > 1) {
3709 struct snd_kcontrol_new *knew;
3710 const char *name;
3711 name = nums > 1 ? "Input Source" : "Capture Source";
3712 knew = snd_hda_gen_add_kctl(spec, name, &cap_src_temp);
3713 if (!knew)
3714 return -ENOMEM;
3715 knew->count = nums;
3716 }
3717
3718 for (n = 0; n < nums; n++) {
3719 bool multi = false;
3720 bool multi_cap_vol = spec->multi_cap_vol;
3721 bool inv_dmic = false;
3722 int vol, sw;
3723
3724 vol = sw = 0;
3725 for (i = 0; i < imux->num_items; i++) {
3726 struct nid_path *path;
3727 path = get_input_path(codec, n, i);
3728 if (!path)
3729 continue;
3730 parse_capvol_in_path(codec, path);
3731 if (!vol)
3732 vol = path->ctls[NID_PATH_VOL_CTL];
3733 else if (vol != path->ctls[NID_PATH_VOL_CTL]) {
3734 multi = true;
3735 if (!same_amp_caps(codec, vol,
3736 path->ctls[NID_PATH_VOL_CTL], HDA_INPUT))
3737 multi_cap_vol = true;
3738 }
3739 if (!sw)
3740 sw = path->ctls[NID_PATH_MUTE_CTL];
3741 else if (sw != path->ctls[NID_PATH_MUTE_CTL]) {
3742 multi = true;
3743 if (!same_amp_caps(codec, sw,
3744 path->ctls[NID_PATH_MUTE_CTL], HDA_INPUT))
3745 multi_cap_vol = true;
3746 }
3747 if (is_inv_dmic_pin(codec, spec->imux_pins[i]))
3748 inv_dmic = true;
3749 }
3750
3751 if (!multi)
3752 err = create_single_cap_vol_ctl(codec, n, vol, sw,
3753 inv_dmic);
3754 else if (!multi_cap_vol && !inv_dmic)
3755 err = create_bind_cap_vol_ctl(codec, n, vol, sw);
3756 else
3757 err = create_multi_cap_vol_ctl(codec);
3758 if (err < 0)
3759 return err;
3760 }
3761
3762 return 0;
3763}
3764
3765
3766
3767
3768
3769
3770static bool check_boost_vol(struct hda_codec *codec, hda_nid_t nid,
3771 int dir, int idx)
3772{
3773 unsigned int step;
3774
3775 if (!nid_has_volume(codec, nid, dir) ||
3776 is_ctl_associated(codec, nid, dir, idx, NID_PATH_VOL_CTL) ||
3777 is_ctl_associated(codec, nid, dir, idx, NID_PATH_BOOST_CTL))
3778 return false;
3779
3780 step = (query_amp_caps(codec, nid, dir) & AC_AMPCAP_STEP_SIZE)
3781 >> AC_AMPCAP_STEP_SIZE_SHIFT;
3782 if (step < 0x20)
3783 return false;
3784 return true;
3785}
3786
3787
3788static unsigned int look_for_boost_amp(struct hda_codec *codec,
3789 struct nid_path *path)
3790{
3791 unsigned int val = 0;
3792 hda_nid_t nid;
3793 int depth;
3794
3795 for (depth = 0; depth < 3; depth++) {
3796 if (depth >= path->depth - 1)
3797 break;
3798 nid = path->path[depth];
3799 if (depth && check_boost_vol(codec, nid, HDA_OUTPUT, 0)) {
3800 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
3801 break;
3802 } else if (check_boost_vol(codec, nid, HDA_INPUT,
3803 path->idx[depth])) {
3804 val = HDA_COMPOSE_AMP_VAL(nid, 3, path->idx[depth],
3805 HDA_INPUT);
3806 break;
3807 }
3808 }
3809
3810 return val;
3811}
3812
3813static int parse_mic_boost(struct hda_codec *codec)
3814{
3815 struct hda_gen_spec *spec = codec->spec;
3816 struct auto_pin_cfg *cfg = &spec->autocfg;
3817 struct hda_input_mux *imux = &spec->input_mux;
3818 int i;
3819
3820 if (!spec->num_adc_nids)
3821 return 0;
3822
3823 for (i = 0; i < imux->num_items; i++) {
3824 struct nid_path *path;
3825 unsigned int val;
3826 int idx;
3827 char boost_label[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
3828
3829 idx = imux->items[i].index;
3830 if (idx >= imux->num_items)
3831 continue;
3832
3833
3834 if (cfg->inputs[idx].type > AUTO_PIN_LINE_IN)
3835 continue;
3836
3837 path = get_input_path(codec, 0, i);
3838 if (!path)
3839 continue;
3840
3841 val = look_for_boost_amp(codec, path);
3842 if (!val)
3843 continue;
3844
3845
3846 snprintf(boost_label, sizeof(boost_label),
3847 "%s Boost Volume", spec->input_labels[idx]);
3848 if (!add_control(spec, HDA_CTL_WIDGET_VOL, boost_label,
3849 spec->input_label_idxs[idx], val))
3850 return -ENOMEM;
3851
3852 path->ctls[NID_PATH_BOOST_CTL] = val;
3853 }
3854 return 0;
3855}
3856
3857
3858
3859
3860static void parse_digital(struct hda_codec *codec)
3861{
3862 struct hda_gen_spec *spec = codec->spec;
3863 struct nid_path *path;
3864 int i, nums;
3865 hda_nid_t dig_nid, pin;
3866
3867
3868 nums = 0;
3869 for (i = 0; i < spec->autocfg.dig_outs; i++) {
3870 pin = spec->autocfg.dig_out_pins[i];
3871 dig_nid = look_for_dac(codec, pin, true);
3872 if (!dig_nid)
3873 continue;
3874 path = snd_hda_add_new_path(codec, dig_nid, pin, 0);
3875 if (!path)
3876 continue;
3877 print_nid_path(codec, "digout", path);
3878 path->active = true;
3879 path->pin_fixed = true;
3880 spec->digout_paths[i] = snd_hda_get_path_idx(codec, path);
3881 set_pin_target(codec, pin, PIN_OUT, false);
3882 if (!nums) {
3883 spec->multiout.dig_out_nid = dig_nid;
3884 spec->dig_out_type = spec->autocfg.dig_out_type[0];
3885 } else {
3886 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
3887 if (nums >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
3888 break;
3889 spec->slave_dig_outs[nums - 1] = dig_nid;
3890 }
3891 nums++;
3892 }
3893
3894 if (spec->autocfg.dig_in_pin) {
3895 pin = spec->autocfg.dig_in_pin;
3896 for_each_hda_codec_node(dig_nid, codec) {
3897 unsigned int wcaps = get_wcaps(codec, dig_nid);
3898 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
3899 continue;
3900 if (!(wcaps & AC_WCAP_DIGITAL))
3901 continue;
3902 path = snd_hda_add_new_path(codec, pin, dig_nid, 0);
3903 if (path) {
3904 print_nid_path(codec, "digin", path);
3905 path->active = true;
3906 path->pin_fixed = true;
3907 spec->dig_in_nid = dig_nid;
3908 spec->digin_path = snd_hda_get_path_idx(codec, path);
3909 set_pin_target(codec, pin, PIN_IN, false);
3910 break;
3911 }
3912 }
3913 }
3914}
3915
3916
3917
3918
3919
3920
3921static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur);
3922
3923
3924static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
3925 unsigned int idx)
3926{
3927 struct hda_gen_spec *spec = codec->spec;
3928 const struct hda_input_mux *imux;
3929 struct nid_path *old_path, *path;
3930
3931 imux = &spec->input_mux;
3932 if (!imux->num_items)
3933 return 0;
3934
3935 if (idx >= imux->num_items)
3936 idx = imux->num_items - 1;
3937 if (spec->cur_mux[adc_idx] == idx)
3938 return 0;
3939
3940 old_path = get_input_path(codec, adc_idx, spec->cur_mux[adc_idx]);
3941 if (!old_path)
3942 return 0;
3943 if (old_path->active)
3944 snd_hda_activate_path(codec, old_path, false, false);
3945
3946 spec->cur_mux[adc_idx] = idx;
3947
3948 if (spec->hp_mic)
3949 update_hp_mic(codec, adc_idx, false);
3950
3951 if (spec->dyn_adc_switch)
3952 dyn_adc_pcm_resetup(codec, idx);
3953
3954 path = get_input_path(codec, adc_idx, idx);
3955 if (!path)
3956 return 0;
3957 if (path->active)
3958 return 0;
3959 snd_hda_activate_path(codec, path, true, false);
3960 if (spec->cap_sync_hook)
3961 spec->cap_sync_hook(codec, NULL, NULL);
3962 path_power_down_sync(codec, old_path);
3963 return 1;
3964}
3965
3966
3967
3968
3969
3970
3971static hda_nid_t set_path_power(struct hda_codec *codec, hda_nid_t nid,
3972 int pin_state, int stream_state)
3973{
3974 struct hda_gen_spec *spec = codec->spec;
3975 hda_nid_t last, changed = 0;
3976 struct nid_path *path;
3977 int n;
3978
3979 for (n = 0; n < spec->paths.used; n++) {
3980 path = snd_array_elem(&spec->paths, n);
3981 if (!path->depth)
3982 continue;
3983 if (path->path[0] == nid ||
3984 path->path[path->depth - 1] == nid) {
3985 bool pin_old = path->pin_enabled;
3986 bool stream_old = path->stream_enabled;
3987
3988 if (pin_state >= 0)
3989 path->pin_enabled = pin_state;
3990 if (stream_state >= 0)
3991 path->stream_enabled = stream_state;
3992 if ((!path->pin_fixed && path->pin_enabled != pin_old)
3993 || path->stream_enabled != stream_old) {
3994 last = path_power_update(codec, path, true);
3995 if (last)
3996 changed = last;
3997 }
3998 }
3999 }
4000 return changed;
4001}
4002
4003
4004static bool detect_pin_state(struct hda_codec *codec, hda_nid_t pin)
4005{
4006 if (!is_jack_detectable(codec, pin))
4007 return true;
4008 return snd_hda_jack_detect_state(codec, pin) != HDA_JACK_NOT_PRESENT;
4009}
4010
4011
4012
4013
4014
4015
4016
4017static hda_nid_t set_pin_power_jack(struct hda_codec *codec, hda_nid_t pin,
4018 int power)
4019{
4020 bool on;
4021
4022 if (!codec->power_save_node)
4023 return 0;
4024
4025 on = detect_pin_state(codec, pin);
4026
4027 if (power >= 0 && on != power)
4028 return 0;
4029 return set_path_power(codec, pin, on, -1);
4030}
4031
4032static void pin_power_callback(struct hda_codec *codec,
4033 struct hda_jack_callback *jack,
4034 bool on)
4035{
4036 if (jack && jack->nid)
4037 sync_power_state_change(codec,
4038 set_pin_power_jack(codec, jack->nid, on));
4039}
4040
4041
4042static void pin_power_up_callback(struct hda_codec *codec,
4043 struct hda_jack_callback *jack)
4044{
4045 pin_power_callback(codec, jack, true);
4046}
4047
4048
4049static void pin_power_down_callback(struct hda_codec *codec,
4050 struct hda_jack_callback *jack)
4051{
4052 pin_power_callback(codec, jack, false);
4053}
4054
4055
4056static void add_pin_power_ctls(struct hda_codec *codec, int num_pins,
4057 const hda_nid_t *pins, bool on)
4058{
4059 int i;
4060 hda_jack_callback_fn cb =
4061 on ? pin_power_up_callback : pin_power_down_callback;
4062
4063 for (i = 0; i < num_pins && pins[i]; i++) {
4064 if (is_jack_detectable(codec, pins[i]))
4065 snd_hda_jack_detect_enable_callback(codec, pins[i], cb);
4066 else
4067 set_path_power(codec, pins[i], true, -1);
4068 }
4069}
4070
4071
4072
4073
4074static void add_all_pin_power_ctls(struct hda_codec *codec, bool on)
4075{
4076 struct hda_gen_spec *spec = codec->spec;
4077 struct auto_pin_cfg *cfg = &spec->autocfg;
4078 int i;
4079
4080 if (!codec->power_save_node)
4081 return;
4082 add_pin_power_ctls(codec, cfg->line_outs, cfg->line_out_pins, on);
4083 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
4084 add_pin_power_ctls(codec, cfg->hp_outs, cfg->hp_pins, on);
4085 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
4086 add_pin_power_ctls(codec, cfg->speaker_outs, cfg->speaker_pins, on);
4087 for (i = 0; i < cfg->num_inputs; i++)
4088 add_pin_power_ctls(codec, 1, &cfg->inputs[i].pin, on);
4089}
4090
4091
4092static void sync_pin_power_ctls(struct hda_codec *codec, int num_pins,
4093 const hda_nid_t *pins)
4094{
4095 int i;
4096
4097 for (i = 0; i < num_pins && pins[i]; i++)
4098 if (is_jack_detectable(codec, pins[i]))
4099 set_pin_power_jack(codec, pins[i], -1);
4100}
4101
4102
4103static void sync_all_pin_power_ctls(struct hda_codec *codec)
4104{
4105 struct hda_gen_spec *spec = codec->spec;
4106 struct auto_pin_cfg *cfg = &spec->autocfg;
4107 int i;
4108
4109 if (!codec->power_save_node)
4110 return;
4111 sync_pin_power_ctls(codec, cfg->line_outs, cfg->line_out_pins);
4112 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
4113 sync_pin_power_ctls(codec, cfg->hp_outs, cfg->hp_pins);
4114 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
4115 sync_pin_power_ctls(codec, cfg->speaker_outs, cfg->speaker_pins);
4116 for (i = 0; i < cfg->num_inputs; i++)
4117 sync_pin_power_ctls(codec, 1, &cfg->inputs[i].pin);
4118}
4119
4120
4121static int add_fake_paths(struct hda_codec *codec, hda_nid_t nid,
4122 int num_pins, const hda_nid_t *pins)
4123{
4124 struct hda_gen_spec *spec = codec->spec;
4125 struct nid_path *path;
4126 int i;
4127
4128 for (i = 0; i < num_pins; i++) {
4129 if (!pins[i])
4130 break;
4131 if (get_nid_path(codec, nid, pins[i], 0))
4132 continue;
4133 path = snd_array_new(&spec->paths);
4134 if (!path)
4135 return -ENOMEM;
4136 memset(path, 0, sizeof(*path));
4137 path->depth = 2;
4138 path->path[0] = nid;
4139 path->path[1] = pins[i];
4140 path->active = true;
4141 }
4142 return 0;
4143}
4144
4145
4146static int add_fake_beep_paths(struct hda_codec *codec)
4147{
4148 struct hda_gen_spec *spec = codec->spec;
4149 struct auto_pin_cfg *cfg = &spec->autocfg;
4150 hda_nid_t nid = spec->beep_nid;
4151 int err;
4152
4153 if (!codec->power_save_node || !nid)
4154 return 0;
4155 err = add_fake_paths(codec, nid, cfg->line_outs, cfg->line_out_pins);
4156 if (err < 0)
4157 return err;
4158 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
4159 err = add_fake_paths(codec, nid, cfg->hp_outs, cfg->hp_pins);
4160 if (err < 0)
4161 return err;
4162 }
4163 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
4164 err = add_fake_paths(codec, nid, cfg->speaker_outs,
4165 cfg->speaker_pins);
4166 if (err < 0)
4167 return err;
4168 }
4169 return 0;
4170}
4171
4172
4173static void beep_power_hook(struct hda_beep *beep, bool on)
4174{
4175 set_path_power(beep->codec, beep->nid, -1, on);
4176}
4177
4178
4179
4180
4181
4182
4183int snd_hda_gen_fix_pin_power(struct hda_codec *codec, hda_nid_t pin)
4184{
4185 struct hda_gen_spec *spec = codec->spec;
4186 struct nid_path *path;
4187
4188 path = snd_array_new(&spec->paths);
4189 if (!path)
4190 return -ENOMEM;
4191 memset(path, 0, sizeof(*path));
4192 path->depth = 1;
4193 path->path[0] = pin;
4194 path->active = true;
4195 path->pin_fixed = true;
4196 path->stream_enabled = true;
4197 return 0;
4198}
4199EXPORT_SYMBOL_GPL(snd_hda_gen_fix_pin_power);
4200
4201
4202
4203
4204
4205
4206static bool detect_jacks(struct hda_codec *codec, int num_pins, hda_nid_t *pins)
4207{
4208 int i;
4209 bool present = false;
4210
4211 for (i = 0; i < num_pins; i++) {
4212 hda_nid_t nid = pins[i];
4213 if (!nid)
4214 break;
4215
4216 if (snd_hda_codec_get_pin_target(codec, nid) & AC_PINCTL_IN_EN)
4217 continue;
4218 if (snd_hda_jack_detect_state(codec, nid) == HDA_JACK_PRESENT)
4219 present = true;
4220 }
4221 return present;
4222}
4223
4224
4225static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins,
4226 int *paths, bool mute)
4227{
4228 struct hda_gen_spec *spec = codec->spec;
4229 int i;
4230
4231 for (i = 0; i < num_pins; i++) {
4232 hda_nid_t nid = pins[i];
4233 unsigned int val, oldval;
4234 if (!nid)
4235 break;
4236
4237 oldval = snd_hda_codec_get_pin_target(codec, nid);
4238 if (oldval & PIN_IN)
4239 continue;
4240
4241 if (spec->auto_mute_via_amp) {
4242 struct nid_path *path;
4243 hda_nid_t mute_nid;
4244
4245 path = snd_hda_get_path_from_idx(codec, paths[i]);
4246 if (!path)
4247 continue;
4248 mute_nid = get_amp_nid_(path->ctls[NID_PATH_MUTE_CTL]);
4249 if (!mute_nid)
4250 continue;
4251 if (mute)
4252 spec->mute_bits |= (1ULL << mute_nid);
4253 else
4254 spec->mute_bits &= ~(1ULL << mute_nid);
4255 continue;
4256 } else {
4257
4258
4259
4260 if (spec->keep_vref_in_automute)
4261 val = oldval & ~PIN_HP;
4262 else
4263 val = 0;
4264 if (!mute)
4265 val |= oldval;
4266
4267
4268
4269
4270
4271 update_pin_ctl(codec, nid, val);
4272 }
4273
4274 set_pin_eapd(codec, nid, !mute);
4275 if (codec->power_save_node) {
4276 bool on = !mute;
4277 if (on)
4278 on = detect_pin_state(codec, nid);
4279 set_path_power(codec, nid, on, -1);
4280 }
4281 }
4282}
4283
4284
4285
4286
4287
4288
4289
4290void snd_hda_gen_update_outputs(struct hda_codec *codec)
4291{
4292 struct hda_gen_spec *spec = codec->spec;
4293 int *paths;
4294 int on;
4295
4296
4297
4298
4299
4300 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)
4301 paths = spec->out_paths;
4302 else
4303 paths = spec->hp_paths;
4304 do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
4305 spec->autocfg.hp_pins, paths, spec->master_mute);
4306
4307 if (!spec->automute_speaker)
4308 on = 0;
4309 else
4310 on = spec->hp_jack_present | spec->line_jack_present;
4311 on |= spec->master_mute;
4312 spec->speaker_muted = on;
4313 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
4314 paths = spec->out_paths;
4315 else
4316 paths = spec->speaker_paths;
4317 do_automute(codec, ARRAY_SIZE(spec->autocfg.speaker_pins),
4318 spec->autocfg.speaker_pins, paths, on);
4319
4320
4321
4322 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0] ||
4323 spec->autocfg.line_out_pins[0] == spec->autocfg.speaker_pins[0])
4324 return;
4325 if (!spec->automute_lo)
4326 on = 0;
4327 else
4328 on = spec->hp_jack_present;
4329 on |= spec->master_mute;
4330 spec->line_out_muted = on;
4331 paths = spec->out_paths;
4332 do_automute(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
4333 spec->autocfg.line_out_pins, paths, on);
4334}
4335EXPORT_SYMBOL_GPL(snd_hda_gen_update_outputs);
4336
4337static void call_update_outputs(struct hda_codec *codec)
4338{
4339 struct hda_gen_spec *spec = codec->spec;
4340 if (spec->automute_hook)
4341 spec->automute_hook(codec);
4342 else
4343 snd_hda_gen_update_outputs(codec);
4344
4345
4346 if (spec->auto_mute_via_amp && !codec->bus->shutdown)
4347 snd_ctl_sync_vmaster(spec->vmaster_mute.sw_kctl, false);
4348}
4349
4350
4351
4352
4353
4354
4355void snd_hda_gen_hp_automute(struct hda_codec *codec,
4356 struct hda_jack_callback *jack)
4357{
4358 struct hda_gen_spec *spec = codec->spec;
4359 hda_nid_t *pins = spec->autocfg.hp_pins;
4360 int num_pins = ARRAY_SIZE(spec->autocfg.hp_pins);
4361
4362
4363 if (spec->indep_hp_enabled) {
4364 pins++;
4365 num_pins--;
4366 }
4367
4368 spec->hp_jack_present = detect_jacks(codec, num_pins, pins);
4369 if (!spec->detect_hp || (!spec->automute_speaker && !spec->automute_lo))
4370 return;
4371 call_update_outputs(codec);
4372}
4373EXPORT_SYMBOL_GPL(snd_hda_gen_hp_automute);
4374
4375
4376
4377
4378
4379
4380void snd_hda_gen_line_automute(struct hda_codec *codec,
4381 struct hda_jack_callback *jack)
4382{
4383 struct hda_gen_spec *spec = codec->spec;
4384
4385 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
4386 return;
4387
4388 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0])
4389 return;
4390
4391 spec->line_jack_present =
4392 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
4393 spec->autocfg.line_out_pins);
4394 if (!spec->automute_speaker || !spec->detect_lo)
4395 return;
4396 call_update_outputs(codec);
4397}
4398EXPORT_SYMBOL_GPL(snd_hda_gen_line_automute);
4399
4400
4401
4402
4403
4404
4405void snd_hda_gen_mic_autoswitch(struct hda_codec *codec,
4406 struct hda_jack_callback *jack)
4407{
4408 struct hda_gen_spec *spec = codec->spec;
4409 int i;
4410
4411 if (!spec->auto_mic)
4412 return;
4413
4414 for (i = spec->am_num_entries - 1; i > 0; i--) {
4415 hda_nid_t pin = spec->am_entry[i].pin;
4416
4417 if (snd_hda_codec_get_pin_target(codec, pin) & AC_PINCTL_OUT_EN)
4418 continue;
4419 if (snd_hda_jack_detect_state(codec, pin) == HDA_JACK_PRESENT) {
4420 mux_select(codec, 0, spec->am_entry[i].idx);
4421 return;
4422 }
4423 }
4424 mux_select(codec, 0, spec->am_entry[0].idx);
4425}
4426EXPORT_SYMBOL_GPL(snd_hda_gen_mic_autoswitch);
4427
4428
4429static void call_hp_automute(struct hda_codec *codec,
4430 struct hda_jack_callback *jack)
4431{
4432 struct hda_gen_spec *spec = codec->spec;
4433 if (spec->hp_automute_hook)
4434 spec->hp_automute_hook(codec, jack);
4435 else
4436 snd_hda_gen_hp_automute(codec, jack);
4437}
4438
4439static void call_line_automute(struct hda_codec *codec,
4440 struct hda_jack_callback *jack)
4441{
4442 struct hda_gen_spec *spec = codec->spec;
4443 if (spec->line_automute_hook)
4444 spec->line_automute_hook(codec, jack);
4445 else
4446 snd_hda_gen_line_automute(codec, jack);
4447}
4448
4449static void call_mic_autoswitch(struct hda_codec *codec,
4450 struct hda_jack_callback *jack)
4451{
4452 struct hda_gen_spec *spec = codec->spec;
4453 if (spec->mic_autoswitch_hook)
4454 spec->mic_autoswitch_hook(codec, jack);
4455 else
4456 snd_hda_gen_mic_autoswitch(codec, jack);
4457}
4458
4459
4460static void update_automute_all(struct hda_codec *codec)
4461{
4462 call_hp_automute(codec, NULL);
4463 call_line_automute(codec, NULL);
4464 call_mic_autoswitch(codec, NULL);
4465}
4466
4467
4468
4469
4470static int automute_mode_info(struct snd_kcontrol *kcontrol,
4471 struct snd_ctl_elem_info *uinfo)
4472{
4473 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4474 struct hda_gen_spec *spec = codec->spec;
4475 static const char * const texts3[] = {
4476 "Disabled", "Speaker Only", "Line Out+Speaker"
4477 };
4478
4479 if (spec->automute_speaker_possible && spec->automute_lo_possible)
4480 return snd_hda_enum_helper_info(kcontrol, uinfo, 3, texts3);
4481 return snd_hda_enum_bool_helper_info(kcontrol, uinfo);
4482}
4483
4484static int automute_mode_get(struct snd_kcontrol *kcontrol,
4485 struct snd_ctl_elem_value *ucontrol)
4486{
4487 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4488 struct hda_gen_spec *spec = codec->spec;
4489 unsigned int val = 0;
4490 if (spec->automute_speaker)
4491 val++;
4492 if (spec->automute_lo)
4493 val++;
4494
4495 ucontrol->value.enumerated.item[0] = val;
4496 return 0;
4497}
4498
4499static int automute_mode_put(struct snd_kcontrol *kcontrol,
4500 struct snd_ctl_elem_value *ucontrol)
4501{
4502 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4503 struct hda_gen_spec *spec = codec->spec;
4504
4505 switch (ucontrol->value.enumerated.item[0]) {
4506 case 0:
4507 if (!spec->automute_speaker && !spec->automute_lo)
4508 return 0;
4509 spec->automute_speaker = 0;
4510 spec->automute_lo = 0;
4511 break;
4512 case 1:
4513 if (spec->automute_speaker_possible) {
4514 if (!spec->automute_lo && spec->automute_speaker)
4515 return 0;
4516 spec->automute_speaker = 1;
4517 spec->automute_lo = 0;
4518 } else if (spec->automute_lo_possible) {
4519 if (spec->automute_lo)
4520 return 0;
4521 spec->automute_lo = 1;
4522 } else
4523 return -EINVAL;
4524 break;
4525 case 2:
4526 if (!spec->automute_lo_possible || !spec->automute_speaker_possible)
4527 return -EINVAL;
4528 if (spec->automute_speaker && spec->automute_lo)
4529 return 0;
4530 spec->automute_speaker = 1;
4531 spec->automute_lo = 1;
4532 break;
4533 default:
4534 return -EINVAL;
4535 }
4536 call_update_outputs(codec);
4537 return 1;
4538}
4539
4540static const struct snd_kcontrol_new automute_mode_enum = {
4541 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4542 .name = "Auto-Mute Mode",
4543 .info = automute_mode_info,
4544 .get = automute_mode_get,
4545 .put = automute_mode_put,
4546};
4547
4548static int add_automute_mode_enum(struct hda_codec *codec)
4549{
4550 struct hda_gen_spec *spec = codec->spec;
4551
4552 if (!snd_hda_gen_add_kctl(spec, NULL, &automute_mode_enum))
4553 return -ENOMEM;
4554 return 0;
4555}
4556
4557
4558
4559
4560
4561static int check_auto_mute_availability(struct hda_codec *codec)
4562{
4563 struct hda_gen_spec *spec = codec->spec;
4564 struct auto_pin_cfg *cfg = &spec->autocfg;
4565 int present = 0;
4566 int i, err;
4567
4568 if (spec->suppress_auto_mute)
4569 return 0;
4570
4571 if (cfg->hp_pins[0])
4572 present++;
4573 if (cfg->line_out_pins[0])
4574 present++;
4575 if (cfg->speaker_pins[0])
4576 present++;
4577 if (present < 2)
4578 return 0;
4579
4580 if (!cfg->speaker_pins[0] &&
4581 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
4582 memcpy(cfg->speaker_pins, cfg->line_out_pins,
4583 sizeof(cfg->speaker_pins));
4584 cfg->speaker_outs = cfg->line_outs;
4585 }
4586
4587 if (!cfg->hp_pins[0] &&
4588 cfg->line_out_type == AUTO_PIN_HP_OUT) {
4589 memcpy(cfg->hp_pins, cfg->line_out_pins,
4590 sizeof(cfg->hp_pins));
4591 cfg->hp_outs = cfg->line_outs;
4592 }
4593
4594 for (i = 0; i < cfg->hp_outs; i++) {
4595 hda_nid_t nid = cfg->hp_pins[i];
4596 if (!is_jack_detectable(codec, nid))
4597 continue;
4598 codec_dbg(codec, "Enable HP auto-muting on NID 0x%x\n", nid);
4599 snd_hda_jack_detect_enable_callback(codec, nid,
4600 call_hp_automute);
4601 spec->detect_hp = 1;
4602 }
4603
4604 if (cfg->line_out_type == AUTO_PIN_LINE_OUT && cfg->line_outs) {
4605 if (cfg->speaker_outs)
4606 for (i = 0; i < cfg->line_outs; i++) {
4607 hda_nid_t nid = cfg->line_out_pins[i];
4608 if (!is_jack_detectable(codec, nid))
4609 continue;
4610 codec_dbg(codec, "Enable Line-Out auto-muting on NID 0x%x\n", nid);
4611 snd_hda_jack_detect_enable_callback(codec, nid,
4612 call_line_automute);
4613 spec->detect_lo = 1;
4614 }
4615 spec->automute_lo_possible = spec->detect_hp;
4616 }
4617
4618 spec->automute_speaker_possible = cfg->speaker_outs &&
4619 (spec->detect_hp || spec->detect_lo);
4620
4621 spec->automute_lo = spec->automute_lo_possible;
4622 spec->automute_speaker = spec->automute_speaker_possible;
4623
4624 if (spec->automute_speaker_possible || spec->automute_lo_possible) {
4625
4626 err = add_automute_mode_enum(codec);
4627 if (err < 0)
4628 return err;
4629 }
4630 return 0;
4631}
4632
4633
4634static bool auto_mic_check_imux(struct hda_codec *codec)
4635{
4636 struct hda_gen_spec *spec = codec->spec;
4637 const struct hda_input_mux *imux;
4638 int i;
4639
4640 imux = &spec->input_mux;
4641 for (i = 0; i < spec->am_num_entries; i++) {
4642 spec->am_entry[i].idx =
4643 find_idx_in_nid_list(spec->am_entry[i].pin,
4644 spec->imux_pins, imux->num_items);
4645 if (spec->am_entry[i].idx < 0)
4646 return false;
4647 }
4648
4649
4650 for (i = 1; i < spec->am_num_entries; i++)
4651 snd_hda_jack_detect_enable_callback(codec,
4652 spec->am_entry[i].pin,
4653 call_mic_autoswitch);
4654 return true;
4655}
4656
4657static int compare_attr(const void *ap, const void *bp)
4658{
4659 const struct automic_entry *a = ap;
4660 const struct automic_entry *b = bp;
4661 return (int)(a->attr - b->attr);
4662}
4663
4664
4665
4666
4667
4668static int check_auto_mic_availability(struct hda_codec *codec)
4669{
4670 struct hda_gen_spec *spec = codec->spec;
4671 struct auto_pin_cfg *cfg = &spec->autocfg;
4672 unsigned int types;
4673 int i, num_pins;
4674
4675 if (spec->suppress_auto_mic)
4676 return 0;
4677
4678 types = 0;
4679 num_pins = 0;
4680 for (i = 0; i < cfg->num_inputs; i++) {
4681 hda_nid_t nid = cfg->inputs[i].pin;
4682 unsigned int attr;
4683 attr = snd_hda_codec_get_pincfg(codec, nid);
4684 attr = snd_hda_get_input_pin_attr(attr);
4685 if (types & (1 << attr))
4686 return 0;
4687 switch (attr) {
4688 case INPUT_PIN_ATTR_INT:
4689 if (cfg->inputs[i].type != AUTO_PIN_MIC)
4690 return 0;
4691 break;
4692 case INPUT_PIN_ATTR_UNUSED:
4693 return 0;
4694 default:
4695 if (cfg->inputs[i].type > AUTO_PIN_LINE_IN)
4696 return 0;
4697 if (!spec->line_in_auto_switch &&
4698 cfg->inputs[i].type != AUTO_PIN_MIC)
4699 return 0;
4700 if (!is_jack_detectable(codec, nid))
4701 return 0;
4702 break;
4703 }
4704 if (num_pins >= MAX_AUTO_MIC_PINS)
4705 return 0;
4706 types |= (1 << attr);
4707 spec->am_entry[num_pins].pin = nid;
4708 spec->am_entry[num_pins].attr = attr;
4709 num_pins++;
4710 }
4711
4712 if (num_pins < 2)
4713 return 0;
4714
4715 spec->am_num_entries = num_pins;
4716
4717
4718
4719 sort(spec->am_entry, num_pins, sizeof(spec->am_entry[0]),
4720 compare_attr, NULL);
4721
4722 if (!auto_mic_check_imux(codec))
4723 return 0;
4724
4725 spec->auto_mic = 1;
4726 spec->num_adc_nids = 1;
4727 spec->cur_mux[0] = spec->am_entry[0].idx;
4728 codec_dbg(codec, "Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n",
4729 spec->am_entry[0].pin,
4730 spec->am_entry[1].pin,
4731 spec->am_entry[2].pin);
4732
4733 return 0;
4734}
4735
4736
4737
4738
4739
4740
4741
4742
4743unsigned int snd_hda_gen_path_power_filter(struct hda_codec *codec,
4744 hda_nid_t nid,
4745 unsigned int power_state)
4746{
4747 struct hda_gen_spec *spec = codec->spec;
4748
4749 if (!spec->power_down_unused && !codec->power_save_node)
4750 return power_state;
4751 if (power_state != AC_PWRST_D0 || nid == codec->core.afg)
4752 return power_state;
4753 if (get_wcaps_type(get_wcaps(codec, nid)) >= AC_WID_POWER)
4754 return power_state;
4755 if (is_active_nid_for_any(codec, nid))
4756 return power_state;
4757 return AC_PWRST_D3;
4758}
4759EXPORT_SYMBOL_GPL(snd_hda_gen_path_power_filter);
4760
4761
4762static void mute_all_mixer_nid(struct hda_codec *codec, hda_nid_t mix)
4763{
4764 int i, nums;
4765 const hda_nid_t *conn;
4766 bool has_amp;
4767
4768 nums = snd_hda_get_conn_list(codec, mix, &conn);
4769 has_amp = nid_has_mute(codec, mix, HDA_INPUT);
4770 for (i = 0; i < nums; i++) {
4771 if (has_amp)
4772 update_amp(codec, mix, HDA_INPUT, i,
4773 0xff, HDA_AMP_MUTE);
4774 else if (nid_has_volume(codec, conn[i], HDA_OUTPUT))
4775 update_amp(codec, conn[i], HDA_OUTPUT, 0,
4776 0xff, HDA_AMP_MUTE);
4777 }
4778}
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788void snd_hda_gen_stream_pm(struct hda_codec *codec, hda_nid_t nid, bool on)
4789{
4790 if (codec->power_save_node)
4791 set_path_power(codec, nid, -1, on);
4792}
4793EXPORT_SYMBOL_GPL(snd_hda_gen_stream_pm);
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
4805 struct auto_pin_cfg *cfg)
4806{
4807 struct hda_gen_spec *spec = codec->spec;
4808 int err;
4809
4810 parse_user_hints(codec);
4811
4812 if (spec->mixer_nid && !spec->mixer_merge_nid)
4813 spec->mixer_merge_nid = spec->mixer_nid;
4814
4815 if (cfg != &spec->autocfg) {
4816 spec->autocfg = *cfg;
4817 cfg = &spec->autocfg;
4818 }
4819
4820 if (!spec->main_out_badness)
4821 spec->main_out_badness = &hda_main_out_badness;
4822 if (!spec->extra_out_badness)
4823 spec->extra_out_badness = &hda_extra_out_badness;
4824
4825 fill_all_dac_nids(codec);
4826
4827 if (!cfg->line_outs) {
4828 if (cfg->dig_outs || cfg->dig_in_pin) {
4829 spec->multiout.max_channels = 2;
4830 spec->no_analog = 1;
4831 goto dig_only;
4832 }
4833 if (!cfg->num_inputs && !cfg->dig_in_pin)
4834 return 0;
4835 }
4836
4837 if (!spec->no_primary_hp &&
4838 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT &&
4839 cfg->line_outs <= cfg->hp_outs) {
4840
4841 cfg->speaker_outs = cfg->line_outs;
4842 memcpy(cfg->speaker_pins, cfg->line_out_pins,
4843 sizeof(cfg->speaker_pins));
4844 cfg->line_outs = cfg->hp_outs;
4845 memcpy(cfg->line_out_pins, cfg->hp_pins, sizeof(cfg->hp_pins));
4846 cfg->hp_outs = 0;
4847 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
4848 cfg->line_out_type = AUTO_PIN_HP_OUT;
4849 }
4850
4851 err = parse_output_paths(codec);
4852 if (err < 0)
4853 return err;
4854 err = create_multi_channel_mode(codec);
4855 if (err < 0)
4856 return err;
4857 err = create_multi_out_ctls(codec, cfg);
4858 if (err < 0)
4859 return err;
4860 err = create_hp_out_ctls(codec);
4861 if (err < 0)
4862 return err;
4863 err = create_speaker_out_ctls(codec);
4864 if (err < 0)
4865 return err;
4866 err = create_indep_hp_ctls(codec);
4867 if (err < 0)
4868 return err;
4869 err = create_loopback_mixing_ctl(codec);
4870 if (err < 0)
4871 return err;
4872 err = create_hp_mic(codec);
4873 if (err < 0)
4874 return err;
4875 err = create_input_ctls(codec);
4876 if (err < 0)
4877 return err;
4878
4879
4880 add_all_pin_power_ctls(codec, false);
4881
4882 spec->const_channel_count = spec->ext_channel_count;
4883
4884 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
4885 spec->const_channel_count = max(spec->const_channel_count,
4886 cfg->speaker_outs * 2);
4887 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
4888 spec->const_channel_count = max(spec->const_channel_count,
4889 cfg->hp_outs * 2);
4890 spec->multiout.max_channels = max(spec->ext_channel_count,
4891 spec->const_channel_count);
4892
4893 err = check_auto_mute_availability(codec);
4894 if (err < 0)
4895 return err;
4896
4897 err = check_dyn_adc_switch(codec);
4898 if (err < 0)
4899 return err;
4900
4901 err = check_auto_mic_availability(codec);
4902 if (err < 0)
4903 return err;
4904
4905
4906 if (!spec->auto_mic && spec->mixer_nid &&
4907 spec->add_stereo_mix_input == HDA_HINT_STEREO_MIX_AUTO &&
4908 spec->input_mux.num_items > 1) {
4909 err = parse_capture_source(codec, spec->mixer_nid,
4910 CFG_IDX_MIX, spec->num_all_adcs,
4911 "Stereo Mix", 0);
4912 if (err < 0)
4913 return err;
4914 }
4915
4916
4917 err = create_capture_mixers(codec);
4918 if (err < 0)
4919 return err;
4920
4921 err = parse_mic_boost(codec);
4922 if (err < 0)
4923 return err;
4924
4925
4926
4927
4928 if (spec->hp_mic_pin &&
4929 (spec->auto_mic || spec->input_mux.num_items == 1 ||
4930 spec->add_jack_modes)) {
4931 err = create_hp_mic_jack_mode(codec, spec->hp_mic_pin);
4932 if (err < 0)
4933 return err;
4934 }
4935
4936 if (spec->add_jack_modes) {
4937 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
4938 err = create_out_jack_modes(codec, cfg->line_outs,
4939 cfg->line_out_pins);
4940 if (err < 0)
4941 return err;
4942 }
4943 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
4944 err = create_out_jack_modes(codec, cfg->hp_outs,
4945 cfg->hp_pins);
4946 if (err < 0)
4947 return err;
4948 }
4949 }
4950
4951
4952 add_all_pin_power_ctls(codec, true);
4953
4954
4955 if (spec->mixer_nid)
4956 mute_all_mixer_nid(codec, spec->mixer_nid);
4957
4958 dig_only:
4959 parse_digital(codec);
4960
4961 if (spec->power_down_unused || codec->power_save_node) {
4962 if (!codec->power_filter)
4963 codec->power_filter = snd_hda_gen_path_power_filter;
4964 if (!codec->patch_ops.stream_pm)
4965 codec->patch_ops.stream_pm = snd_hda_gen_stream_pm;
4966 }
4967
4968 if (!spec->no_analog && spec->beep_nid) {
4969 err = snd_hda_attach_beep_device(codec, spec->beep_nid);
4970 if (err < 0)
4971 return err;
4972 if (codec->beep && codec->power_save_node) {
4973 err = add_fake_beep_paths(codec);
4974 if (err < 0)
4975 return err;
4976 codec->beep->power_hook = beep_power_hook;
4977 }
4978 }
4979
4980 return 1;
4981}
4982EXPORT_SYMBOL_GPL(snd_hda_gen_parse_auto_config);
4983
4984
4985
4986
4987
4988
4989
4990static const char * const slave_pfxs[] = {
4991 "Front", "Surround", "Center", "LFE", "Side",
4992 "Headphone", "Speaker", "Mono", "Line Out",
4993 "CLFE", "Bass Speaker", "PCM",
4994 "Speaker Front", "Speaker Surround", "Speaker CLFE", "Speaker Side",
4995 "Headphone Front", "Headphone Surround", "Headphone CLFE",
4996 "Headphone Side", "Headphone+LO", "Speaker+LO",
4997 NULL,
4998};
4999
5000
5001
5002
5003
5004
5005
5006int snd_hda_gen_build_controls(struct hda_codec *codec)
5007{
5008 struct hda_gen_spec *spec = codec->spec;
5009 int err;
5010
5011 if (spec->kctls.used) {
5012 err = snd_hda_add_new_ctls(codec, spec->kctls.list);
5013 if (err < 0)
5014 return err;
5015 }
5016
5017 if (spec->multiout.dig_out_nid) {
5018 err = snd_hda_create_dig_out_ctls(codec,
5019 spec->multiout.dig_out_nid,
5020 spec->multiout.dig_out_nid,
5021 spec->pcm_rec[1]->pcm_type);
5022 if (err < 0)
5023 return err;
5024 if (!spec->no_analog) {
5025 err = snd_hda_create_spdif_share_sw(codec,
5026 &spec->multiout);
5027 if (err < 0)
5028 return err;
5029 spec->multiout.share_spdif = 1;
5030 }
5031 }
5032 if (spec->dig_in_nid) {
5033 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
5034 if (err < 0)
5035 return err;
5036 }
5037
5038
5039 if (!spec->no_analog && !spec->suppress_vmaster &&
5040 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
5041 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
5042 spec->vmaster_tlv, slave_pfxs,
5043 "Playback Volume");
5044 if (err < 0)
5045 return err;
5046 }
5047 if (!spec->no_analog && !spec->suppress_vmaster &&
5048 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
5049 err = __snd_hda_add_vmaster(codec, "Master Playback Switch",
5050 NULL, slave_pfxs,
5051 "Playback Switch",
5052 true, &spec->vmaster_mute.sw_kctl);
5053 if (err < 0)
5054 return err;
5055 if (spec->vmaster_mute.hook) {
5056 snd_hda_add_vmaster_hook(codec, &spec->vmaster_mute,
5057 spec->vmaster_mute_enum);
5058 snd_hda_sync_vmaster_hook(&spec->vmaster_mute);
5059 }
5060 }
5061
5062 free_kctls(spec);
5063
5064 err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
5065 if (err < 0)
5066 return err;
5067
5068 return 0;
5069}
5070EXPORT_SYMBOL_GPL(snd_hda_gen_build_controls);
5071
5072
5073
5074
5075
5076
5077static void call_pcm_playback_hook(struct hda_pcm_stream *hinfo,
5078 struct hda_codec *codec,
5079 struct snd_pcm_substream *substream,
5080 int action)
5081{
5082 struct hda_gen_spec *spec = codec->spec;
5083 if (spec->pcm_playback_hook)
5084 spec->pcm_playback_hook(hinfo, codec, substream, action);
5085}
5086
5087static void call_pcm_capture_hook(struct hda_pcm_stream *hinfo,
5088 struct hda_codec *codec,
5089 struct snd_pcm_substream *substream,
5090 int action)
5091{
5092 struct hda_gen_spec *spec = codec->spec;
5093 if (spec->pcm_capture_hook)
5094 spec->pcm_capture_hook(hinfo, codec, substream, action);
5095}
5096
5097
5098
5099
5100static int playback_pcm_open(struct hda_pcm_stream *hinfo,
5101 struct hda_codec *codec,
5102 struct snd_pcm_substream *substream)
5103{
5104 struct hda_gen_spec *spec = codec->spec;
5105 int err;
5106
5107 mutex_lock(&spec->pcm_mutex);
5108 err = snd_hda_multi_out_analog_open(codec,
5109 &spec->multiout, substream,
5110 hinfo);
5111 if (!err) {
5112 spec->active_streams |= 1 << STREAM_MULTI_OUT;
5113 call_pcm_playback_hook(hinfo, codec, substream,
5114 HDA_GEN_PCM_ACT_OPEN);
5115 }
5116 mutex_unlock(&spec->pcm_mutex);
5117 return err;
5118}
5119
5120static int playback_pcm_prepare(struct hda_pcm_stream *hinfo,
5121 struct hda_codec *codec,
5122 unsigned int stream_tag,
5123 unsigned int format,
5124 struct snd_pcm_substream *substream)
5125{
5126 struct hda_gen_spec *spec = codec->spec;
5127 int err;
5128
5129 err = snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
5130 stream_tag, format, substream);
5131 if (!err)
5132 call_pcm_playback_hook(hinfo, codec, substream,
5133 HDA_GEN_PCM_ACT_PREPARE);
5134 return err;
5135}
5136
5137static int playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
5138 struct hda_codec *codec,
5139 struct snd_pcm_substream *substream)
5140{
5141 struct hda_gen_spec *spec = codec->spec;
5142 int err;
5143
5144 err = snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
5145 if (!err)
5146 call_pcm_playback_hook(hinfo, codec, substream,
5147 HDA_GEN_PCM_ACT_CLEANUP);
5148 return err;
5149}
5150
5151static int playback_pcm_close(struct hda_pcm_stream *hinfo,
5152 struct hda_codec *codec,
5153 struct snd_pcm_substream *substream)
5154{
5155 struct hda_gen_spec *spec = codec->spec;
5156 mutex_lock(&spec->pcm_mutex);
5157 spec->active_streams &= ~(1 << STREAM_MULTI_OUT);
5158 call_pcm_playback_hook(hinfo, codec, substream,
5159 HDA_GEN_PCM_ACT_CLOSE);
5160 mutex_unlock(&spec->pcm_mutex);
5161 return 0;
5162}
5163
5164static int capture_pcm_open(struct hda_pcm_stream *hinfo,
5165 struct hda_codec *codec,
5166 struct snd_pcm_substream *substream)
5167{
5168 call_pcm_capture_hook(hinfo, codec, substream, HDA_GEN_PCM_ACT_OPEN);
5169 return 0;
5170}
5171
5172static int capture_pcm_prepare(struct hda_pcm_stream *hinfo,
5173 struct hda_codec *codec,
5174 unsigned int stream_tag,
5175 unsigned int format,
5176 struct snd_pcm_substream *substream)
5177{
5178 snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format);
5179 call_pcm_capture_hook(hinfo, codec, substream,
5180 HDA_GEN_PCM_ACT_PREPARE);
5181 return 0;
5182}
5183
5184static int capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
5185 struct hda_codec *codec,
5186 struct snd_pcm_substream *substream)
5187{
5188 snd_hda_codec_cleanup_stream(codec, hinfo->nid);
5189 call_pcm_capture_hook(hinfo, codec, substream,
5190 HDA_GEN_PCM_ACT_CLEANUP);
5191 return 0;
5192}
5193
5194static int capture_pcm_close(struct hda_pcm_stream *hinfo,
5195 struct hda_codec *codec,
5196 struct snd_pcm_substream *substream)
5197{
5198 call_pcm_capture_hook(hinfo, codec, substream, HDA_GEN_PCM_ACT_CLOSE);
5199 return 0;
5200}
5201
5202static int alt_playback_pcm_open(struct hda_pcm_stream *hinfo,
5203 struct hda_codec *codec,
5204 struct snd_pcm_substream *substream)
5205{
5206 struct hda_gen_spec *spec = codec->spec;
5207 int err = 0;
5208
5209 mutex_lock(&spec->pcm_mutex);
5210 if (spec->indep_hp && !spec->indep_hp_enabled)
5211 err = -EBUSY;
5212 else
5213 spec->active_streams |= 1 << STREAM_INDEP_HP;
5214 call_pcm_playback_hook(hinfo, codec, substream,
5215 HDA_GEN_PCM_ACT_OPEN);
5216 mutex_unlock(&spec->pcm_mutex);
5217 return err;
5218}
5219
5220static int alt_playback_pcm_close(struct hda_pcm_stream *hinfo,
5221 struct hda_codec *codec,
5222 struct snd_pcm_substream *substream)
5223{
5224 struct hda_gen_spec *spec = codec->spec;
5225 mutex_lock(&spec->pcm_mutex);
5226 spec->active_streams &= ~(1 << STREAM_INDEP_HP);
5227 call_pcm_playback_hook(hinfo, codec, substream,
5228 HDA_GEN_PCM_ACT_CLOSE);
5229 mutex_unlock(&spec->pcm_mutex);
5230 return 0;
5231}
5232
5233static int alt_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
5234 struct hda_codec *codec,
5235 unsigned int stream_tag,
5236 unsigned int format,
5237 struct snd_pcm_substream *substream)
5238{
5239 snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format);
5240 call_pcm_playback_hook(hinfo, codec, substream,
5241 HDA_GEN_PCM_ACT_PREPARE);
5242 return 0;
5243}
5244
5245static int alt_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
5246 struct hda_codec *codec,
5247 struct snd_pcm_substream *substream)
5248{
5249 snd_hda_codec_cleanup_stream(codec, hinfo->nid);
5250 call_pcm_playback_hook(hinfo, codec, substream,
5251 HDA_GEN_PCM_ACT_CLEANUP);
5252 return 0;
5253}
5254
5255
5256
5257
5258static int dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
5259 struct hda_codec *codec,
5260 struct snd_pcm_substream *substream)
5261{
5262 struct hda_gen_spec *spec = codec->spec;
5263 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
5264}
5265
5266static int dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
5267 struct hda_codec *codec,
5268 unsigned int stream_tag,
5269 unsigned int format,
5270 struct snd_pcm_substream *substream)
5271{
5272 struct hda_gen_spec *spec = codec->spec;
5273 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
5274 stream_tag, format, substream);
5275}
5276
5277static int dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
5278 struct hda_codec *codec,
5279 struct snd_pcm_substream *substream)
5280{
5281 struct hda_gen_spec *spec = codec->spec;
5282 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
5283}
5284
5285static int dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
5286 struct hda_codec *codec,
5287 struct snd_pcm_substream *substream)
5288{
5289 struct hda_gen_spec *spec = codec->spec;
5290 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
5291}
5292
5293
5294
5295
5296#define alt_capture_pcm_open capture_pcm_open
5297#define alt_capture_pcm_close capture_pcm_close
5298
5299static int alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
5300 struct hda_codec *codec,
5301 unsigned int stream_tag,
5302 unsigned int format,
5303 struct snd_pcm_substream *substream)
5304{
5305 struct hda_gen_spec *spec = codec->spec;
5306
5307 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
5308 stream_tag, 0, format);
5309 call_pcm_capture_hook(hinfo, codec, substream,
5310 HDA_GEN_PCM_ACT_PREPARE);
5311 return 0;
5312}
5313
5314static int alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
5315 struct hda_codec *codec,
5316 struct snd_pcm_substream *substream)
5317{
5318 struct hda_gen_spec *spec = codec->spec;
5319
5320 snd_hda_codec_cleanup_stream(codec,
5321 spec->adc_nids[substream->number + 1]);
5322 call_pcm_capture_hook(hinfo, codec, substream,
5323 HDA_GEN_PCM_ACT_CLEANUP);
5324 return 0;
5325}
5326
5327
5328
5329static const struct hda_pcm_stream pcm_analog_playback = {
5330 .substreams = 1,
5331 .channels_min = 2,
5332 .channels_max = 8,
5333
5334 .ops = {
5335 .open = playback_pcm_open,
5336 .close = playback_pcm_close,
5337 .prepare = playback_pcm_prepare,
5338 .cleanup = playback_pcm_cleanup
5339 },
5340};
5341
5342static const struct hda_pcm_stream pcm_analog_capture = {
5343 .substreams = 1,
5344 .channels_min = 2,
5345 .channels_max = 2,
5346
5347 .ops = {
5348 .open = capture_pcm_open,
5349 .close = capture_pcm_close,
5350 .prepare = capture_pcm_prepare,
5351 .cleanup = capture_pcm_cleanup
5352 },
5353};
5354
5355static const struct hda_pcm_stream pcm_analog_alt_playback = {
5356 .substreams = 1,
5357 .channels_min = 2,
5358 .channels_max = 2,
5359
5360 .ops = {
5361 .open = alt_playback_pcm_open,
5362 .close = alt_playback_pcm_close,
5363 .prepare = alt_playback_pcm_prepare,
5364 .cleanup = alt_playback_pcm_cleanup
5365 },
5366};
5367
5368static const struct hda_pcm_stream pcm_analog_alt_capture = {
5369 .substreams = 2,
5370 .channels_min = 2,
5371 .channels_max = 2,
5372
5373 .ops = {
5374 .open = alt_capture_pcm_open,
5375 .close = alt_capture_pcm_close,
5376 .prepare = alt_capture_pcm_prepare,
5377 .cleanup = alt_capture_pcm_cleanup
5378 },
5379};
5380
5381static const struct hda_pcm_stream pcm_digital_playback = {
5382 .substreams = 1,
5383 .channels_min = 2,
5384 .channels_max = 2,
5385
5386 .ops = {
5387 .open = dig_playback_pcm_open,
5388 .close = dig_playback_pcm_close,
5389 .prepare = dig_playback_pcm_prepare,
5390 .cleanup = dig_playback_pcm_cleanup
5391 },
5392};
5393
5394static const struct hda_pcm_stream pcm_digital_capture = {
5395 .substreams = 1,
5396 .channels_min = 2,
5397 .channels_max = 2,
5398
5399};
5400
5401
5402static const struct hda_pcm_stream pcm_null_stream = {
5403 .substreams = 0,
5404 .channels_min = 0,
5405 .channels_max = 0,
5406};
5407
5408
5409
5410
5411static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur)
5412{
5413 struct hda_gen_spec *spec = codec->spec;
5414 hda_nid_t new_adc = spec->adc_nids[spec->dyn_adc_idx[cur]];
5415
5416 if (spec->cur_adc && spec->cur_adc != new_adc) {
5417
5418 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
5419 spec->cur_adc = new_adc;
5420 snd_hda_codec_setup_stream(codec, new_adc,
5421 spec->cur_adc_stream_tag, 0,
5422 spec->cur_adc_format);
5423 return true;
5424 }
5425 return false;
5426}
5427
5428
5429static int dyn_adc_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
5430 struct hda_codec *codec,
5431 unsigned int stream_tag,
5432 unsigned int format,
5433 struct snd_pcm_substream *substream)
5434{
5435 struct hda_gen_spec *spec = codec->spec;
5436 spec->cur_adc = spec->adc_nids[spec->dyn_adc_idx[spec->cur_mux[0]]];
5437 spec->cur_adc_stream_tag = stream_tag;
5438 spec->cur_adc_format = format;
5439 snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
5440 call_pcm_capture_hook(hinfo, codec, substream, HDA_GEN_PCM_ACT_PREPARE);
5441 return 0;
5442}
5443
5444static int dyn_adc_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
5445 struct hda_codec *codec,
5446 struct snd_pcm_substream *substream)
5447{
5448 struct hda_gen_spec *spec = codec->spec;
5449 snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
5450 spec->cur_adc = 0;
5451 call_pcm_capture_hook(hinfo, codec, substream, HDA_GEN_PCM_ACT_CLEANUP);
5452 return 0;
5453}
5454
5455static const struct hda_pcm_stream dyn_adc_pcm_analog_capture = {
5456 .substreams = 1,
5457 .channels_min = 2,
5458 .channels_max = 2,
5459 .nid = 0,
5460 .ops = {
5461 .prepare = dyn_adc_capture_pcm_prepare,
5462 .cleanup = dyn_adc_capture_pcm_cleanup
5463 },
5464};
5465
5466static void fill_pcm_stream_name(char *str, size_t len, const char *sfx,
5467 const char *chip_name)
5468{
5469 char *p;
5470
5471 if (*str)
5472 return;
5473 strlcpy(str, chip_name, len);
5474
5475
5476 for (p = strchr(str, ' '); p; p = strchr(p + 1, ' ')) {
5477 if (!isalnum(p[1])) {
5478 *p = 0;
5479 break;
5480 }
5481 }
5482 strlcat(str, sfx, len);
5483}
5484
5485
5486
5487
5488static void setup_pcm_stream(struct hda_pcm_stream *str,
5489 const struct hda_pcm_stream *default_str,
5490 const struct hda_pcm_stream *spec_str,
5491 hda_nid_t nid)
5492{
5493 *str = *default_str;
5494 if (nid)
5495 str->nid = nid;
5496 if (spec_str) {
5497 if (spec_str->substreams)
5498 str->substreams = spec_str->substreams;
5499 if (spec_str->channels_min)
5500 str->channels_min = spec_str->channels_min;
5501 if (spec_str->channels_max)
5502 str->channels_max = spec_str->channels_max;
5503 if (spec_str->rates)
5504 str->rates = spec_str->rates;
5505 if (spec_str->formats)
5506 str->formats = spec_str->formats;
5507 if (spec_str->maxbps)
5508 str->maxbps = spec_str->maxbps;
5509 }
5510}
5511
5512
5513
5514
5515
5516
5517
5518int snd_hda_gen_build_pcms(struct hda_codec *codec)
5519{
5520 struct hda_gen_spec *spec = codec->spec;
5521 struct hda_pcm *info;
5522 bool have_multi_adcs;
5523
5524 if (spec->no_analog)
5525 goto skip_analog;
5526
5527 fill_pcm_stream_name(spec->stream_name_analog,
5528 sizeof(spec->stream_name_analog),
5529 " Analog", codec->core.chip_name);
5530 info = snd_hda_codec_pcm_new(codec, "%s", spec->stream_name_analog);
5531 if (!info)
5532 return -ENOMEM;
5533 spec->pcm_rec[0] = info;
5534
5535 if (spec->multiout.num_dacs > 0) {
5536 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_PLAYBACK],
5537 &pcm_analog_playback,
5538 spec->stream_analog_playback,
5539 spec->multiout.dac_nids[0]);
5540 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
5541 spec->multiout.max_channels;
5542 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT &&
5543 spec->autocfg.line_outs == 2)
5544 info->stream[SNDRV_PCM_STREAM_PLAYBACK].chmap =
5545 snd_pcm_2_1_chmaps;
5546 }
5547 if (spec->num_adc_nids) {
5548 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_CAPTURE],
5549 (spec->dyn_adc_switch ?
5550 &dyn_adc_pcm_analog_capture : &pcm_analog_capture),
5551 spec->stream_analog_capture,
5552 spec->adc_nids[0]);
5553 }
5554
5555 skip_analog:
5556
5557 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
5558 fill_pcm_stream_name(spec->stream_name_digital,
5559 sizeof(spec->stream_name_digital),
5560 " Digital", codec->core.chip_name);
5561 info = snd_hda_codec_pcm_new(codec, "%s",
5562 spec->stream_name_digital);
5563 if (!info)
5564 return -ENOMEM;
5565 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
5566 spec->pcm_rec[1] = info;
5567 if (spec->dig_out_type)
5568 info->pcm_type = spec->dig_out_type;
5569 else
5570 info->pcm_type = HDA_PCM_TYPE_SPDIF;
5571 if (spec->multiout.dig_out_nid)
5572 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_PLAYBACK],
5573 &pcm_digital_playback,
5574 spec->stream_digital_playback,
5575 spec->multiout.dig_out_nid);
5576 if (spec->dig_in_nid)
5577 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_CAPTURE],
5578 &pcm_digital_capture,
5579 spec->stream_digital_capture,
5580 spec->dig_in_nid);
5581 }
5582
5583 if (spec->no_analog)
5584 return 0;
5585
5586
5587
5588
5589 have_multi_adcs = (spec->num_adc_nids > 1) &&
5590 !spec->dyn_adc_switch && !spec->auto_mic;
5591
5592 if (spec->alt_dac_nid || have_multi_adcs) {
5593 fill_pcm_stream_name(spec->stream_name_alt_analog,
5594 sizeof(spec->stream_name_alt_analog),
5595 " Alt Analog", codec->core.chip_name);
5596 info = snd_hda_codec_pcm_new(codec, "%s",
5597 spec->stream_name_alt_analog);
5598 if (!info)
5599 return -ENOMEM;
5600 spec->pcm_rec[2] = info;
5601 if (spec->alt_dac_nid)
5602 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_PLAYBACK],
5603 &pcm_analog_alt_playback,
5604 spec->stream_analog_alt_playback,
5605 spec->alt_dac_nid);
5606 else
5607 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_PLAYBACK],
5608 &pcm_null_stream, NULL, 0);
5609 if (have_multi_adcs) {
5610 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_CAPTURE],
5611 &pcm_analog_alt_capture,
5612 spec->stream_analog_alt_capture,
5613 spec->adc_nids[1]);
5614 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
5615 spec->num_adc_nids - 1;
5616 } else {
5617 setup_pcm_stream(&info->stream[SNDRV_PCM_STREAM_CAPTURE],
5618 &pcm_null_stream, NULL, 0);
5619 }
5620 }
5621
5622 return 0;
5623}
5624EXPORT_SYMBOL_GPL(snd_hda_gen_build_pcms);
5625
5626
5627
5628
5629
5630
5631
5632static void set_output_and_unmute(struct hda_codec *codec, int path_idx)
5633{
5634 struct nid_path *path;
5635 hda_nid_t pin;
5636
5637 path = snd_hda_get_path_from_idx(codec, path_idx);
5638 if (!path || !path->depth)
5639 return;
5640 pin = path->path[path->depth - 1];
5641 restore_pin_ctl(codec, pin);
5642 snd_hda_activate_path(codec, path, path->active,
5643 aamix_default(codec->spec));
5644 set_pin_eapd(codec, pin, path->active);
5645}
5646
5647
5648static void init_multi_out(struct hda_codec *codec)
5649{
5650 struct hda_gen_spec *spec = codec->spec;
5651 int i;
5652
5653 for (i = 0; i < spec->autocfg.line_outs; i++)
5654 set_output_and_unmute(codec, spec->out_paths[i]);
5655}
5656
5657
5658static void __init_extra_out(struct hda_codec *codec, int num_outs, int *paths)
5659{
5660 int i;
5661
5662 for (i = 0; i < num_outs; i++)
5663 set_output_and_unmute(codec, paths[i]);
5664}
5665
5666
5667static void init_extra_out(struct hda_codec *codec)
5668{
5669 struct hda_gen_spec *spec = codec->spec;
5670
5671 if (spec->autocfg.line_out_type != AUTO_PIN_HP_OUT)
5672 __init_extra_out(codec, spec->autocfg.hp_outs, spec->hp_paths);
5673 if (spec->autocfg.line_out_type != AUTO_PIN_SPEAKER_OUT)
5674 __init_extra_out(codec, spec->autocfg.speaker_outs,
5675 spec->speaker_paths);
5676}
5677
5678
5679static void init_multi_io(struct hda_codec *codec)
5680{
5681 struct hda_gen_spec *spec = codec->spec;
5682 int i;
5683
5684 for (i = 0; i < spec->multi_ios; i++) {
5685 hda_nid_t pin = spec->multi_io[i].pin;
5686 struct nid_path *path;
5687 path = get_multiio_path(codec, i);
5688 if (!path)
5689 continue;
5690 if (!spec->multi_io[i].ctl_in)
5691 spec->multi_io[i].ctl_in =
5692 snd_hda_codec_get_pin_target(codec, pin);
5693 snd_hda_activate_path(codec, path, path->active,
5694 aamix_default(spec));
5695 }
5696}
5697
5698static void init_aamix_paths(struct hda_codec *codec)
5699{
5700 struct hda_gen_spec *spec = codec->spec;
5701
5702 if (!spec->have_aamix_ctl)
5703 return;
5704 if (!has_aamix_out_paths(spec))
5705 return;
5706 update_aamix_paths(codec, spec->aamix_mode, spec->out_paths[0],
5707 spec->aamix_out_paths[0],
5708 spec->autocfg.line_out_type);
5709 update_aamix_paths(codec, spec->aamix_mode, spec->hp_paths[0],
5710 spec->aamix_out_paths[1],
5711 AUTO_PIN_HP_OUT);
5712 update_aamix_paths(codec, spec->aamix_mode, spec->speaker_paths[0],
5713 spec->aamix_out_paths[2],
5714 AUTO_PIN_SPEAKER_OUT);
5715}
5716
5717
5718static void init_analog_input(struct hda_codec *codec)
5719{
5720 struct hda_gen_spec *spec = codec->spec;
5721 struct auto_pin_cfg *cfg = &spec->autocfg;
5722 int i;
5723
5724 for (i = 0; i < cfg->num_inputs; i++) {
5725 hda_nid_t nid = cfg->inputs[i].pin;
5726 if (is_input_pin(codec, nid))
5727 restore_pin_ctl(codec, nid);
5728
5729
5730 if (spec->mixer_nid) {
5731 resume_path_from_idx(codec, spec->loopback_paths[i]);
5732 resume_path_from_idx(codec, spec->loopback_merge_path);
5733 }
5734 }
5735}
5736
5737
5738static void init_input_src(struct hda_codec *codec)
5739{
5740 struct hda_gen_spec *spec = codec->spec;
5741 struct hda_input_mux *imux = &spec->input_mux;
5742 struct nid_path *path;
5743 int i, c, nums;
5744
5745 if (spec->dyn_adc_switch)
5746 nums = 1;
5747 else
5748 nums = spec->num_adc_nids;
5749
5750 for (c = 0; c < nums; c++) {
5751 for (i = 0; i < imux->num_items; i++) {
5752 path = get_input_path(codec, c, i);
5753 if (path) {
5754 bool active = path->active;
5755 if (i == spec->cur_mux[c])
5756 active = true;
5757 snd_hda_activate_path(codec, path, active, false);
5758 }
5759 }
5760 if (spec->hp_mic)
5761 update_hp_mic(codec, c, true);
5762 }
5763
5764 if (spec->cap_sync_hook)
5765 spec->cap_sync_hook(codec, NULL, NULL);
5766}
5767
5768
5769static void init_digital(struct hda_codec *codec)
5770{
5771 struct hda_gen_spec *spec = codec->spec;
5772 int i;
5773 hda_nid_t pin;
5774
5775 for (i = 0; i < spec->autocfg.dig_outs; i++)
5776 set_output_and_unmute(codec, spec->digout_paths[i]);
5777 pin = spec->autocfg.dig_in_pin;
5778 if (pin) {
5779 restore_pin_ctl(codec, pin);
5780 resume_path_from_idx(codec, spec->digin_path);
5781 }
5782}
5783
5784
5785
5786
5787static void clear_unsol_on_unused_pins(struct hda_codec *codec)
5788{
5789 int i;
5790
5791 for (i = 0; i < codec->init_pins.used; i++) {
5792 struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
5793 hda_nid_t nid = pin->nid;
5794 if (is_jack_detectable(codec, nid) &&
5795 !snd_hda_jack_tbl_get(codec, nid))
5796 snd_hda_codec_update_cache(codec, nid, 0,
5797 AC_VERB_SET_UNSOLICITED_ENABLE, 0);
5798 }
5799}
5800
5801
5802
5803
5804
5805
5806
5807int snd_hda_gen_init(struct hda_codec *codec)
5808{
5809 struct hda_gen_spec *spec = codec->spec;
5810
5811 if (spec->init_hook)
5812 spec->init_hook(codec);
5813
5814 snd_hda_apply_verbs(codec);
5815
5816 init_multi_out(codec);
5817 init_extra_out(codec);
5818 init_multi_io(codec);
5819 init_aamix_paths(codec);
5820 init_analog_input(codec);
5821 init_input_src(codec);
5822 init_digital(codec);
5823
5824 clear_unsol_on_unused_pins(codec);
5825
5826 sync_all_pin_power_ctls(codec);
5827
5828
5829 update_automute_all(codec);
5830
5831 regcache_sync(codec->core.regmap);
5832
5833 if (spec->vmaster_mute.sw_kctl && spec->vmaster_mute.hook)
5834 snd_hda_sync_vmaster_hook(&spec->vmaster_mute);
5835
5836 hda_call_check_power_status(codec, 0x01);
5837 return 0;
5838}
5839EXPORT_SYMBOL_GPL(snd_hda_gen_init);
5840
5841
5842
5843
5844
5845
5846
5847void snd_hda_gen_free(struct hda_codec *codec)
5848{
5849 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_FREE);
5850 snd_hda_gen_spec_free(codec->spec);
5851 kfree(codec->spec);
5852 codec->spec = NULL;
5853}
5854EXPORT_SYMBOL_GPL(snd_hda_gen_free);
5855
5856#ifdef CONFIG_PM
5857
5858
5859
5860
5861
5862
5863
5864int snd_hda_gen_check_power_status(struct hda_codec *codec, hda_nid_t nid)
5865{
5866 struct hda_gen_spec *spec = codec->spec;
5867 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
5868}
5869EXPORT_SYMBOL_GPL(snd_hda_gen_check_power_status);
5870#endif
5871
5872
5873
5874
5875
5876
5877static const struct hda_codec_ops generic_patch_ops = {
5878 .build_controls = snd_hda_gen_build_controls,
5879 .build_pcms = snd_hda_gen_build_pcms,
5880 .init = snd_hda_gen_init,
5881 .free = snd_hda_gen_free,
5882 .unsol_event = snd_hda_jack_unsol_event,
5883#ifdef CONFIG_PM
5884 .check_power_status = snd_hda_gen_check_power_status,
5885#endif
5886};
5887
5888
5889
5890
5891
5892static int snd_hda_parse_generic_codec(struct hda_codec *codec)
5893{
5894 struct hda_gen_spec *spec;
5895 int err;
5896
5897 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5898 if (!spec)
5899 return -ENOMEM;
5900 snd_hda_gen_spec_init(spec);
5901 codec->spec = spec;
5902
5903 err = snd_hda_parse_pin_defcfg(codec, &spec->autocfg, NULL, 0);
5904 if (err < 0)
5905 return err;
5906
5907 err = snd_hda_gen_parse_auto_config(codec, &spec->autocfg);
5908 if (err < 0)
5909 goto error;
5910
5911 codec->patch_ops = generic_patch_ops;
5912 return 0;
5913
5914error:
5915 snd_hda_gen_free(codec);
5916 return err;
5917}
5918
5919static const struct hda_device_id snd_hda_id_generic[] = {
5920 HDA_CODEC_ENTRY(HDA_CODEC_ID_GENERIC, "Generic", snd_hda_parse_generic_codec),
5921 {}
5922};
5923MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_generic);
5924
5925static struct hda_codec_driver generic_driver = {
5926 .id = snd_hda_id_generic,
5927};
5928
5929module_hda_codec_driver(generic_driver);
5930
5931MODULE_LICENSE("GPL");
5932MODULE_DESCRIPTION("Generic HD-audio codec parser");
5933