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