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