blob: 1b8fd4d6cae9ac7f97ef04e11f987c1ae019e086 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * Universal Interface for Intel High Definition Audio Codec
3 *
4 * Generic widget tree parser
5 *
6 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
7 *
8 * This driver is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This driver is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22
Linus Torvalds1da177e2005-04-16 15:20:36 -070023#include <linux/init.h>
24#include <linux/slab.h>
Paul Gortmakerd81a6d72011-09-22 09:34:58 -040025#include <linux/export.h>
Takashi Iwai352f7f92012-12-19 12:52:06 +010026#include <linux/sort.h>
Takashi Iwaif873e532012-12-20 16:58:39 +010027#include <linux/ctype.h>
28#include <linux/string.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070029#include <sound/core.h>
Takashi Iwai352f7f92012-12-19 12:52:06 +010030#include <sound/jack.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include "hda_codec.h"
32#include "hda_local.h"
Takashi Iwai352f7f92012-12-19 12:52:06 +010033#include "hda_auto_parser.h"
34#include "hda_jack.h"
35#include "hda_generic.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070036
Linus Torvalds1da177e2005-04-16 15:20:36 -070037
Takashi Iwai352f7f92012-12-19 12:52:06 +010038/* initialize hda_gen_spec struct */
39int snd_hda_gen_spec_init(struct hda_gen_spec *spec)
Linus Torvalds1da177e2005-04-16 15:20:36 -070040{
Takashi Iwai352f7f92012-12-19 12:52:06 +010041 snd_array_init(&spec->kctls, sizeof(struct snd_kcontrol_new), 32);
Takashi Iwai352f7f92012-12-19 12:52:06 +010042 snd_array_init(&spec->paths, sizeof(struct nid_path), 8);
Takashi Iwai38cf6f12012-12-21 14:09:42 +010043 mutex_init(&spec->pcm_mutex);
Takashi Iwai352f7f92012-12-19 12:52:06 +010044 return 0;
45}
46EXPORT_SYMBOL_HDA(snd_hda_gen_spec_init);
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
Takashi Iwai12c93df2012-12-19 14:38:33 +010048struct snd_kcontrol_new *
49snd_hda_gen_add_kctl(struct hda_gen_spec *spec, const char *name,
50 const struct snd_kcontrol_new *temp)
Takashi Iwai352f7f92012-12-19 12:52:06 +010051{
52 struct snd_kcontrol_new *knew = snd_array_new(&spec->kctls);
53 if (!knew)
54 return NULL;
55 *knew = *temp;
56 if (name)
57 knew->name = kstrdup(name, GFP_KERNEL);
58 else if (knew->name)
59 knew->name = kstrdup(knew->name, GFP_KERNEL);
60 if (!knew->name)
61 return NULL;
62 return knew;
63}
Takashi Iwai12c93df2012-12-19 14:38:33 +010064EXPORT_SYMBOL_HDA(snd_hda_gen_add_kctl);
Takashi Iwai352f7f92012-12-19 12:52:06 +010065
66static void free_kctls(struct hda_gen_spec *spec)
67{
68 if (spec->kctls.list) {
69 struct snd_kcontrol_new *kctl = spec->kctls.list;
70 int i;
71 for (i = 0; i < spec->kctls.used; i++)
72 kfree(kctl[i].name);
73 }
74 snd_array_free(&spec->kctls);
75}
76
Takashi Iwai352f7f92012-12-19 12:52:06 +010077void snd_hda_gen_spec_free(struct hda_gen_spec *spec)
78{
79 if (!spec)
Linus Torvalds1da177e2005-04-16 15:20:36 -070080 return;
Takashi Iwai352f7f92012-12-19 12:52:06 +010081 free_kctls(spec);
Takashi Iwai352f7f92012-12-19 12:52:06 +010082 snd_array_free(&spec->paths);
Linus Torvalds1da177e2005-04-16 15:20:36 -070083}
Takashi Iwai352f7f92012-12-19 12:52:06 +010084EXPORT_SYMBOL_HDA(snd_hda_gen_spec_free);
Linus Torvalds1da177e2005-04-16 15:20:36 -070085
86/*
Takashi Iwai352f7f92012-12-19 12:52:06 +010087 * parsing paths
Linus Torvalds1da177e2005-04-16 15:20:36 -070088 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070089
Takashi Iwaif5172a72013-01-04 13:19:55 +010090static struct nid_path *get_nid_path(struct hda_codec *codec,
91 hda_nid_t from_nid, hda_nid_t to_nid,
92 int with_aa_mix)
Linus Torvalds1da177e2005-04-16 15:20:36 -070093{
Takashi Iwai352f7f92012-12-19 12:52:06 +010094 struct hda_gen_spec *spec = codec->spec;
95 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -070096
Takashi Iwai352f7f92012-12-19 12:52:06 +010097 for (i = 0; i < spec->paths.used; i++) {
98 struct nid_path *path = snd_array_elem(&spec->paths, i);
99 if (path->depth <= 0)
100 continue;
101 if ((!from_nid || path->path[0] == from_nid) &&
Takashi Iwaif5172a72013-01-04 13:19:55 +0100102 (!to_nid || path->path[path->depth - 1] == to_nid)) {
103 if (with_aa_mix == HDA_PARSE_ALL ||
104 path->with_aa_mix == with_aa_mix)
105 return path;
106 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107 }
108 return NULL;
109}
Takashi Iwaif5172a72013-01-04 13:19:55 +0100110
111/* get the path between the given NIDs;
112 * passing 0 to either @pin or @dac behaves as a wildcard
113 */
114struct nid_path *snd_hda_get_nid_path(struct hda_codec *codec,
115 hda_nid_t from_nid, hda_nid_t to_nid)
116{
117 return get_nid_path(codec, from_nid, to_nid, HDA_PARSE_ALL);
118}
Takashi Iwai352f7f92012-12-19 12:52:06 +0100119EXPORT_SYMBOL_HDA(snd_hda_get_nid_path);
120
Takashi Iwai196c17662013-01-04 15:01:40 +0100121/* get the index number corresponding to the path instance;
122 * the index starts from 1, for easier checking the invalid value
123 */
124int snd_hda_get_path_idx(struct hda_codec *codec, struct nid_path *path)
125{
126 struct hda_gen_spec *spec = codec->spec;
127 struct nid_path *array = spec->paths.list;
128 ssize_t idx;
129
130 if (!spec->paths.used)
131 return 0;
132 idx = path - array;
133 if (idx < 0 || idx >= spec->paths.used)
134 return 0;
135 return idx + 1;
136}
137
138/* get the path instance corresponding to the given index number */
139struct nid_path *snd_hda_get_path_from_idx(struct hda_codec *codec, int idx)
140{
141 struct hda_gen_spec *spec = codec->spec;
142
143 if (idx <= 0 || idx > spec->paths.used)
144 return NULL;
145 return snd_array_elem(&spec->paths, idx - 1);
146}
147
Takashi Iwai352f7f92012-12-19 12:52:06 +0100148/* check whether the given DAC is already found in any existing paths */
149static bool is_dac_already_used(struct hda_codec *codec, hda_nid_t nid)
150{
151 struct hda_gen_spec *spec = codec->spec;
152 int i;
153
154 for (i = 0; i < spec->paths.used; i++) {
155 struct nid_path *path = snd_array_elem(&spec->paths, i);
156 if (path->path[0] == nid)
157 return true;
158 }
159 return false;
160}
161
162/* check whether the given two widgets can be connected */
163static bool is_reachable_path(struct hda_codec *codec,
164 hda_nid_t from_nid, hda_nid_t to_nid)
165{
166 if (!from_nid || !to_nid)
167 return false;
168 return snd_hda_get_conn_index(codec, to_nid, from_nid, true) >= 0;
169}
170
171/* nid, dir and idx */
172#define AMP_VAL_COMPARE_MASK (0xffff | (1U << 18) | (0x0f << 19))
173
174/* check whether the given ctl is already assigned in any path elements */
175static bool is_ctl_used(struct hda_codec *codec, unsigned int val, int type)
176{
177 struct hda_gen_spec *spec = codec->spec;
178 int i;
179
180 val &= AMP_VAL_COMPARE_MASK;
181 for (i = 0; i < spec->paths.used; i++) {
182 struct nid_path *path = snd_array_elem(&spec->paths, i);
183 if ((path->ctls[type] & AMP_VAL_COMPARE_MASK) == val)
184 return true;
185 }
186 return false;
187}
188
189/* check whether a control with the given (nid, dir, idx) was assigned */
190static bool is_ctl_associated(struct hda_codec *codec, hda_nid_t nid,
191 int dir, int idx)
192{
193 unsigned int val = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
194 return is_ctl_used(codec, val, NID_PATH_VOL_CTL) ||
195 is_ctl_used(codec, val, NID_PATH_MUTE_CTL);
196}
197
Takashi Iwai0c8c0f52012-12-20 17:54:22 +0100198static void print_nid_path(const char *pfx, struct nid_path *path)
199{
200 char buf[40];
201 int i;
202
203
204 buf[0] = 0;
205 for (i = 0; i < path->depth; i++) {
206 char tmp[4];
207 sprintf(tmp, ":%02x", path->path[i]);
208 strlcat(buf, tmp, sizeof(buf));
209 }
210 snd_printdd("%s path: depth=%d %s\n", pfx, path->depth, buf);
211}
212
Takashi Iwai352f7f92012-12-19 12:52:06 +0100213/* called recursively */
214static bool __parse_nid_path(struct hda_codec *codec,
215 hda_nid_t from_nid, hda_nid_t to_nid,
216 int with_aa_mix, struct nid_path *path, int depth)
217{
218 struct hda_gen_spec *spec = codec->spec;
Takashi Iwaiee8e7652013-01-03 15:25:11 +0100219 const hda_nid_t *conn;
Takashi Iwai352f7f92012-12-19 12:52:06 +0100220 int i, nums;
221
222 if (to_nid == spec->mixer_nid) {
Takashi Iwai4ac0eef2012-12-20 18:10:51 +0100223 if (with_aa_mix == HDA_PARSE_NO_AAMIX)
Takashi Iwai352f7f92012-12-19 12:52:06 +0100224 return false;
Takashi Iwai4ac0eef2012-12-20 18:10:51 +0100225 with_aa_mix = HDA_PARSE_ALL; /* mark aa-mix is included */
Takashi Iwai352f7f92012-12-19 12:52:06 +0100226 }
227
Takashi Iwaiee8e7652013-01-03 15:25:11 +0100228 nums = snd_hda_get_conn_list(codec, to_nid, &conn);
Takashi Iwai352f7f92012-12-19 12:52:06 +0100229 for (i = 0; i < nums; i++) {
230 if (conn[i] != from_nid) {
231 /* special case: when from_nid is 0,
232 * try to find an empty DAC
233 */
234 if (from_nid ||
235 get_wcaps_type(get_wcaps(codec, conn[i])) != AC_WID_AUD_OUT ||
236 is_dac_already_used(codec, conn[i]))
237 continue;
238 }
239 /* aa-mix is requested but not included? */
Takashi Iwai4ac0eef2012-12-20 18:10:51 +0100240 if (!(spec->mixer_nid && with_aa_mix == HDA_PARSE_ONLY_AAMIX))
Takashi Iwai352f7f92012-12-19 12:52:06 +0100241 goto found;
242 }
243 if (depth >= MAX_NID_PATH_DEPTH)
244 return false;
245 for (i = 0; i < nums; i++) {
246 unsigned int type;
247 type = get_wcaps_type(get_wcaps(codec, conn[i]));
248 if (type == AC_WID_AUD_OUT || type == AC_WID_AUD_IN ||
249 type == AC_WID_PIN)
250 continue;
251 if (__parse_nid_path(codec, from_nid, conn[i],
252 with_aa_mix, path, depth + 1))
253 goto found;
254 }
255 return false;
256
257 found:
258 path->path[path->depth] = conn[i];
Takashi Iwaif5172a72013-01-04 13:19:55 +0100259 if (conn[i] == spec->mixer_nid)
260 path->with_aa_mix = true;
Takashi Iwai352f7f92012-12-19 12:52:06 +0100261 path->idx[path->depth + 1] = i;
262 if (nums > 1 && get_wcaps_type(get_wcaps(codec, to_nid)) != AC_WID_AUD_MIX)
263 path->multi[path->depth + 1] = 1;
264 path->depth++;
265 return true;
266}
267
268/* parse the widget path from the given nid to the target nid;
269 * when @from_nid is 0, try to find an empty DAC;
Takashi Iwai4ac0eef2012-12-20 18:10:51 +0100270 * when @with_aa_mix is HDA_PARSE_NO_AAMIX, paths with spec->mixer_nid are
271 * excluded, only the paths that don't go through the mixer will be chosen.
272 * when @with_aa_mix is HDA_PARSE_ONLY_AAMIX, only the paths going through
273 * spec->mixer_nid will be chosen.
274 * when @with_aa_mix is HDA_PARSE_ALL, no special handling about mixer widget.
Takashi Iwai352f7f92012-12-19 12:52:06 +0100275 */
276bool snd_hda_parse_nid_path(struct hda_codec *codec, hda_nid_t from_nid,
277 hda_nid_t to_nid, int with_aa_mix,
278 struct nid_path *path)
279{
280 if (__parse_nid_path(codec, from_nid, to_nid, with_aa_mix, path, 1)) {
281 path->path[path->depth] = to_nid;
282 path->depth++;
Takashi Iwai352f7f92012-12-19 12:52:06 +0100283 return true;
284 }
285 return false;
286}
287EXPORT_SYMBOL_HDA(snd_hda_parse_nid_path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288
289/*
Takashi Iwai352f7f92012-12-19 12:52:06 +0100290 * parse the path between the given NIDs and add to the path list.
291 * if no valid path is found, return NULL
Linus Torvalds1da177e2005-04-16 15:20:36 -0700292 */
Takashi Iwai352f7f92012-12-19 12:52:06 +0100293struct nid_path *
294snd_hda_add_new_path(struct hda_codec *codec, hda_nid_t from_nid,
295 hda_nid_t to_nid, int with_aa_mix)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296{
Takashi Iwai352f7f92012-12-19 12:52:06 +0100297 struct hda_gen_spec *spec = codec->spec;
298 struct nid_path *path;
299
300 if (from_nid && to_nid && !is_reachable_path(codec, from_nid, to_nid))
301 return NULL;
302
Takashi Iwaif5172a72013-01-04 13:19:55 +0100303 /* check whether the path has been already added */
304 path = get_nid_path(codec, from_nid, to_nid, with_aa_mix);
305 if (path)
306 return path;
307
Takashi Iwai352f7f92012-12-19 12:52:06 +0100308 path = snd_array_new(&spec->paths);
309 if (!path)
310 return NULL;
311 memset(path, 0, sizeof(*path));
312 if (snd_hda_parse_nid_path(codec, from_nid, to_nid, with_aa_mix, path))
313 return path;
314 /* push back */
315 spec->paths.used--;
316 return NULL;
317}
318EXPORT_SYMBOL_HDA(snd_hda_add_new_path);
319
320/* look for an empty DAC slot */
321static hda_nid_t look_for_dac(struct hda_codec *codec, hda_nid_t pin,
322 bool is_digital)
323{
324 struct hda_gen_spec *spec = codec->spec;
325 bool cap_digital;
326 int i;
327
328 for (i = 0; i < spec->num_all_dacs; i++) {
329 hda_nid_t nid = spec->all_dacs[i];
330 if (!nid || is_dac_already_used(codec, nid))
331 continue;
332 cap_digital = !!(get_wcaps(codec, nid) & AC_WCAP_DIGITAL);
333 if (is_digital != cap_digital)
334 continue;
335 if (is_reachable_path(codec, nid, pin))
336 return nid;
337 }
338 return 0;
339}
340
341/* replace the channels in the composed amp value with the given number */
342static unsigned int amp_val_replace_channels(unsigned int val, unsigned int chs)
343{
344 val &= ~(0x3U << 16);
345 val |= chs << 16;
346 return val;
347}
348
349/* check whether the widget has the given amp capability for the direction */
350static bool check_amp_caps(struct hda_codec *codec, hda_nid_t nid,
351 int dir, unsigned int bits)
352{
353 if (!nid)
354 return false;
355 if (get_wcaps(codec, nid) & (1 << (dir + 1)))
356 if (query_amp_caps(codec, nid, dir) & bits)
357 return true;
358 return false;
359}
360
361#define nid_has_mute(codec, nid, dir) \
362 check_amp_caps(codec, nid, dir, AC_AMPCAP_MUTE)
363#define nid_has_volume(codec, nid, dir) \
364 check_amp_caps(codec, nid, dir, AC_AMPCAP_NUM_STEPS)
365
366/* look for a widget suitable for assigning a mute switch in the path */
367static hda_nid_t look_for_out_mute_nid(struct hda_codec *codec,
368 struct nid_path *path)
369{
370 int i;
371
372 for (i = path->depth - 1; i >= 0; i--) {
373 if (nid_has_mute(codec, path->path[i], HDA_OUTPUT))
374 return path->path[i];
375 if (i != path->depth - 1 && i != 0 &&
376 nid_has_mute(codec, path->path[i], HDA_INPUT))
377 return path->path[i];
378 }
379 return 0;
380}
381
382/* look for a widget suitable for assigning a volume ctl in the path */
383static hda_nid_t look_for_out_vol_nid(struct hda_codec *codec,
384 struct nid_path *path)
385{
386 int i;
387
388 for (i = path->depth - 1; i >= 0; i--) {
389 if (nid_has_volume(codec, path->path[i], HDA_OUTPUT))
390 return path->path[i];
391 }
Takashi Iwai82beb8f2007-08-10 17:09:26 +0200392 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700393}
394
395/*
Takashi Iwai352f7f92012-12-19 12:52:06 +0100396 * path activation / deactivation
Linus Torvalds1da177e2005-04-16 15:20:36 -0700397 */
Takashi Iwai352f7f92012-12-19 12:52:06 +0100398
399/* can have the amp-in capability? */
400static bool has_amp_in(struct hda_codec *codec, struct nid_path *path, int idx)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401{
Takashi Iwai352f7f92012-12-19 12:52:06 +0100402 hda_nid_t nid = path->path[idx];
403 unsigned int caps = get_wcaps(codec, nid);
404 unsigned int type = get_wcaps_type(caps);
405
406 if (!(caps & AC_WCAP_IN_AMP))
407 return false;
408 if (type == AC_WID_PIN && idx > 0) /* only for input pins */
409 return false;
410 return true;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700411}
412
Takashi Iwai352f7f92012-12-19 12:52:06 +0100413/* can have the amp-out capability? */
414static bool has_amp_out(struct hda_codec *codec, struct nid_path *path, int idx)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700415{
Takashi Iwai352f7f92012-12-19 12:52:06 +0100416 hda_nid_t nid = path->path[idx];
417 unsigned int caps = get_wcaps(codec, nid);
418 unsigned int type = get_wcaps_type(caps);
419
420 if (!(caps & AC_WCAP_OUT_AMP))
421 return false;
422 if (type == AC_WID_PIN && !idx) /* only for output pins */
423 return false;
424 return true;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425}
426
Takashi Iwai352f7f92012-12-19 12:52:06 +0100427/* check whether the given (nid,dir,idx) is active */
428static bool is_active_nid(struct hda_codec *codec, hda_nid_t nid,
429 unsigned int idx, unsigned int dir)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700430{
Takashi Iwai352f7f92012-12-19 12:52:06 +0100431 struct hda_gen_spec *spec = codec->spec;
432 int i, n;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433
Takashi Iwai352f7f92012-12-19 12:52:06 +0100434 for (n = 0; n < spec->paths.used; n++) {
435 struct nid_path *path = snd_array_elem(&spec->paths, n);
436 if (!path->active)
437 continue;
438 for (i = 0; i < path->depth; i++) {
439 if (path->path[i] == nid) {
440 if (dir == HDA_OUTPUT || path->idx[i] == idx)
441 return true;
442 break;
443 }
444 }
445 }
446 return false;
447}
448
449/* get the default amp value for the target state */
450static int get_amp_val_to_activate(struct hda_codec *codec, hda_nid_t nid,
451 int dir, bool enable)
452{
453 unsigned int caps;
454 unsigned int val = 0;
455
456 caps = query_amp_caps(codec, nid, dir);
457 if (caps & AC_AMPCAP_NUM_STEPS) {
458 /* set to 0dB */
459 if (enable)
460 val = (caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT;
461 }
462 if (caps & AC_AMPCAP_MUTE) {
463 if (!enable)
464 val |= HDA_AMP_MUTE;
465 }
466 return val;
467}
468
469/* initialize the amp value (only at the first time) */
470static void init_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx)
471{
472 int val = get_amp_val_to_activate(codec, nid, dir, false);
473 snd_hda_codec_amp_init_stereo(codec, nid, dir, idx, 0xff, val);
474}
475
476static void activate_amp(struct hda_codec *codec, hda_nid_t nid, int dir,
477 int idx, bool enable)
478{
479 int val;
480 if (is_ctl_associated(codec, nid, dir, idx) ||
Takashi Iwai985803c2013-01-03 16:30:04 +0100481 (!enable && is_active_nid(codec, nid, dir, idx)))
Takashi Iwai352f7f92012-12-19 12:52:06 +0100482 return;
483 val = get_amp_val_to_activate(codec, nid, dir, enable);
484 snd_hda_codec_amp_stereo(codec, nid, dir, idx, 0xff, val);
485}
486
487static void activate_amp_out(struct hda_codec *codec, struct nid_path *path,
488 int i, bool enable)
489{
490 hda_nid_t nid = path->path[i];
491 init_amp(codec, nid, HDA_OUTPUT, 0);
492 activate_amp(codec, nid, HDA_OUTPUT, 0, enable);
493}
494
495static void activate_amp_in(struct hda_codec *codec, struct nid_path *path,
496 int i, bool enable, bool add_aamix)
497{
498 struct hda_gen_spec *spec = codec->spec;
Takashi Iwaiee8e7652013-01-03 15:25:11 +0100499 const hda_nid_t *conn;
Takashi Iwai352f7f92012-12-19 12:52:06 +0100500 int n, nums, idx;
501 int type;
502 hda_nid_t nid = path->path[i];
503
Takashi Iwaiee8e7652013-01-03 15:25:11 +0100504 nums = snd_hda_get_conn_list(codec, nid, &conn);
Takashi Iwai352f7f92012-12-19 12:52:06 +0100505 type = get_wcaps_type(get_wcaps(codec, nid));
506 if (type == AC_WID_PIN ||
507 (type == AC_WID_AUD_IN && codec->single_adc_amp)) {
508 nums = 1;
509 idx = 0;
510 } else
511 idx = path->idx[i];
512
513 for (n = 0; n < nums; n++)
514 init_amp(codec, nid, HDA_INPUT, n);
515
516 if (is_ctl_associated(codec, nid, HDA_INPUT, idx))
517 return;
518
519 /* here is a little bit tricky in comparison with activate_amp_out();
520 * when aa-mixer is available, we need to enable the path as well
521 */
522 for (n = 0; n < nums; n++) {
523 if (n != idx && (!add_aamix || conn[n] != spec->mixer_nid))
524 continue;
525 activate_amp(codec, nid, HDA_INPUT, n, enable);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526 }
527}
528
Takashi Iwai352f7f92012-12-19 12:52:06 +0100529/* activate or deactivate the given path
530 * if @add_aamix is set, enable the input from aa-mix NID as well (if any)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700531 */
Takashi Iwai352f7f92012-12-19 12:52:06 +0100532void snd_hda_activate_path(struct hda_codec *codec, struct nid_path *path,
533 bool enable, bool add_aamix)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534{
Takashi Iwai352f7f92012-12-19 12:52:06 +0100535 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700536
Takashi Iwai352f7f92012-12-19 12:52:06 +0100537 if (!enable)
538 path->active = false;
539
540 for (i = path->depth - 1; i >= 0; i--) {
541 if (enable && path->multi[i])
542 snd_hda_codec_write_cache(codec, path->path[i], 0,
543 AC_VERB_SET_CONNECT_SEL,
544 path->idx[i]);
545 if (has_amp_in(codec, path, i))
546 activate_amp_in(codec, path, i, enable, add_aamix);
547 if (has_amp_out(codec, path, i))
548 activate_amp_out(codec, path, i, enable);
549 }
550
551 if (enable)
552 path->active = true;
553}
554EXPORT_SYMBOL_HDA(snd_hda_activate_path);
555
Takashi Iwaid5a9f1b2012-12-20 15:36:30 +0100556/* turn on/off EAPD on the given pin */
557static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable)
558{
559 struct hda_gen_spec *spec = codec->spec;
560 if (spec->own_eapd_ctl ||
561 !(snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD))
562 return;
Takashi Iwaiecac3ed2012-12-21 15:23:01 +0100563 if (codec->inv_eapd)
564 enable = !enable;
Takashi Iwaid5a9f1b2012-12-20 15:36:30 +0100565 snd_hda_codec_update_cache(codec, pin, 0,
566 AC_VERB_SET_EAPD_BTLENABLE,
567 enable ? 0x02 : 0x00);
568}
569
Takashi Iwai352f7f92012-12-19 12:52:06 +0100570
571/*
572 * Helper functions for creating mixer ctl elements
573 */
574
575enum {
576 HDA_CTL_WIDGET_VOL,
577 HDA_CTL_WIDGET_MUTE,
578 HDA_CTL_BIND_MUTE,
Takashi Iwai352f7f92012-12-19 12:52:06 +0100579};
580static const struct snd_kcontrol_new control_templates[] = {
581 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
582 HDA_CODEC_MUTE(NULL, 0, 0, 0),
583 HDA_BIND_MUTE(NULL, 0, 0, 0),
Takashi Iwai352f7f92012-12-19 12:52:06 +0100584};
585
586/* add dynamic controls from template */
587static int add_control(struct hda_gen_spec *spec, int type, const char *name,
588 int cidx, unsigned long val)
589{
590 struct snd_kcontrol_new *knew;
591
Takashi Iwai12c93df2012-12-19 14:38:33 +0100592 knew = snd_hda_gen_add_kctl(spec, name, &control_templates[type]);
Takashi Iwai352f7f92012-12-19 12:52:06 +0100593 if (!knew)
594 return -ENOMEM;
595 knew->index = cidx;
596 if (get_amp_nid_(val))
597 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
598 knew->private_value = val;
599 return 0;
600}
601
602static int add_control_with_pfx(struct hda_gen_spec *spec, int type,
603 const char *pfx, const char *dir,
604 const char *sfx, int cidx, unsigned long val)
605{
606 char name[32];
607 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
608 return add_control(spec, type, name, cidx, val);
609}
610
611#define add_pb_vol_ctrl(spec, type, pfx, val) \
612 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", 0, val)
613#define add_pb_sw_ctrl(spec, type, pfx, val) \
614 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", 0, val)
615#define __add_pb_vol_ctrl(spec, type, pfx, cidx, val) \
616 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", cidx, val)
617#define __add_pb_sw_ctrl(spec, type, pfx, cidx, val) \
618 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", cidx, val)
619
620static int add_vol_ctl(struct hda_codec *codec, const char *pfx, int cidx,
621 unsigned int chs, struct nid_path *path)
622{
623 unsigned int val;
624 if (!path)
625 return 0;
626 val = path->ctls[NID_PATH_VOL_CTL];
627 if (!val)
628 return 0;
629 val = amp_val_replace_channels(val, chs);
630 return __add_pb_vol_ctrl(codec->spec, HDA_CTL_WIDGET_VOL, pfx, cidx, val);
631}
632
633/* return the channel bits suitable for the given path->ctls[] */
634static int get_default_ch_nums(struct hda_codec *codec, struct nid_path *path,
635 int type)
636{
637 int chs = 1; /* mono (left only) */
638 if (path) {
639 hda_nid_t nid = get_amp_nid_(path->ctls[type]);
640 if (nid && (get_wcaps(codec, nid) & AC_WCAP_STEREO))
641 chs = 3; /* stereo */
642 }
643 return chs;
644}
645
646static int add_stereo_vol(struct hda_codec *codec, const char *pfx, int cidx,
647 struct nid_path *path)
648{
649 int chs = get_default_ch_nums(codec, path, NID_PATH_VOL_CTL);
650 return add_vol_ctl(codec, pfx, cidx, chs, path);
651}
652
653/* create a mute-switch for the given mixer widget;
654 * if it has multiple sources (e.g. DAC and loopback), create a bind-mute
655 */
656static int add_sw_ctl(struct hda_codec *codec, const char *pfx, int cidx,
657 unsigned int chs, struct nid_path *path)
658{
659 unsigned int val;
660 int type = HDA_CTL_WIDGET_MUTE;
661
662 if (!path)
663 return 0;
664 val = path->ctls[NID_PATH_MUTE_CTL];
665 if (!val)
666 return 0;
667 val = amp_val_replace_channels(val, chs);
668 if (get_amp_direction_(val) == HDA_INPUT) {
669 hda_nid_t nid = get_amp_nid_(val);
670 int nums = snd_hda_get_num_conns(codec, nid);
671 if (nums > 1) {
672 type = HDA_CTL_BIND_MUTE;
673 val |= nums << 19;
674 }
675 }
676 return __add_pb_sw_ctrl(codec->spec, type, pfx, cidx, val);
677}
678
679static int add_stereo_sw(struct hda_codec *codec, const char *pfx,
680 int cidx, struct nid_path *path)
681{
682 int chs = get_default_ch_nums(codec, path, NID_PATH_MUTE_CTL);
683 return add_sw_ctl(codec, pfx, cidx, chs, path);
684}
685
686static const char * const channel_name[4] = {
687 "Front", "Surround", "CLFE", "Side"
688};
689
690/* give some appropriate ctl name prefix for the given line out channel */
691static const char *get_line_out_pfx(struct hda_gen_spec *spec, int ch,
692 bool can_be_master, int *index)
693{
694 struct auto_pin_cfg *cfg = &spec->autocfg;
695
696 *index = 0;
697 if (cfg->line_outs == 1 && !spec->multi_ios &&
698 !cfg->hp_outs && !cfg->speaker_outs && can_be_master)
699 return spec->vmaster_mute.hook ? "PCM" : "Master";
700
701 /* if there is really a single DAC used in the whole output paths,
702 * use it master (or "PCM" if a vmaster hook is present)
703 */
704 if (spec->multiout.num_dacs == 1 && !spec->mixer_nid &&
705 !spec->multiout.hp_out_nid[0] && !spec->multiout.extra_out_nid[0])
706 return spec->vmaster_mute.hook ? "PCM" : "Master";
707
708 switch (cfg->line_out_type) {
709 case AUTO_PIN_SPEAKER_OUT:
710 if (cfg->line_outs == 1)
711 return "Speaker";
712 if (cfg->line_outs == 2)
713 return ch ? "Bass Speaker" : "Speaker";
714 break;
715 case AUTO_PIN_HP_OUT:
716 /* for multi-io case, only the primary out */
717 if (ch && spec->multi_ios)
718 break;
719 *index = ch;
720 return "Headphone";
721 default:
722 if (cfg->line_outs == 1 && !spec->multi_ios)
723 return "PCM";
724 break;
725 }
726 if (ch >= ARRAY_SIZE(channel_name)) {
727 snd_BUG();
728 return "PCM";
729 }
730
731 return channel_name[ch];
732}
733
734/*
735 * Parse output paths
736 */
737
738/* badness definition */
739enum {
740 /* No primary DAC is found for the main output */
741 BAD_NO_PRIMARY_DAC = 0x10000,
742 /* No DAC is found for the extra output */
743 BAD_NO_DAC = 0x4000,
744 /* No possible multi-ios */
745 BAD_MULTI_IO = 0x103,
746 /* No individual DAC for extra output */
747 BAD_NO_EXTRA_DAC = 0x102,
748 /* No individual DAC for extra surrounds */
749 BAD_NO_EXTRA_SURR_DAC = 0x101,
750 /* Primary DAC shared with main surrounds */
751 BAD_SHARED_SURROUND = 0x100,
752 /* Primary DAC shared with main CLFE */
753 BAD_SHARED_CLFE = 0x10,
754 /* Primary DAC shared with extra surrounds */
755 BAD_SHARED_EXTRA_SURROUND = 0x10,
756 /* Volume widget is shared */
757 BAD_SHARED_VOL = 0x10,
758};
759
760/* look for widgets in the path between the given NIDs appropriate for
761 * volume and mute controls, and assign the values to ctls[].
762 *
763 * When no appropriate widget is found in the path, the badness value
764 * is incremented depending on the situation. The function returns the
765 * total badness for both volume and mute controls.
766 */
767static int assign_out_path_ctls(struct hda_codec *codec, hda_nid_t pin,
768 hda_nid_t dac)
769{
770 struct nid_path *path = snd_hda_get_nid_path(codec, dac, pin);
771 hda_nid_t nid;
772 unsigned int val;
773 int badness = 0;
774
775 if (!path)
776 return BAD_SHARED_VOL * 2;
777 nid = look_for_out_vol_nid(codec, path);
778 if (nid) {
779 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
780 if (is_ctl_used(codec, val, NID_PATH_VOL_CTL))
781 badness += BAD_SHARED_VOL;
782 else
783 path->ctls[NID_PATH_VOL_CTL] = val;
784 } else
785 badness += BAD_SHARED_VOL;
786 nid = look_for_out_mute_nid(codec, path);
787 if (nid) {
788 unsigned int wid_type = get_wcaps_type(get_wcaps(codec, nid));
789 if (wid_type == AC_WID_PIN || wid_type == AC_WID_AUD_OUT ||
790 nid_has_mute(codec, nid, HDA_OUTPUT))
791 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
792 else
793 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT);
794 if (is_ctl_used(codec, val, NID_PATH_MUTE_CTL))
795 badness += BAD_SHARED_VOL;
796 else
797 path->ctls[NID_PATH_MUTE_CTL] = val;
798 } else
799 badness += BAD_SHARED_VOL;
800 return badness;
801}
802
803struct badness_table {
804 int no_primary_dac; /* no primary DAC */
805 int no_dac; /* no secondary DACs */
806 int shared_primary; /* primary DAC is shared with main output */
807 int shared_surr; /* secondary DAC shared with main or primary */
808 int shared_clfe; /* third DAC shared with main or primary */
809 int shared_surr_main; /* secondary DAC sahred with main/DAC0 */
810};
811
812static struct badness_table main_out_badness = {
813 .no_primary_dac = BAD_NO_PRIMARY_DAC,
814 .no_dac = BAD_NO_DAC,
815 .shared_primary = BAD_NO_PRIMARY_DAC,
816 .shared_surr = BAD_SHARED_SURROUND,
817 .shared_clfe = BAD_SHARED_CLFE,
818 .shared_surr_main = BAD_SHARED_SURROUND,
819};
820
821static struct badness_table extra_out_badness = {
822 .no_primary_dac = BAD_NO_DAC,
823 .no_dac = BAD_NO_DAC,
824 .shared_primary = BAD_NO_EXTRA_DAC,
825 .shared_surr = BAD_SHARED_EXTRA_SURROUND,
826 .shared_clfe = BAD_SHARED_EXTRA_SURROUND,
827 .shared_surr_main = BAD_NO_EXTRA_SURR_DAC,
828};
829
Takashi Iwai7385df62013-01-07 09:50:52 +0100830/* get the DAC of the primary output corresponding to the given array index */
831static hda_nid_t get_primary_out(struct hda_codec *codec, int idx)
832{
833 struct hda_gen_spec *spec = codec->spec;
834 struct auto_pin_cfg *cfg = &spec->autocfg;
835
836 if (cfg->line_outs > idx)
837 return spec->private_dac_nids[idx];
838 idx -= cfg->line_outs;
839 if (spec->multi_ios > idx)
840 return spec->multi_io[idx].dac;
841 return 0;
842}
843
844/* return the DAC if it's reachable, otherwise zero */
845static inline hda_nid_t try_dac(struct hda_codec *codec,
846 hda_nid_t dac, hda_nid_t pin)
847{
848 return is_reachable_path(codec, dac, pin) ? dac : 0;
849}
850
Takashi Iwai352f7f92012-12-19 12:52:06 +0100851/* try to assign DACs to pins and return the resultant badness */
852static int try_assign_dacs(struct hda_codec *codec, int num_outs,
853 const hda_nid_t *pins, hda_nid_t *dacs,
Takashi Iwai196c17662013-01-04 15:01:40 +0100854 int *path_idx,
Takashi Iwai352f7f92012-12-19 12:52:06 +0100855 const struct badness_table *bad)
856{
857 struct hda_gen_spec *spec = codec->spec;
Takashi Iwai352f7f92012-12-19 12:52:06 +0100858 int i, j;
859 int badness = 0;
860 hda_nid_t dac;
861
862 if (!num_outs)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863 return 0;
864
Takashi Iwai352f7f92012-12-19 12:52:06 +0100865 for (i = 0; i < num_outs; i++) {
Takashi Iwai0c8c0f52012-12-20 17:54:22 +0100866 struct nid_path *path;
Takashi Iwai352f7f92012-12-19 12:52:06 +0100867 hda_nid_t pin = pins[i];
Takashi Iwai1e0b5282013-01-04 12:56:52 +0100868
869 if (dacs[i]) {
870 badness += assign_out_path_ctls(codec, pin, dacs[i]);
871 continue;
872 }
873
874 dacs[i] = look_for_dac(codec, pin, false);
Takashi Iwai352f7f92012-12-19 12:52:06 +0100875 if (!dacs[i] && !i) {
876 for (j = 1; j < num_outs; j++) {
877 if (is_reachable_path(codec, dacs[j], pin)) {
878 dacs[0] = dacs[j];
879 dacs[j] = 0;
Takashi Iwai196c17662013-01-04 15:01:40 +0100880 path_idx[j] = 0;
Takashi Iwai352f7f92012-12-19 12:52:06 +0100881 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882 }
883 }
Takashi Iwai352f7f92012-12-19 12:52:06 +0100884 }
885 dac = dacs[i];
886 if (!dac) {
Takashi Iwai7385df62013-01-07 09:50:52 +0100887 if (num_outs > 2)
888 dac = try_dac(codec, get_primary_out(codec, i), pin);
889 if (!dac)
890 dac = try_dac(codec, dacs[0], pin);
891 if (!dac)
892 dac = try_dac(codec, get_primary_out(codec, i), pin);
Takashi Iwai352f7f92012-12-19 12:52:06 +0100893 if (dac) {
894 if (!i)
895 badness += bad->shared_primary;
896 else if (i == 1)
897 badness += bad->shared_surr;
898 else
899 badness += bad->shared_clfe;
900 } else if (is_reachable_path(codec, spec->private_dac_nids[0], pin)) {
901 dac = spec->private_dac_nids[0];
902 badness += bad->shared_surr_main;
903 } else if (!i)
904 badness += bad->no_primary_dac;
905 else
906 badness += bad->no_dac;
907 }
Takashi Iwai4ac0eef2012-12-20 18:10:51 +0100908 path = snd_hda_add_new_path(codec, dac, pin, HDA_PARSE_NO_AAMIX);
Takashi Iwai117688a2013-01-04 15:41:41 +0100909 if (!path && !i && spec->mixer_nid) {
Takashi Iwaib3a8c742012-12-20 18:29:16 +0100910 /* try with aamix */
911 path = snd_hda_add_new_path(codec, dac, pin, HDA_PARSE_ALL);
912 }
Takashi Iwai0c8c0f52012-12-20 17:54:22 +0100913 if (!path)
Takashi Iwai352f7f92012-12-19 12:52:06 +0100914 dac = dacs[i] = 0;
Takashi Iwaie1284af2013-01-03 16:33:02 +0100915 else {
Takashi Iwai0c8c0f52012-12-20 17:54:22 +0100916 print_nid_path("output", path);
Takashi Iwaie1284af2013-01-03 16:33:02 +0100917 path->active = true;
Takashi Iwai196c17662013-01-04 15:01:40 +0100918 path_idx[i] = snd_hda_get_path_idx(codec, path);
Takashi Iwaie1284af2013-01-03 16:33:02 +0100919 }
Takashi Iwai352f7f92012-12-19 12:52:06 +0100920 if (dac)
921 badness += assign_out_path_ctls(codec, pin, dac);
922 }
923
924 return badness;
925}
926
927/* return NID if the given pin has only a single connection to a certain DAC */
928static hda_nid_t get_dac_if_single(struct hda_codec *codec, hda_nid_t pin)
929{
930 struct hda_gen_spec *spec = codec->spec;
931 int i;
932 hda_nid_t nid_found = 0;
933
934 for (i = 0; i < spec->num_all_dacs; i++) {
935 hda_nid_t nid = spec->all_dacs[i];
936 if (!nid || is_dac_already_used(codec, nid))
937 continue;
938 if (is_reachable_path(codec, nid, pin)) {
939 if (nid_found)
940 return 0;
941 nid_found = nid;
942 }
943 }
944 return nid_found;
945}
946
947/* check whether the given pin can be a multi-io pin */
948static bool can_be_multiio_pin(struct hda_codec *codec,
949 unsigned int location, hda_nid_t nid)
950{
951 unsigned int defcfg, caps;
952
953 defcfg = snd_hda_codec_get_pincfg(codec, nid);
954 if (get_defcfg_connect(defcfg) != AC_JACK_PORT_COMPLEX)
955 return false;
956 if (location && get_defcfg_location(defcfg) != location)
957 return false;
958 caps = snd_hda_query_pin_caps(codec, nid);
959 if (!(caps & AC_PINCAP_OUT))
960 return false;
961 return true;
962}
963
Takashi Iwaie22aab72013-01-04 14:50:04 +0100964/* count the number of input pins that are capable to be multi-io */
965static int count_multiio_pins(struct hda_codec *codec, hda_nid_t reference_pin)
966{
967 struct hda_gen_spec *spec = codec->spec;
968 struct auto_pin_cfg *cfg = &spec->autocfg;
969 unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin);
970 unsigned int location = get_defcfg_location(defcfg);
971 int type, i;
972 int num_pins = 0;
973
974 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
975 for (i = 0; i < cfg->num_inputs; i++) {
976 if (cfg->inputs[i].type != type)
977 continue;
978 if (can_be_multiio_pin(codec, location,
979 cfg->inputs[i].pin))
980 num_pins++;
981 }
982 }
983 return num_pins;
984}
985
Takashi Iwai352f7f92012-12-19 12:52:06 +0100986/*
987 * multi-io helper
988 *
989 * When hardwired is set, try to fill ony hardwired pins, and returns
990 * zero if any pins are filled, non-zero if nothing found.
991 * When hardwired is off, try to fill possible input pins, and returns
992 * the badness value.
993 */
994static int fill_multi_ios(struct hda_codec *codec,
995 hda_nid_t reference_pin,
Takashi Iwaie22aab72013-01-04 14:50:04 +0100996 bool hardwired)
Takashi Iwai352f7f92012-12-19 12:52:06 +0100997{
998 struct hda_gen_spec *spec = codec->spec;
999 struct auto_pin_cfg *cfg = &spec->autocfg;
Takashi Iwaie22aab72013-01-04 14:50:04 +01001000 int type, i, j, num_pins, old_pins;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001001 unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin);
1002 unsigned int location = get_defcfg_location(defcfg);
1003 int badness = 0;
1004
1005 old_pins = spec->multi_ios;
1006 if (old_pins >= 2)
1007 goto end_fill;
1008
Takashi Iwaie22aab72013-01-04 14:50:04 +01001009 num_pins = count_multiio_pins(codec, reference_pin);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001010 if (num_pins < 2)
1011 goto end_fill;
1012
Takashi Iwai352f7f92012-12-19 12:52:06 +01001013 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
1014 for (i = 0; i < cfg->num_inputs; i++) {
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001015 struct nid_path *path;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001016 hda_nid_t nid = cfg->inputs[i].pin;
1017 hda_nid_t dac = 0;
1018
1019 if (cfg->inputs[i].type != type)
1020 continue;
1021 if (!can_be_multiio_pin(codec, location, nid))
1022 continue;
1023 for (j = 0; j < spec->multi_ios; j++) {
1024 if (nid == spec->multi_io[j].pin)
1025 break;
1026 }
1027 if (j < spec->multi_ios)
1028 continue;
1029
Takashi Iwai352f7f92012-12-19 12:52:06 +01001030 if (hardwired)
1031 dac = get_dac_if_single(codec, nid);
1032 else if (!dac)
1033 dac = look_for_dac(codec, nid, false);
1034 if (!dac) {
1035 badness++;
1036 continue;
1037 }
Takashi Iwai4ac0eef2012-12-20 18:10:51 +01001038 path = snd_hda_add_new_path(codec, dac, nid, HDA_PARSE_NO_AAMIX);
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001039 if (!path) {
Takashi Iwai352f7f92012-12-19 12:52:06 +01001040 badness++;
1041 continue;
1042 }
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001043 print_nid_path("multiio", path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001044 spec->multi_io[spec->multi_ios].pin = nid;
1045 spec->multi_io[spec->multi_ios].dac = dac;
Takashi Iwai196c17662013-01-04 15:01:40 +01001046 spec->out_paths[cfg->line_outs + spec->multi_ios] =
1047 snd_hda_get_path_idx(codec, path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001048 spec->multi_ios++;
1049 if (spec->multi_ios >= 2)
1050 break;
1051 }
1052 }
1053 end_fill:
1054 if (badness)
1055 badness = BAD_MULTI_IO;
1056 if (old_pins == spec->multi_ios) {
1057 if (hardwired)
1058 return 1; /* nothing found */
1059 else
1060 return badness; /* no badness if nothing found */
1061 }
1062 if (!hardwired && spec->multi_ios < 2) {
1063 /* cancel newly assigned paths */
1064 spec->paths.used -= spec->multi_ios - old_pins;
1065 spec->multi_ios = old_pins;
1066 return badness;
1067 }
1068
1069 /* assign volume and mute controls */
1070 for (i = old_pins; i < spec->multi_ios; i++)
1071 badness += assign_out_path_ctls(codec, spec->multi_io[i].pin,
1072 spec->multi_io[i].dac);
1073
1074 return badness;
1075}
1076
1077/* map DACs for all pins in the list if they are single connections */
1078static bool map_singles(struct hda_codec *codec, int outs,
Takashi Iwai196c17662013-01-04 15:01:40 +01001079 const hda_nid_t *pins, hda_nid_t *dacs, int *path_idx)
Takashi Iwai352f7f92012-12-19 12:52:06 +01001080{
Takashi Iwaib3a8c742012-12-20 18:29:16 +01001081 struct hda_gen_spec *spec = codec->spec;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001082 int i;
1083 bool found = false;
1084 for (i = 0; i < outs; i++) {
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001085 struct nid_path *path;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001086 hda_nid_t dac;
1087 if (dacs[i])
1088 continue;
1089 dac = get_dac_if_single(codec, pins[i]);
1090 if (!dac)
1091 continue;
Takashi Iwai4ac0eef2012-12-20 18:10:51 +01001092 path = snd_hda_add_new_path(codec, dac, pins[i], HDA_PARSE_NO_AAMIX);
Takashi Iwai117688a2013-01-04 15:41:41 +01001093 if (!path && !i && spec->mixer_nid)
Takashi Iwaib3a8c742012-12-20 18:29:16 +01001094 path = snd_hda_add_new_path(codec, dac, pins[i], HDA_PARSE_ALL);
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001095 if (path) {
Takashi Iwai352f7f92012-12-19 12:52:06 +01001096 dacs[i] = dac;
1097 found = true;
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001098 print_nid_path("output", path);
Takashi Iwaie1284af2013-01-03 16:33:02 +01001099 path->active = true;
Takashi Iwai196c17662013-01-04 15:01:40 +01001100 path_idx[i] = snd_hda_get_path_idx(codec, path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001101 }
1102 }
1103 return found;
1104}
1105
Takashi Iwaic30aa7b2013-01-04 16:42:48 +01001106/* create a new path including aamix if available, and return its index */
1107static int check_aamix_out_path(struct hda_codec *codec, int path_idx)
1108{
1109 struct nid_path *path;
1110
1111 path = snd_hda_get_path_from_idx(codec, path_idx);
1112 if (!path || !path->depth || path->with_aa_mix)
1113 return 0;
1114 path = snd_hda_add_new_path(codec, path->path[0],
1115 path->path[path->depth - 1],
1116 HDA_PARSE_ONLY_AAMIX);
1117 if (!path)
1118 return 0;
1119 print_nid_path("output-aamix", path);
1120 path->active = false; /* unused as default */
1121 return snd_hda_get_path_idx(codec, path);
1122}
1123
Takashi Iwai352f7f92012-12-19 12:52:06 +01001124/* fill in the dac_nids table from the parsed pin configuration */
1125static int fill_and_eval_dacs(struct hda_codec *codec,
1126 bool fill_hardwired,
1127 bool fill_mio_first)
1128{
1129 struct hda_gen_spec *spec = codec->spec;
1130 struct auto_pin_cfg *cfg = &spec->autocfg;
1131 int i, err, badness;
1132
1133 /* set num_dacs once to full for look_for_dac() */
1134 spec->multiout.num_dacs = cfg->line_outs;
1135 spec->multiout.dac_nids = spec->private_dac_nids;
1136 memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids));
1137 memset(spec->multiout.hp_out_nid, 0, sizeof(spec->multiout.hp_out_nid));
1138 memset(spec->multiout.extra_out_nid, 0, sizeof(spec->multiout.extra_out_nid));
1139 spec->multi_ios = 0;
1140 snd_array_free(&spec->paths);
Takashi Iwaicd5be3f2013-01-07 15:07:00 +01001141
1142 /* clear path indices */
1143 memset(spec->out_paths, 0, sizeof(spec->out_paths));
1144 memset(spec->hp_paths, 0, sizeof(spec->hp_paths));
1145 memset(spec->speaker_paths, 0, sizeof(spec->speaker_paths));
1146 memset(spec->aamix_out_paths, 0, sizeof(spec->aamix_out_paths));
1147 memset(spec->digout_paths, 0, sizeof(spec->digout_paths));
1148 memset(spec->loopback_paths, 0, sizeof(spec->loopback_paths));
1149 memset(&spec->digin_path, 0, sizeof(spec->digin_path));
1150
Takashi Iwai352f7f92012-12-19 12:52:06 +01001151 badness = 0;
1152
1153 /* fill hard-wired DACs first */
1154 if (fill_hardwired) {
1155 bool mapped;
1156 do {
1157 mapped = map_singles(codec, cfg->line_outs,
1158 cfg->line_out_pins,
Takashi Iwai196c17662013-01-04 15:01:40 +01001159 spec->private_dac_nids,
1160 spec->out_paths);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001161 mapped |= map_singles(codec, cfg->hp_outs,
1162 cfg->hp_pins,
Takashi Iwai196c17662013-01-04 15:01:40 +01001163 spec->multiout.hp_out_nid,
1164 spec->hp_paths);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001165 mapped |= map_singles(codec, cfg->speaker_outs,
1166 cfg->speaker_pins,
Takashi Iwai196c17662013-01-04 15:01:40 +01001167 spec->multiout.extra_out_nid,
1168 spec->speaker_paths);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001169 if (fill_mio_first && cfg->line_outs == 1 &&
1170 cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
Takashi Iwaie22aab72013-01-04 14:50:04 +01001171 err = fill_multi_ios(codec, cfg->line_out_pins[0], true);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001172 if (!err)
1173 mapped = true;
1174 }
1175 } while (mapped);
1176 }
1177
1178 badness += try_assign_dacs(codec, cfg->line_outs, cfg->line_out_pins,
Takashi Iwai196c17662013-01-04 15:01:40 +01001179 spec->private_dac_nids, spec->out_paths,
Takashi Iwai352f7f92012-12-19 12:52:06 +01001180 &main_out_badness);
1181
1182 /* re-count num_dacs and squash invalid entries */
1183 spec->multiout.num_dacs = 0;
1184 for (i = 0; i < cfg->line_outs; i++) {
1185 if (spec->private_dac_nids[i])
1186 spec->multiout.num_dacs++;
1187 else {
1188 memmove(spec->private_dac_nids + i,
1189 spec->private_dac_nids + i + 1,
1190 sizeof(hda_nid_t) * (cfg->line_outs - i - 1));
1191 spec->private_dac_nids[cfg->line_outs - 1] = 0;
1192 }
1193 }
1194
1195 if (fill_mio_first &&
1196 cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1197 /* try to fill multi-io first */
Takashi Iwaie22aab72013-01-04 14:50:04 +01001198 err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001199 if (err < 0)
1200 return err;
1201 /* we don't count badness at this stage yet */
1202 }
1203
1204 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
1205 err = try_assign_dacs(codec, cfg->hp_outs, cfg->hp_pins,
1206 spec->multiout.hp_out_nid,
Takashi Iwai196c17662013-01-04 15:01:40 +01001207 spec->hp_paths,
Takashi Iwai352f7f92012-12-19 12:52:06 +01001208 &extra_out_badness);
1209 if (err < 0)
1210 return err;
1211 badness += err;
1212 }
1213 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1214 err = try_assign_dacs(codec, cfg->speaker_outs,
1215 cfg->speaker_pins,
1216 spec->multiout.extra_out_nid,
Takashi Iwai196c17662013-01-04 15:01:40 +01001217 spec->speaker_paths,
1218 &extra_out_badness);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001219 if (err < 0)
1220 return err;
1221 badness += err;
1222 }
1223 if (cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
Takashi Iwaie22aab72013-01-04 14:50:04 +01001224 err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001225 if (err < 0)
1226 return err;
1227 badness += err;
1228 }
Takashi Iwaie22aab72013-01-04 14:50:04 +01001229
Takashi Iwaic30aa7b2013-01-04 16:42:48 +01001230 if (spec->mixer_nid) {
1231 spec->aamix_out_paths[0] =
1232 check_aamix_out_path(codec, spec->out_paths[0]);
1233 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1234 spec->aamix_out_paths[1] =
1235 check_aamix_out_path(codec, spec->hp_paths[0]);
1236 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1237 spec->aamix_out_paths[2] =
1238 check_aamix_out_path(codec, spec->speaker_paths[0]);
1239 }
1240
Takashi Iwaie22aab72013-01-04 14:50:04 +01001241 if (cfg->hp_outs && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
1242 if (count_multiio_pins(codec, cfg->hp_pins[0]) >= 2)
1243 spec->multi_ios = 1; /* give badness */
Takashi Iwai352f7f92012-12-19 12:52:06 +01001244
1245 if (spec->multi_ios == 2) {
1246 for (i = 0; i < 2; i++)
1247 spec->private_dac_nids[spec->multiout.num_dacs++] =
1248 spec->multi_io[i].dac;
1249 spec->ext_channel_count = 2;
1250 } else if (spec->multi_ios) {
1251 spec->multi_ios = 0;
1252 badness += BAD_MULTI_IO;
1253 }
1254
1255 return badness;
1256}
1257
1258#define DEBUG_BADNESS
1259
1260#ifdef DEBUG_BADNESS
1261#define debug_badness snd_printdd
1262#else
1263#define debug_badness(...)
1264#endif
1265
1266static void debug_show_configs(struct hda_gen_spec *spec, struct auto_pin_cfg *cfg)
1267{
1268 debug_badness("multi_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1269 cfg->line_out_pins[0], cfg->line_out_pins[1],
Takashi Iwai708122e2012-12-20 17:56:57 +01001270 cfg->line_out_pins[2], cfg->line_out_pins[3],
Takashi Iwai352f7f92012-12-19 12:52:06 +01001271 spec->multiout.dac_nids[0],
1272 spec->multiout.dac_nids[1],
1273 spec->multiout.dac_nids[2],
1274 spec->multiout.dac_nids[3]);
1275 if (spec->multi_ios > 0)
1276 debug_badness("multi_ios(%d) = %x/%x : %x/%x\n",
1277 spec->multi_ios,
1278 spec->multi_io[0].pin, spec->multi_io[1].pin,
1279 spec->multi_io[0].dac, spec->multi_io[1].dac);
1280 debug_badness("hp_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1281 cfg->hp_pins[0], cfg->hp_pins[1],
Takashi Iwai708122e2012-12-20 17:56:57 +01001282 cfg->hp_pins[2], cfg->hp_pins[3],
Takashi Iwai352f7f92012-12-19 12:52:06 +01001283 spec->multiout.hp_out_nid[0],
1284 spec->multiout.hp_out_nid[1],
1285 spec->multiout.hp_out_nid[2],
1286 spec->multiout.hp_out_nid[3]);
1287 debug_badness("spk_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1288 cfg->speaker_pins[0], cfg->speaker_pins[1],
1289 cfg->speaker_pins[2], cfg->speaker_pins[3],
1290 spec->multiout.extra_out_nid[0],
1291 spec->multiout.extra_out_nid[1],
1292 spec->multiout.extra_out_nid[2],
1293 spec->multiout.extra_out_nid[3]);
1294}
1295
1296/* find all available DACs of the codec */
1297static void fill_all_dac_nids(struct hda_codec *codec)
1298{
1299 struct hda_gen_spec *spec = codec->spec;
1300 int i;
1301 hda_nid_t nid = codec->start_nid;
1302
1303 spec->num_all_dacs = 0;
1304 memset(spec->all_dacs, 0, sizeof(spec->all_dacs));
1305 for (i = 0; i < codec->num_nodes; i++, nid++) {
1306 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_AUD_OUT)
1307 continue;
1308 if (spec->num_all_dacs >= ARRAY_SIZE(spec->all_dacs)) {
1309 snd_printk(KERN_ERR "hda: Too many DACs!\n");
1310 break;
1311 }
1312 spec->all_dacs[spec->num_all_dacs++] = nid;
1313 }
1314}
1315
1316static int parse_output_paths(struct hda_codec *codec)
1317{
1318 struct hda_gen_spec *spec = codec->spec;
1319 struct auto_pin_cfg *cfg = &spec->autocfg;
1320 struct auto_pin_cfg *best_cfg;
1321 int best_badness = INT_MAX;
1322 int badness;
1323 bool fill_hardwired = true, fill_mio_first = true;
1324 bool best_wired = true, best_mio = true;
1325 bool hp_spk_swapped = false;
1326
1327 fill_all_dac_nids(codec);
1328
1329 best_cfg = kmalloc(sizeof(*best_cfg), GFP_KERNEL);
1330 if (!best_cfg)
1331 return -ENOMEM;
1332 *best_cfg = *cfg;
1333
1334 for (;;) {
1335 badness = fill_and_eval_dacs(codec, fill_hardwired,
1336 fill_mio_first);
1337 if (badness < 0) {
1338 kfree(best_cfg);
1339 return badness;
1340 }
1341 debug_badness("==> lo_type=%d, wired=%d, mio=%d, badness=0x%x\n",
1342 cfg->line_out_type, fill_hardwired, fill_mio_first,
1343 badness);
1344 debug_show_configs(spec, cfg);
1345 if (badness < best_badness) {
1346 best_badness = badness;
1347 *best_cfg = *cfg;
1348 best_wired = fill_hardwired;
1349 best_mio = fill_mio_first;
1350 }
1351 if (!badness)
1352 break;
1353 fill_mio_first = !fill_mio_first;
1354 if (!fill_mio_first)
1355 continue;
1356 fill_hardwired = !fill_hardwired;
1357 if (!fill_hardwired)
1358 continue;
1359 if (hp_spk_swapped)
1360 break;
1361 hp_spk_swapped = true;
1362 if (cfg->speaker_outs > 0 &&
1363 cfg->line_out_type == AUTO_PIN_HP_OUT) {
1364 cfg->hp_outs = cfg->line_outs;
1365 memcpy(cfg->hp_pins, cfg->line_out_pins,
1366 sizeof(cfg->hp_pins));
1367 cfg->line_outs = cfg->speaker_outs;
1368 memcpy(cfg->line_out_pins, cfg->speaker_pins,
1369 sizeof(cfg->speaker_pins));
1370 cfg->speaker_outs = 0;
1371 memset(cfg->speaker_pins, 0, sizeof(cfg->speaker_pins));
1372 cfg->line_out_type = AUTO_PIN_SPEAKER_OUT;
1373 fill_hardwired = true;
1374 continue;
1375 }
1376 if (cfg->hp_outs > 0 &&
1377 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
1378 cfg->speaker_outs = cfg->line_outs;
1379 memcpy(cfg->speaker_pins, cfg->line_out_pins,
1380 sizeof(cfg->speaker_pins));
1381 cfg->line_outs = cfg->hp_outs;
1382 memcpy(cfg->line_out_pins, cfg->hp_pins,
1383 sizeof(cfg->hp_pins));
1384 cfg->hp_outs = 0;
1385 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
1386 cfg->line_out_type = AUTO_PIN_HP_OUT;
1387 fill_hardwired = true;
1388 continue;
1389 }
1390 break;
1391 }
1392
1393 if (badness) {
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001394 debug_badness("==> restoring best_cfg\n");
Takashi Iwai352f7f92012-12-19 12:52:06 +01001395 *cfg = *best_cfg;
1396 fill_and_eval_dacs(codec, best_wired, best_mio);
1397 }
1398 debug_badness("==> Best config: lo_type=%d, wired=%d, mio=%d\n",
1399 cfg->line_out_type, best_wired, best_mio);
1400 debug_show_configs(spec, cfg);
1401
1402 if (cfg->line_out_pins[0]) {
1403 struct nid_path *path;
Takashi Iwai196c17662013-01-04 15:01:40 +01001404 path = snd_hda_get_path_from_idx(codec, spec->out_paths[0]);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001405 if (path)
1406 spec->vmaster_nid = look_for_out_vol_nid(codec, path);
1407 }
1408
1409 kfree(best_cfg);
1410 return 0;
1411}
1412
1413/* add playback controls from the parsed DAC table */
1414static int create_multi_out_ctls(struct hda_codec *codec,
1415 const struct auto_pin_cfg *cfg)
1416{
1417 struct hda_gen_spec *spec = codec->spec;
1418 int i, err, noutputs;
1419
1420 noutputs = cfg->line_outs;
1421 if (spec->multi_ios > 0 && cfg->line_outs < 3)
1422 noutputs += spec->multi_ios;
1423
1424 for (i = 0; i < noutputs; i++) {
1425 const char *name;
1426 int index;
Takashi Iwai196c17662013-01-04 15:01:40 +01001427 hda_nid_t dac;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001428 struct nid_path *path;
1429
1430 dac = spec->multiout.dac_nids[i];
1431 if (!dac)
1432 continue;
1433 if (i >= cfg->line_outs) {
Takashi Iwai352f7f92012-12-19 12:52:06 +01001434 index = 0;
1435 name = channel_name[i];
1436 } else {
Takashi Iwai352f7f92012-12-19 12:52:06 +01001437 name = get_line_out_pfx(spec, i, true, &index);
1438 }
1439
Takashi Iwai196c17662013-01-04 15:01:40 +01001440 path = snd_hda_get_path_from_idx(codec, spec->out_paths[i]);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001441 if (!path)
1442 continue;
1443 if (!name || !strcmp(name, "CLFE")) {
1444 /* Center/LFE */
1445 err = add_vol_ctl(codec, "Center", 0, 1, path);
1446 if (err < 0)
1447 return err;
1448 err = add_vol_ctl(codec, "LFE", 0, 2, path);
1449 if (err < 0)
1450 return err;
1451 err = add_sw_ctl(codec, "Center", 0, 1, path);
1452 if (err < 0)
1453 return err;
1454 err = add_sw_ctl(codec, "LFE", 0, 2, path);
1455 if (err < 0)
1456 return err;
1457 } else {
1458 err = add_stereo_vol(codec, name, index, path);
1459 if (err < 0)
1460 return err;
1461 err = add_stereo_sw(codec, name, index, path);
1462 if (err < 0)
1463 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001464 }
1465 }
1466 return 0;
1467}
1468
Takashi Iwaic2c80382013-01-07 10:33:57 +01001469static int create_extra_out(struct hda_codec *codec, int path_idx,
Takashi Iwai196c17662013-01-04 15:01:40 +01001470 const char *pfx, int cidx)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001471{
Takashi Iwai352f7f92012-12-19 12:52:06 +01001472 struct nid_path *path;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001473 int err;
1474
Takashi Iwai196c17662013-01-04 15:01:40 +01001475 path = snd_hda_get_path_from_idx(codec, path_idx);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001476 if (!path)
1477 return 0;
Takashi Iwaic2c80382013-01-07 10:33:57 +01001478 err = add_stereo_vol(codec, pfx, cidx, path);
1479 if (err < 0)
1480 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001481 err = add_stereo_sw(codec, pfx, cidx, path);
1482 if (err < 0)
1483 return err;
1484 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001485}
1486
Takashi Iwai352f7f92012-12-19 12:52:06 +01001487/* add playback controls for speaker and HP outputs */
1488static int create_extra_outs(struct hda_codec *codec, int num_pins,
Takashi Iwai196c17662013-01-04 15:01:40 +01001489 const int *paths, const char *pfx)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001490{
Takashi Iwaic2c80382013-01-07 10:33:57 +01001491 int i;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001492
1493 for (i = 0; i < num_pins; i++) {
Takashi Iwaic2c80382013-01-07 10:33:57 +01001494 const char *name;
1495 char tmp[44];
1496 int err, idx = 0;
1497
1498 if (num_pins == 2 && i == 1 && !strcmp(pfx, "Speaker"))
1499 name = "Bass Speaker";
1500 else if (num_pins >= 3) {
1501 snprintf(tmp, sizeof(tmp), "%s %s",
Takashi Iwai352f7f92012-12-19 12:52:06 +01001502 pfx, channel_name[i]);
Takashi Iwaic2c80382013-01-07 10:33:57 +01001503 name = tmp;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001504 } else {
Takashi Iwaic2c80382013-01-07 10:33:57 +01001505 name = pfx;
1506 idx = i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001507 }
Takashi Iwaic2c80382013-01-07 10:33:57 +01001508 err = create_extra_out(codec, paths[i], name, idx);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001509 if (err < 0)
1510 return err;
1511 }
1512 return 0;
1513}
Takashi Iwai97ec5582006-03-21 11:29:07 +01001514
Takashi Iwai352f7f92012-12-19 12:52:06 +01001515static int create_hp_out_ctls(struct hda_codec *codec)
1516{
1517 struct hda_gen_spec *spec = codec->spec;
1518 return create_extra_outs(codec, spec->autocfg.hp_outs,
Takashi Iwai196c17662013-01-04 15:01:40 +01001519 spec->hp_paths,
Takashi Iwai352f7f92012-12-19 12:52:06 +01001520 "Headphone");
1521}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001522
Takashi Iwai352f7f92012-12-19 12:52:06 +01001523static int create_speaker_out_ctls(struct hda_codec *codec)
1524{
1525 struct hda_gen_spec *spec = codec->spec;
1526 return create_extra_outs(codec, spec->autocfg.speaker_outs,
Takashi Iwai196c17662013-01-04 15:01:40 +01001527 spec->speaker_paths,
Takashi Iwai352f7f92012-12-19 12:52:06 +01001528 "Speaker");
1529}
1530
1531/*
Takashi Iwai38cf6f12012-12-21 14:09:42 +01001532 * independent HP controls
1533 */
1534
1535static int indep_hp_info(struct snd_kcontrol *kcontrol,
1536 struct snd_ctl_elem_info *uinfo)
1537{
1538 return snd_hda_enum_bool_helper_info(kcontrol, uinfo);
1539}
1540
1541static int indep_hp_get(struct snd_kcontrol *kcontrol,
1542 struct snd_ctl_elem_value *ucontrol)
1543{
1544 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1545 struct hda_gen_spec *spec = codec->spec;
1546 ucontrol->value.enumerated.item[0] = spec->indep_hp_enabled;
1547 return 0;
1548}
1549
1550static int indep_hp_put(struct snd_kcontrol *kcontrol,
1551 struct snd_ctl_elem_value *ucontrol)
1552{
1553 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1554 struct hda_gen_spec *spec = codec->spec;
1555 unsigned int select = ucontrol->value.enumerated.item[0];
1556 int ret = 0;
1557
1558 mutex_lock(&spec->pcm_mutex);
1559 if (spec->active_streams) {
1560 ret = -EBUSY;
1561 goto unlock;
1562 }
1563
1564 if (spec->indep_hp_enabled != select) {
1565 spec->indep_hp_enabled = select;
1566 if (spec->indep_hp_enabled)
1567 spec->multiout.hp_out_nid[0] = 0;
1568 else
1569 spec->multiout.hp_out_nid[0] = spec->alt_dac_nid;
1570 ret = 1;
1571 }
1572 unlock:
1573 mutex_unlock(&spec->pcm_mutex);
1574 return ret;
1575}
1576
1577static const struct snd_kcontrol_new indep_hp_ctl = {
1578 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1579 .name = "Independent HP",
1580 .info = indep_hp_info,
1581 .get = indep_hp_get,
1582 .put = indep_hp_put,
1583};
1584
1585
1586static int create_indep_hp_ctls(struct hda_codec *codec)
1587{
1588 struct hda_gen_spec *spec = codec->spec;
1589
1590 if (!spec->indep_hp)
1591 return 0;
1592 if (!spec->multiout.hp_out_nid[0]) {
1593 spec->indep_hp = 0;
1594 return 0;
1595 }
1596
1597 spec->indep_hp_enabled = false;
1598 spec->alt_dac_nid = spec->multiout.hp_out_nid[0];
1599 if (!snd_hda_gen_add_kctl(spec, NULL, &indep_hp_ctl))
1600 return -ENOMEM;
1601 return 0;
1602}
1603
1604/*
Takashi Iwai352f7f92012-12-19 12:52:06 +01001605 * channel mode enum control
1606 */
1607
1608static int ch_mode_info(struct snd_kcontrol *kcontrol,
1609 struct snd_ctl_elem_info *uinfo)
1610{
1611 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1612 struct hda_gen_spec *spec = codec->spec;
1613
1614 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1615 uinfo->count = 1;
1616 uinfo->value.enumerated.items = spec->multi_ios + 1;
1617 if (uinfo->value.enumerated.item > spec->multi_ios)
1618 uinfo->value.enumerated.item = spec->multi_ios;
1619 sprintf(uinfo->value.enumerated.name, "%dch",
1620 (uinfo->value.enumerated.item + 1) * 2);
1621 return 0;
1622}
1623
1624static int ch_mode_get(struct snd_kcontrol *kcontrol,
1625 struct snd_ctl_elem_value *ucontrol)
1626{
1627 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1628 struct hda_gen_spec *spec = codec->spec;
1629 ucontrol->value.enumerated.item[0] = (spec->ext_channel_count - 1) / 2;
1630 return 0;
1631}
1632
Takashi Iwai196c17662013-01-04 15:01:40 +01001633static inline struct nid_path *
1634get_multiio_path(struct hda_codec *codec, int idx)
1635{
1636 struct hda_gen_spec *spec = codec->spec;
1637 return snd_hda_get_path_from_idx(codec,
1638 spec->out_paths[spec->autocfg.line_outs + idx]);
1639}
1640
Takashi Iwai352f7f92012-12-19 12:52:06 +01001641static int set_multi_io(struct hda_codec *codec, int idx, bool output)
1642{
1643 struct hda_gen_spec *spec = codec->spec;
1644 hda_nid_t nid = spec->multi_io[idx].pin;
1645 struct nid_path *path;
1646
Takashi Iwai196c17662013-01-04 15:01:40 +01001647 path = get_multiio_path(codec, idx);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001648 if (!path)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001649 return -EINVAL;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001650
1651 if (path->active == output)
1652 return 0;
1653
1654 if (output) {
1655 snd_hda_set_pin_ctl_cache(codec, nid, PIN_OUT);
1656 snd_hda_activate_path(codec, path, true, true);
Takashi Iwaid5a9f1b2012-12-20 15:36:30 +01001657 set_pin_eapd(codec, nid, true);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001658 } else {
Takashi Iwaid5a9f1b2012-12-20 15:36:30 +01001659 set_pin_eapd(codec, nid, false);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001660 snd_hda_activate_path(codec, path, false, true);
1661 snd_hda_set_pin_ctl_cache(codec, nid,
1662 spec->multi_io[idx].ctl_in);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001663 }
Takashi Iwai352f7f92012-12-19 12:52:06 +01001664 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001665}
1666
Takashi Iwai352f7f92012-12-19 12:52:06 +01001667static int ch_mode_put(struct snd_kcontrol *kcontrol,
1668 struct snd_ctl_elem_value *ucontrol)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001669{
Takashi Iwai352f7f92012-12-19 12:52:06 +01001670 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1671 struct hda_gen_spec *spec = codec->spec;
1672 int i, ch;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001673
Takashi Iwai352f7f92012-12-19 12:52:06 +01001674 ch = ucontrol->value.enumerated.item[0];
1675 if (ch < 0 || ch > spec->multi_ios)
1676 return -EINVAL;
1677 if (ch == (spec->ext_channel_count - 1) / 2)
1678 return 0;
1679 spec->ext_channel_count = (ch + 1) * 2;
1680 for (i = 0; i < spec->multi_ios; i++)
1681 set_multi_io(codec, i, i < ch);
1682 spec->multiout.max_channels = max(spec->ext_channel_count,
1683 spec->const_channel_count);
1684 if (spec->need_dac_fix)
1685 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001686 return 1;
1687}
1688
Takashi Iwai352f7f92012-12-19 12:52:06 +01001689static const struct snd_kcontrol_new channel_mode_enum = {
1690 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1691 .name = "Channel Mode",
1692 .info = ch_mode_info,
1693 .get = ch_mode_get,
1694 .put = ch_mode_put,
1695};
Linus Torvalds1da177e2005-04-16 15:20:36 -07001696
Takashi Iwai352f7f92012-12-19 12:52:06 +01001697static int create_multi_channel_mode(struct hda_codec *codec)
1698{
1699 struct hda_gen_spec *spec = codec->spec;
1700
1701 if (spec->multi_ios > 0) {
Takashi Iwai12c93df2012-12-19 14:38:33 +01001702 if (!snd_hda_gen_add_kctl(spec, NULL, &channel_mode_enum))
Takashi Iwai352f7f92012-12-19 12:52:06 +01001703 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001704 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001705 return 0;
1706}
1707
Takashi Iwai352f7f92012-12-19 12:52:06 +01001708/*
Takashi Iwaic30aa7b2013-01-04 16:42:48 +01001709 * aamix loopback enable/disable switch
1710 */
1711
1712#define loopback_mixing_info indep_hp_info
1713
1714static int loopback_mixing_get(struct snd_kcontrol *kcontrol,
1715 struct snd_ctl_elem_value *ucontrol)
1716{
1717 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1718 struct hda_gen_spec *spec = codec->spec;
1719 ucontrol->value.enumerated.item[0] = spec->aamix_mode;
1720 return 0;
1721}
1722
1723static void update_aamix_paths(struct hda_codec *codec, bool do_mix,
1724 int nomix_path_idx, int mix_path_idx)
1725{
1726 struct nid_path *nomix_path, *mix_path;
1727
1728 nomix_path = snd_hda_get_path_from_idx(codec, nomix_path_idx);
1729 mix_path = snd_hda_get_path_from_idx(codec, mix_path_idx);
1730 if (!nomix_path || !mix_path)
1731 return;
1732 if (do_mix) {
1733 snd_hda_activate_path(codec, nomix_path, false, true);
1734 snd_hda_activate_path(codec, mix_path, true, true);
1735 } else {
1736 snd_hda_activate_path(codec, mix_path, false, true);
1737 snd_hda_activate_path(codec, nomix_path, true, true);
1738 }
1739}
1740
1741static int loopback_mixing_put(struct snd_kcontrol *kcontrol,
1742 struct snd_ctl_elem_value *ucontrol)
1743{
1744 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1745 struct hda_gen_spec *spec = codec->spec;
1746 unsigned int val = ucontrol->value.enumerated.item[0];
1747
1748 if (val == spec->aamix_mode)
1749 return 0;
1750 spec->aamix_mode = val;
1751 update_aamix_paths(codec, val, spec->out_paths[0],
1752 spec->aamix_out_paths[0]);
1753 update_aamix_paths(codec, val, spec->hp_paths[0],
1754 spec->aamix_out_paths[1]);
1755 update_aamix_paths(codec, val, spec->speaker_paths[0],
1756 spec->aamix_out_paths[2]);
1757 return 1;
1758}
1759
1760static const struct snd_kcontrol_new loopback_mixing_enum = {
1761 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1762 .name = "Loopback Mixing",
1763 .info = loopback_mixing_info,
1764 .get = loopback_mixing_get,
1765 .put = loopback_mixing_put,
1766};
1767
1768static int create_loopback_mixing_ctl(struct hda_codec *codec)
1769{
1770 struct hda_gen_spec *spec = codec->spec;
1771
1772 if (!spec->mixer_nid)
1773 return 0;
1774 if (!(spec->aamix_out_paths[0] || spec->aamix_out_paths[1] ||
1775 spec->aamix_out_paths[2]))
1776 return 0;
1777 if (!snd_hda_gen_add_kctl(spec, NULL, &loopback_mixing_enum))
1778 return -ENOMEM;
1779 return 0;
1780}
1781
1782/*
Takashi Iwai352f7f92012-12-19 12:52:06 +01001783 * shared headphone/mic handling
1784 */
Takashi Iwaicb53c622007-08-10 17:21:45 +02001785
Takashi Iwai352f7f92012-12-19 12:52:06 +01001786static void call_update_outputs(struct hda_codec *codec);
1787
1788/* for shared I/O, change the pin-control accordingly */
1789static void update_shared_mic_hp(struct hda_codec *codec, bool set_as_mic)
1790{
1791 struct hda_gen_spec *spec = codec->spec;
1792 unsigned int val;
1793 hda_nid_t pin = spec->autocfg.inputs[1].pin;
1794 /* NOTE: this assumes that there are only two inputs, the
1795 * first is the real internal mic and the second is HP/mic jack.
1796 */
1797
1798 val = snd_hda_get_default_vref(codec, pin);
1799
1800 /* This pin does not have vref caps - let's enable vref on pin 0x18
1801 instead, as suggested by Realtek */
1802 if (val == AC_PINCTL_VREF_HIZ && spec->shared_mic_vref_pin) {
1803 const hda_nid_t vref_pin = spec->shared_mic_vref_pin;
1804 unsigned int vref_val = snd_hda_get_default_vref(codec, vref_pin);
1805 if (vref_val != AC_PINCTL_VREF_HIZ)
Takashi Iwai7594aa32012-12-20 15:38:40 +01001806 snd_hda_set_pin_ctl_cache(codec, vref_pin,
1807 PIN_IN | (set_as_mic ? vref_val : 0));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001808 }
Takashi Iwai352f7f92012-12-19 12:52:06 +01001809
1810 val = set_as_mic ? val | PIN_IN : PIN_HP;
Takashi Iwai7594aa32012-12-20 15:38:40 +01001811 snd_hda_set_pin_ctl_cache(codec, pin, val);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001812
1813 spec->automute_speaker = !set_as_mic;
1814 call_update_outputs(codec);
1815}
1816
1817/* create a shared input with the headphone out */
1818static int create_shared_input(struct hda_codec *codec)
1819{
1820 struct hda_gen_spec *spec = codec->spec;
1821 struct auto_pin_cfg *cfg = &spec->autocfg;
1822 unsigned int defcfg;
1823 hda_nid_t nid;
1824
1825 /* only one internal input pin? */
1826 if (cfg->num_inputs != 1)
1827 return 0;
1828 defcfg = snd_hda_codec_get_pincfg(codec, cfg->inputs[0].pin);
1829 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
1830 return 0;
1831
1832 if (cfg->hp_outs == 1 && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
1833 nid = cfg->hp_pins[0]; /* OK, we have a single HP-out */
1834 else if (cfg->line_outs == 1 && cfg->line_out_type == AUTO_PIN_HP_OUT)
1835 nid = cfg->line_out_pins[0]; /* OK, we have a single line-out */
1836 else
1837 return 0; /* both not available */
1838
1839 if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_IN))
1840 return 0; /* no input */
1841
1842 cfg->inputs[1].pin = nid;
1843 cfg->inputs[1].type = AUTO_PIN_MIC;
1844 cfg->num_inputs = 2;
1845 spec->shared_mic_hp = 1;
1846 snd_printdd("hda-codec: Enable shared I/O jack on NID 0x%x\n", nid);
1847 return 0;
1848}
1849
1850
1851/*
1852 * Parse input paths
1853 */
1854
1855#ifdef CONFIG_PM
1856/* add the powersave loopback-list entry */
1857static void add_loopback_list(struct hda_gen_spec *spec, hda_nid_t mix, int idx)
1858{
1859 struct hda_amp_list *list;
1860
1861 if (spec->num_loopbacks >= ARRAY_SIZE(spec->loopback_list) - 1)
1862 return;
1863 list = spec->loopback_list + spec->num_loopbacks;
1864 list->nid = mix;
1865 list->dir = HDA_INPUT;
1866 list->idx = idx;
1867 spec->num_loopbacks++;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001868 spec->loopback.amplist = spec->loopback_list;
1869}
1870#else
Takashi Iwai352f7f92012-12-19 12:52:06 +01001871#define add_loopback_list(spec, mix, idx) /* NOP */
Takashi Iwaicb53c622007-08-10 17:21:45 +02001872#endif
1873
Takashi Iwai352f7f92012-12-19 12:52:06 +01001874/* create input playback/capture controls for the given pin */
Takashi Iwai196c17662013-01-04 15:01:40 +01001875static int new_analog_input(struct hda_codec *codec, int input_idx,
1876 hda_nid_t pin, const char *ctlname, int ctlidx,
Takashi Iwai352f7f92012-12-19 12:52:06 +01001877 hda_nid_t mix_nid)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001878{
Takashi Iwai352f7f92012-12-19 12:52:06 +01001879 struct hda_gen_spec *spec = codec->spec;
1880 struct nid_path *path;
1881 unsigned int val;
1882 int err, idx;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001883
Takashi Iwai352f7f92012-12-19 12:52:06 +01001884 if (!nid_has_volume(codec, mix_nid, HDA_INPUT) &&
1885 !nid_has_mute(codec, mix_nid, HDA_INPUT))
1886 return 0; /* no need for analog loopback */
1887
Takashi Iwai4ac0eef2012-12-20 18:10:51 +01001888 path = snd_hda_add_new_path(codec, pin, mix_nid, HDA_PARSE_ALL);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001889 if (!path)
1890 return -EINVAL;
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001891 print_nid_path("loopback", path);
Takashi Iwai196c17662013-01-04 15:01:40 +01001892 spec->loopback_paths[input_idx] = snd_hda_get_path_idx(codec, path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001893
1894 idx = path->idx[path->depth - 1];
1895 if (nid_has_volume(codec, mix_nid, HDA_INPUT)) {
1896 val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
1897 err = __add_pb_vol_ctrl(spec, HDA_CTL_WIDGET_VOL, ctlname, ctlidx, val);
Takashi Iwaid13bd412008-07-30 15:01:45 +02001898 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001899 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001900 path->ctls[NID_PATH_VOL_CTL] = val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001901 }
1902
Takashi Iwai352f7f92012-12-19 12:52:06 +01001903 if (nid_has_mute(codec, mix_nid, HDA_INPUT)) {
1904 val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
1905 err = __add_pb_sw_ctrl(spec, HDA_CTL_WIDGET_MUTE, ctlname, ctlidx, val);
Takashi Iwaid13bd412008-07-30 15:01:45 +02001906 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001907 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001908 path->ctls[NID_PATH_MUTE_CTL] = val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001909 }
1910
Takashi Iwai352f7f92012-12-19 12:52:06 +01001911 path->active = true;
1912 add_loopback_list(spec, mix_nid, idx);
1913 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001914}
1915
Takashi Iwai352f7f92012-12-19 12:52:06 +01001916static int is_input_pin(struct hda_codec *codec, hda_nid_t nid)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001917{
Takashi Iwai352f7f92012-12-19 12:52:06 +01001918 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
1919 return (pincap & AC_PINCAP_IN) != 0;
1920}
1921
1922/* Parse the codec tree and retrieve ADCs */
1923static int fill_adc_nids(struct hda_codec *codec)
1924{
1925 struct hda_gen_spec *spec = codec->spec;
1926 hda_nid_t nid;
1927 hda_nid_t *adc_nids = spec->adc_nids;
1928 int max_nums = ARRAY_SIZE(spec->adc_nids);
1929 int i, nums = 0;
1930
1931 nid = codec->start_nid;
1932 for (i = 0; i < codec->num_nodes; i++, nid++) {
1933 unsigned int caps = get_wcaps(codec, nid);
1934 int type = get_wcaps_type(caps);
1935
1936 if (type != AC_WID_AUD_IN || (caps & AC_WCAP_DIGITAL))
1937 continue;
1938 adc_nids[nums] = nid;
1939 if (++nums >= max_nums)
1940 break;
1941 }
1942 spec->num_adc_nids = nums;
1943 return nums;
1944}
1945
1946/* filter out invalid adc_nids that don't give all active input pins;
1947 * if needed, check whether dynamic ADC-switching is available
1948 */
1949static int check_dyn_adc_switch(struct hda_codec *codec)
1950{
1951 struct hda_gen_spec *spec = codec->spec;
1952 struct hda_input_mux *imux = &spec->input_mux;
1953 hda_nid_t adc_nids[ARRAY_SIZE(spec->adc_nids)];
1954 int i, n, nums;
1955 hda_nid_t pin, adc;
1956
1957 again:
1958 nums = 0;
1959 for (n = 0; n < spec->num_adc_nids; n++) {
1960 adc = spec->adc_nids[n];
1961 for (i = 0; i < imux->num_items; i++) {
1962 pin = spec->imux_pins[i];
1963 if (!is_reachable_path(codec, pin, adc))
1964 break;
1965 }
1966 if (i >= imux->num_items)
1967 adc_nids[nums++] = adc;
1968 }
1969
1970 if (!nums) {
1971 if (spec->shared_mic_hp) {
1972 spec->shared_mic_hp = 0;
1973 imux->num_items = 1;
1974 goto again;
1975 }
1976
1977 /* check whether ADC-switch is possible */
1978 for (i = 0; i < imux->num_items; i++) {
1979 pin = spec->imux_pins[i];
1980 for (n = 0; n < spec->num_adc_nids; n++) {
1981 adc = spec->adc_nids[n];
1982 if (is_reachable_path(codec, pin, adc)) {
1983 spec->dyn_adc_idx[i] = n;
1984 break;
1985 }
1986 }
1987 }
1988
1989 snd_printdd("hda-codec: enabling ADC switching\n");
1990 spec->dyn_adc_switch = 1;
1991 } else if (nums != spec->num_adc_nids) {
1992 memcpy(spec->adc_nids, adc_nids, nums * sizeof(hda_nid_t));
1993 spec->num_adc_nids = nums;
1994 }
1995
1996 if (imux->num_items == 1 || spec->shared_mic_hp) {
1997 snd_printdd("hda-codec: reducing to a single ADC\n");
1998 spec->num_adc_nids = 1; /* reduce to a single ADC */
1999 }
2000
2001 /* single index for individual volumes ctls */
2002 if (!spec->dyn_adc_switch && spec->multi_cap_vol)
2003 spec->num_adc_nids = 1;
2004
Linus Torvalds1da177e2005-04-16 15:20:36 -07002005 return 0;
2006}
2007
2008/*
Takashi Iwai352f7f92012-12-19 12:52:06 +01002009 * create playback/capture controls for input pins
Linus Torvalds1da177e2005-04-16 15:20:36 -07002010 */
Takashi Iwai352f7f92012-12-19 12:52:06 +01002011static int create_input_ctls(struct hda_codec *codec)
Takashi Iwaia7da6ce2006-09-06 14:03:14 +02002012{
Takashi Iwai352f7f92012-12-19 12:52:06 +01002013 struct hda_gen_spec *spec = codec->spec;
2014 const struct auto_pin_cfg *cfg = &spec->autocfg;
2015 hda_nid_t mixer = spec->mixer_nid;
2016 struct hda_input_mux *imux = &spec->input_mux;
2017 int num_adcs;
2018 int i, c, err, type_idx = 0;
2019 const char *prev_label = NULL;
Takashi Iwaia7da6ce2006-09-06 14:03:14 +02002020
Takashi Iwai352f7f92012-12-19 12:52:06 +01002021 num_adcs = fill_adc_nids(codec);
2022 if (num_adcs < 0)
2023 return 0;
Takashi Iwaia7da6ce2006-09-06 14:03:14 +02002024
Takashi Iwai352f7f92012-12-19 12:52:06 +01002025 for (i = 0; i < cfg->num_inputs; i++) {
2026 hda_nid_t pin;
2027 const char *label;
2028 bool imux_added;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002029
Takashi Iwai352f7f92012-12-19 12:52:06 +01002030 pin = cfg->inputs[i].pin;
2031 if (!is_input_pin(codec, pin))
2032 continue;
2033
2034 label = hda_get_autocfg_input_label(codec, cfg, i);
2035 if (spec->shared_mic_hp && !strcmp(label, "Misc"))
2036 label = "Headphone Mic";
2037 if (prev_label && !strcmp(label, prev_label))
2038 type_idx++;
Takashi Iwaia7da6ce2006-09-06 14:03:14 +02002039 else
Takashi Iwai352f7f92012-12-19 12:52:06 +01002040 type_idx = 0;
2041 prev_label = label;
2042
2043 if (mixer) {
2044 if (is_reachable_path(codec, pin, mixer)) {
Takashi Iwai196c17662013-01-04 15:01:40 +01002045 err = new_analog_input(codec, i, pin,
Takashi Iwai352f7f92012-12-19 12:52:06 +01002046 label, type_idx, mixer);
2047 if (err < 0)
2048 return err;
2049 }
2050 }
2051
2052 imux_added = false;
2053 for (c = 0; c < num_adcs; c++) {
2054 struct nid_path *path;
2055 hda_nid_t adc = spec->adc_nids[c];
2056
2057 if (!is_reachable_path(codec, pin, adc))
2058 continue;
2059 path = snd_array_new(&spec->paths);
2060 if (!path)
2061 return -ENOMEM;
2062 memset(path, 0, sizeof(*path));
Takashi Iwai4ac0eef2012-12-20 18:10:51 +01002063 if (!snd_hda_parse_nid_path(codec, pin, adc, HDA_PARSE_ALL, path)) {
Takashi Iwai352f7f92012-12-19 12:52:06 +01002064 snd_printd(KERN_ERR
2065 "invalid input path 0x%x -> 0x%x\n",
2066 pin, adc);
2067 spec->paths.used--;
2068 continue;
2069 }
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01002070 print_nid_path("input", path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002071
2072 if (!imux_added) {
2073 spec->imux_pins[imux->num_items] = pin;
2074 snd_hda_add_imux_item(imux, label,
2075 imux->num_items, NULL);
2076 imux_added = true;
2077 }
2078 }
2079 }
2080
2081 return 0;
2082}
2083
2084
2085/*
2086 * input source mux
2087 */
2088
2089/* get the ADC NID corresponding to the given index */
2090static hda_nid_t get_adc_nid(struct hda_codec *codec, int adc_idx, int imux_idx)
2091{
2092 struct hda_gen_spec *spec = codec->spec;
2093 if (spec->dyn_adc_switch)
2094 adc_idx = spec->dyn_adc_idx[imux_idx];
2095 return spec->adc_nids[adc_idx];
2096}
2097
2098static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
2099 unsigned int idx);
2100
2101static int mux_enum_info(struct snd_kcontrol *kcontrol,
2102 struct snd_ctl_elem_info *uinfo)
2103{
2104 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2105 struct hda_gen_spec *spec = codec->spec;
2106 return snd_hda_input_mux_info(&spec->input_mux, uinfo);
2107}
2108
2109static int mux_enum_get(struct snd_kcontrol *kcontrol,
2110 struct snd_ctl_elem_value *ucontrol)
2111{
2112 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2113 struct hda_gen_spec *spec = codec->spec;
2114 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2115
2116 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
2117 return 0;
2118}
2119
2120static int mux_enum_put(struct snd_kcontrol *kcontrol,
2121 struct snd_ctl_elem_value *ucontrol)
2122{
2123 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2124 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2125 return mux_select(codec, adc_idx,
2126 ucontrol->value.enumerated.item[0]);
2127}
2128
Takashi Iwai352f7f92012-12-19 12:52:06 +01002129static const struct snd_kcontrol_new cap_src_temp = {
2130 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2131 .name = "Input Source",
2132 .info = mux_enum_info,
2133 .get = mux_enum_get,
2134 .put = mux_enum_put,
2135};
2136
Takashi Iwai47d46ab2012-12-20 11:48:54 +01002137/*
2138 * capture volume and capture switch ctls
2139 */
2140
Takashi Iwai352f7f92012-12-19 12:52:06 +01002141typedef int (*put_call_t)(struct snd_kcontrol *kcontrol,
2142 struct snd_ctl_elem_value *ucontrol);
2143
Takashi Iwai47d46ab2012-12-20 11:48:54 +01002144/* call the given amp update function for all amps in the imux list at once */
Takashi Iwai352f7f92012-12-19 12:52:06 +01002145static int cap_put_caller(struct snd_kcontrol *kcontrol,
2146 struct snd_ctl_elem_value *ucontrol,
2147 put_call_t func, int type)
2148{
2149 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2150 struct hda_gen_spec *spec = codec->spec;
2151 const struct hda_input_mux *imux;
2152 struct nid_path *path;
2153 int i, adc_idx, err = 0;
2154
2155 imux = &spec->input_mux;
2156 adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2157 mutex_lock(&codec->control_mutex);
Takashi Iwai47d46ab2012-12-20 11:48:54 +01002158 /* we use the cache-only update at first since multiple input paths
2159 * may shared the same amp; by updating only caches, the redundant
2160 * writes to hardware can be reduced.
2161 */
Takashi Iwai352f7f92012-12-19 12:52:06 +01002162 codec->cached_write = 1;
2163 for (i = 0; i < imux->num_items; i++) {
2164 path = snd_hda_get_nid_path(codec, spec->imux_pins[i],
2165 get_adc_nid(codec, adc_idx, i));
2166 if (!path->ctls[type])
2167 continue;
2168 kcontrol->private_value = path->ctls[type];
2169 err = func(kcontrol, ucontrol);
2170 if (err < 0)
2171 goto error;
2172 }
2173 error:
2174 codec->cached_write = 0;
2175 mutex_unlock(&codec->control_mutex);
Takashi Iwai47d46ab2012-12-20 11:48:54 +01002176 snd_hda_codec_flush_amp_cache(codec); /* flush the updates */
Takashi Iwai352f7f92012-12-19 12:52:06 +01002177 if (err >= 0 && spec->cap_sync_hook)
2178 spec->cap_sync_hook(codec);
2179 return err;
2180}
2181
2182/* capture volume ctl callbacks */
2183#define cap_vol_info snd_hda_mixer_amp_volume_info
2184#define cap_vol_get snd_hda_mixer_amp_volume_get
2185#define cap_vol_tlv snd_hda_mixer_amp_tlv
2186
2187static int cap_vol_put(struct snd_kcontrol *kcontrol,
2188 struct snd_ctl_elem_value *ucontrol)
2189{
2190 return cap_put_caller(kcontrol, ucontrol,
2191 snd_hda_mixer_amp_volume_put,
2192 NID_PATH_VOL_CTL);
2193}
2194
2195static const struct snd_kcontrol_new cap_vol_temp = {
2196 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2197 .name = "Capture Volume",
2198 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
2199 SNDRV_CTL_ELEM_ACCESS_TLV_READ |
2200 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK),
2201 .info = cap_vol_info,
2202 .get = cap_vol_get,
2203 .put = cap_vol_put,
2204 .tlv = { .c = cap_vol_tlv },
2205};
2206
2207/* capture switch ctl callbacks */
2208#define cap_sw_info snd_ctl_boolean_stereo_info
2209#define cap_sw_get snd_hda_mixer_amp_switch_get
2210
2211static int cap_sw_put(struct snd_kcontrol *kcontrol,
2212 struct snd_ctl_elem_value *ucontrol)
2213{
2214 return cap_put_caller(kcontrol, ucontrol,
2215 snd_hda_mixer_amp_switch_put,
2216 NID_PATH_MUTE_CTL);
2217}
2218
2219static const struct snd_kcontrol_new cap_sw_temp = {
2220 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2221 .name = "Capture Switch",
2222 .info = cap_sw_info,
2223 .get = cap_sw_get,
2224 .put = cap_sw_put,
2225};
2226
2227static int parse_capvol_in_path(struct hda_codec *codec, struct nid_path *path)
2228{
2229 hda_nid_t nid;
2230 int i, depth;
2231
2232 path->ctls[NID_PATH_VOL_CTL] = path->ctls[NID_PATH_MUTE_CTL] = 0;
2233 for (depth = 0; depth < 3; depth++) {
2234 if (depth >= path->depth)
2235 return -EINVAL;
2236 i = path->depth - depth - 1;
2237 nid = path->path[i];
2238 if (!path->ctls[NID_PATH_VOL_CTL]) {
2239 if (nid_has_volume(codec, nid, HDA_OUTPUT))
2240 path->ctls[NID_PATH_VOL_CTL] =
2241 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
2242 else if (nid_has_volume(codec, nid, HDA_INPUT)) {
2243 int idx = path->idx[i];
2244 if (!depth && codec->single_adc_amp)
2245 idx = 0;
2246 path->ctls[NID_PATH_VOL_CTL] =
2247 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
2248 }
2249 }
2250 if (!path->ctls[NID_PATH_MUTE_CTL]) {
2251 if (nid_has_mute(codec, nid, HDA_OUTPUT))
2252 path->ctls[NID_PATH_MUTE_CTL] =
2253 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
2254 else if (nid_has_mute(codec, nid, HDA_INPUT)) {
2255 int idx = path->idx[i];
2256 if (!depth && codec->single_adc_amp)
2257 idx = 0;
2258 path->ctls[NID_PATH_MUTE_CTL] =
2259 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
2260 }
2261 }
Takashi Iwai97ec5582006-03-21 11:29:07 +01002262 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002263 return 0;
2264}
2265
Takashi Iwai352f7f92012-12-19 12:52:06 +01002266static bool is_inv_dmic_pin(struct hda_codec *codec, hda_nid_t nid)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002267{
Takashi Iwai352f7f92012-12-19 12:52:06 +01002268 struct hda_gen_spec *spec = codec->spec;
2269 struct auto_pin_cfg *cfg = &spec->autocfg;
2270 unsigned int val;
2271 int i;
2272
2273 if (!spec->inv_dmic_split)
2274 return false;
2275 for (i = 0; i < cfg->num_inputs; i++) {
2276 if (cfg->inputs[i].pin != nid)
2277 continue;
2278 if (cfg->inputs[i].type != AUTO_PIN_MIC)
2279 return false;
2280 val = snd_hda_codec_get_pincfg(codec, nid);
2281 return snd_hda_get_input_pin_attr(val) == INPUT_PIN_ATTR_INT;
2282 }
2283 return false;
2284}
2285
2286static int add_single_cap_ctl(struct hda_codec *codec, const char *label,
2287 int idx, bool is_switch, unsigned int ctl,
2288 bool inv_dmic)
2289{
2290 struct hda_gen_spec *spec = codec->spec;
2291 char tmpname[44];
2292 int type = is_switch ? HDA_CTL_WIDGET_MUTE : HDA_CTL_WIDGET_VOL;
2293 const char *sfx = is_switch ? "Switch" : "Volume";
2294 unsigned int chs = inv_dmic ? 1 : 3;
2295 int err;
2296
2297 if (!ctl)
2298 return 0;
2299
2300 if (label)
2301 snprintf(tmpname, sizeof(tmpname),
2302 "%s Capture %s", label, sfx);
2303 else
2304 snprintf(tmpname, sizeof(tmpname),
2305 "Capture %s", sfx);
2306 err = add_control(spec, type, tmpname, idx,
2307 amp_val_replace_channels(ctl, chs));
2308 if (err < 0 || !inv_dmic)
2309 return err;
2310
2311 /* Make independent right kcontrol */
2312 if (label)
2313 snprintf(tmpname, sizeof(tmpname),
2314 "Inverted %s Capture %s", label, sfx);
2315 else
2316 snprintf(tmpname, sizeof(tmpname),
2317 "Inverted Capture %s", sfx);
2318 return add_control(spec, type, tmpname, idx,
2319 amp_val_replace_channels(ctl, 2));
2320}
2321
2322/* create single (and simple) capture volume and switch controls */
2323static int create_single_cap_vol_ctl(struct hda_codec *codec, int idx,
2324 unsigned int vol_ctl, unsigned int sw_ctl,
2325 bool inv_dmic)
2326{
2327 int err;
2328 err = add_single_cap_ctl(codec, NULL, idx, false, vol_ctl, inv_dmic);
2329 if (err < 0)
2330 return err;
2331 err = add_single_cap_ctl(codec, NULL, idx, true, sw_ctl, inv_dmic);
2332 if (err < 0)
2333 return err;
2334 return 0;
2335}
2336
2337/* create bound capture volume and switch controls */
2338static int create_bind_cap_vol_ctl(struct hda_codec *codec, int idx,
2339 unsigned int vol_ctl, unsigned int sw_ctl)
2340{
2341 struct hda_gen_spec *spec = codec->spec;
2342 struct snd_kcontrol_new *knew;
2343
2344 if (vol_ctl) {
Takashi Iwai12c93df2012-12-19 14:38:33 +01002345 knew = snd_hda_gen_add_kctl(spec, NULL, &cap_vol_temp);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002346 if (!knew)
2347 return -ENOMEM;
2348 knew->index = idx;
2349 knew->private_value = vol_ctl;
2350 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2351 }
2352 if (sw_ctl) {
Takashi Iwai12c93df2012-12-19 14:38:33 +01002353 knew = snd_hda_gen_add_kctl(spec, NULL, &cap_sw_temp);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002354 if (!knew)
2355 return -ENOMEM;
2356 knew->index = idx;
2357 knew->private_value = sw_ctl;
2358 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2359 }
2360 return 0;
2361}
2362
2363/* return the vol ctl when used first in the imux list */
2364static unsigned int get_first_cap_ctl(struct hda_codec *codec, int idx, int type)
2365{
2366 struct hda_gen_spec *spec = codec->spec;
2367 struct nid_path *path;
2368 unsigned int ctl;
2369 int i;
2370
2371 path = snd_hda_get_nid_path(codec, spec->imux_pins[idx],
2372 get_adc_nid(codec, 0, idx));
2373 if (!path)
2374 return 0;
2375 ctl = path->ctls[type];
2376 if (!ctl)
2377 return 0;
2378 for (i = 0; i < idx - 1; i++) {
2379 path = snd_hda_get_nid_path(codec, spec->imux_pins[i],
2380 get_adc_nid(codec, 0, i));
2381 if (path && path->ctls[type] == ctl)
2382 return 0;
2383 }
2384 return ctl;
2385}
2386
2387/* create individual capture volume and switch controls per input */
2388static int create_multi_cap_vol_ctl(struct hda_codec *codec)
2389{
2390 struct hda_gen_spec *spec = codec->spec;
2391 struct hda_input_mux *imux = &spec->input_mux;
2392 int i, err, type, type_idx = 0;
2393 const char *prev_label = NULL;
2394
2395 for (i = 0; i < imux->num_items; i++) {
2396 const char *label;
2397 bool inv_dmic;
2398 label = hda_get_autocfg_input_label(codec, &spec->autocfg, i);
2399 if (prev_label && !strcmp(label, prev_label))
2400 type_idx++;
2401 else
2402 type_idx = 0;
2403 prev_label = label;
2404 inv_dmic = is_inv_dmic_pin(codec, spec->imux_pins[i]);
2405
2406 for (type = 0; type < 2; type++) {
2407 err = add_single_cap_ctl(codec, label, type_idx, type,
2408 get_first_cap_ctl(codec, i, type),
2409 inv_dmic);
2410 if (err < 0)
2411 return err;
2412 }
2413 }
2414 return 0;
2415}
2416
2417static int create_capture_mixers(struct hda_codec *codec)
2418{
2419 struct hda_gen_spec *spec = codec->spec;
2420 struct hda_input_mux *imux = &spec->input_mux;
2421 int i, n, nums, err;
2422
2423 if (spec->dyn_adc_switch)
2424 nums = 1;
2425 else
2426 nums = spec->num_adc_nids;
2427
2428 if (!spec->auto_mic && imux->num_items > 1) {
2429 struct snd_kcontrol_new *knew;
Takashi Iwai624d9142012-12-19 17:41:52 +01002430 const char *name;
2431 name = nums > 1 ? "Input Source" : "Capture Source";
2432 knew = snd_hda_gen_add_kctl(spec, name, &cap_src_temp);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002433 if (!knew)
2434 return -ENOMEM;
2435 knew->count = nums;
2436 }
2437
2438 for (n = 0; n < nums; n++) {
2439 bool multi = false;
2440 bool inv_dmic = false;
2441 int vol, sw;
2442
2443 vol = sw = 0;
2444 for (i = 0; i < imux->num_items; i++) {
2445 struct nid_path *path;
2446 path = snd_hda_get_nid_path(codec, spec->imux_pins[i],
2447 get_adc_nid(codec, n, i));
2448 if (!path)
2449 continue;
2450 parse_capvol_in_path(codec, path);
2451 if (!vol)
2452 vol = path->ctls[NID_PATH_VOL_CTL];
2453 else if (vol != path->ctls[NID_PATH_VOL_CTL])
2454 multi = true;
2455 if (!sw)
2456 sw = path->ctls[NID_PATH_MUTE_CTL];
2457 else if (sw != path->ctls[NID_PATH_MUTE_CTL])
2458 multi = true;
2459 if (is_inv_dmic_pin(codec, spec->imux_pins[i]))
2460 inv_dmic = true;
2461 }
2462
2463 if (!multi)
2464 err = create_single_cap_vol_ctl(codec, n, vol, sw,
2465 inv_dmic);
2466 else if (!spec->multi_cap_vol)
2467 err = create_bind_cap_vol_ctl(codec, n, vol, sw);
2468 else
2469 err = create_multi_cap_vol_ctl(codec);
2470 if (err < 0)
2471 return err;
2472 }
2473
2474 return 0;
2475}
2476
2477/*
2478 * add mic boosts if needed
2479 */
2480static int parse_mic_boost(struct hda_codec *codec)
2481{
2482 struct hda_gen_spec *spec = codec->spec;
2483 struct auto_pin_cfg *cfg = &spec->autocfg;
Takashi Iwai071c73a2006-08-23 18:34:06 +02002484 int i, err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01002485 int type_idx = 0;
2486 hda_nid_t nid;
2487 const char *prev_label = NULL;
2488
2489 for (i = 0; i < cfg->num_inputs; i++) {
2490 if (cfg->inputs[i].type > AUTO_PIN_MIC)
2491 break;
2492 nid = cfg->inputs[i].pin;
2493 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) {
2494 const char *label;
Takashi Iwai5abd4882013-01-07 09:43:18 +01002495 char boost_label[44];
Takashi Iwai352f7f92012-12-19 12:52:06 +01002496 struct nid_path *path;
2497 unsigned int val;
2498
2499 label = hda_get_autocfg_input_label(codec, cfg, i);
2500 if (spec->shared_mic_hp && !strcmp(label, "Misc"))
2501 label = "Headphone Mic";
2502 if (prev_label && !strcmp(label, prev_label))
2503 type_idx++;
2504 else
2505 type_idx = 0;
2506 prev_label = label;
2507
2508 snprintf(boost_label, sizeof(boost_label),
2509 "%s Boost Volume", label);
2510 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT);
2511 err = add_control(spec, HDA_CTL_WIDGET_VOL,
2512 boost_label, type_idx, val);
2513 if (err < 0)
2514 return err;
2515
2516 path = snd_hda_get_nid_path(codec, nid, 0);
2517 if (path)
2518 path->ctls[NID_PATH_BOOST_CTL] = val;
2519 }
2520 }
2521 return 0;
2522}
2523
2524/*
2525 * parse digital I/Os and set up NIDs in BIOS auto-parse mode
2526 */
2527static void parse_digital(struct hda_codec *codec)
2528{
2529 struct hda_gen_spec *spec = codec->spec;
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01002530 struct nid_path *path;
Takashi Iwai352f7f92012-12-19 12:52:06 +01002531 int i, nums;
2532 hda_nid_t dig_nid;
2533
2534 /* support multiple SPDIFs; the secondary is set up as a slave */
2535 nums = 0;
2536 for (i = 0; i < spec->autocfg.dig_outs; i++) {
2537 hda_nid_t pin = spec->autocfg.dig_out_pins[i];
2538 dig_nid = look_for_dac(codec, pin, true);
2539 if (!dig_nid)
2540 continue;
Takashi Iwai4ac0eef2012-12-20 18:10:51 +01002541 path = snd_hda_add_new_path(codec, dig_nid, pin, HDA_PARSE_ALL);
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01002542 if (!path)
Takashi Iwai352f7f92012-12-19 12:52:06 +01002543 continue;
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01002544 print_nid_path("digout", path);
Takashi Iwaie1284af2013-01-03 16:33:02 +01002545 path->active = true;
Takashi Iwai196c17662013-01-04 15:01:40 +01002546 spec->digout_paths[i] = snd_hda_get_path_idx(codec, path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002547 if (!nums) {
2548 spec->multiout.dig_out_nid = dig_nid;
2549 spec->dig_out_type = spec->autocfg.dig_out_type[0];
2550 } else {
2551 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
2552 if (nums >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
2553 break;
2554 spec->slave_dig_outs[nums - 1] = dig_nid;
2555 }
2556 nums++;
2557 }
2558
2559 if (spec->autocfg.dig_in_pin) {
2560 dig_nid = codec->start_nid;
2561 for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
Takashi Iwai352f7f92012-12-19 12:52:06 +01002562 unsigned int wcaps = get_wcaps(codec, dig_nid);
2563 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
2564 continue;
2565 if (!(wcaps & AC_WCAP_DIGITAL))
2566 continue;
2567 path = snd_hda_add_new_path(codec,
2568 spec->autocfg.dig_in_pin,
Takashi Iwai4ac0eef2012-12-20 18:10:51 +01002569 dig_nid, HDA_PARSE_ALL);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002570 if (path) {
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01002571 print_nid_path("digin", path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002572 path->active = true;
2573 spec->dig_in_nid = dig_nid;
Takashi Iwai2430d7b2013-01-04 15:09:42 +01002574 spec->digin_path = snd_hda_get_path_idx(codec, path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002575 break;
2576 }
2577 }
2578 }
2579}
2580
2581
2582/*
2583 * input MUX handling
2584 */
2585
2586static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur);
2587
2588/* select the given imux item; either unmute exclusively or select the route */
2589static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
2590 unsigned int idx)
2591{
2592 struct hda_gen_spec *spec = codec->spec;
2593 const struct hda_input_mux *imux;
2594 struct nid_path *path;
2595
2596 imux = &spec->input_mux;
2597 if (!imux->num_items)
2598 return 0;
2599
2600 if (idx >= imux->num_items)
2601 idx = imux->num_items - 1;
2602 if (spec->cur_mux[adc_idx] == idx)
2603 return 0;
2604
2605 path = snd_hda_get_nid_path(codec,
2606 spec->imux_pins[spec->cur_mux[adc_idx]],
2607 spec->adc_nids[adc_idx]);
2608 if (!path)
2609 return 0;
2610 if (path->active)
2611 snd_hda_activate_path(codec, path, false, false);
2612
2613 spec->cur_mux[adc_idx] = idx;
2614
2615 if (spec->shared_mic_hp)
2616 update_shared_mic_hp(codec, spec->cur_mux[adc_idx]);
2617
2618 if (spec->dyn_adc_switch)
2619 dyn_adc_pcm_resetup(codec, idx);
2620
2621 path = snd_hda_get_nid_path(codec, spec->imux_pins[idx],
2622 get_adc_nid(codec, adc_idx, idx));
2623 if (!path)
2624 return 0;
2625 if (path->active)
2626 return 0;
2627 snd_hda_activate_path(codec, path, true, false);
2628 if (spec->cap_sync_hook)
2629 spec->cap_sync_hook(codec);
2630 return 1;
2631}
2632
2633
2634/*
2635 * Jack detections for HP auto-mute and mic-switch
2636 */
2637
2638/* check each pin in the given array; returns true if any of them is plugged */
2639static bool detect_jacks(struct hda_codec *codec, int num_pins, hda_nid_t *pins)
2640{
2641 int i, present = 0;
2642
2643 for (i = 0; i < num_pins; i++) {
2644 hda_nid_t nid = pins[i];
2645 if (!nid)
2646 break;
2647 present |= snd_hda_jack_detect(codec, nid);
2648 }
2649 return present;
2650}
2651
2652/* standard HP/line-out auto-mute helper */
2653static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins,
2654 bool mute, bool hp_out)
2655{
2656 struct hda_gen_spec *spec = codec->spec;
2657 unsigned int pin_bits = mute ? 0 : (hp_out ? PIN_HP : PIN_OUT);
2658 int i;
2659
2660 for (i = 0; i < num_pins; i++) {
2661 hda_nid_t nid = pins[i];
2662 unsigned int val;
2663 if (!nid)
2664 break;
2665 /* don't reset VREF value in case it's controlling
2666 * the amp (see alc861_fixup_asus_amp_vref_0f())
2667 */
2668 if (spec->keep_vref_in_automute) {
2669 val = snd_hda_codec_read(codec, nid, 0,
2670 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
2671 val &= ~PIN_HP;
2672 } else
2673 val = 0;
2674 val |= pin_bits;
Takashi Iwai7594aa32012-12-20 15:38:40 +01002675 snd_hda_set_pin_ctl_cache(codec, nid, val);
Takashi Iwaid5a9f1b2012-12-20 15:36:30 +01002676 set_pin_eapd(codec, nid, !mute);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002677 }
2678}
2679
2680/* Toggle outputs muting */
Takashi Iwai5d550e12012-12-19 15:16:44 +01002681void snd_hda_gen_update_outputs(struct hda_codec *codec)
Takashi Iwai352f7f92012-12-19 12:52:06 +01002682{
2683 struct hda_gen_spec *spec = codec->spec;
2684 int on;
2685
2686 /* Control HP pins/amps depending on master_mute state;
2687 * in general, HP pins/amps control should be enabled in all cases,
2688 * but currently set only for master_mute, just to be safe
2689 */
2690 if (!spec->shared_mic_hp) /* don't change HP-pin when shared with mic */
2691 do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
2692 spec->autocfg.hp_pins, spec->master_mute, true);
2693
2694 if (!spec->automute_speaker)
2695 on = 0;
2696 else
2697 on = spec->hp_jack_present | spec->line_jack_present;
2698 on |= spec->master_mute;
2699 do_automute(codec, ARRAY_SIZE(spec->autocfg.speaker_pins),
2700 spec->autocfg.speaker_pins, on, false);
2701
2702 /* toggle line-out mutes if needed, too */
2703 /* if LO is a copy of either HP or Speaker, don't need to handle it */
2704 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0] ||
2705 spec->autocfg.line_out_pins[0] == spec->autocfg.speaker_pins[0])
2706 return;
2707 if (!spec->automute_lo)
2708 on = 0;
2709 else
2710 on = spec->hp_jack_present;
2711 on |= spec->master_mute;
2712 do_automute(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
2713 spec->autocfg.line_out_pins, on, false);
2714}
Takashi Iwai5d550e12012-12-19 15:16:44 +01002715EXPORT_SYMBOL_HDA(snd_hda_gen_update_outputs);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002716
2717static void call_update_outputs(struct hda_codec *codec)
2718{
2719 struct hda_gen_spec *spec = codec->spec;
2720 if (spec->automute_hook)
2721 spec->automute_hook(codec);
2722 else
Takashi Iwai5d550e12012-12-19 15:16:44 +01002723 snd_hda_gen_update_outputs(codec);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002724}
2725
2726/* standard HP-automute helper */
Takashi Iwai5d550e12012-12-19 15:16:44 +01002727void snd_hda_gen_hp_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)
Takashi Iwai352f7f92012-12-19 12:52:06 +01002728{
2729 struct hda_gen_spec *spec = codec->spec;
2730
2731 spec->hp_jack_present =
2732 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
2733 spec->autocfg.hp_pins);
2734 if (!spec->detect_hp || (!spec->automute_speaker && !spec->automute_lo))
2735 return;
2736 call_update_outputs(codec);
2737}
Takashi Iwai5d550e12012-12-19 15:16:44 +01002738EXPORT_SYMBOL_HDA(snd_hda_gen_hp_automute);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002739
2740/* standard line-out-automute helper */
Takashi Iwai5d550e12012-12-19 15:16:44 +01002741void snd_hda_gen_line_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)
Takashi Iwai352f7f92012-12-19 12:52:06 +01002742{
2743 struct hda_gen_spec *spec = codec->spec;
2744
2745 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
2746 return;
2747 /* check LO jack only when it's different from HP */
2748 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0])
2749 return;
2750
2751 spec->line_jack_present =
2752 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
2753 spec->autocfg.line_out_pins);
2754 if (!spec->automute_speaker || !spec->detect_lo)
2755 return;
2756 call_update_outputs(codec);
2757}
Takashi Iwai5d550e12012-12-19 15:16:44 +01002758EXPORT_SYMBOL_HDA(snd_hda_gen_line_automute);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002759
2760/* standard mic auto-switch helper */
Takashi Iwai5d550e12012-12-19 15:16:44 +01002761void snd_hda_gen_mic_autoswitch(struct hda_codec *codec, struct hda_jack_tbl *jack)
Takashi Iwai352f7f92012-12-19 12:52:06 +01002762{
2763 struct hda_gen_spec *spec = codec->spec;
2764 int i;
2765
2766 if (!spec->auto_mic)
2767 return;
2768
2769 for (i = spec->am_num_entries - 1; i > 0; i--) {
2770 if (snd_hda_jack_detect(codec, spec->am_entry[i].pin)) {
2771 mux_select(codec, 0, spec->am_entry[i].idx);
2772 return;
2773 }
2774 }
2775 mux_select(codec, 0, spec->am_entry[0].idx);
2776}
Takashi Iwai5d550e12012-12-19 15:16:44 +01002777EXPORT_SYMBOL_HDA(snd_hda_gen_mic_autoswitch);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002778
2779/*
2780 * Auto-Mute mode mixer enum support
2781 */
2782static int automute_mode_info(struct snd_kcontrol *kcontrol,
2783 struct snd_ctl_elem_info *uinfo)
2784{
2785 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2786 struct hda_gen_spec *spec = codec->spec;
2787 static const char * const texts3[] = {
2788 "Disabled", "Speaker Only", "Line Out+Speaker"
Takashi Iwai071c73a2006-08-23 18:34:06 +02002789 };
Linus Torvalds1da177e2005-04-16 15:20:36 -07002790
Takashi Iwai352f7f92012-12-19 12:52:06 +01002791 if (spec->automute_speaker_possible && spec->automute_lo_possible)
2792 return snd_hda_enum_helper_info(kcontrol, uinfo, 3, texts3);
2793 return snd_hda_enum_bool_helper_info(kcontrol, uinfo);
2794}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002795
Takashi Iwai352f7f92012-12-19 12:52:06 +01002796static int automute_mode_get(struct snd_kcontrol *kcontrol,
2797 struct snd_ctl_elem_value *ucontrol)
2798{
2799 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2800 struct hda_gen_spec *spec = codec->spec;
2801 unsigned int val = 0;
2802 if (spec->automute_speaker)
2803 val++;
2804 if (spec->automute_lo)
2805 val++;
Takashi Iwai071c73a2006-08-23 18:34:06 +02002806
Takashi Iwai352f7f92012-12-19 12:52:06 +01002807 ucontrol->value.enumerated.item[0] = val;
2808 return 0;
2809}
2810
2811static int automute_mode_put(struct snd_kcontrol *kcontrol,
2812 struct snd_ctl_elem_value *ucontrol)
2813{
2814 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2815 struct hda_gen_spec *spec = codec->spec;
2816
2817 switch (ucontrol->value.enumerated.item[0]) {
2818 case 0:
2819 if (!spec->automute_speaker && !spec->automute_lo)
2820 return 0;
2821 spec->automute_speaker = 0;
2822 spec->automute_lo = 0;
2823 break;
2824 case 1:
2825 if (spec->automute_speaker_possible) {
2826 if (!spec->automute_lo && spec->automute_speaker)
2827 return 0;
2828 spec->automute_speaker = 1;
2829 spec->automute_lo = 0;
2830 } else if (spec->automute_lo_possible) {
2831 if (spec->automute_lo)
2832 return 0;
2833 spec->automute_lo = 1;
2834 } else
2835 return -EINVAL;
2836 break;
2837 case 2:
2838 if (!spec->automute_lo_possible || !spec->automute_speaker_possible)
2839 return -EINVAL;
2840 if (spec->automute_speaker && spec->automute_lo)
2841 return 0;
2842 spec->automute_speaker = 1;
2843 spec->automute_lo = 1;
2844 break;
2845 default:
2846 return -EINVAL;
2847 }
2848 call_update_outputs(codec);
2849 return 1;
2850}
2851
2852static const struct snd_kcontrol_new automute_mode_enum = {
2853 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2854 .name = "Auto-Mute Mode",
2855 .info = automute_mode_info,
2856 .get = automute_mode_get,
2857 .put = automute_mode_put,
2858};
2859
2860static int add_automute_mode_enum(struct hda_codec *codec)
2861{
2862 struct hda_gen_spec *spec = codec->spec;
2863
Takashi Iwai12c93df2012-12-19 14:38:33 +01002864 if (!snd_hda_gen_add_kctl(spec, NULL, &automute_mode_enum))
Takashi Iwai352f7f92012-12-19 12:52:06 +01002865 return -ENOMEM;
2866 return 0;
2867}
2868
2869/*
2870 * Check the availability of HP/line-out auto-mute;
2871 * Set up appropriately if really supported
2872 */
2873static int check_auto_mute_availability(struct hda_codec *codec)
2874{
2875 struct hda_gen_spec *spec = codec->spec;
2876 struct auto_pin_cfg *cfg = &spec->autocfg;
2877 int present = 0;
2878 int i, err;
2879
2880 if (cfg->hp_pins[0])
2881 present++;
2882 if (cfg->line_out_pins[0])
2883 present++;
2884 if (cfg->speaker_pins[0])
2885 present++;
2886 if (present < 2) /* need two different output types */
Takashi Iwai071c73a2006-08-23 18:34:06 +02002887 return 0;
Takashi Iwai352f7f92012-12-19 12:52:06 +01002888
2889 if (!cfg->speaker_pins[0] &&
2890 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
2891 memcpy(cfg->speaker_pins, cfg->line_out_pins,
2892 sizeof(cfg->speaker_pins));
2893 cfg->speaker_outs = cfg->line_outs;
Takashi Iwai071c73a2006-08-23 18:34:06 +02002894 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002895
Takashi Iwai352f7f92012-12-19 12:52:06 +01002896 if (!cfg->hp_pins[0] &&
2897 cfg->line_out_type == AUTO_PIN_HP_OUT) {
2898 memcpy(cfg->hp_pins, cfg->line_out_pins,
2899 sizeof(cfg->hp_pins));
2900 cfg->hp_outs = cfg->line_outs;
2901 }
2902
2903 for (i = 0; i < cfg->hp_outs; i++) {
2904 hda_nid_t nid = cfg->hp_pins[i];
2905 if (!is_jack_detectable(codec, nid))
2906 continue;
2907 snd_printdd("hda-codec: Enable HP auto-muting on NID 0x%x\n",
2908 nid);
2909 snd_hda_jack_detect_enable_callback(codec, nid, HDA_GEN_HP_EVENT,
Takashi Iwai2e03e952013-01-03 15:55:06 +01002910 spec->hp_automute_hook ?
2911 spec->hp_automute_hook :
Takashi Iwai5d550e12012-12-19 15:16:44 +01002912 snd_hda_gen_hp_automute);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002913 spec->detect_hp = 1;
2914 }
2915
2916 if (cfg->line_out_type == AUTO_PIN_LINE_OUT && cfg->line_outs) {
2917 if (cfg->speaker_outs)
2918 for (i = 0; i < cfg->line_outs; i++) {
2919 hda_nid_t nid = cfg->line_out_pins[i];
2920 if (!is_jack_detectable(codec, nid))
2921 continue;
2922 snd_printdd("hda-codec: Enable Line-Out auto-muting on NID 0x%x\n", nid);
2923 snd_hda_jack_detect_enable_callback(codec, nid,
2924 HDA_GEN_FRONT_EVENT,
Takashi Iwai2e03e952013-01-03 15:55:06 +01002925 spec->line_automute_hook ?
2926 spec->line_automute_hook :
Takashi Iwai5d550e12012-12-19 15:16:44 +01002927 snd_hda_gen_line_automute);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002928 spec->detect_lo = 1;
2929 }
2930 spec->automute_lo_possible = spec->detect_hp;
2931 }
2932
2933 spec->automute_speaker_possible = cfg->speaker_outs &&
2934 (spec->detect_hp || spec->detect_lo);
2935
2936 spec->automute_lo = spec->automute_lo_possible;
2937 spec->automute_speaker = spec->automute_speaker_possible;
2938
2939 if (spec->automute_speaker_possible || spec->automute_lo_possible) {
2940 /* create a control for automute mode */
2941 err = add_automute_mode_enum(codec);
2942 if (err < 0)
2943 return err;
2944 }
2945 return 0;
2946}
2947
2948/* return the position of NID in the list, or -1 if not found */
2949static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
2950{
2951 int i;
2952 for (i = 0; i < nums; i++)
2953 if (list[i] == nid)
2954 return i;
2955 return -1;
2956}
2957
2958/* check whether all auto-mic pins are valid; setup indices if OK */
2959static bool auto_mic_check_imux(struct hda_codec *codec)
2960{
2961 struct hda_gen_spec *spec = codec->spec;
2962 const struct hda_input_mux *imux;
2963 int i;
2964
2965 imux = &spec->input_mux;
2966 for (i = 0; i < spec->am_num_entries; i++) {
2967 spec->am_entry[i].idx =
2968 find_idx_in_nid_list(spec->am_entry[i].pin,
2969 spec->imux_pins, imux->num_items);
2970 if (spec->am_entry[i].idx < 0)
2971 return false; /* no corresponding imux */
2972 }
2973
2974 /* we don't need the jack detection for the first pin */
2975 for (i = 1; i < spec->am_num_entries; i++)
2976 snd_hda_jack_detect_enable_callback(codec,
2977 spec->am_entry[i].pin,
2978 HDA_GEN_MIC_EVENT,
Takashi Iwai2e03e952013-01-03 15:55:06 +01002979 spec->mic_autoswitch_hook ?
2980 spec->mic_autoswitch_hook :
Takashi Iwai5d550e12012-12-19 15:16:44 +01002981 snd_hda_gen_mic_autoswitch);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002982 return true;
2983}
2984
2985static int compare_attr(const void *ap, const void *bp)
2986{
2987 const struct automic_entry *a = ap;
2988 const struct automic_entry *b = bp;
2989 return (int)(a->attr - b->attr);
2990}
2991
2992/*
2993 * Check the availability of auto-mic switch;
2994 * Set up if really supported
2995 */
2996static int check_auto_mic_availability(struct hda_codec *codec)
2997{
2998 struct hda_gen_spec *spec = codec->spec;
2999 struct auto_pin_cfg *cfg = &spec->autocfg;
3000 unsigned int types;
3001 int i, num_pins;
3002
3003 types = 0;
3004 num_pins = 0;
3005 for (i = 0; i < cfg->num_inputs; i++) {
3006 hda_nid_t nid = cfg->inputs[i].pin;
3007 unsigned int attr;
3008 attr = snd_hda_codec_get_pincfg(codec, nid);
3009 attr = snd_hda_get_input_pin_attr(attr);
3010 if (types & (1 << attr))
3011 return 0; /* already occupied */
3012 switch (attr) {
3013 case INPUT_PIN_ATTR_INT:
3014 if (cfg->inputs[i].type != AUTO_PIN_MIC)
3015 return 0; /* invalid type */
3016 break;
3017 case INPUT_PIN_ATTR_UNUSED:
3018 return 0; /* invalid entry */
3019 default:
3020 if (cfg->inputs[i].type > AUTO_PIN_LINE_IN)
3021 return 0; /* invalid type */
3022 if (!spec->line_in_auto_switch &&
3023 cfg->inputs[i].type != AUTO_PIN_MIC)
3024 return 0; /* only mic is allowed */
3025 if (!is_jack_detectable(codec, nid))
3026 return 0; /* no unsol support */
3027 break;
3028 }
3029 if (num_pins >= MAX_AUTO_MIC_PINS)
3030 return 0;
3031 types |= (1 << attr);
3032 spec->am_entry[num_pins].pin = nid;
3033 spec->am_entry[num_pins].attr = attr;
3034 num_pins++;
3035 }
3036
3037 if (num_pins < 2)
3038 return 0;
3039
3040 spec->am_num_entries = num_pins;
3041 /* sort the am_entry in the order of attr so that the pin with a
3042 * higher attr will be selected when the jack is plugged.
3043 */
3044 sort(spec->am_entry, num_pins, sizeof(spec->am_entry[0]),
3045 compare_attr, NULL);
3046
3047 if (!auto_mic_check_imux(codec))
3048 return 0;
3049
3050 spec->auto_mic = 1;
3051 spec->num_adc_nids = 1;
3052 spec->cur_mux[0] = spec->am_entry[0].idx;
3053 snd_printdd("hda-codec: Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n",
3054 spec->am_entry[0].pin,
3055 spec->am_entry[1].pin,
3056 spec->am_entry[2].pin);
3057
3058 return 0;
3059}
3060
3061
Takashi Iwai9eb413e2012-12-19 14:41:21 +01003062/*
3063 * Parse the given BIOS configuration and set up the hda_gen_spec
3064 *
3065 * return 1 if successful, 0 if the proper config is not found,
Takashi Iwai352f7f92012-12-19 12:52:06 +01003066 * or a negative error code
3067 */
3068int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
Takashi Iwai9eb413e2012-12-19 14:41:21 +01003069 struct auto_pin_cfg *cfg)
Takashi Iwai352f7f92012-12-19 12:52:06 +01003070{
3071 struct hda_gen_spec *spec = codec->spec;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003072 int err;
3073
Takashi Iwai9eb413e2012-12-19 14:41:21 +01003074 if (cfg != &spec->autocfg) {
3075 spec->autocfg = *cfg;
3076 cfg = &spec->autocfg;
3077 }
3078
Takashi Iwai352f7f92012-12-19 12:52:06 +01003079 if (!cfg->line_outs) {
3080 if (cfg->dig_outs || cfg->dig_in_pin) {
3081 spec->multiout.max_channels = 2;
3082 spec->no_analog = 1;
3083 goto dig_only;
3084 }
3085 return 0; /* can't find valid BIOS pin config */
3086 }
3087
3088 if (!spec->no_primary_hp &&
3089 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT &&
3090 cfg->line_outs <= cfg->hp_outs) {
3091 /* use HP as primary out */
3092 cfg->speaker_outs = cfg->line_outs;
3093 memcpy(cfg->speaker_pins, cfg->line_out_pins,
3094 sizeof(cfg->speaker_pins));
3095 cfg->line_outs = cfg->hp_outs;
3096 memcpy(cfg->line_out_pins, cfg->hp_pins, sizeof(cfg->hp_pins));
3097 cfg->hp_outs = 0;
3098 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
3099 cfg->line_out_type = AUTO_PIN_HP_OUT;
3100 }
3101
3102 err = parse_output_paths(codec);
3103 if (err < 0)
3104 return err;
3105 err = create_multi_channel_mode(codec);
3106 if (err < 0)
3107 return err;
3108 err = create_multi_out_ctls(codec, cfg);
3109 if (err < 0)
3110 return err;
3111 err = create_hp_out_ctls(codec);
3112 if (err < 0)
3113 return err;
3114 err = create_speaker_out_ctls(codec);
3115 if (err < 0)
3116 return err;
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003117 err = create_indep_hp_ctls(codec);
3118 if (err < 0)
3119 return err;
Takashi Iwaic30aa7b2013-01-04 16:42:48 +01003120 err = create_loopback_mixing_ctl(codec);
3121 if (err < 0)
3122 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003123 err = create_shared_input(codec);
3124 if (err < 0)
3125 return err;
3126 err = create_input_ctls(codec);
Takashi Iwaid13bd412008-07-30 15:01:45 +02003127 if (err < 0)
Takashi Iwai071c73a2006-08-23 18:34:06 +02003128 return err;
3129
Takashi Iwai352f7f92012-12-19 12:52:06 +01003130 /* check the multiple speaker pins */
3131 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
3132 spec->const_channel_count = cfg->line_outs * 2;
3133 else
3134 spec->const_channel_count = cfg->speaker_outs * 2;
Takashi Iwai071c73a2006-08-23 18:34:06 +02003135
Takashi Iwai352f7f92012-12-19 12:52:06 +01003136 if (spec->multi_ios > 0)
3137 spec->multiout.max_channels = max(spec->ext_channel_count,
3138 spec->const_channel_count);
3139 else
3140 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
3141
3142 err = check_auto_mute_availability(codec);
3143 if (err < 0)
3144 return err;
3145
3146 err = check_dyn_adc_switch(codec);
3147 if (err < 0)
3148 return err;
3149
3150 if (!spec->shared_mic_hp) {
3151 err = check_auto_mic_availability(codec);
Takashi Iwaid13bd412008-07-30 15:01:45 +02003152 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003153 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003154 }
Takashi Iwai071c73a2006-08-23 18:34:06 +02003155
Takashi Iwai352f7f92012-12-19 12:52:06 +01003156 err = create_capture_mixers(codec);
3157 if (err < 0)
3158 return err;
3159
3160 err = parse_mic_boost(codec);
3161 if (err < 0)
3162 return err;
3163
3164 dig_only:
3165 parse_digital(codec);
3166
3167 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003168}
Takashi Iwai352f7f92012-12-19 12:52:06 +01003169EXPORT_SYMBOL_HDA(snd_hda_gen_parse_auto_config);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003170
3171
3172/*
Takashi Iwai352f7f92012-12-19 12:52:06 +01003173 * Build control elements
Linus Torvalds1da177e2005-04-16 15:20:36 -07003174 */
Takashi Iwai352f7f92012-12-19 12:52:06 +01003175
3176/* slave controls for virtual master */
3177static const char * const slave_pfxs[] = {
3178 "Front", "Surround", "Center", "LFE", "Side",
3179 "Headphone", "Speaker", "Mono", "Line Out",
3180 "CLFE", "Bass Speaker", "PCM",
Takashi Iwaiee79c692013-01-07 09:57:42 +01003181 "Speaker Front", "Speaker Surround", "Speaker CLFE", "Speaker Side",
3182 "Headphone Front", "Headphone Surround", "Headphone CLFE",
3183 "Headphone Side",
Takashi Iwai352f7f92012-12-19 12:52:06 +01003184 NULL,
3185};
3186
3187int snd_hda_gen_build_controls(struct hda_codec *codec)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003188{
Takashi Iwai352f7f92012-12-19 12:52:06 +01003189 struct hda_gen_spec *spec = codec->spec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003190 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003191
Takashi Iwai36502d02012-12-19 15:15:10 +01003192 if (spec->kctls.used) {
3193 err = snd_hda_add_new_ctls(codec, spec->kctls.list);
3194 if (err < 0)
3195 return err;
3196 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003197
Takashi Iwai352f7f92012-12-19 12:52:06 +01003198 if (spec->multiout.dig_out_nid) {
3199 err = snd_hda_create_dig_out_ctls(codec,
3200 spec->multiout.dig_out_nid,
3201 spec->multiout.dig_out_nid,
3202 spec->pcm_rec[1].pcm_type);
3203 if (err < 0)
3204 return err;
3205 if (!spec->no_analog) {
3206 err = snd_hda_create_spdif_share_sw(codec,
3207 &spec->multiout);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003208 if (err < 0)
3209 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003210 spec->multiout.share_spdif = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003211 }
3212 }
Takashi Iwai352f7f92012-12-19 12:52:06 +01003213 if (spec->dig_in_nid) {
3214 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
3215 if (err < 0)
3216 return err;
3217 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003218
Takashi Iwai352f7f92012-12-19 12:52:06 +01003219 /* if we have no master control, let's create it */
3220 if (!spec->no_analog &&
3221 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
3222 unsigned int vmaster_tlv[4];
3223 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
3224 HDA_OUTPUT, vmaster_tlv);
3225 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
3226 vmaster_tlv, slave_pfxs,
3227 "Playback Volume");
3228 if (err < 0)
3229 return err;
3230 }
3231 if (!spec->no_analog &&
3232 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
3233 err = __snd_hda_add_vmaster(codec, "Master Playback Switch",
3234 NULL, slave_pfxs,
3235 "Playback Switch",
3236 true, &spec->vmaster_mute.sw_kctl);
3237 if (err < 0)
3238 return err;
3239 if (spec->vmaster_mute.hook)
Takashi Iwaifd25a972012-12-20 14:57:18 +01003240 snd_hda_add_vmaster_hook(codec, &spec->vmaster_mute,
3241 spec->vmaster_mute_enum);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003242 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003243
Takashi Iwai352f7f92012-12-19 12:52:06 +01003244 free_kctls(spec); /* no longer needed */
3245
3246 if (spec->shared_mic_hp) {
3247 int err;
3248 int nid = spec->autocfg.inputs[1].pin;
3249 err = snd_hda_jack_add_kctl(codec, nid, "Headphone Mic", 0);
3250 if (err < 0)
3251 return err;
3252 err = snd_hda_jack_detect_enable(codec, nid, 0);
3253 if (err < 0)
3254 return err;
3255 }
3256
3257 err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
3258 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003259 return err;
3260
3261 return 0;
3262}
Takashi Iwai352f7f92012-12-19 12:52:06 +01003263EXPORT_SYMBOL_HDA(snd_hda_gen_build_controls);
3264
Linus Torvalds1da177e2005-04-16 15:20:36 -07003265
3266/*
Takashi Iwai352f7f92012-12-19 12:52:06 +01003267 * PCM definitions
Linus Torvalds1da177e2005-04-16 15:20:36 -07003268 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003269
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003270static void call_pcm_playback_hook(struct hda_pcm_stream *hinfo,
3271 struct hda_codec *codec,
3272 struct snd_pcm_substream *substream,
3273 int action)
3274{
3275 struct hda_gen_spec *spec = codec->spec;
3276 if (spec->pcm_playback_hook)
3277 spec->pcm_playback_hook(hinfo, codec, substream, action);
3278}
3279
Takashi Iwai352f7f92012-12-19 12:52:06 +01003280/*
3281 * Analog playback callbacks
3282 */
3283static int playback_pcm_open(struct hda_pcm_stream *hinfo,
3284 struct hda_codec *codec,
3285 struct snd_pcm_substream *substream)
3286{
3287 struct hda_gen_spec *spec = codec->spec;
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003288 int err;
3289
3290 mutex_lock(&spec->pcm_mutex);
3291 err = snd_hda_multi_out_analog_open(codec,
3292 &spec->multiout, substream,
Takashi Iwai352f7f92012-12-19 12:52:06 +01003293 hinfo);
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003294 if (!err) {
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003295 spec->active_streams |= 1 << STREAM_MULTI_OUT;
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003296 call_pcm_playback_hook(hinfo, codec, substream,
3297 HDA_GEN_PCM_ACT_OPEN);
3298 }
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003299 mutex_unlock(&spec->pcm_mutex);
3300 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003301}
3302
3303static int playback_pcm_prepare(struct hda_pcm_stream *hinfo,
Takashi Iwai97ec5582006-03-21 11:29:07 +01003304 struct hda_codec *codec,
3305 unsigned int stream_tag,
3306 unsigned int format,
3307 struct snd_pcm_substream *substream)
3308{
Takashi Iwai352f7f92012-12-19 12:52:06 +01003309 struct hda_gen_spec *spec = codec->spec;
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003310 int err;
3311
3312 err = snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3313 stream_tag, format, substream);
3314 if (!err)
3315 call_pcm_playback_hook(hinfo, codec, substream,
3316 HDA_GEN_PCM_ACT_PREPARE);
3317 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003318}
Takashi Iwai97ec5582006-03-21 11:29:07 +01003319
Takashi Iwai352f7f92012-12-19 12:52:06 +01003320static int playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3321 struct hda_codec *codec,
3322 struct snd_pcm_substream *substream)
3323{
3324 struct hda_gen_spec *spec = codec->spec;
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003325 int err;
3326
3327 err = snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3328 if (!err)
3329 call_pcm_playback_hook(hinfo, codec, substream,
3330 HDA_GEN_PCM_ACT_CLEANUP);
3331 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003332}
3333
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003334static int playback_pcm_close(struct hda_pcm_stream *hinfo,
3335 struct hda_codec *codec,
3336 struct snd_pcm_substream *substream)
3337{
3338 struct hda_gen_spec *spec = codec->spec;
3339 mutex_lock(&spec->pcm_mutex);
3340 spec->active_streams &= ~(1 << STREAM_MULTI_OUT);
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003341 call_pcm_playback_hook(hinfo, codec, substream,
3342 HDA_GEN_PCM_ACT_CLOSE);
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003343 mutex_unlock(&spec->pcm_mutex);
3344 return 0;
3345}
3346
3347static int alt_playback_pcm_open(struct hda_pcm_stream *hinfo,
3348 struct hda_codec *codec,
3349 struct snd_pcm_substream *substream)
3350{
3351 struct hda_gen_spec *spec = codec->spec;
3352 int err = 0;
3353
3354 mutex_lock(&spec->pcm_mutex);
3355 if (!spec->indep_hp_enabled)
3356 err = -EBUSY;
3357 else
3358 spec->active_streams |= 1 << STREAM_INDEP_HP;
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003359 call_pcm_playback_hook(hinfo, codec, substream,
3360 HDA_GEN_PCM_ACT_OPEN);
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003361 mutex_unlock(&spec->pcm_mutex);
3362 return err;
3363}
3364
3365static int alt_playback_pcm_close(struct hda_pcm_stream *hinfo,
3366 struct hda_codec *codec,
3367 struct snd_pcm_substream *substream)
3368{
3369 struct hda_gen_spec *spec = codec->spec;
3370 mutex_lock(&spec->pcm_mutex);
3371 spec->active_streams &= ~(1 << STREAM_INDEP_HP);
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003372 call_pcm_playback_hook(hinfo, codec, substream,
3373 HDA_GEN_PCM_ACT_CLOSE);
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003374 mutex_unlock(&spec->pcm_mutex);
3375 return 0;
3376}
3377
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003378static int alt_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3379 struct hda_codec *codec,
3380 unsigned int stream_tag,
3381 unsigned int format,
3382 struct snd_pcm_substream *substream)
3383{
3384 snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format);
3385 call_pcm_playback_hook(hinfo, codec, substream,
3386 HDA_GEN_PCM_ACT_PREPARE);
3387 return 0;
3388}
3389
3390static int alt_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3391 struct hda_codec *codec,
3392 struct snd_pcm_substream *substream)
3393{
3394 snd_hda_codec_cleanup_stream(codec, hinfo->nid);
3395 call_pcm_playback_hook(hinfo, codec, substream,
3396 HDA_GEN_PCM_ACT_CLEANUP);
3397 return 0;
3398}
3399
Takashi Iwai352f7f92012-12-19 12:52:06 +01003400/*
3401 * Digital out
3402 */
3403static int dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3404 struct hda_codec *codec,
3405 struct snd_pcm_substream *substream)
3406{
3407 struct hda_gen_spec *spec = codec->spec;
3408 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3409}
3410
3411static int dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3412 struct hda_codec *codec,
3413 unsigned int stream_tag,
3414 unsigned int format,
3415 struct snd_pcm_substream *substream)
3416{
3417 struct hda_gen_spec *spec = codec->spec;
3418 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3419 stream_tag, format, substream);
3420}
3421
3422static int dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3423 struct hda_codec *codec,
3424 struct snd_pcm_substream *substream)
3425{
3426 struct hda_gen_spec *spec = codec->spec;
3427 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3428}
3429
3430static int dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3431 struct hda_codec *codec,
3432 struct snd_pcm_substream *substream)
3433{
3434 struct hda_gen_spec *spec = codec->spec;
3435 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3436}
3437
3438/*
3439 * Analog capture
3440 */
3441static int alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3442 struct hda_codec *codec,
3443 unsigned int stream_tag,
3444 unsigned int format,
3445 struct snd_pcm_substream *substream)
3446{
3447 struct hda_gen_spec *spec = codec->spec;
3448
3449 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
Takashi Iwai97ec5582006-03-21 11:29:07 +01003450 stream_tag, 0, format);
3451 return 0;
3452}
3453
Takashi Iwai352f7f92012-12-19 12:52:06 +01003454static int alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3455 struct hda_codec *codec,
3456 struct snd_pcm_substream *substream)
Takashi Iwai97ec5582006-03-21 11:29:07 +01003457{
Takashi Iwai352f7f92012-12-19 12:52:06 +01003458 struct hda_gen_spec *spec = codec->spec;
Takashi Iwai97ec5582006-03-21 11:29:07 +01003459
Takashi Iwai352f7f92012-12-19 12:52:06 +01003460 snd_hda_codec_cleanup_stream(codec,
3461 spec->adc_nids[substream->number + 1]);
Takashi Iwai97ec5582006-03-21 11:29:07 +01003462 return 0;
3463}
3464
Takashi Iwai352f7f92012-12-19 12:52:06 +01003465/*
3466 */
3467static const struct hda_pcm_stream pcm_analog_playback = {
3468 .substreams = 1,
3469 .channels_min = 2,
3470 .channels_max = 8,
3471 /* NID is set in build_pcms */
3472 .ops = {
3473 .open = playback_pcm_open,
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003474 .close = playback_pcm_close,
Takashi Iwai352f7f92012-12-19 12:52:06 +01003475 .prepare = playback_pcm_prepare,
3476 .cleanup = playback_pcm_cleanup
3477 },
3478};
Linus Torvalds1da177e2005-04-16 15:20:36 -07003479
Takashi Iwai352f7f92012-12-19 12:52:06 +01003480static const struct hda_pcm_stream pcm_analog_capture = {
3481 .substreams = 1,
3482 .channels_min = 2,
3483 .channels_max = 2,
3484 /* NID is set in build_pcms */
3485};
3486
3487static const struct hda_pcm_stream pcm_analog_alt_playback = {
3488 .substreams = 1,
3489 .channels_min = 2,
3490 .channels_max = 2,
3491 /* NID is set in build_pcms */
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003492 .ops = {
3493 .open = alt_playback_pcm_open,
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003494 .close = alt_playback_pcm_close,
3495 .prepare = alt_playback_pcm_prepare,
3496 .cleanup = alt_playback_pcm_cleanup
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003497 },
Takashi Iwai352f7f92012-12-19 12:52:06 +01003498};
3499
3500static const struct hda_pcm_stream pcm_analog_alt_capture = {
3501 .substreams = 2, /* can be overridden */
3502 .channels_min = 2,
3503 .channels_max = 2,
3504 /* NID is set in build_pcms */
3505 .ops = {
3506 .prepare = alt_capture_pcm_prepare,
3507 .cleanup = alt_capture_pcm_cleanup
3508 },
3509};
3510
3511static const struct hda_pcm_stream pcm_digital_playback = {
3512 .substreams = 1,
3513 .channels_min = 2,
3514 .channels_max = 2,
3515 /* NID is set in build_pcms */
3516 .ops = {
3517 .open = dig_playback_pcm_open,
3518 .close = dig_playback_pcm_close,
3519 .prepare = dig_playback_pcm_prepare,
3520 .cleanup = dig_playback_pcm_cleanup
3521 },
3522};
3523
3524static const struct hda_pcm_stream pcm_digital_capture = {
3525 .substreams = 1,
3526 .channels_min = 2,
3527 .channels_max = 2,
3528 /* NID is set in build_pcms */
3529};
3530
3531/* Used by build_pcms to flag that a PCM has no playback stream */
3532static const struct hda_pcm_stream pcm_null_stream = {
3533 .substreams = 0,
3534 .channels_min = 0,
3535 .channels_max = 0,
3536};
3537
3538/*
3539 * dynamic changing ADC PCM streams
3540 */
3541static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur)
3542{
3543 struct hda_gen_spec *spec = codec->spec;
3544 hda_nid_t new_adc = spec->adc_nids[spec->dyn_adc_idx[cur]];
3545
3546 if (spec->cur_adc && spec->cur_adc != new_adc) {
3547 /* stream is running, let's swap the current ADC */
3548 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
3549 spec->cur_adc = new_adc;
3550 snd_hda_codec_setup_stream(codec, new_adc,
3551 spec->cur_adc_stream_tag, 0,
3552 spec->cur_adc_format);
3553 return true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003554 }
Takashi Iwai352f7f92012-12-19 12:52:06 +01003555 return false;
3556}
3557
3558/* analog capture with dynamic dual-adc changes */
3559static int dyn_adc_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3560 struct hda_codec *codec,
3561 unsigned int stream_tag,
3562 unsigned int format,
3563 struct snd_pcm_substream *substream)
3564{
3565 struct hda_gen_spec *spec = codec->spec;
3566 spec->cur_adc = spec->adc_nids[spec->dyn_adc_idx[spec->cur_mux[0]]];
3567 spec->cur_adc_stream_tag = stream_tag;
3568 spec->cur_adc_format = format;
3569 snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
3570 return 0;
3571}
3572
3573static int dyn_adc_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3574 struct hda_codec *codec,
3575 struct snd_pcm_substream *substream)
3576{
3577 struct hda_gen_spec *spec = codec->spec;
3578 snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
3579 spec->cur_adc = 0;
3580 return 0;
3581}
3582
3583static const struct hda_pcm_stream dyn_adc_pcm_analog_capture = {
3584 .substreams = 1,
3585 .channels_min = 2,
3586 .channels_max = 2,
3587 .nid = 0, /* fill later */
3588 .ops = {
3589 .prepare = dyn_adc_capture_pcm_prepare,
3590 .cleanup = dyn_adc_capture_pcm_cleanup
3591 },
3592};
3593
Takashi Iwaif873e532012-12-20 16:58:39 +01003594static void fill_pcm_stream_name(char *str, size_t len, const char *sfx,
3595 const char *chip_name)
3596{
3597 char *p;
3598
3599 if (*str)
3600 return;
3601 strlcpy(str, chip_name, len);
3602
3603 /* drop non-alnum chars after a space */
3604 for (p = strchr(str, ' '); p; p = strchr(p + 1, ' ')) {
3605 if (!isalnum(p[1])) {
3606 *p = 0;
3607 break;
3608 }
3609 }
3610 strlcat(str, sfx, len);
3611}
3612
Takashi Iwai352f7f92012-12-19 12:52:06 +01003613/* build PCM streams based on the parsed results */
3614int snd_hda_gen_build_pcms(struct hda_codec *codec)
3615{
3616 struct hda_gen_spec *spec = codec->spec;
3617 struct hda_pcm *info = spec->pcm_rec;
3618 const struct hda_pcm_stream *p;
3619 bool have_multi_adcs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003620
3621 codec->num_pcms = 1;
3622 codec->pcm_info = info;
3623
Takashi Iwai352f7f92012-12-19 12:52:06 +01003624 if (spec->no_analog)
3625 goto skip_analog;
3626
Takashi Iwaif873e532012-12-20 16:58:39 +01003627 fill_pcm_stream_name(spec->stream_name_analog,
3628 sizeof(spec->stream_name_analog),
3629 " Analog", codec->chip_name);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003630 info->name = spec->stream_name_analog;
3631
3632 if (spec->multiout.num_dacs > 0) {
3633 p = spec->stream_analog_playback;
3634 if (!p)
3635 p = &pcm_analog_playback;
3636 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3637 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3638 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
3639 spec->multiout.max_channels;
3640 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT &&
3641 spec->autocfg.line_outs == 2)
3642 info->stream[SNDRV_PCM_STREAM_PLAYBACK].chmap =
3643 snd_pcm_2_1_chmaps;
3644 }
3645 if (spec->num_adc_nids) {
3646 p = spec->stream_analog_capture;
3647 if (!p) {
3648 if (spec->dyn_adc_switch)
3649 p = &dyn_adc_pcm_analog_capture;
3650 else
3651 p = &pcm_analog_capture;
3652 }
3653 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3654 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3655 }
3656
Takashi Iwai352f7f92012-12-19 12:52:06 +01003657 skip_analog:
3658 /* SPDIF for stream index #1 */
3659 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
Takashi Iwaif873e532012-12-20 16:58:39 +01003660 fill_pcm_stream_name(spec->stream_name_digital,
3661 sizeof(spec->stream_name_digital),
3662 " Digital", codec->chip_name);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003663 codec->num_pcms = 2;
3664 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3665 info = spec->pcm_rec + 1;
3666 info->name = spec->stream_name_digital;
3667 if (spec->dig_out_type)
3668 info->pcm_type = spec->dig_out_type;
3669 else
3670 info->pcm_type = HDA_PCM_TYPE_SPDIF;
3671 if (spec->multiout.dig_out_nid) {
3672 p = spec->stream_digital_playback;
3673 if (!p)
3674 p = &pcm_digital_playback;
3675 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3676 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3677 }
3678 if (spec->dig_in_nid) {
3679 p = spec->stream_digital_capture;
3680 if (!p)
3681 p = &pcm_digital_capture;
3682 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3683 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3684 }
3685 }
3686
3687 if (spec->no_analog)
3688 return 0;
3689
3690 /* If the use of more than one ADC is requested for the current
3691 * model, configure a second analog capture-only PCM.
3692 */
3693 have_multi_adcs = (spec->num_adc_nids > 1) &&
3694 !spec->dyn_adc_switch && !spec->auto_mic;
3695 /* Additional Analaog capture for index #2 */
3696 if (spec->alt_dac_nid || have_multi_adcs) {
3697 codec->num_pcms = 3;
3698 info = spec->pcm_rec + 2;
3699 info->name = spec->stream_name_analog;
3700 if (spec->alt_dac_nid) {
3701 p = spec->stream_analog_alt_playback;
3702 if (!p)
3703 p = &pcm_analog_alt_playback;
3704 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3705 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3706 spec->alt_dac_nid;
3707 } else {
3708 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3709 pcm_null_stream;
3710 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3711 }
3712 if (have_multi_adcs) {
3713 p = spec->stream_analog_alt_capture;
3714 if (!p)
3715 p = &pcm_analog_alt_capture;
3716 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3717 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3718 spec->adc_nids[1];
3719 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3720 spec->num_adc_nids - 1;
3721 } else {
3722 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3723 pcm_null_stream;
3724 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3725 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003726 }
3727
3728 return 0;
3729}
Takashi Iwai352f7f92012-12-19 12:52:06 +01003730EXPORT_SYMBOL_HDA(snd_hda_gen_build_pcms);
3731
3732
3733/*
3734 * Standard auto-parser initializations
3735 */
3736
Takashi Iwaid4156932013-01-07 10:08:02 +01003737/* configure the given path as a proper output */
3738static void set_output_and_unmute(struct hda_codec *codec,
Takashi Iwai196c17662013-01-04 15:01:40 +01003739 int pin_type, int path_idx)
Takashi Iwai352f7f92012-12-19 12:52:06 +01003740{
3741 struct nid_path *path;
Takashi Iwaid4156932013-01-07 10:08:02 +01003742 hda_nid_t pin;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003743
Takashi Iwai196c17662013-01-04 15:01:40 +01003744 path = snd_hda_get_path_from_idx(codec, path_idx);
Takashi Iwaid4156932013-01-07 10:08:02 +01003745 if (!path || !path->depth)
Takashi Iwai352f7f92012-12-19 12:52:06 +01003746 return;
Takashi Iwaid4156932013-01-07 10:08:02 +01003747 pin = path->path[path->depth - 1];
3748 snd_hda_set_pin_ctl_cache(codec, pin, pin_type);
Takashi Iwaie1284af2013-01-03 16:33:02 +01003749 snd_hda_activate_path(codec, path, path->active, true);
3750 set_pin_eapd(codec, pin, path->active);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003751}
3752
3753/* initialize primary output paths */
3754static void init_multi_out(struct hda_codec *codec)
3755{
3756 struct hda_gen_spec *spec = codec->spec;
3757 int pin_type;
3758 int i;
3759
3760 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)
3761 pin_type = PIN_HP;
3762 else
3763 pin_type = PIN_OUT;
3764
Takashi Iwaid4156932013-01-07 10:08:02 +01003765 for (i = 0; i < spec->autocfg.line_outs; i++)
3766 set_output_and_unmute(codec, pin_type, spec->out_paths[i]);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003767}
3768
Takashi Iwaidb23fd12012-12-20 15:27:24 +01003769
3770static void __init_extra_out(struct hda_codec *codec, int num_outs,
Takashi Iwaid4156932013-01-07 10:08:02 +01003771 int *paths, int type)
Takashi Iwai352f7f92012-12-19 12:52:06 +01003772{
Takashi Iwai352f7f92012-12-19 12:52:06 +01003773 int i;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003774
Takashi Iwaid4156932013-01-07 10:08:02 +01003775 for (i = 0; i < num_outs; i++)
3776 set_output_and_unmute(codec, type, paths[i]);
Takashi Iwaidb23fd12012-12-20 15:27:24 +01003777}
3778
3779/* initialize hp and speaker paths */
3780static void init_extra_out(struct hda_codec *codec)
3781{
3782 struct hda_gen_spec *spec = codec->spec;
3783
3784 if (spec->autocfg.line_out_type != AUTO_PIN_HP_OUT)
3785 __init_extra_out(codec, spec->autocfg.hp_outs,
Takashi Iwai196c17662013-01-04 15:01:40 +01003786 spec->hp_paths, PIN_HP);
Takashi Iwaidb23fd12012-12-20 15:27:24 +01003787 if (spec->autocfg.line_out_type != AUTO_PIN_SPEAKER_OUT)
3788 __init_extra_out(codec, spec->autocfg.speaker_outs,
Takashi Iwai196c17662013-01-04 15:01:40 +01003789 spec->speaker_paths, PIN_OUT);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003790}
3791
3792/* initialize multi-io paths */
3793static void init_multi_io(struct hda_codec *codec)
3794{
3795 struct hda_gen_spec *spec = codec->spec;
3796 int i;
3797
3798 for (i = 0; i < spec->multi_ios; i++) {
3799 hda_nid_t pin = spec->multi_io[i].pin;
3800 struct nid_path *path;
Takashi Iwai196c17662013-01-04 15:01:40 +01003801 path = get_multiio_path(codec, i);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003802 if (!path)
3803 continue;
3804 if (!spec->multi_io[i].ctl_in)
3805 spec->multi_io[i].ctl_in =
3806 snd_hda_codec_update_cache(codec, pin, 0,
3807 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3808 snd_hda_activate_path(codec, path, path->active, true);
3809 }
3810}
3811
3812/* set up the input pin config, depending on the given auto-pin type */
3813static void set_input_pin(struct hda_codec *codec, hda_nid_t nid,
3814 int auto_pin_type)
3815{
3816 unsigned int val = PIN_IN;
3817 if (auto_pin_type == AUTO_PIN_MIC)
3818 val |= snd_hda_get_default_vref(codec, nid);
Takashi Iwai7594aa32012-12-20 15:38:40 +01003819 snd_hda_set_pin_ctl_cache(codec, nid, val);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003820}
3821
3822/* set up input pins and loopback paths */
3823static void init_analog_input(struct hda_codec *codec)
3824{
3825 struct hda_gen_spec *spec = codec->spec;
3826 struct auto_pin_cfg *cfg = &spec->autocfg;
3827 int i;
3828
3829 for (i = 0; i < cfg->num_inputs; i++) {
3830 hda_nid_t nid = cfg->inputs[i].pin;
3831 if (is_input_pin(codec, nid))
3832 set_input_pin(codec, nid, cfg->inputs[i].type);
3833
3834 /* init loopback inputs */
3835 if (spec->mixer_nid) {
3836 struct nid_path *path;
Takashi Iwai196c17662013-01-04 15:01:40 +01003837 path = snd_hda_get_path_from_idx(codec, spec->loopback_paths[i]);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003838 if (path)
3839 snd_hda_activate_path(codec, path,
3840 path->active, false);
3841 }
3842 }
3843}
3844
3845/* initialize ADC paths */
3846static void init_input_src(struct hda_codec *codec)
3847{
3848 struct hda_gen_spec *spec = codec->spec;
3849 struct hda_input_mux *imux = &spec->input_mux;
3850 struct nid_path *path;
3851 int i, c, nums;
3852
3853 if (spec->dyn_adc_switch)
3854 nums = 1;
3855 else
3856 nums = spec->num_adc_nids;
3857
3858 for (c = 0; c < nums; c++) {
3859 for (i = 0; i < imux->num_items; i++) {
3860 path = snd_hda_get_nid_path(codec, spec->imux_pins[i],
3861 get_adc_nid(codec, c, i));
3862 if (path) {
3863 bool active = path->active;
3864 if (i == spec->cur_mux[c])
3865 active = true;
3866 snd_hda_activate_path(codec, path, active, false);
3867 }
3868 }
3869 }
3870
3871 if (spec->shared_mic_hp)
3872 update_shared_mic_hp(codec, spec->cur_mux[0]);
3873
3874 if (spec->cap_sync_hook)
3875 spec->cap_sync_hook(codec);
3876}
3877
3878/* set right pin controls for digital I/O */
3879static void init_digital(struct hda_codec *codec)
3880{
3881 struct hda_gen_spec *spec = codec->spec;
3882 int i;
3883 hda_nid_t pin;
3884
Takashi Iwaid4156932013-01-07 10:08:02 +01003885 for (i = 0; i < spec->autocfg.dig_outs; i++)
3886 set_output_and_unmute(codec, PIN_OUT, spec->digout_paths[i]);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003887 pin = spec->autocfg.dig_in_pin;
Takashi Iwai2430d7b2013-01-04 15:09:42 +01003888 if (pin) {
3889 struct nid_path *path;
Takashi Iwai7594aa32012-12-20 15:38:40 +01003890 snd_hda_set_pin_ctl_cache(codec, pin, PIN_IN);
Takashi Iwai2430d7b2013-01-04 15:09:42 +01003891 path = snd_hda_get_path_from_idx(codec, spec->digin_path);
3892 if (path)
3893 snd_hda_activate_path(codec, path, path->active, false);
3894 }
Takashi Iwai352f7f92012-12-19 12:52:06 +01003895}
3896
Takashi Iwai973e4972012-12-20 15:16:09 +01003897/* clear unsol-event tags on unused pins; Conexant codecs seem to leave
3898 * invalid unsol tags by some reason
3899 */
3900static void clear_unsol_on_unused_pins(struct hda_codec *codec)
3901{
3902 int i;
3903
3904 for (i = 0; i < codec->init_pins.used; i++) {
3905 struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
3906 hda_nid_t nid = pin->nid;
3907 if (is_jack_detectable(codec, nid) &&
3908 !snd_hda_jack_tbl_get(codec, nid))
3909 snd_hda_codec_update_cache(codec, nid, 0,
3910 AC_VERB_SET_UNSOLICITED_ENABLE, 0);
3911 }
3912}
3913
Takashi Iwai5187ac12013-01-07 12:52:16 +01003914/*
3915 * initialize the generic spec;
3916 * this can be put as patch_ops.init function
3917 */
Takashi Iwai352f7f92012-12-19 12:52:06 +01003918int snd_hda_gen_init(struct hda_codec *codec)
3919{
3920 struct hda_gen_spec *spec = codec->spec;
3921
3922 if (spec->init_hook)
3923 spec->init_hook(codec);
3924
3925 snd_hda_apply_verbs(codec);
3926
Takashi Iwai3bbcd272012-12-20 11:50:58 +01003927 codec->cached_write = 1;
3928
Takashi Iwai352f7f92012-12-19 12:52:06 +01003929 init_multi_out(codec);
3930 init_extra_out(codec);
3931 init_multi_io(codec);
3932 init_analog_input(codec);
3933 init_input_src(codec);
3934 init_digital(codec);
3935
Takashi Iwai973e4972012-12-20 15:16:09 +01003936 clear_unsol_on_unused_pins(codec);
3937
Takashi Iwai352f7f92012-12-19 12:52:06 +01003938 /* call init functions of standard auto-mute helpers */
Takashi Iwai5d550e12012-12-19 15:16:44 +01003939 snd_hda_gen_hp_automute(codec, NULL);
3940 snd_hda_gen_line_automute(codec, NULL);
3941 snd_hda_gen_mic_autoswitch(codec, NULL);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003942
Takashi Iwai3bbcd272012-12-20 11:50:58 +01003943 snd_hda_codec_flush_amp_cache(codec);
3944 snd_hda_codec_flush_cmd_cache(codec);
3945
Takashi Iwai352f7f92012-12-19 12:52:06 +01003946 if (spec->vmaster_mute.sw_kctl && spec->vmaster_mute.hook)
3947 snd_hda_sync_vmaster_hook(&spec->vmaster_mute);
3948
3949 hda_call_check_power_status(codec, 0x01);
3950 return 0;
3951}
Takashi Iwaifce52a32013-01-07 12:42:48 +01003952EXPORT_SYMBOL_HDA(snd_hda_gen_init);
3953
Takashi Iwai5187ac12013-01-07 12:52:16 +01003954/*
3955 * free the generic spec;
3956 * this can be put as patch_ops.free function
3957 */
Takashi Iwaifce52a32013-01-07 12:42:48 +01003958void snd_hda_gen_free(struct hda_codec *codec)
3959{
3960 snd_hda_gen_spec_free(codec->spec);
3961 kfree(codec->spec);
3962 codec->spec = NULL;
3963}
3964EXPORT_SYMBOL_HDA(snd_hda_gen_free);
3965
3966#ifdef CONFIG_PM
Takashi Iwai5187ac12013-01-07 12:52:16 +01003967/*
3968 * check the loopback power save state;
3969 * this can be put as patch_ops.check_power_status function
3970 */
Takashi Iwaifce52a32013-01-07 12:42:48 +01003971int snd_hda_gen_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3972{
3973 struct hda_gen_spec *spec = codec->spec;
3974 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3975}
3976EXPORT_SYMBOL_HDA(snd_hda_gen_check_power_status);
3977#endif
Takashi Iwai352f7f92012-12-19 12:52:06 +01003978
3979
3980/*
3981 * the generic codec support
3982 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003983
Takashi Iwai352f7f92012-12-19 12:52:06 +01003984static const struct hda_codec_ops generic_patch_ops = {
3985 .build_controls = snd_hda_gen_build_controls,
3986 .build_pcms = snd_hda_gen_build_pcms,
3987 .init = snd_hda_gen_init,
Takashi Iwaifce52a32013-01-07 12:42:48 +01003988 .free = snd_hda_gen_free,
Takashi Iwai352f7f92012-12-19 12:52:06 +01003989 .unsol_event = snd_hda_jack_unsol_event,
Takashi Iwai83012a72012-08-24 18:38:08 +02003990#ifdef CONFIG_PM
Takashi Iwaifce52a32013-01-07 12:42:48 +01003991 .check_power_status = snd_hda_gen_check_power_status,
Takashi Iwaicb53c622007-08-10 17:21:45 +02003992#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003993};
3994
Linus Torvalds1da177e2005-04-16 15:20:36 -07003995int snd_hda_parse_generic_codec(struct hda_codec *codec)
3996{
Takashi Iwai352f7f92012-12-19 12:52:06 +01003997 struct hda_gen_spec *spec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003998 int err;
3999
Takashi Iwaie560d8d2005-09-09 14:21:46 +02004000 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
Takashi Iwai352f7f92012-12-19 12:52:06 +01004001 if (!spec)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004002 return -ENOMEM;
Takashi Iwai352f7f92012-12-19 12:52:06 +01004003 snd_hda_gen_spec_init(spec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004004 codec->spec = spec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004005
Takashi Iwai9eb413e2012-12-19 14:41:21 +01004006 err = snd_hda_parse_pin_defcfg(codec, &spec->autocfg, NULL, 0);
4007 if (err < 0)
4008 return err;
4009
4010 err = snd_hda_gen_parse_auto_config(codec, &spec->autocfg);
Takashi Iwai352f7f92012-12-19 12:52:06 +01004011 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004012 goto error;
4013
4014 codec->patch_ops = generic_patch_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004015 return 0;
4016
Takashi Iwai352f7f92012-12-19 12:52:06 +01004017error:
Takashi Iwaifce52a32013-01-07 12:42:48 +01004018 snd_hda_gen_free(codec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004019 return err;
4020}
Takashi Iwaifce52a32013-01-07 12:42:48 +01004021EXPORT_SYMBOL_HDA(snd_hda_parse_generic_codec);