blob: 26e8d83b56729b60ed5bc8b8957d341fd733c34a [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 Iwai3ca529d2013-01-07 17:25:08 +010090/* return the position of NID in the list, or -1 if not found */
91static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
92{
93 int i;
94 for (i = 0; i < nums; i++)
95 if (list[i] == nid)
96 return i;
97 return -1;
98}
99
100/* return true if the given NID is contained in the path */
101static bool is_nid_contained(struct nid_path *path, hda_nid_t nid)
102{
103 return find_idx_in_nid_list(nid, path->path, path->depth) >= 0;
104}
105
Takashi Iwaif5172a72013-01-04 13:19:55 +0100106static struct nid_path *get_nid_path(struct hda_codec *codec,
107 hda_nid_t from_nid, hda_nid_t to_nid,
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100108 int anchor_nid)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700109{
Takashi Iwai352f7f92012-12-19 12:52:06 +0100110 struct hda_gen_spec *spec = codec->spec;
111 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112
Takashi Iwai352f7f92012-12-19 12:52:06 +0100113 for (i = 0; i < spec->paths.used; i++) {
114 struct nid_path *path = snd_array_elem(&spec->paths, i);
115 if (path->depth <= 0)
116 continue;
117 if ((!from_nid || path->path[0] == from_nid) &&
Takashi Iwaif5172a72013-01-04 13:19:55 +0100118 (!to_nid || path->path[path->depth - 1] == to_nid)) {
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100119 if (!anchor_nid ||
120 (anchor_nid > 0 && is_nid_contained(path, anchor_nid)) ||
121 (anchor_nid < 0 && !is_nid_contained(path, anchor_nid)))
Takashi Iwaif5172a72013-01-04 13:19:55 +0100122 return path;
123 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124 }
125 return NULL;
126}
Takashi Iwaif5172a72013-01-04 13:19:55 +0100127
128/* get the path between the given NIDs;
129 * passing 0 to either @pin or @dac behaves as a wildcard
130 */
131struct nid_path *snd_hda_get_nid_path(struct hda_codec *codec,
132 hda_nid_t from_nid, hda_nid_t to_nid)
133{
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100134 return get_nid_path(codec, from_nid, to_nid, 0);
Takashi Iwaif5172a72013-01-04 13:19:55 +0100135}
Takashi Iwai352f7f92012-12-19 12:52:06 +0100136EXPORT_SYMBOL_HDA(snd_hda_get_nid_path);
137
Takashi Iwai196c17662013-01-04 15:01:40 +0100138/* get the index number corresponding to the path instance;
139 * the index starts from 1, for easier checking the invalid value
140 */
141int snd_hda_get_path_idx(struct hda_codec *codec, struct nid_path *path)
142{
143 struct hda_gen_spec *spec = codec->spec;
144 struct nid_path *array = spec->paths.list;
145 ssize_t idx;
146
147 if (!spec->paths.used)
148 return 0;
149 idx = path - array;
150 if (idx < 0 || idx >= spec->paths.used)
151 return 0;
152 return idx + 1;
153}
154
155/* get the path instance corresponding to the given index number */
156struct nid_path *snd_hda_get_path_from_idx(struct hda_codec *codec, int idx)
157{
158 struct hda_gen_spec *spec = codec->spec;
159
160 if (idx <= 0 || idx > spec->paths.used)
161 return NULL;
162 return snd_array_elem(&spec->paths, idx - 1);
163}
164
Takashi Iwai352f7f92012-12-19 12:52:06 +0100165/* check whether the given DAC is already found in any existing paths */
166static bool is_dac_already_used(struct hda_codec *codec, hda_nid_t nid)
167{
168 struct hda_gen_spec *spec = codec->spec;
169 int i;
170
171 for (i = 0; i < spec->paths.used; i++) {
172 struct nid_path *path = snd_array_elem(&spec->paths, i);
173 if (path->path[0] == nid)
174 return true;
175 }
176 return false;
177}
178
179/* check whether the given two widgets can be connected */
180static bool is_reachable_path(struct hda_codec *codec,
181 hda_nid_t from_nid, hda_nid_t to_nid)
182{
183 if (!from_nid || !to_nid)
184 return false;
185 return snd_hda_get_conn_index(codec, to_nid, from_nid, true) >= 0;
186}
187
188/* nid, dir and idx */
189#define AMP_VAL_COMPARE_MASK (0xffff | (1U << 18) | (0x0f << 19))
190
191/* check whether the given ctl is already assigned in any path elements */
192static bool is_ctl_used(struct hda_codec *codec, unsigned int val, int type)
193{
194 struct hda_gen_spec *spec = codec->spec;
195 int i;
196
197 val &= AMP_VAL_COMPARE_MASK;
198 for (i = 0; i < spec->paths.used; i++) {
199 struct nid_path *path = snd_array_elem(&spec->paths, i);
200 if ((path->ctls[type] & AMP_VAL_COMPARE_MASK) == val)
201 return true;
202 }
203 return false;
204}
205
206/* check whether a control with the given (nid, dir, idx) was assigned */
207static bool is_ctl_associated(struct hda_codec *codec, hda_nid_t nid,
208 int dir, int idx)
209{
210 unsigned int val = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
211 return is_ctl_used(codec, val, NID_PATH_VOL_CTL) ||
212 is_ctl_used(codec, val, NID_PATH_MUTE_CTL);
213}
214
Takashi Iwai0c8c0f52012-12-20 17:54:22 +0100215static void print_nid_path(const char *pfx, struct nid_path *path)
216{
217 char buf[40];
218 int i;
219
220
221 buf[0] = 0;
222 for (i = 0; i < path->depth; i++) {
223 char tmp[4];
224 sprintf(tmp, ":%02x", path->path[i]);
225 strlcat(buf, tmp, sizeof(buf));
226 }
227 snd_printdd("%s path: depth=%d %s\n", pfx, path->depth, buf);
228}
229
Takashi Iwai352f7f92012-12-19 12:52:06 +0100230/* called recursively */
231static bool __parse_nid_path(struct hda_codec *codec,
232 hda_nid_t from_nid, hda_nid_t to_nid,
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100233 int anchor_nid, struct nid_path *path,
234 int depth)
Takashi Iwai352f7f92012-12-19 12:52:06 +0100235{
Takashi Iwaiee8e7652013-01-03 15:25:11 +0100236 const hda_nid_t *conn;
Takashi Iwai352f7f92012-12-19 12:52:06 +0100237 int i, nums;
238
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100239 if (to_nid == anchor_nid)
240 anchor_nid = 0; /* anchor passed */
241 else if (to_nid == (hda_nid_t)(-anchor_nid))
242 return false; /* hit the exclusive nid */
Takashi Iwai352f7f92012-12-19 12:52:06 +0100243
Takashi Iwaiee8e7652013-01-03 15:25:11 +0100244 nums = snd_hda_get_conn_list(codec, to_nid, &conn);
Takashi Iwai352f7f92012-12-19 12:52:06 +0100245 for (i = 0; i < nums; i++) {
246 if (conn[i] != from_nid) {
247 /* special case: when from_nid is 0,
248 * try to find an empty DAC
249 */
250 if (from_nid ||
251 get_wcaps_type(get_wcaps(codec, conn[i])) != AC_WID_AUD_OUT ||
252 is_dac_already_used(codec, conn[i]))
253 continue;
254 }
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100255 /* anchor is not requested or already passed? */
256 if (anchor_nid <= 0)
Takashi Iwai352f7f92012-12-19 12:52:06 +0100257 goto found;
258 }
259 if (depth >= MAX_NID_PATH_DEPTH)
260 return false;
261 for (i = 0; i < nums; i++) {
262 unsigned int type;
263 type = get_wcaps_type(get_wcaps(codec, conn[i]));
264 if (type == AC_WID_AUD_OUT || type == AC_WID_AUD_IN ||
265 type == AC_WID_PIN)
266 continue;
267 if (__parse_nid_path(codec, from_nid, conn[i],
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100268 anchor_nid, path, depth + 1))
Takashi Iwai352f7f92012-12-19 12:52:06 +0100269 goto found;
270 }
271 return false;
272
273 found:
274 path->path[path->depth] = conn[i];
275 path->idx[path->depth + 1] = i;
276 if (nums > 1 && get_wcaps_type(get_wcaps(codec, to_nid)) != AC_WID_AUD_MIX)
277 path->multi[path->depth + 1] = 1;
278 path->depth++;
279 return true;
280}
281
282/* parse the widget path from the given nid to the target nid;
283 * when @from_nid is 0, try to find an empty DAC;
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100284 * when @anchor_nid is set to a positive value, only paths through the widget
285 * with the given value are evaluated.
286 * when @anchor_nid is set to a negative value, paths through the widget
287 * with the negative of given value are excluded, only other paths are chosen.
288 * when @anchor_nid is zero, no special handling about path selection.
Takashi Iwai352f7f92012-12-19 12:52:06 +0100289 */
290bool snd_hda_parse_nid_path(struct hda_codec *codec, hda_nid_t from_nid,
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100291 hda_nid_t to_nid, int anchor_nid,
Takashi Iwai352f7f92012-12-19 12:52:06 +0100292 struct nid_path *path)
293{
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100294 if (__parse_nid_path(codec, from_nid, to_nid, anchor_nid, path, 1)) {
Takashi Iwai352f7f92012-12-19 12:52:06 +0100295 path->path[path->depth] = to_nid;
296 path->depth++;
Takashi Iwai352f7f92012-12-19 12:52:06 +0100297 return true;
298 }
299 return false;
300}
301EXPORT_SYMBOL_HDA(snd_hda_parse_nid_path);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302
303/*
Takashi Iwai352f7f92012-12-19 12:52:06 +0100304 * parse the path between the given NIDs and add to the path list.
305 * if no valid path is found, return NULL
Linus Torvalds1da177e2005-04-16 15:20:36 -0700306 */
Takashi Iwai352f7f92012-12-19 12:52:06 +0100307struct nid_path *
308snd_hda_add_new_path(struct hda_codec *codec, hda_nid_t from_nid,
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100309 hda_nid_t to_nid, int anchor_nid)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310{
Takashi Iwai352f7f92012-12-19 12:52:06 +0100311 struct hda_gen_spec *spec = codec->spec;
312 struct nid_path *path;
313
314 if (from_nid && to_nid && !is_reachable_path(codec, from_nid, to_nid))
315 return NULL;
316
Takashi Iwaif5172a72013-01-04 13:19:55 +0100317 /* check whether the path has been already added */
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100318 path = get_nid_path(codec, from_nid, to_nid, anchor_nid);
Takashi Iwaif5172a72013-01-04 13:19:55 +0100319 if (path)
320 return path;
321
Takashi Iwai352f7f92012-12-19 12:52:06 +0100322 path = snd_array_new(&spec->paths);
323 if (!path)
324 return NULL;
325 memset(path, 0, sizeof(*path));
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100326 if (snd_hda_parse_nid_path(codec, from_nid, to_nid, anchor_nid, path))
Takashi Iwai352f7f92012-12-19 12:52:06 +0100327 return path;
328 /* push back */
329 spec->paths.used--;
330 return NULL;
331}
332EXPORT_SYMBOL_HDA(snd_hda_add_new_path);
333
334/* look for an empty DAC slot */
335static hda_nid_t look_for_dac(struct hda_codec *codec, hda_nid_t pin,
336 bool is_digital)
337{
338 struct hda_gen_spec *spec = codec->spec;
339 bool cap_digital;
340 int i;
341
342 for (i = 0; i < spec->num_all_dacs; i++) {
343 hda_nid_t nid = spec->all_dacs[i];
344 if (!nid || is_dac_already_used(codec, nid))
345 continue;
346 cap_digital = !!(get_wcaps(codec, nid) & AC_WCAP_DIGITAL);
347 if (is_digital != cap_digital)
348 continue;
349 if (is_reachable_path(codec, nid, pin))
350 return nid;
351 }
352 return 0;
353}
354
355/* replace the channels in the composed amp value with the given number */
356static unsigned int amp_val_replace_channels(unsigned int val, unsigned int chs)
357{
358 val &= ~(0x3U << 16);
359 val |= chs << 16;
360 return val;
361}
362
363/* check whether the widget has the given amp capability for the direction */
364static bool check_amp_caps(struct hda_codec *codec, hda_nid_t nid,
365 int dir, unsigned int bits)
366{
367 if (!nid)
368 return false;
369 if (get_wcaps(codec, nid) & (1 << (dir + 1)))
370 if (query_amp_caps(codec, nid, dir) & bits)
371 return true;
372 return false;
373}
374
375#define nid_has_mute(codec, nid, dir) \
376 check_amp_caps(codec, nid, dir, AC_AMPCAP_MUTE)
377#define nid_has_volume(codec, nid, dir) \
378 check_amp_caps(codec, nid, dir, AC_AMPCAP_NUM_STEPS)
379
380/* look for a widget suitable for assigning a mute switch in the path */
381static hda_nid_t look_for_out_mute_nid(struct hda_codec *codec,
382 struct nid_path *path)
383{
384 int i;
385
386 for (i = path->depth - 1; i >= 0; i--) {
387 if (nid_has_mute(codec, path->path[i], HDA_OUTPUT))
388 return path->path[i];
389 if (i != path->depth - 1 && i != 0 &&
390 nid_has_mute(codec, path->path[i], HDA_INPUT))
391 return path->path[i];
392 }
393 return 0;
394}
395
396/* look for a widget suitable for assigning a volume ctl in the path */
397static hda_nid_t look_for_out_vol_nid(struct hda_codec *codec,
398 struct nid_path *path)
399{
400 int i;
401
402 for (i = path->depth - 1; i >= 0; i--) {
403 if (nid_has_volume(codec, path->path[i], HDA_OUTPUT))
404 return path->path[i];
405 }
Takashi Iwai82beb8f2007-08-10 17:09:26 +0200406 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407}
408
409/*
Takashi Iwai352f7f92012-12-19 12:52:06 +0100410 * path activation / deactivation
Linus Torvalds1da177e2005-04-16 15:20:36 -0700411 */
Takashi Iwai352f7f92012-12-19 12:52:06 +0100412
413/* can have the amp-in capability? */
414static bool has_amp_in(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_IN_AMP))
421 return false;
422 if (type == AC_WID_PIN && idx > 0) /* only for input pins */
423 return false;
424 return true;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425}
426
Takashi Iwai352f7f92012-12-19 12:52:06 +0100427/* can have the amp-out capability? */
428static bool has_amp_out(struct hda_codec *codec, struct nid_path *path, int idx)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700429{
Takashi Iwai352f7f92012-12-19 12:52:06 +0100430 hda_nid_t nid = path->path[idx];
431 unsigned int caps = get_wcaps(codec, nid);
432 unsigned int type = get_wcaps_type(caps);
433
434 if (!(caps & AC_WCAP_OUT_AMP))
435 return false;
436 if (type == AC_WID_PIN && !idx) /* only for output pins */
437 return false;
438 return true;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700439}
440
Takashi Iwai352f7f92012-12-19 12:52:06 +0100441/* check whether the given (nid,dir,idx) is active */
442static bool is_active_nid(struct hda_codec *codec, hda_nid_t nid,
443 unsigned int idx, unsigned int dir)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444{
Takashi Iwai352f7f92012-12-19 12:52:06 +0100445 struct hda_gen_spec *spec = codec->spec;
446 int i, n;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447
Takashi Iwai352f7f92012-12-19 12:52:06 +0100448 for (n = 0; n < spec->paths.used; n++) {
449 struct nid_path *path = snd_array_elem(&spec->paths, n);
450 if (!path->active)
451 continue;
452 for (i = 0; i < path->depth; i++) {
453 if (path->path[i] == nid) {
454 if (dir == HDA_OUTPUT || path->idx[i] == idx)
455 return true;
456 break;
457 }
458 }
459 }
460 return false;
461}
462
463/* get the default amp value for the target state */
464static int get_amp_val_to_activate(struct hda_codec *codec, hda_nid_t nid,
465 int dir, bool enable)
466{
467 unsigned int caps;
468 unsigned int val = 0;
469
470 caps = query_amp_caps(codec, nid, dir);
471 if (caps & AC_AMPCAP_NUM_STEPS) {
472 /* set to 0dB */
473 if (enable)
474 val = (caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT;
475 }
476 if (caps & AC_AMPCAP_MUTE) {
477 if (!enable)
478 val |= HDA_AMP_MUTE;
479 }
480 return val;
481}
482
483/* initialize the amp value (only at the first time) */
484static void init_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx)
485{
486 int val = get_amp_val_to_activate(codec, nid, dir, false);
487 snd_hda_codec_amp_init_stereo(codec, nid, dir, idx, 0xff, val);
488}
489
490static void activate_amp(struct hda_codec *codec, hda_nid_t nid, int dir,
491 int idx, bool enable)
492{
493 int val;
494 if (is_ctl_associated(codec, nid, dir, idx) ||
Takashi Iwai985803c2013-01-03 16:30:04 +0100495 (!enable && is_active_nid(codec, nid, dir, idx)))
Takashi Iwai352f7f92012-12-19 12:52:06 +0100496 return;
497 val = get_amp_val_to_activate(codec, nid, dir, enable);
498 snd_hda_codec_amp_stereo(codec, nid, dir, idx, 0xff, val);
499}
500
501static void activate_amp_out(struct hda_codec *codec, struct nid_path *path,
502 int i, bool enable)
503{
504 hda_nid_t nid = path->path[i];
505 init_amp(codec, nid, HDA_OUTPUT, 0);
506 activate_amp(codec, nid, HDA_OUTPUT, 0, enable);
507}
508
509static void activate_amp_in(struct hda_codec *codec, struct nid_path *path,
510 int i, bool enable, bool add_aamix)
511{
512 struct hda_gen_spec *spec = codec->spec;
Takashi Iwaiee8e7652013-01-03 15:25:11 +0100513 const hda_nid_t *conn;
Takashi Iwai352f7f92012-12-19 12:52:06 +0100514 int n, nums, idx;
515 int type;
516 hda_nid_t nid = path->path[i];
517
Takashi Iwaiee8e7652013-01-03 15:25:11 +0100518 nums = snd_hda_get_conn_list(codec, nid, &conn);
Takashi Iwai352f7f92012-12-19 12:52:06 +0100519 type = get_wcaps_type(get_wcaps(codec, nid));
520 if (type == AC_WID_PIN ||
521 (type == AC_WID_AUD_IN && codec->single_adc_amp)) {
522 nums = 1;
523 idx = 0;
524 } else
525 idx = path->idx[i];
526
527 for (n = 0; n < nums; n++)
528 init_amp(codec, nid, HDA_INPUT, n);
529
530 if (is_ctl_associated(codec, nid, HDA_INPUT, idx))
531 return;
532
533 /* here is a little bit tricky in comparison with activate_amp_out();
534 * when aa-mixer is available, we need to enable the path as well
535 */
536 for (n = 0; n < nums; n++) {
537 if (n != idx && (!add_aamix || conn[n] != spec->mixer_nid))
538 continue;
539 activate_amp(codec, nid, HDA_INPUT, n, enable);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700540 }
541}
542
Takashi Iwai352f7f92012-12-19 12:52:06 +0100543/* activate or deactivate the given path
544 * if @add_aamix is set, enable the input from aa-mix NID as well (if any)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545 */
Takashi Iwai352f7f92012-12-19 12:52:06 +0100546void snd_hda_activate_path(struct hda_codec *codec, struct nid_path *path,
547 bool enable, bool add_aamix)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548{
Takashi Iwai352f7f92012-12-19 12:52:06 +0100549 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550
Takashi Iwai352f7f92012-12-19 12:52:06 +0100551 if (!enable)
552 path->active = false;
553
554 for (i = path->depth - 1; i >= 0; i--) {
555 if (enable && path->multi[i])
556 snd_hda_codec_write_cache(codec, path->path[i], 0,
557 AC_VERB_SET_CONNECT_SEL,
558 path->idx[i]);
559 if (has_amp_in(codec, path, i))
560 activate_amp_in(codec, path, i, enable, add_aamix);
561 if (has_amp_out(codec, path, i))
562 activate_amp_out(codec, path, i, enable);
563 }
564
565 if (enable)
566 path->active = true;
567}
568EXPORT_SYMBOL_HDA(snd_hda_activate_path);
569
Takashi Iwaid5a9f1b2012-12-20 15:36:30 +0100570/* turn on/off EAPD on the given pin */
571static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable)
572{
573 struct hda_gen_spec *spec = codec->spec;
574 if (spec->own_eapd_ctl ||
575 !(snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD))
576 return;
Takashi Iwaiecac3ed2012-12-21 15:23:01 +0100577 if (codec->inv_eapd)
578 enable = !enable;
Takashi Iwaid5a9f1b2012-12-20 15:36:30 +0100579 snd_hda_codec_update_cache(codec, pin, 0,
580 AC_VERB_SET_EAPD_BTLENABLE,
581 enable ? 0x02 : 0x00);
582}
583
Takashi Iwai352f7f92012-12-19 12:52:06 +0100584
585/*
586 * Helper functions for creating mixer ctl elements
587 */
588
589enum {
590 HDA_CTL_WIDGET_VOL,
591 HDA_CTL_WIDGET_MUTE,
592 HDA_CTL_BIND_MUTE,
Takashi Iwai352f7f92012-12-19 12:52:06 +0100593};
594static const struct snd_kcontrol_new control_templates[] = {
595 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
596 HDA_CODEC_MUTE(NULL, 0, 0, 0),
597 HDA_BIND_MUTE(NULL, 0, 0, 0),
Takashi Iwai352f7f92012-12-19 12:52:06 +0100598};
599
600/* add dynamic controls from template */
601static int add_control(struct hda_gen_spec *spec, int type, const char *name,
602 int cidx, unsigned long val)
603{
604 struct snd_kcontrol_new *knew;
605
Takashi Iwai12c93df2012-12-19 14:38:33 +0100606 knew = snd_hda_gen_add_kctl(spec, name, &control_templates[type]);
Takashi Iwai352f7f92012-12-19 12:52:06 +0100607 if (!knew)
608 return -ENOMEM;
609 knew->index = cidx;
610 if (get_amp_nid_(val))
611 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
612 knew->private_value = val;
613 return 0;
614}
615
616static int add_control_with_pfx(struct hda_gen_spec *spec, int type,
617 const char *pfx, const char *dir,
618 const char *sfx, int cidx, unsigned long val)
619{
620 char name[32];
621 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
622 return add_control(spec, type, name, cidx, val);
623}
624
625#define add_pb_vol_ctrl(spec, type, pfx, val) \
626 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", 0, val)
627#define add_pb_sw_ctrl(spec, type, pfx, val) \
628 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", 0, val)
629#define __add_pb_vol_ctrl(spec, type, pfx, cidx, val) \
630 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", cidx, val)
631#define __add_pb_sw_ctrl(spec, type, pfx, cidx, val) \
632 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", cidx, val)
633
634static int add_vol_ctl(struct hda_codec *codec, const char *pfx, int cidx,
635 unsigned int chs, struct nid_path *path)
636{
637 unsigned int val;
638 if (!path)
639 return 0;
640 val = path->ctls[NID_PATH_VOL_CTL];
641 if (!val)
642 return 0;
643 val = amp_val_replace_channels(val, chs);
644 return __add_pb_vol_ctrl(codec->spec, HDA_CTL_WIDGET_VOL, pfx, cidx, val);
645}
646
647/* return the channel bits suitable for the given path->ctls[] */
648static int get_default_ch_nums(struct hda_codec *codec, struct nid_path *path,
649 int type)
650{
651 int chs = 1; /* mono (left only) */
652 if (path) {
653 hda_nid_t nid = get_amp_nid_(path->ctls[type]);
654 if (nid && (get_wcaps(codec, nid) & AC_WCAP_STEREO))
655 chs = 3; /* stereo */
656 }
657 return chs;
658}
659
660static int add_stereo_vol(struct hda_codec *codec, const char *pfx, int cidx,
661 struct nid_path *path)
662{
663 int chs = get_default_ch_nums(codec, path, NID_PATH_VOL_CTL);
664 return add_vol_ctl(codec, pfx, cidx, chs, path);
665}
666
667/* create a mute-switch for the given mixer widget;
668 * if it has multiple sources (e.g. DAC and loopback), create a bind-mute
669 */
670static int add_sw_ctl(struct hda_codec *codec, const char *pfx, int cidx,
671 unsigned int chs, struct nid_path *path)
672{
673 unsigned int val;
674 int type = HDA_CTL_WIDGET_MUTE;
675
676 if (!path)
677 return 0;
678 val = path->ctls[NID_PATH_MUTE_CTL];
679 if (!val)
680 return 0;
681 val = amp_val_replace_channels(val, chs);
682 if (get_amp_direction_(val) == HDA_INPUT) {
683 hda_nid_t nid = get_amp_nid_(val);
684 int nums = snd_hda_get_num_conns(codec, nid);
685 if (nums > 1) {
686 type = HDA_CTL_BIND_MUTE;
687 val |= nums << 19;
688 }
689 }
690 return __add_pb_sw_ctrl(codec->spec, type, pfx, cidx, val);
691}
692
693static int add_stereo_sw(struct hda_codec *codec, const char *pfx,
694 int cidx, struct nid_path *path)
695{
696 int chs = get_default_ch_nums(codec, path, NID_PATH_MUTE_CTL);
697 return add_sw_ctl(codec, pfx, cidx, chs, path);
698}
699
700static const char * const channel_name[4] = {
701 "Front", "Surround", "CLFE", "Side"
702};
703
704/* give some appropriate ctl name prefix for the given line out channel */
705static const char *get_line_out_pfx(struct hda_gen_spec *spec, int ch,
706 bool can_be_master, int *index)
707{
708 struct auto_pin_cfg *cfg = &spec->autocfg;
709
710 *index = 0;
711 if (cfg->line_outs == 1 && !spec->multi_ios &&
712 !cfg->hp_outs && !cfg->speaker_outs && can_be_master)
713 return spec->vmaster_mute.hook ? "PCM" : "Master";
714
715 /* if there is really a single DAC used in the whole output paths,
716 * use it master (or "PCM" if a vmaster hook is present)
717 */
718 if (spec->multiout.num_dacs == 1 && !spec->mixer_nid &&
719 !spec->multiout.hp_out_nid[0] && !spec->multiout.extra_out_nid[0])
720 return spec->vmaster_mute.hook ? "PCM" : "Master";
721
722 switch (cfg->line_out_type) {
723 case AUTO_PIN_SPEAKER_OUT:
724 if (cfg->line_outs == 1)
725 return "Speaker";
726 if (cfg->line_outs == 2)
727 return ch ? "Bass Speaker" : "Speaker";
728 break;
729 case AUTO_PIN_HP_OUT:
730 /* for multi-io case, only the primary out */
731 if (ch && spec->multi_ios)
732 break;
733 *index = ch;
734 return "Headphone";
735 default:
736 if (cfg->line_outs == 1 && !spec->multi_ios)
737 return "PCM";
738 break;
739 }
740 if (ch >= ARRAY_SIZE(channel_name)) {
741 snd_BUG();
742 return "PCM";
743 }
744
745 return channel_name[ch];
746}
747
748/*
749 * Parse output paths
750 */
751
752/* badness definition */
753enum {
754 /* No primary DAC is found for the main output */
755 BAD_NO_PRIMARY_DAC = 0x10000,
756 /* No DAC is found for the extra output */
757 BAD_NO_DAC = 0x4000,
758 /* No possible multi-ios */
759 BAD_MULTI_IO = 0x103,
760 /* No individual DAC for extra output */
761 BAD_NO_EXTRA_DAC = 0x102,
762 /* No individual DAC for extra surrounds */
763 BAD_NO_EXTRA_SURR_DAC = 0x101,
764 /* Primary DAC shared with main surrounds */
765 BAD_SHARED_SURROUND = 0x100,
766 /* Primary DAC shared with main CLFE */
767 BAD_SHARED_CLFE = 0x10,
768 /* Primary DAC shared with extra surrounds */
769 BAD_SHARED_EXTRA_SURROUND = 0x10,
770 /* Volume widget is shared */
771 BAD_SHARED_VOL = 0x10,
772};
773
Takashi Iwai0e614dd2013-01-07 15:11:44 +0100774/* look for widgets in the given path which are appropriate for
Takashi Iwai352f7f92012-12-19 12:52:06 +0100775 * volume and mute controls, and assign the values to ctls[].
776 *
777 * When no appropriate widget is found in the path, the badness value
778 * is incremented depending on the situation. The function returns the
779 * total badness for both volume and mute controls.
780 */
Takashi Iwai0e614dd2013-01-07 15:11:44 +0100781static int assign_out_path_ctls(struct hda_codec *codec, struct nid_path *path)
Takashi Iwai352f7f92012-12-19 12:52:06 +0100782{
Takashi Iwai352f7f92012-12-19 12:52:06 +0100783 hda_nid_t nid;
784 unsigned int val;
785 int badness = 0;
786
787 if (!path)
788 return BAD_SHARED_VOL * 2;
Takashi Iwai0e614dd2013-01-07 15:11:44 +0100789
790 if (path->ctls[NID_PATH_VOL_CTL] ||
791 path->ctls[NID_PATH_MUTE_CTL])
792 return 0; /* already evaluated */
793
Takashi Iwai352f7f92012-12-19 12:52:06 +0100794 nid = look_for_out_vol_nid(codec, path);
795 if (nid) {
796 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
797 if (is_ctl_used(codec, val, NID_PATH_VOL_CTL))
798 badness += BAD_SHARED_VOL;
799 else
800 path->ctls[NID_PATH_VOL_CTL] = val;
801 } else
802 badness += BAD_SHARED_VOL;
803 nid = look_for_out_mute_nid(codec, path);
804 if (nid) {
805 unsigned int wid_type = get_wcaps_type(get_wcaps(codec, nid));
806 if (wid_type == AC_WID_PIN || wid_type == AC_WID_AUD_OUT ||
807 nid_has_mute(codec, nid, HDA_OUTPUT))
808 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
809 else
810 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT);
811 if (is_ctl_used(codec, val, NID_PATH_MUTE_CTL))
812 badness += BAD_SHARED_VOL;
813 else
814 path->ctls[NID_PATH_MUTE_CTL] = val;
815 } else
816 badness += BAD_SHARED_VOL;
817 return badness;
818}
819
820struct badness_table {
821 int no_primary_dac; /* no primary DAC */
822 int no_dac; /* no secondary DACs */
823 int shared_primary; /* primary DAC is shared with main output */
824 int shared_surr; /* secondary DAC shared with main or primary */
825 int shared_clfe; /* third DAC shared with main or primary */
826 int shared_surr_main; /* secondary DAC sahred with main/DAC0 */
827};
828
829static struct badness_table main_out_badness = {
830 .no_primary_dac = BAD_NO_PRIMARY_DAC,
831 .no_dac = BAD_NO_DAC,
832 .shared_primary = BAD_NO_PRIMARY_DAC,
833 .shared_surr = BAD_SHARED_SURROUND,
834 .shared_clfe = BAD_SHARED_CLFE,
835 .shared_surr_main = BAD_SHARED_SURROUND,
836};
837
838static struct badness_table extra_out_badness = {
839 .no_primary_dac = BAD_NO_DAC,
840 .no_dac = BAD_NO_DAC,
841 .shared_primary = BAD_NO_EXTRA_DAC,
842 .shared_surr = BAD_SHARED_EXTRA_SURROUND,
843 .shared_clfe = BAD_SHARED_EXTRA_SURROUND,
844 .shared_surr_main = BAD_NO_EXTRA_SURR_DAC,
845};
846
Takashi Iwai7385df62013-01-07 09:50:52 +0100847/* get the DAC of the primary output corresponding to the given array index */
848static hda_nid_t get_primary_out(struct hda_codec *codec, int idx)
849{
850 struct hda_gen_spec *spec = codec->spec;
851 struct auto_pin_cfg *cfg = &spec->autocfg;
852
853 if (cfg->line_outs > idx)
854 return spec->private_dac_nids[idx];
855 idx -= cfg->line_outs;
856 if (spec->multi_ios > idx)
857 return spec->multi_io[idx].dac;
858 return 0;
859}
860
861/* return the DAC if it's reachable, otherwise zero */
862static inline hda_nid_t try_dac(struct hda_codec *codec,
863 hda_nid_t dac, hda_nid_t pin)
864{
865 return is_reachable_path(codec, dac, pin) ? dac : 0;
866}
867
Takashi Iwai352f7f92012-12-19 12:52:06 +0100868/* try to assign DACs to pins and return the resultant badness */
869static int try_assign_dacs(struct hda_codec *codec, int num_outs,
870 const hda_nid_t *pins, hda_nid_t *dacs,
Takashi Iwai196c17662013-01-04 15:01:40 +0100871 int *path_idx,
Takashi Iwai352f7f92012-12-19 12:52:06 +0100872 const struct badness_table *bad)
873{
874 struct hda_gen_spec *spec = codec->spec;
Takashi Iwai352f7f92012-12-19 12:52:06 +0100875 int i, j;
876 int badness = 0;
877 hda_nid_t dac;
878
879 if (!num_outs)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700880 return 0;
881
Takashi Iwai352f7f92012-12-19 12:52:06 +0100882 for (i = 0; i < num_outs; i++) {
Takashi Iwai0c8c0f52012-12-20 17:54:22 +0100883 struct nid_path *path;
Takashi Iwai352f7f92012-12-19 12:52:06 +0100884 hda_nid_t pin = pins[i];
Takashi Iwai1e0b5282013-01-04 12:56:52 +0100885
Takashi Iwai0e614dd2013-01-07 15:11:44 +0100886 path = snd_hda_get_path_from_idx(codec, path_idx[i]);
887 if (path) {
888 badness += assign_out_path_ctls(codec, path);
Takashi Iwai1e0b5282013-01-04 12:56:52 +0100889 continue;
890 }
891
892 dacs[i] = look_for_dac(codec, pin, false);
Takashi Iwai352f7f92012-12-19 12:52:06 +0100893 if (!dacs[i] && !i) {
894 for (j = 1; j < num_outs; j++) {
895 if (is_reachable_path(codec, dacs[j], pin)) {
896 dacs[0] = dacs[j];
897 dacs[j] = 0;
Takashi Iwai196c17662013-01-04 15:01:40 +0100898 path_idx[j] = 0;
Takashi Iwai352f7f92012-12-19 12:52:06 +0100899 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900 }
901 }
Takashi Iwai352f7f92012-12-19 12:52:06 +0100902 }
903 dac = dacs[i];
904 if (!dac) {
Takashi Iwai7385df62013-01-07 09:50:52 +0100905 if (num_outs > 2)
906 dac = try_dac(codec, get_primary_out(codec, i), pin);
907 if (!dac)
908 dac = try_dac(codec, dacs[0], pin);
909 if (!dac)
910 dac = try_dac(codec, get_primary_out(codec, i), pin);
Takashi Iwai352f7f92012-12-19 12:52:06 +0100911 if (dac) {
912 if (!i)
913 badness += bad->shared_primary;
914 else if (i == 1)
915 badness += bad->shared_surr;
916 else
917 badness += bad->shared_clfe;
918 } else if (is_reachable_path(codec, spec->private_dac_nids[0], pin)) {
919 dac = spec->private_dac_nids[0];
920 badness += bad->shared_surr_main;
921 } else if (!i)
922 badness += bad->no_primary_dac;
923 else
924 badness += bad->no_dac;
925 }
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100926 path = snd_hda_add_new_path(codec, dac, pin, -spec->mixer_nid);
Takashi Iwai117688a2013-01-04 15:41:41 +0100927 if (!path && !i && spec->mixer_nid) {
Takashi Iwaib3a8c742012-12-20 18:29:16 +0100928 /* try with aamix */
Takashi Iwai3ca529d2013-01-07 17:25:08 +0100929 path = snd_hda_add_new_path(codec, dac, pin, 0);
Takashi Iwaib3a8c742012-12-20 18:29:16 +0100930 }
Takashi Iwai0c8c0f52012-12-20 17:54:22 +0100931 if (!path)
Takashi Iwai352f7f92012-12-19 12:52:06 +0100932 dac = dacs[i] = 0;
Takashi Iwaie1284af2013-01-03 16:33:02 +0100933 else {
Takashi Iwai0c8c0f52012-12-20 17:54:22 +0100934 print_nid_path("output", path);
Takashi Iwaie1284af2013-01-03 16:33:02 +0100935 path->active = true;
Takashi Iwai196c17662013-01-04 15:01:40 +0100936 path_idx[i] = snd_hda_get_path_idx(codec, path);
Takashi Iwai0e614dd2013-01-07 15:11:44 +0100937 badness += assign_out_path_ctls(codec, path);
Takashi Iwaie1284af2013-01-03 16:33:02 +0100938 }
Takashi Iwai352f7f92012-12-19 12:52:06 +0100939 }
940
941 return badness;
942}
943
944/* return NID if the given pin has only a single connection to a certain DAC */
945static hda_nid_t get_dac_if_single(struct hda_codec *codec, hda_nid_t pin)
946{
947 struct hda_gen_spec *spec = codec->spec;
948 int i;
949 hda_nid_t nid_found = 0;
950
951 for (i = 0; i < spec->num_all_dacs; i++) {
952 hda_nid_t nid = spec->all_dacs[i];
953 if (!nid || is_dac_already_used(codec, nid))
954 continue;
955 if (is_reachable_path(codec, nid, pin)) {
956 if (nid_found)
957 return 0;
958 nid_found = nid;
959 }
960 }
961 return nid_found;
962}
963
964/* check whether the given pin can be a multi-io pin */
965static bool can_be_multiio_pin(struct hda_codec *codec,
966 unsigned int location, hda_nid_t nid)
967{
968 unsigned int defcfg, caps;
969
970 defcfg = snd_hda_codec_get_pincfg(codec, nid);
971 if (get_defcfg_connect(defcfg) != AC_JACK_PORT_COMPLEX)
972 return false;
973 if (location && get_defcfg_location(defcfg) != location)
974 return false;
975 caps = snd_hda_query_pin_caps(codec, nid);
976 if (!(caps & AC_PINCAP_OUT))
977 return false;
978 return true;
979}
980
Takashi Iwaie22aab72013-01-04 14:50:04 +0100981/* count the number of input pins that are capable to be multi-io */
982static int count_multiio_pins(struct hda_codec *codec, hda_nid_t reference_pin)
983{
984 struct hda_gen_spec *spec = codec->spec;
985 struct auto_pin_cfg *cfg = &spec->autocfg;
986 unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin);
987 unsigned int location = get_defcfg_location(defcfg);
988 int type, i;
989 int num_pins = 0;
990
991 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
992 for (i = 0; i < cfg->num_inputs; i++) {
993 if (cfg->inputs[i].type != type)
994 continue;
995 if (can_be_multiio_pin(codec, location,
996 cfg->inputs[i].pin))
997 num_pins++;
998 }
999 }
1000 return num_pins;
1001}
1002
Takashi Iwai352f7f92012-12-19 12:52:06 +01001003/*
1004 * multi-io helper
1005 *
1006 * When hardwired is set, try to fill ony hardwired pins, and returns
1007 * zero if any pins are filled, non-zero if nothing found.
1008 * When hardwired is off, try to fill possible input pins, and returns
1009 * the badness value.
1010 */
1011static int fill_multi_ios(struct hda_codec *codec,
1012 hda_nid_t reference_pin,
Takashi Iwaie22aab72013-01-04 14:50:04 +01001013 bool hardwired)
Takashi Iwai352f7f92012-12-19 12:52:06 +01001014{
1015 struct hda_gen_spec *spec = codec->spec;
1016 struct auto_pin_cfg *cfg = &spec->autocfg;
Takashi Iwaie22aab72013-01-04 14:50:04 +01001017 int type, i, j, num_pins, old_pins;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001018 unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin);
1019 unsigned int location = get_defcfg_location(defcfg);
1020 int badness = 0;
Takashi Iwai0e614dd2013-01-07 15:11:44 +01001021 struct nid_path *path;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001022
1023 old_pins = spec->multi_ios;
1024 if (old_pins >= 2)
1025 goto end_fill;
1026
Takashi Iwaie22aab72013-01-04 14:50:04 +01001027 num_pins = count_multiio_pins(codec, reference_pin);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001028 if (num_pins < 2)
1029 goto end_fill;
1030
Takashi Iwai352f7f92012-12-19 12:52:06 +01001031 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
1032 for (i = 0; i < cfg->num_inputs; i++) {
1033 hda_nid_t nid = cfg->inputs[i].pin;
1034 hda_nid_t dac = 0;
1035
1036 if (cfg->inputs[i].type != type)
1037 continue;
1038 if (!can_be_multiio_pin(codec, location, nid))
1039 continue;
1040 for (j = 0; j < spec->multi_ios; j++) {
1041 if (nid == spec->multi_io[j].pin)
1042 break;
1043 }
1044 if (j < spec->multi_ios)
1045 continue;
1046
Takashi Iwai352f7f92012-12-19 12:52:06 +01001047 if (hardwired)
1048 dac = get_dac_if_single(codec, nid);
1049 else if (!dac)
1050 dac = look_for_dac(codec, nid, false);
1051 if (!dac) {
1052 badness++;
1053 continue;
1054 }
Takashi Iwai3ca529d2013-01-07 17:25:08 +01001055 path = snd_hda_add_new_path(codec, dac, nid,
1056 -spec->mixer_nid);
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001057 if (!path) {
Takashi Iwai352f7f92012-12-19 12:52:06 +01001058 badness++;
1059 continue;
1060 }
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001061 print_nid_path("multiio", path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001062 spec->multi_io[spec->multi_ios].pin = nid;
1063 spec->multi_io[spec->multi_ios].dac = dac;
Takashi Iwai196c17662013-01-04 15:01:40 +01001064 spec->out_paths[cfg->line_outs + spec->multi_ios] =
1065 snd_hda_get_path_idx(codec, path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001066 spec->multi_ios++;
1067 if (spec->multi_ios >= 2)
1068 break;
1069 }
1070 }
1071 end_fill:
1072 if (badness)
1073 badness = BAD_MULTI_IO;
1074 if (old_pins == spec->multi_ios) {
1075 if (hardwired)
1076 return 1; /* nothing found */
1077 else
1078 return badness; /* no badness if nothing found */
1079 }
1080 if (!hardwired && spec->multi_ios < 2) {
1081 /* cancel newly assigned paths */
1082 spec->paths.used -= spec->multi_ios - old_pins;
1083 spec->multi_ios = old_pins;
1084 return badness;
1085 }
1086
1087 /* assign volume and mute controls */
Takashi Iwai0e614dd2013-01-07 15:11:44 +01001088 for (i = old_pins; i < spec->multi_ios; i++) {
1089 path = snd_hda_get_path_from_idx(codec, spec->out_paths[cfg->line_outs + i]);
1090 badness += assign_out_path_ctls(codec, path);
1091 }
Takashi Iwai352f7f92012-12-19 12:52:06 +01001092
1093 return badness;
1094}
1095
1096/* map DACs for all pins in the list if they are single connections */
1097static bool map_singles(struct hda_codec *codec, int outs,
Takashi Iwai196c17662013-01-04 15:01:40 +01001098 const hda_nid_t *pins, hda_nid_t *dacs, int *path_idx)
Takashi Iwai352f7f92012-12-19 12:52:06 +01001099{
Takashi Iwaib3a8c742012-12-20 18:29:16 +01001100 struct hda_gen_spec *spec = codec->spec;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001101 int i;
1102 bool found = false;
1103 for (i = 0; i < outs; i++) {
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001104 struct nid_path *path;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001105 hda_nid_t dac;
1106 if (dacs[i])
1107 continue;
1108 dac = get_dac_if_single(codec, pins[i]);
1109 if (!dac)
1110 continue;
Takashi Iwai3ca529d2013-01-07 17:25:08 +01001111 path = snd_hda_add_new_path(codec, dac, pins[i],
1112 -spec->mixer_nid);
Takashi Iwai117688a2013-01-04 15:41:41 +01001113 if (!path && !i && spec->mixer_nid)
Takashi Iwai3ca529d2013-01-07 17:25:08 +01001114 path = snd_hda_add_new_path(codec, dac, pins[i], 0);
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001115 if (path) {
Takashi Iwai352f7f92012-12-19 12:52:06 +01001116 dacs[i] = dac;
1117 found = true;
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001118 print_nid_path("output", path);
Takashi Iwaie1284af2013-01-03 16:33:02 +01001119 path->active = true;
Takashi Iwai196c17662013-01-04 15:01:40 +01001120 path_idx[i] = snd_hda_get_path_idx(codec, path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001121 }
1122 }
1123 return found;
1124}
1125
Takashi Iwaic30aa7b2013-01-04 16:42:48 +01001126/* create a new path including aamix if available, and return its index */
1127static int check_aamix_out_path(struct hda_codec *codec, int path_idx)
1128{
Takashi Iwai3ca529d2013-01-07 17:25:08 +01001129 struct hda_gen_spec *spec = codec->spec;
Takashi Iwaic30aa7b2013-01-04 16:42:48 +01001130 struct nid_path *path;
1131
1132 path = snd_hda_get_path_from_idx(codec, path_idx);
Takashi Iwai3ca529d2013-01-07 17:25:08 +01001133 if (!path || !path->depth ||
1134 is_nid_contained(path, spec->mixer_nid))
Takashi Iwaic30aa7b2013-01-04 16:42:48 +01001135 return 0;
1136 path = snd_hda_add_new_path(codec, path->path[0],
1137 path->path[path->depth - 1],
Takashi Iwai3ca529d2013-01-07 17:25:08 +01001138 spec->mixer_nid);
Takashi Iwaic30aa7b2013-01-04 16:42:48 +01001139 if (!path)
1140 return 0;
1141 print_nid_path("output-aamix", path);
1142 path->active = false; /* unused as default */
1143 return snd_hda_get_path_idx(codec, path);
1144}
1145
Takashi Iwaia07a9492013-01-07 16:44:06 +01001146/* fill the empty entries in the dac array for speaker/hp with the
1147 * shared dac pointed by the paths
1148 */
1149static void refill_shared_dacs(struct hda_codec *codec, int num_outs,
1150 hda_nid_t *dacs, int *path_idx)
1151{
1152 struct nid_path *path;
1153 int i;
1154
1155 for (i = 0; i < num_outs; i++) {
1156 if (dacs[i])
1157 continue;
1158 path = snd_hda_get_path_from_idx(codec, path_idx[i]);
1159 if (!path)
1160 continue;
1161 dacs[i] = path->path[0];
1162 }
1163}
1164
Takashi Iwai352f7f92012-12-19 12:52:06 +01001165/* fill in the dac_nids table from the parsed pin configuration */
1166static int fill_and_eval_dacs(struct hda_codec *codec,
1167 bool fill_hardwired,
1168 bool fill_mio_first)
1169{
1170 struct hda_gen_spec *spec = codec->spec;
1171 struct auto_pin_cfg *cfg = &spec->autocfg;
1172 int i, err, badness;
1173
1174 /* set num_dacs once to full for look_for_dac() */
1175 spec->multiout.num_dacs = cfg->line_outs;
1176 spec->multiout.dac_nids = spec->private_dac_nids;
1177 memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids));
1178 memset(spec->multiout.hp_out_nid, 0, sizeof(spec->multiout.hp_out_nid));
1179 memset(spec->multiout.extra_out_nid, 0, sizeof(spec->multiout.extra_out_nid));
1180 spec->multi_ios = 0;
1181 snd_array_free(&spec->paths);
Takashi Iwaicd5be3f2013-01-07 15:07:00 +01001182
1183 /* clear path indices */
1184 memset(spec->out_paths, 0, sizeof(spec->out_paths));
1185 memset(spec->hp_paths, 0, sizeof(spec->hp_paths));
1186 memset(spec->speaker_paths, 0, sizeof(spec->speaker_paths));
1187 memset(spec->aamix_out_paths, 0, sizeof(spec->aamix_out_paths));
1188 memset(spec->digout_paths, 0, sizeof(spec->digout_paths));
Takashi Iwaic697b712013-01-07 17:09:26 +01001189 memset(spec->input_paths, 0, sizeof(spec->input_paths));
Takashi Iwaicd5be3f2013-01-07 15:07:00 +01001190 memset(spec->loopback_paths, 0, sizeof(spec->loopback_paths));
1191 memset(&spec->digin_path, 0, sizeof(spec->digin_path));
1192
Takashi Iwai352f7f92012-12-19 12:52:06 +01001193 badness = 0;
1194
1195 /* fill hard-wired DACs first */
1196 if (fill_hardwired) {
1197 bool mapped;
1198 do {
1199 mapped = map_singles(codec, cfg->line_outs,
1200 cfg->line_out_pins,
Takashi Iwai196c17662013-01-04 15:01:40 +01001201 spec->private_dac_nids,
1202 spec->out_paths);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001203 mapped |= map_singles(codec, cfg->hp_outs,
1204 cfg->hp_pins,
Takashi Iwai196c17662013-01-04 15:01:40 +01001205 spec->multiout.hp_out_nid,
1206 spec->hp_paths);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001207 mapped |= map_singles(codec, cfg->speaker_outs,
1208 cfg->speaker_pins,
Takashi Iwai196c17662013-01-04 15:01:40 +01001209 spec->multiout.extra_out_nid,
1210 spec->speaker_paths);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001211 if (fill_mio_first && cfg->line_outs == 1 &&
1212 cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
Takashi Iwaie22aab72013-01-04 14:50:04 +01001213 err = fill_multi_ios(codec, cfg->line_out_pins[0], true);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001214 if (!err)
1215 mapped = true;
1216 }
1217 } while (mapped);
1218 }
1219
1220 badness += try_assign_dacs(codec, cfg->line_outs, cfg->line_out_pins,
Takashi Iwai196c17662013-01-04 15:01:40 +01001221 spec->private_dac_nids, spec->out_paths,
Takashi Iwai352f7f92012-12-19 12:52:06 +01001222 &main_out_badness);
1223
Takashi Iwai352f7f92012-12-19 12:52:06 +01001224 if (fill_mio_first &&
1225 cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1226 /* try to fill multi-io first */
Takashi Iwaie22aab72013-01-04 14:50:04 +01001227 err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001228 if (err < 0)
1229 return err;
1230 /* we don't count badness at this stage yet */
1231 }
1232
1233 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
1234 err = try_assign_dacs(codec, cfg->hp_outs, cfg->hp_pins,
1235 spec->multiout.hp_out_nid,
Takashi Iwai196c17662013-01-04 15:01:40 +01001236 spec->hp_paths,
Takashi Iwai352f7f92012-12-19 12:52:06 +01001237 &extra_out_badness);
1238 if (err < 0)
1239 return err;
1240 badness += err;
1241 }
1242 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
1243 err = try_assign_dacs(codec, cfg->speaker_outs,
1244 cfg->speaker_pins,
1245 spec->multiout.extra_out_nid,
Takashi Iwai196c17662013-01-04 15:01:40 +01001246 spec->speaker_paths,
1247 &extra_out_badness);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001248 if (err < 0)
1249 return err;
1250 badness += err;
1251 }
1252 if (cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
Takashi Iwaie22aab72013-01-04 14:50:04 +01001253 err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001254 if (err < 0)
1255 return err;
1256 badness += err;
1257 }
Takashi Iwaie22aab72013-01-04 14:50:04 +01001258
Takashi Iwaic30aa7b2013-01-04 16:42:48 +01001259 if (spec->mixer_nid) {
1260 spec->aamix_out_paths[0] =
1261 check_aamix_out_path(codec, spec->out_paths[0]);
1262 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1263 spec->aamix_out_paths[1] =
1264 check_aamix_out_path(codec, spec->hp_paths[0]);
1265 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1266 spec->aamix_out_paths[2] =
1267 check_aamix_out_path(codec, spec->speaker_paths[0]);
1268 }
1269
Takashi Iwaie22aab72013-01-04 14:50:04 +01001270 if (cfg->hp_outs && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
1271 if (count_multiio_pins(codec, cfg->hp_pins[0]) >= 2)
1272 spec->multi_ios = 1; /* give badness */
Takashi Iwai352f7f92012-12-19 12:52:06 +01001273
Takashi Iwaia07a9492013-01-07 16:44:06 +01001274 /* re-count num_dacs and squash invalid entries */
1275 spec->multiout.num_dacs = 0;
1276 for (i = 0; i < cfg->line_outs; i++) {
1277 if (spec->private_dac_nids[i])
1278 spec->multiout.num_dacs++;
1279 else {
1280 memmove(spec->private_dac_nids + i,
1281 spec->private_dac_nids + i + 1,
1282 sizeof(hda_nid_t) * (cfg->line_outs - i - 1));
1283 spec->private_dac_nids[cfg->line_outs - 1] = 0;
1284 }
1285 }
1286
1287 spec->ext_channel_count = spec->min_channel_count =
1288 spec->multiout.num_dacs;
1289
Takashi Iwai352f7f92012-12-19 12:52:06 +01001290 if (spec->multi_ios == 2) {
1291 for (i = 0; i < 2; i++)
1292 spec->private_dac_nids[spec->multiout.num_dacs++] =
1293 spec->multi_io[i].dac;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001294 } else if (spec->multi_ios) {
1295 spec->multi_ios = 0;
1296 badness += BAD_MULTI_IO;
1297 }
1298
Takashi Iwaia07a9492013-01-07 16:44:06 +01001299 /* re-fill the shared DAC for speaker / headphone */
1300 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1301 refill_shared_dacs(codec, cfg->hp_outs,
1302 spec->multiout.hp_out_nid,
1303 spec->hp_paths);
1304 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1305 refill_shared_dacs(codec, cfg->speaker_outs,
1306 spec->multiout.extra_out_nid,
1307 spec->speaker_paths);
1308
Takashi Iwai352f7f92012-12-19 12:52:06 +01001309 return badness;
1310}
1311
1312#define DEBUG_BADNESS
1313
1314#ifdef DEBUG_BADNESS
1315#define debug_badness snd_printdd
1316#else
1317#define debug_badness(...)
1318#endif
1319
1320static void debug_show_configs(struct hda_gen_spec *spec, struct auto_pin_cfg *cfg)
1321{
1322 debug_badness("multi_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1323 cfg->line_out_pins[0], cfg->line_out_pins[1],
Takashi Iwai708122e2012-12-20 17:56:57 +01001324 cfg->line_out_pins[2], cfg->line_out_pins[3],
Takashi Iwai352f7f92012-12-19 12:52:06 +01001325 spec->multiout.dac_nids[0],
1326 spec->multiout.dac_nids[1],
1327 spec->multiout.dac_nids[2],
1328 spec->multiout.dac_nids[3]);
1329 if (spec->multi_ios > 0)
1330 debug_badness("multi_ios(%d) = %x/%x : %x/%x\n",
1331 spec->multi_ios,
1332 spec->multi_io[0].pin, spec->multi_io[1].pin,
1333 spec->multi_io[0].dac, spec->multi_io[1].dac);
1334 debug_badness("hp_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1335 cfg->hp_pins[0], cfg->hp_pins[1],
Takashi Iwai708122e2012-12-20 17:56:57 +01001336 cfg->hp_pins[2], cfg->hp_pins[3],
Takashi Iwai352f7f92012-12-19 12:52:06 +01001337 spec->multiout.hp_out_nid[0],
1338 spec->multiout.hp_out_nid[1],
1339 spec->multiout.hp_out_nid[2],
1340 spec->multiout.hp_out_nid[3]);
1341 debug_badness("spk_outs = %x/%x/%x/%x : %x/%x/%x/%x\n",
1342 cfg->speaker_pins[0], cfg->speaker_pins[1],
1343 cfg->speaker_pins[2], cfg->speaker_pins[3],
1344 spec->multiout.extra_out_nid[0],
1345 spec->multiout.extra_out_nid[1],
1346 spec->multiout.extra_out_nid[2],
1347 spec->multiout.extra_out_nid[3]);
1348}
1349
1350/* find all available DACs of the codec */
1351static void fill_all_dac_nids(struct hda_codec *codec)
1352{
1353 struct hda_gen_spec *spec = codec->spec;
1354 int i;
1355 hda_nid_t nid = codec->start_nid;
1356
1357 spec->num_all_dacs = 0;
1358 memset(spec->all_dacs, 0, sizeof(spec->all_dacs));
1359 for (i = 0; i < codec->num_nodes; i++, nid++) {
1360 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_AUD_OUT)
1361 continue;
1362 if (spec->num_all_dacs >= ARRAY_SIZE(spec->all_dacs)) {
1363 snd_printk(KERN_ERR "hda: Too many DACs!\n");
1364 break;
1365 }
1366 spec->all_dacs[spec->num_all_dacs++] = nid;
1367 }
1368}
1369
1370static int parse_output_paths(struct hda_codec *codec)
1371{
1372 struct hda_gen_spec *spec = codec->spec;
1373 struct auto_pin_cfg *cfg = &spec->autocfg;
1374 struct auto_pin_cfg *best_cfg;
1375 int best_badness = INT_MAX;
1376 int badness;
1377 bool fill_hardwired = true, fill_mio_first = true;
1378 bool best_wired = true, best_mio = true;
1379 bool hp_spk_swapped = false;
1380
1381 fill_all_dac_nids(codec);
1382
1383 best_cfg = kmalloc(sizeof(*best_cfg), GFP_KERNEL);
1384 if (!best_cfg)
1385 return -ENOMEM;
1386 *best_cfg = *cfg;
1387
1388 for (;;) {
1389 badness = fill_and_eval_dacs(codec, fill_hardwired,
1390 fill_mio_first);
1391 if (badness < 0) {
1392 kfree(best_cfg);
1393 return badness;
1394 }
1395 debug_badness("==> lo_type=%d, wired=%d, mio=%d, badness=0x%x\n",
1396 cfg->line_out_type, fill_hardwired, fill_mio_first,
1397 badness);
1398 debug_show_configs(spec, cfg);
1399 if (badness < best_badness) {
1400 best_badness = badness;
1401 *best_cfg = *cfg;
1402 best_wired = fill_hardwired;
1403 best_mio = fill_mio_first;
1404 }
1405 if (!badness)
1406 break;
1407 fill_mio_first = !fill_mio_first;
1408 if (!fill_mio_first)
1409 continue;
1410 fill_hardwired = !fill_hardwired;
1411 if (!fill_hardwired)
1412 continue;
1413 if (hp_spk_swapped)
1414 break;
1415 hp_spk_swapped = true;
1416 if (cfg->speaker_outs > 0 &&
1417 cfg->line_out_type == AUTO_PIN_HP_OUT) {
1418 cfg->hp_outs = cfg->line_outs;
1419 memcpy(cfg->hp_pins, cfg->line_out_pins,
1420 sizeof(cfg->hp_pins));
1421 cfg->line_outs = cfg->speaker_outs;
1422 memcpy(cfg->line_out_pins, cfg->speaker_pins,
1423 sizeof(cfg->speaker_pins));
1424 cfg->speaker_outs = 0;
1425 memset(cfg->speaker_pins, 0, sizeof(cfg->speaker_pins));
1426 cfg->line_out_type = AUTO_PIN_SPEAKER_OUT;
1427 fill_hardwired = true;
1428 continue;
1429 }
1430 if (cfg->hp_outs > 0 &&
1431 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
1432 cfg->speaker_outs = cfg->line_outs;
1433 memcpy(cfg->speaker_pins, cfg->line_out_pins,
1434 sizeof(cfg->speaker_pins));
1435 cfg->line_outs = cfg->hp_outs;
1436 memcpy(cfg->line_out_pins, cfg->hp_pins,
1437 sizeof(cfg->hp_pins));
1438 cfg->hp_outs = 0;
1439 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
1440 cfg->line_out_type = AUTO_PIN_HP_OUT;
1441 fill_hardwired = true;
1442 continue;
1443 }
1444 break;
1445 }
1446
1447 if (badness) {
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001448 debug_badness("==> restoring best_cfg\n");
Takashi Iwai352f7f92012-12-19 12:52:06 +01001449 *cfg = *best_cfg;
1450 fill_and_eval_dacs(codec, best_wired, best_mio);
1451 }
1452 debug_badness("==> Best config: lo_type=%d, wired=%d, mio=%d\n",
1453 cfg->line_out_type, best_wired, best_mio);
1454 debug_show_configs(spec, cfg);
1455
1456 if (cfg->line_out_pins[0]) {
1457 struct nid_path *path;
Takashi Iwai196c17662013-01-04 15:01:40 +01001458 path = snd_hda_get_path_from_idx(codec, spec->out_paths[0]);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001459 if (path)
1460 spec->vmaster_nid = look_for_out_vol_nid(codec, path);
1461 }
1462
1463 kfree(best_cfg);
1464 return 0;
1465}
1466
1467/* add playback controls from the parsed DAC table */
1468static int create_multi_out_ctls(struct hda_codec *codec,
1469 const struct auto_pin_cfg *cfg)
1470{
1471 struct hda_gen_spec *spec = codec->spec;
1472 int i, err, noutputs;
1473
1474 noutputs = cfg->line_outs;
1475 if (spec->multi_ios > 0 && cfg->line_outs < 3)
1476 noutputs += spec->multi_ios;
1477
1478 for (i = 0; i < noutputs; i++) {
1479 const char *name;
1480 int index;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001481 struct nid_path *path;
1482
Takashi Iwai352f7f92012-12-19 12:52:06 +01001483 if (i >= cfg->line_outs) {
Takashi Iwai352f7f92012-12-19 12:52:06 +01001484 index = 0;
1485 name = channel_name[i];
1486 } else {
Takashi Iwai352f7f92012-12-19 12:52:06 +01001487 name = get_line_out_pfx(spec, i, true, &index);
1488 }
1489
Takashi Iwai196c17662013-01-04 15:01:40 +01001490 path = snd_hda_get_path_from_idx(codec, spec->out_paths[i]);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001491 if (!path)
1492 continue;
1493 if (!name || !strcmp(name, "CLFE")) {
1494 /* Center/LFE */
1495 err = add_vol_ctl(codec, "Center", 0, 1, path);
1496 if (err < 0)
1497 return err;
1498 err = add_vol_ctl(codec, "LFE", 0, 2, path);
1499 if (err < 0)
1500 return err;
1501 err = add_sw_ctl(codec, "Center", 0, 1, path);
1502 if (err < 0)
1503 return err;
1504 err = add_sw_ctl(codec, "LFE", 0, 2, path);
1505 if (err < 0)
1506 return err;
1507 } else {
1508 err = add_stereo_vol(codec, name, index, path);
1509 if (err < 0)
1510 return err;
1511 err = add_stereo_sw(codec, name, index, path);
1512 if (err < 0)
1513 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001514 }
1515 }
1516 return 0;
1517}
1518
Takashi Iwaic2c80382013-01-07 10:33:57 +01001519static int create_extra_out(struct hda_codec *codec, int path_idx,
Takashi Iwai196c17662013-01-04 15:01:40 +01001520 const char *pfx, int cidx)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001521{
Takashi Iwai352f7f92012-12-19 12:52:06 +01001522 struct nid_path *path;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001523 int err;
1524
Takashi Iwai196c17662013-01-04 15:01:40 +01001525 path = snd_hda_get_path_from_idx(codec, path_idx);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001526 if (!path)
1527 return 0;
Takashi Iwaic2c80382013-01-07 10:33:57 +01001528 err = add_stereo_vol(codec, pfx, cidx, path);
1529 if (err < 0)
1530 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001531 err = add_stereo_sw(codec, pfx, cidx, path);
1532 if (err < 0)
1533 return err;
1534 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001535}
1536
Takashi Iwai352f7f92012-12-19 12:52:06 +01001537/* add playback controls for speaker and HP outputs */
1538static int create_extra_outs(struct hda_codec *codec, int num_pins,
Takashi Iwai196c17662013-01-04 15:01:40 +01001539 const int *paths, const char *pfx)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001540{
Takashi Iwaic2c80382013-01-07 10:33:57 +01001541 int i;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001542
1543 for (i = 0; i < num_pins; i++) {
Takashi Iwaic2c80382013-01-07 10:33:57 +01001544 const char *name;
1545 char tmp[44];
1546 int err, idx = 0;
1547
1548 if (num_pins == 2 && i == 1 && !strcmp(pfx, "Speaker"))
1549 name = "Bass Speaker";
1550 else if (num_pins >= 3) {
1551 snprintf(tmp, sizeof(tmp), "%s %s",
Takashi Iwai352f7f92012-12-19 12:52:06 +01001552 pfx, channel_name[i]);
Takashi Iwaic2c80382013-01-07 10:33:57 +01001553 name = tmp;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001554 } else {
Takashi Iwaic2c80382013-01-07 10:33:57 +01001555 name = pfx;
1556 idx = i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001557 }
Takashi Iwaic2c80382013-01-07 10:33:57 +01001558 err = create_extra_out(codec, paths[i], name, idx);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001559 if (err < 0)
1560 return err;
1561 }
1562 return 0;
1563}
Takashi Iwai97ec5582006-03-21 11:29:07 +01001564
Takashi Iwai352f7f92012-12-19 12:52:06 +01001565static int create_hp_out_ctls(struct hda_codec *codec)
1566{
1567 struct hda_gen_spec *spec = codec->spec;
1568 return create_extra_outs(codec, spec->autocfg.hp_outs,
Takashi Iwai196c17662013-01-04 15:01:40 +01001569 spec->hp_paths,
Takashi Iwai352f7f92012-12-19 12:52:06 +01001570 "Headphone");
1571}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001572
Takashi Iwai352f7f92012-12-19 12:52:06 +01001573static int create_speaker_out_ctls(struct hda_codec *codec)
1574{
1575 struct hda_gen_spec *spec = codec->spec;
1576 return create_extra_outs(codec, spec->autocfg.speaker_outs,
Takashi Iwai196c17662013-01-04 15:01:40 +01001577 spec->speaker_paths,
Takashi Iwai352f7f92012-12-19 12:52:06 +01001578 "Speaker");
1579}
1580
1581/*
Takashi Iwai38cf6f12012-12-21 14:09:42 +01001582 * independent HP controls
1583 */
1584
1585static int indep_hp_info(struct snd_kcontrol *kcontrol,
1586 struct snd_ctl_elem_info *uinfo)
1587{
1588 return snd_hda_enum_bool_helper_info(kcontrol, uinfo);
1589}
1590
1591static int indep_hp_get(struct snd_kcontrol *kcontrol,
1592 struct snd_ctl_elem_value *ucontrol)
1593{
1594 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1595 struct hda_gen_spec *spec = codec->spec;
1596 ucontrol->value.enumerated.item[0] = spec->indep_hp_enabled;
1597 return 0;
1598}
1599
1600static int indep_hp_put(struct snd_kcontrol *kcontrol,
1601 struct snd_ctl_elem_value *ucontrol)
1602{
1603 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1604 struct hda_gen_spec *spec = codec->spec;
1605 unsigned int select = ucontrol->value.enumerated.item[0];
1606 int ret = 0;
1607
1608 mutex_lock(&spec->pcm_mutex);
1609 if (spec->active_streams) {
1610 ret = -EBUSY;
1611 goto unlock;
1612 }
1613
1614 if (spec->indep_hp_enabled != select) {
1615 spec->indep_hp_enabled = select;
1616 if (spec->indep_hp_enabled)
1617 spec->multiout.hp_out_nid[0] = 0;
1618 else
1619 spec->multiout.hp_out_nid[0] = spec->alt_dac_nid;
1620 ret = 1;
1621 }
1622 unlock:
1623 mutex_unlock(&spec->pcm_mutex);
1624 return ret;
1625}
1626
1627static const struct snd_kcontrol_new indep_hp_ctl = {
1628 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1629 .name = "Independent HP",
1630 .info = indep_hp_info,
1631 .get = indep_hp_get,
1632 .put = indep_hp_put,
1633};
1634
1635
1636static int create_indep_hp_ctls(struct hda_codec *codec)
1637{
1638 struct hda_gen_spec *spec = codec->spec;
1639
1640 if (!spec->indep_hp)
1641 return 0;
1642 if (!spec->multiout.hp_out_nid[0]) {
1643 spec->indep_hp = 0;
1644 return 0;
1645 }
1646
1647 spec->indep_hp_enabled = false;
1648 spec->alt_dac_nid = spec->multiout.hp_out_nid[0];
1649 if (!snd_hda_gen_add_kctl(spec, NULL, &indep_hp_ctl))
1650 return -ENOMEM;
1651 return 0;
1652}
1653
1654/*
Takashi Iwai352f7f92012-12-19 12:52:06 +01001655 * channel mode enum control
1656 */
1657
1658static int ch_mode_info(struct snd_kcontrol *kcontrol,
1659 struct snd_ctl_elem_info *uinfo)
1660{
1661 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1662 struct hda_gen_spec *spec = codec->spec;
Takashi Iwaia07a9492013-01-07 16:44:06 +01001663 int chs;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001664
1665 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1666 uinfo->count = 1;
1667 uinfo->value.enumerated.items = spec->multi_ios + 1;
1668 if (uinfo->value.enumerated.item > spec->multi_ios)
1669 uinfo->value.enumerated.item = spec->multi_ios;
Takashi Iwaia07a9492013-01-07 16:44:06 +01001670 chs = uinfo->value.enumerated.item * 2 + spec->min_channel_count;
1671 sprintf(uinfo->value.enumerated.name, "%dch", chs);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001672 return 0;
1673}
1674
1675static int ch_mode_get(struct snd_kcontrol *kcontrol,
1676 struct snd_ctl_elem_value *ucontrol)
1677{
1678 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1679 struct hda_gen_spec *spec = codec->spec;
Takashi Iwaia07a9492013-01-07 16:44:06 +01001680 ucontrol->value.enumerated.item[0] =
1681 (spec->ext_channel_count - spec->min_channel_count) / 2;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001682 return 0;
1683}
1684
Takashi Iwai196c17662013-01-04 15:01:40 +01001685static inline struct nid_path *
1686get_multiio_path(struct hda_codec *codec, int idx)
1687{
1688 struct hda_gen_spec *spec = codec->spec;
1689 return snd_hda_get_path_from_idx(codec,
1690 spec->out_paths[spec->autocfg.line_outs + idx]);
1691}
1692
Takashi Iwai352f7f92012-12-19 12:52:06 +01001693static int set_multi_io(struct hda_codec *codec, int idx, bool output)
1694{
1695 struct hda_gen_spec *spec = codec->spec;
1696 hda_nid_t nid = spec->multi_io[idx].pin;
1697 struct nid_path *path;
1698
Takashi Iwai196c17662013-01-04 15:01:40 +01001699 path = get_multiio_path(codec, idx);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001700 if (!path)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001701 return -EINVAL;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001702
1703 if (path->active == output)
1704 return 0;
1705
1706 if (output) {
1707 snd_hda_set_pin_ctl_cache(codec, nid, PIN_OUT);
1708 snd_hda_activate_path(codec, path, true, true);
Takashi Iwaid5a9f1b2012-12-20 15:36:30 +01001709 set_pin_eapd(codec, nid, true);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001710 } else {
Takashi Iwaid5a9f1b2012-12-20 15:36:30 +01001711 set_pin_eapd(codec, nid, false);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001712 snd_hda_activate_path(codec, path, false, true);
1713 snd_hda_set_pin_ctl_cache(codec, nid,
1714 spec->multi_io[idx].ctl_in);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001715 }
Takashi Iwai352f7f92012-12-19 12:52:06 +01001716 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001717}
1718
Takashi Iwai352f7f92012-12-19 12:52:06 +01001719static int ch_mode_put(struct snd_kcontrol *kcontrol,
1720 struct snd_ctl_elem_value *ucontrol)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001721{
Takashi Iwai352f7f92012-12-19 12:52:06 +01001722 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1723 struct hda_gen_spec *spec = codec->spec;
1724 int i, ch;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001725
Takashi Iwai352f7f92012-12-19 12:52:06 +01001726 ch = ucontrol->value.enumerated.item[0];
1727 if (ch < 0 || ch > spec->multi_ios)
1728 return -EINVAL;
Takashi Iwaia07a9492013-01-07 16:44:06 +01001729 if (ch == (spec->ext_channel_count - spec->min_channel_count) / 2)
Takashi Iwai352f7f92012-12-19 12:52:06 +01001730 return 0;
Takashi Iwaia07a9492013-01-07 16:44:06 +01001731 spec->ext_channel_count = ch * 2 + spec->min_channel_count;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001732 for (i = 0; i < spec->multi_ios; i++)
1733 set_multi_io(codec, i, i < ch);
1734 spec->multiout.max_channels = max(spec->ext_channel_count,
1735 spec->const_channel_count);
1736 if (spec->need_dac_fix)
1737 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738 return 1;
1739}
1740
Takashi Iwai352f7f92012-12-19 12:52:06 +01001741static const struct snd_kcontrol_new channel_mode_enum = {
1742 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1743 .name = "Channel Mode",
1744 .info = ch_mode_info,
1745 .get = ch_mode_get,
1746 .put = ch_mode_put,
1747};
Linus Torvalds1da177e2005-04-16 15:20:36 -07001748
Takashi Iwai352f7f92012-12-19 12:52:06 +01001749static int create_multi_channel_mode(struct hda_codec *codec)
1750{
1751 struct hda_gen_spec *spec = codec->spec;
1752
1753 if (spec->multi_ios > 0) {
Takashi Iwai12c93df2012-12-19 14:38:33 +01001754 if (!snd_hda_gen_add_kctl(spec, NULL, &channel_mode_enum))
Takashi Iwai352f7f92012-12-19 12:52:06 +01001755 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001756 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001757 return 0;
1758}
1759
Takashi Iwai352f7f92012-12-19 12:52:06 +01001760/*
Takashi Iwaic30aa7b2013-01-04 16:42:48 +01001761 * aamix loopback enable/disable switch
1762 */
1763
1764#define loopback_mixing_info indep_hp_info
1765
1766static int loopback_mixing_get(struct snd_kcontrol *kcontrol,
1767 struct snd_ctl_elem_value *ucontrol)
1768{
1769 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1770 struct hda_gen_spec *spec = codec->spec;
1771 ucontrol->value.enumerated.item[0] = spec->aamix_mode;
1772 return 0;
1773}
1774
1775static void update_aamix_paths(struct hda_codec *codec, bool do_mix,
1776 int nomix_path_idx, int mix_path_idx)
1777{
1778 struct nid_path *nomix_path, *mix_path;
1779
1780 nomix_path = snd_hda_get_path_from_idx(codec, nomix_path_idx);
1781 mix_path = snd_hda_get_path_from_idx(codec, mix_path_idx);
1782 if (!nomix_path || !mix_path)
1783 return;
1784 if (do_mix) {
1785 snd_hda_activate_path(codec, nomix_path, false, true);
1786 snd_hda_activate_path(codec, mix_path, true, true);
1787 } else {
1788 snd_hda_activate_path(codec, mix_path, false, true);
1789 snd_hda_activate_path(codec, nomix_path, true, true);
1790 }
1791}
1792
1793static int loopback_mixing_put(struct snd_kcontrol *kcontrol,
1794 struct snd_ctl_elem_value *ucontrol)
1795{
1796 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1797 struct hda_gen_spec *spec = codec->spec;
1798 unsigned int val = ucontrol->value.enumerated.item[0];
1799
1800 if (val == spec->aamix_mode)
1801 return 0;
1802 spec->aamix_mode = val;
1803 update_aamix_paths(codec, val, spec->out_paths[0],
1804 spec->aamix_out_paths[0]);
1805 update_aamix_paths(codec, val, spec->hp_paths[0],
1806 spec->aamix_out_paths[1]);
1807 update_aamix_paths(codec, val, spec->speaker_paths[0],
1808 spec->aamix_out_paths[2]);
1809 return 1;
1810}
1811
1812static const struct snd_kcontrol_new loopback_mixing_enum = {
1813 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1814 .name = "Loopback Mixing",
1815 .info = loopback_mixing_info,
1816 .get = loopback_mixing_get,
1817 .put = loopback_mixing_put,
1818};
1819
1820static int create_loopback_mixing_ctl(struct hda_codec *codec)
1821{
1822 struct hda_gen_spec *spec = codec->spec;
1823
1824 if (!spec->mixer_nid)
1825 return 0;
1826 if (!(spec->aamix_out_paths[0] || spec->aamix_out_paths[1] ||
1827 spec->aamix_out_paths[2]))
1828 return 0;
1829 if (!snd_hda_gen_add_kctl(spec, NULL, &loopback_mixing_enum))
1830 return -ENOMEM;
1831 return 0;
1832}
1833
1834/*
Takashi Iwai352f7f92012-12-19 12:52:06 +01001835 * shared headphone/mic handling
1836 */
Takashi Iwaicb53c622007-08-10 17:21:45 +02001837
Takashi Iwai352f7f92012-12-19 12:52:06 +01001838static void call_update_outputs(struct hda_codec *codec);
1839
1840/* for shared I/O, change the pin-control accordingly */
1841static void update_shared_mic_hp(struct hda_codec *codec, bool set_as_mic)
1842{
1843 struct hda_gen_spec *spec = codec->spec;
1844 unsigned int val;
1845 hda_nid_t pin = spec->autocfg.inputs[1].pin;
1846 /* NOTE: this assumes that there are only two inputs, the
1847 * first is the real internal mic and the second is HP/mic jack.
1848 */
1849
1850 val = snd_hda_get_default_vref(codec, pin);
1851
1852 /* This pin does not have vref caps - let's enable vref on pin 0x18
1853 instead, as suggested by Realtek */
1854 if (val == AC_PINCTL_VREF_HIZ && spec->shared_mic_vref_pin) {
1855 const hda_nid_t vref_pin = spec->shared_mic_vref_pin;
1856 unsigned int vref_val = snd_hda_get_default_vref(codec, vref_pin);
1857 if (vref_val != AC_PINCTL_VREF_HIZ)
Takashi Iwai7594aa32012-12-20 15:38:40 +01001858 snd_hda_set_pin_ctl_cache(codec, vref_pin,
1859 PIN_IN | (set_as_mic ? vref_val : 0));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001860 }
Takashi Iwai352f7f92012-12-19 12:52:06 +01001861
1862 val = set_as_mic ? val | PIN_IN : PIN_HP;
Takashi Iwai7594aa32012-12-20 15:38:40 +01001863 snd_hda_set_pin_ctl_cache(codec, pin, val);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001864
1865 spec->automute_speaker = !set_as_mic;
1866 call_update_outputs(codec);
1867}
1868
1869/* create a shared input with the headphone out */
1870static int create_shared_input(struct hda_codec *codec)
1871{
1872 struct hda_gen_spec *spec = codec->spec;
1873 struct auto_pin_cfg *cfg = &spec->autocfg;
1874 unsigned int defcfg;
1875 hda_nid_t nid;
1876
1877 /* only one internal input pin? */
1878 if (cfg->num_inputs != 1)
1879 return 0;
1880 defcfg = snd_hda_codec_get_pincfg(codec, cfg->inputs[0].pin);
1881 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
1882 return 0;
1883
1884 if (cfg->hp_outs == 1 && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
1885 nid = cfg->hp_pins[0]; /* OK, we have a single HP-out */
1886 else if (cfg->line_outs == 1 && cfg->line_out_type == AUTO_PIN_HP_OUT)
1887 nid = cfg->line_out_pins[0]; /* OK, we have a single line-out */
1888 else
1889 return 0; /* both not available */
1890
1891 if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_IN))
1892 return 0; /* no input */
1893
1894 cfg->inputs[1].pin = nid;
1895 cfg->inputs[1].type = AUTO_PIN_MIC;
1896 cfg->num_inputs = 2;
1897 spec->shared_mic_hp = 1;
1898 snd_printdd("hda-codec: Enable shared I/O jack on NID 0x%x\n", nid);
1899 return 0;
1900}
1901
1902
1903/*
1904 * Parse input paths
1905 */
1906
1907#ifdef CONFIG_PM
1908/* add the powersave loopback-list entry */
1909static void add_loopback_list(struct hda_gen_spec *spec, hda_nid_t mix, int idx)
1910{
1911 struct hda_amp_list *list;
1912
1913 if (spec->num_loopbacks >= ARRAY_SIZE(spec->loopback_list) - 1)
1914 return;
1915 list = spec->loopback_list + spec->num_loopbacks;
1916 list->nid = mix;
1917 list->dir = HDA_INPUT;
1918 list->idx = idx;
1919 spec->num_loopbacks++;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001920 spec->loopback.amplist = spec->loopback_list;
1921}
1922#else
Takashi Iwai352f7f92012-12-19 12:52:06 +01001923#define add_loopback_list(spec, mix, idx) /* NOP */
Takashi Iwaicb53c622007-08-10 17:21:45 +02001924#endif
1925
Takashi Iwai352f7f92012-12-19 12:52:06 +01001926/* create input playback/capture controls for the given pin */
Takashi Iwai196c17662013-01-04 15:01:40 +01001927static int new_analog_input(struct hda_codec *codec, int input_idx,
1928 hda_nid_t pin, const char *ctlname, int ctlidx,
Takashi Iwai352f7f92012-12-19 12:52:06 +01001929 hda_nid_t mix_nid)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001930{
Takashi Iwai352f7f92012-12-19 12:52:06 +01001931 struct hda_gen_spec *spec = codec->spec;
1932 struct nid_path *path;
1933 unsigned int val;
1934 int err, idx;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001935
Takashi Iwai352f7f92012-12-19 12:52:06 +01001936 if (!nid_has_volume(codec, mix_nid, HDA_INPUT) &&
1937 !nid_has_mute(codec, mix_nid, HDA_INPUT))
1938 return 0; /* no need for analog loopback */
1939
Takashi Iwai3ca529d2013-01-07 17:25:08 +01001940 path = snd_hda_add_new_path(codec, pin, mix_nid, 0);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001941 if (!path)
1942 return -EINVAL;
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01001943 print_nid_path("loopback", path);
Takashi Iwai196c17662013-01-04 15:01:40 +01001944 spec->loopback_paths[input_idx] = snd_hda_get_path_idx(codec, path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01001945
1946 idx = path->idx[path->depth - 1];
1947 if (nid_has_volume(codec, mix_nid, HDA_INPUT)) {
1948 val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
1949 err = __add_pb_vol_ctrl(spec, HDA_CTL_WIDGET_VOL, ctlname, ctlidx, val);
Takashi Iwaid13bd412008-07-30 15:01:45 +02001950 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001952 path->ctls[NID_PATH_VOL_CTL] = val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001953 }
1954
Takashi Iwai352f7f92012-12-19 12:52:06 +01001955 if (nid_has_mute(codec, mix_nid, HDA_INPUT)) {
1956 val = HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT);
1957 err = __add_pb_sw_ctrl(spec, HDA_CTL_WIDGET_MUTE, ctlname, ctlidx, val);
Takashi Iwaid13bd412008-07-30 15:01:45 +02001958 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001959 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01001960 path->ctls[NID_PATH_MUTE_CTL] = val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001961 }
1962
Takashi Iwai352f7f92012-12-19 12:52:06 +01001963 path->active = true;
1964 add_loopback_list(spec, mix_nid, idx);
1965 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001966}
1967
Takashi Iwai352f7f92012-12-19 12:52:06 +01001968static int is_input_pin(struct hda_codec *codec, hda_nid_t nid)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001969{
Takashi Iwai352f7f92012-12-19 12:52:06 +01001970 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
1971 return (pincap & AC_PINCAP_IN) != 0;
1972}
1973
1974/* Parse the codec tree and retrieve ADCs */
1975static int fill_adc_nids(struct hda_codec *codec)
1976{
1977 struct hda_gen_spec *spec = codec->spec;
1978 hda_nid_t nid;
1979 hda_nid_t *adc_nids = spec->adc_nids;
1980 int max_nums = ARRAY_SIZE(spec->adc_nids);
1981 int i, nums = 0;
1982
1983 nid = codec->start_nid;
1984 for (i = 0; i < codec->num_nodes; i++, nid++) {
1985 unsigned int caps = get_wcaps(codec, nid);
1986 int type = get_wcaps_type(caps);
1987
1988 if (type != AC_WID_AUD_IN || (caps & AC_WCAP_DIGITAL))
1989 continue;
1990 adc_nids[nums] = nid;
1991 if (++nums >= max_nums)
1992 break;
1993 }
1994 spec->num_adc_nids = nums;
1995 return nums;
1996}
1997
1998/* filter out invalid adc_nids that don't give all active input pins;
1999 * if needed, check whether dynamic ADC-switching is available
2000 */
2001static int check_dyn_adc_switch(struct hda_codec *codec)
2002{
2003 struct hda_gen_spec *spec = codec->spec;
2004 struct hda_input_mux *imux = &spec->input_mux;
Takashi Iwai3a65bcd2013-01-09 09:06:18 +01002005 unsigned int ok_bits;
Takashi Iwai352f7f92012-12-19 12:52:06 +01002006 int i, n, nums;
Takashi Iwai352f7f92012-12-19 12:52:06 +01002007
2008 again:
2009 nums = 0;
Takashi Iwai3a65bcd2013-01-09 09:06:18 +01002010 ok_bits = 0;
Takashi Iwai352f7f92012-12-19 12:52:06 +01002011 for (n = 0; n < spec->num_adc_nids; n++) {
Takashi Iwai352f7f92012-12-19 12:52:06 +01002012 for (i = 0; i < imux->num_items; i++) {
Takashi Iwai3a65bcd2013-01-09 09:06:18 +01002013 if (!spec->input_paths[i][n])
Takashi Iwai352f7f92012-12-19 12:52:06 +01002014 break;
2015 }
Takashi Iwai3a65bcd2013-01-09 09:06:18 +01002016 if (i >= imux->num_items) {
2017 ok_bits |= (1 << n);
2018 nums++;
2019 }
Takashi Iwai352f7f92012-12-19 12:52:06 +01002020 }
2021
Takashi Iwai3a65bcd2013-01-09 09:06:18 +01002022 if (!ok_bits) {
Takashi Iwai352f7f92012-12-19 12:52:06 +01002023 if (spec->shared_mic_hp) {
2024 spec->shared_mic_hp = 0;
2025 imux->num_items = 1;
2026 goto again;
2027 }
2028
2029 /* check whether ADC-switch is possible */
2030 for (i = 0; i < imux->num_items; i++) {
Takashi Iwai352f7f92012-12-19 12:52:06 +01002031 for (n = 0; n < spec->num_adc_nids; n++) {
Takashi Iwai3a65bcd2013-01-09 09:06:18 +01002032 if (spec->input_paths[i][n]) {
Takashi Iwai352f7f92012-12-19 12:52:06 +01002033 spec->dyn_adc_idx[i] = n;
2034 break;
2035 }
2036 }
2037 }
2038
2039 snd_printdd("hda-codec: enabling ADC switching\n");
2040 spec->dyn_adc_switch = 1;
2041 } else if (nums != spec->num_adc_nids) {
Takashi Iwai3a65bcd2013-01-09 09:06:18 +01002042 /* shrink the invalid adcs and input paths */
2043 nums = 0;
2044 for (n = 0; n < spec->num_adc_nids; n++) {
2045 if (!(ok_bits & (1 << n)))
2046 continue;
2047 if (n != nums) {
2048 spec->adc_nids[nums] = spec->adc_nids[n];
2049 for (i = 0; i < imux->num_items; i++)
2050 spec->input_paths[i][nums] =
2051 spec->input_paths[i][n];
2052 }
2053 nums++;
2054 }
Takashi Iwai352f7f92012-12-19 12:52:06 +01002055 spec->num_adc_nids = nums;
2056 }
2057
2058 if (imux->num_items == 1 || spec->shared_mic_hp) {
2059 snd_printdd("hda-codec: reducing to a single ADC\n");
2060 spec->num_adc_nids = 1; /* reduce to a single ADC */
2061 }
2062
2063 /* single index for individual volumes ctls */
2064 if (!spec->dyn_adc_switch && spec->multi_cap_vol)
2065 spec->num_adc_nids = 1;
2066
Linus Torvalds1da177e2005-04-16 15:20:36 -07002067 return 0;
2068}
2069
Takashi Iwaif3fc0b02013-01-09 09:14:23 +01002070/* parse capture source paths from the given pin and create imux items */
2071static int parse_capture_source(struct hda_codec *codec, hda_nid_t pin,
2072 int num_adcs, const char *label, int anchor)
2073{
2074 struct hda_gen_spec *spec = codec->spec;
2075 struct hda_input_mux *imux = &spec->input_mux;
2076 int imux_idx = imux->num_items;
2077 bool imux_added = false;
2078 int c;
2079
2080 for (c = 0; c < num_adcs; c++) {
2081 struct nid_path *path;
2082 hda_nid_t adc = spec->adc_nids[c];
2083
2084 if (!is_reachable_path(codec, pin, adc))
2085 continue;
2086 path = snd_hda_add_new_path(codec, pin, adc, anchor);
2087 if (!path)
2088 continue;
2089 print_nid_path("input", path);
2090 spec->input_paths[imux_idx][c] =
2091 snd_hda_get_path_idx(codec, path);
2092
2093 if (!imux_added) {
2094 spec->imux_pins[imux->num_items] = pin;
2095 snd_hda_add_imux_item(imux, label,
2096 imux->num_items, NULL);
2097 imux_added = true;
2098 }
2099 }
2100
2101 return 0;
2102}
2103
Linus Torvalds1da177e2005-04-16 15:20:36 -07002104/*
Takashi Iwai352f7f92012-12-19 12:52:06 +01002105 * create playback/capture controls for input pins
Linus Torvalds1da177e2005-04-16 15:20:36 -07002106 */
Takashi Iwai352f7f92012-12-19 12:52:06 +01002107static int create_input_ctls(struct hda_codec *codec)
Takashi Iwaia7da6ce2006-09-06 14:03:14 +02002108{
Takashi Iwai352f7f92012-12-19 12:52:06 +01002109 struct hda_gen_spec *spec = codec->spec;
2110 const struct auto_pin_cfg *cfg = &spec->autocfg;
2111 hda_nid_t mixer = spec->mixer_nid;
Takashi Iwai352f7f92012-12-19 12:52:06 +01002112 int num_adcs;
Takashi Iwaif3fc0b02013-01-09 09:14:23 +01002113 int i, err, type_idx = 0;
Takashi Iwai352f7f92012-12-19 12:52:06 +01002114 const char *prev_label = NULL;
Takashi Iwaia7da6ce2006-09-06 14:03:14 +02002115
Takashi Iwai352f7f92012-12-19 12:52:06 +01002116 num_adcs = fill_adc_nids(codec);
2117 if (num_adcs < 0)
2118 return 0;
Takashi Iwaia7da6ce2006-09-06 14:03:14 +02002119
Takashi Iwai352f7f92012-12-19 12:52:06 +01002120 for (i = 0; i < cfg->num_inputs; i++) {
2121 hda_nid_t pin;
2122 const char *label;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002123
Takashi Iwai352f7f92012-12-19 12:52:06 +01002124 pin = cfg->inputs[i].pin;
2125 if (!is_input_pin(codec, pin))
2126 continue;
2127
2128 label = hda_get_autocfg_input_label(codec, cfg, i);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002129 if (prev_label && !strcmp(label, prev_label))
2130 type_idx++;
Takashi Iwaia7da6ce2006-09-06 14:03:14 +02002131 else
Takashi Iwai352f7f92012-12-19 12:52:06 +01002132 type_idx = 0;
2133 prev_label = label;
2134
2135 if (mixer) {
2136 if (is_reachable_path(codec, pin, mixer)) {
Takashi Iwai196c17662013-01-04 15:01:40 +01002137 err = new_analog_input(codec, i, pin,
Takashi Iwai352f7f92012-12-19 12:52:06 +01002138 label, type_idx, mixer);
2139 if (err < 0)
2140 return err;
2141 }
2142 }
2143
Takashi Iwaif3fc0b02013-01-09 09:14:23 +01002144 err = parse_capture_source(codec, pin, num_adcs, label, -mixer);
2145 if (err < 0)
2146 return err;
2147 }
Takashi Iwai352f7f92012-12-19 12:52:06 +01002148
Takashi Iwaif3fc0b02013-01-09 09:14:23 +01002149 if (mixer && spec->add_stereo_mix_input) {
2150 err = parse_capture_source(codec, mixer, num_adcs,
2151 "Stereo Mix", 0);
2152 if (err < 0)
2153 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01002154 }
2155
2156 return 0;
2157}
2158
2159
2160/*
2161 * input source mux
2162 */
2163
Takashi Iwaic697b712013-01-07 17:09:26 +01002164/* get the input path specified by the given adc and imux indices */
2165static struct nid_path *get_input_path(struct hda_codec *codec, int adc_idx, int imux_idx)
Takashi Iwai352f7f92012-12-19 12:52:06 +01002166{
2167 struct hda_gen_spec *spec = codec->spec;
2168 if (spec->dyn_adc_switch)
2169 adc_idx = spec->dyn_adc_idx[imux_idx];
Takashi Iwaic697b712013-01-07 17:09:26 +01002170 return snd_hda_get_path_from_idx(codec, spec->input_paths[imux_idx][adc_idx]);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002171}
2172
2173static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
2174 unsigned int idx);
2175
2176static int mux_enum_info(struct snd_kcontrol *kcontrol,
2177 struct snd_ctl_elem_info *uinfo)
2178{
2179 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2180 struct hda_gen_spec *spec = codec->spec;
2181 return snd_hda_input_mux_info(&spec->input_mux, uinfo);
2182}
2183
2184static int mux_enum_get(struct snd_kcontrol *kcontrol,
2185 struct snd_ctl_elem_value *ucontrol)
2186{
2187 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2188 struct hda_gen_spec *spec = codec->spec;
2189 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2190
2191 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
2192 return 0;
2193}
2194
2195static int mux_enum_put(struct snd_kcontrol *kcontrol,
2196 struct snd_ctl_elem_value *ucontrol)
2197{
2198 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2199 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2200 return mux_select(codec, adc_idx,
2201 ucontrol->value.enumerated.item[0]);
2202}
2203
Takashi Iwai352f7f92012-12-19 12:52:06 +01002204static const struct snd_kcontrol_new cap_src_temp = {
2205 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2206 .name = "Input Source",
2207 .info = mux_enum_info,
2208 .get = mux_enum_get,
2209 .put = mux_enum_put,
2210};
2211
Takashi Iwai47d46ab2012-12-20 11:48:54 +01002212/*
2213 * capture volume and capture switch ctls
2214 */
2215
Takashi Iwai352f7f92012-12-19 12:52:06 +01002216typedef int (*put_call_t)(struct snd_kcontrol *kcontrol,
2217 struct snd_ctl_elem_value *ucontrol);
2218
Takashi Iwai47d46ab2012-12-20 11:48:54 +01002219/* call the given amp update function for all amps in the imux list at once */
Takashi Iwai352f7f92012-12-19 12:52:06 +01002220static int cap_put_caller(struct snd_kcontrol *kcontrol,
2221 struct snd_ctl_elem_value *ucontrol,
2222 put_call_t func, int type)
2223{
2224 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2225 struct hda_gen_spec *spec = codec->spec;
2226 const struct hda_input_mux *imux;
2227 struct nid_path *path;
2228 int i, adc_idx, err = 0;
2229
2230 imux = &spec->input_mux;
2231 adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2232 mutex_lock(&codec->control_mutex);
Takashi Iwai47d46ab2012-12-20 11:48:54 +01002233 /* we use the cache-only update at first since multiple input paths
2234 * may shared the same amp; by updating only caches, the redundant
2235 * writes to hardware can be reduced.
2236 */
Takashi Iwai352f7f92012-12-19 12:52:06 +01002237 codec->cached_write = 1;
2238 for (i = 0; i < imux->num_items; i++) {
Takashi Iwaic697b712013-01-07 17:09:26 +01002239 path = get_input_path(codec, adc_idx, i);
2240 if (!path || !path->ctls[type])
Takashi Iwai352f7f92012-12-19 12:52:06 +01002241 continue;
2242 kcontrol->private_value = path->ctls[type];
2243 err = func(kcontrol, ucontrol);
2244 if (err < 0)
2245 goto error;
2246 }
2247 error:
2248 codec->cached_write = 0;
2249 mutex_unlock(&codec->control_mutex);
Takashi Iwai47d46ab2012-12-20 11:48:54 +01002250 snd_hda_codec_flush_amp_cache(codec); /* flush the updates */
Takashi Iwai352f7f92012-12-19 12:52:06 +01002251 if (err >= 0 && spec->cap_sync_hook)
2252 spec->cap_sync_hook(codec);
2253 return err;
2254}
2255
2256/* capture volume ctl callbacks */
2257#define cap_vol_info snd_hda_mixer_amp_volume_info
2258#define cap_vol_get snd_hda_mixer_amp_volume_get
2259#define cap_vol_tlv snd_hda_mixer_amp_tlv
2260
2261static int cap_vol_put(struct snd_kcontrol *kcontrol,
2262 struct snd_ctl_elem_value *ucontrol)
2263{
2264 return cap_put_caller(kcontrol, ucontrol,
2265 snd_hda_mixer_amp_volume_put,
2266 NID_PATH_VOL_CTL);
2267}
2268
2269static const struct snd_kcontrol_new cap_vol_temp = {
2270 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2271 .name = "Capture Volume",
2272 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
2273 SNDRV_CTL_ELEM_ACCESS_TLV_READ |
2274 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK),
2275 .info = cap_vol_info,
2276 .get = cap_vol_get,
2277 .put = cap_vol_put,
2278 .tlv = { .c = cap_vol_tlv },
2279};
2280
2281/* capture switch ctl callbacks */
2282#define cap_sw_info snd_ctl_boolean_stereo_info
2283#define cap_sw_get snd_hda_mixer_amp_switch_get
2284
2285static int cap_sw_put(struct snd_kcontrol *kcontrol,
2286 struct snd_ctl_elem_value *ucontrol)
2287{
2288 return cap_put_caller(kcontrol, ucontrol,
2289 snd_hda_mixer_amp_switch_put,
2290 NID_PATH_MUTE_CTL);
2291}
2292
2293static const struct snd_kcontrol_new cap_sw_temp = {
2294 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2295 .name = "Capture Switch",
2296 .info = cap_sw_info,
2297 .get = cap_sw_get,
2298 .put = cap_sw_put,
2299};
2300
2301static int parse_capvol_in_path(struct hda_codec *codec, struct nid_path *path)
2302{
2303 hda_nid_t nid;
2304 int i, depth;
2305
2306 path->ctls[NID_PATH_VOL_CTL] = path->ctls[NID_PATH_MUTE_CTL] = 0;
2307 for (depth = 0; depth < 3; depth++) {
2308 if (depth >= path->depth)
2309 return -EINVAL;
2310 i = path->depth - depth - 1;
2311 nid = path->path[i];
2312 if (!path->ctls[NID_PATH_VOL_CTL]) {
2313 if (nid_has_volume(codec, nid, HDA_OUTPUT))
2314 path->ctls[NID_PATH_VOL_CTL] =
2315 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
2316 else if (nid_has_volume(codec, nid, HDA_INPUT)) {
2317 int idx = path->idx[i];
2318 if (!depth && codec->single_adc_amp)
2319 idx = 0;
2320 path->ctls[NID_PATH_VOL_CTL] =
2321 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
2322 }
2323 }
2324 if (!path->ctls[NID_PATH_MUTE_CTL]) {
2325 if (nid_has_mute(codec, nid, HDA_OUTPUT))
2326 path->ctls[NID_PATH_MUTE_CTL] =
2327 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
2328 else if (nid_has_mute(codec, nid, HDA_INPUT)) {
2329 int idx = path->idx[i];
2330 if (!depth && codec->single_adc_amp)
2331 idx = 0;
2332 path->ctls[NID_PATH_MUTE_CTL] =
2333 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_INPUT);
2334 }
2335 }
Takashi Iwai97ec5582006-03-21 11:29:07 +01002336 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002337 return 0;
2338}
2339
Takashi Iwai352f7f92012-12-19 12:52:06 +01002340static bool is_inv_dmic_pin(struct hda_codec *codec, hda_nid_t nid)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002341{
Takashi Iwai352f7f92012-12-19 12:52:06 +01002342 struct hda_gen_spec *spec = codec->spec;
2343 struct auto_pin_cfg *cfg = &spec->autocfg;
2344 unsigned int val;
2345 int i;
2346
2347 if (!spec->inv_dmic_split)
2348 return false;
2349 for (i = 0; i < cfg->num_inputs; i++) {
2350 if (cfg->inputs[i].pin != nid)
2351 continue;
2352 if (cfg->inputs[i].type != AUTO_PIN_MIC)
2353 return false;
2354 val = snd_hda_codec_get_pincfg(codec, nid);
2355 return snd_hda_get_input_pin_attr(val) == INPUT_PIN_ATTR_INT;
2356 }
2357 return false;
2358}
2359
2360static int add_single_cap_ctl(struct hda_codec *codec, const char *label,
2361 int idx, bool is_switch, unsigned int ctl,
2362 bool inv_dmic)
2363{
2364 struct hda_gen_spec *spec = codec->spec;
2365 char tmpname[44];
2366 int type = is_switch ? HDA_CTL_WIDGET_MUTE : HDA_CTL_WIDGET_VOL;
2367 const char *sfx = is_switch ? "Switch" : "Volume";
2368 unsigned int chs = inv_dmic ? 1 : 3;
2369 int err;
2370
2371 if (!ctl)
2372 return 0;
2373
2374 if (label)
2375 snprintf(tmpname, sizeof(tmpname),
2376 "%s Capture %s", label, sfx);
2377 else
2378 snprintf(tmpname, sizeof(tmpname),
2379 "Capture %s", sfx);
2380 err = add_control(spec, type, tmpname, idx,
2381 amp_val_replace_channels(ctl, chs));
2382 if (err < 0 || !inv_dmic)
2383 return err;
2384
2385 /* Make independent right kcontrol */
2386 if (label)
2387 snprintf(tmpname, sizeof(tmpname),
2388 "Inverted %s Capture %s", label, sfx);
2389 else
2390 snprintf(tmpname, sizeof(tmpname),
2391 "Inverted Capture %s", sfx);
2392 return add_control(spec, type, tmpname, idx,
2393 amp_val_replace_channels(ctl, 2));
2394}
2395
2396/* create single (and simple) capture volume and switch controls */
2397static int create_single_cap_vol_ctl(struct hda_codec *codec, int idx,
2398 unsigned int vol_ctl, unsigned int sw_ctl,
2399 bool inv_dmic)
2400{
2401 int err;
2402 err = add_single_cap_ctl(codec, NULL, idx, false, vol_ctl, inv_dmic);
2403 if (err < 0)
2404 return err;
2405 err = add_single_cap_ctl(codec, NULL, idx, true, sw_ctl, inv_dmic);
2406 if (err < 0)
2407 return err;
2408 return 0;
2409}
2410
2411/* create bound capture volume and switch controls */
2412static int create_bind_cap_vol_ctl(struct hda_codec *codec, int idx,
2413 unsigned int vol_ctl, unsigned int sw_ctl)
2414{
2415 struct hda_gen_spec *spec = codec->spec;
2416 struct snd_kcontrol_new *knew;
2417
2418 if (vol_ctl) {
Takashi Iwai12c93df2012-12-19 14:38:33 +01002419 knew = snd_hda_gen_add_kctl(spec, NULL, &cap_vol_temp);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002420 if (!knew)
2421 return -ENOMEM;
2422 knew->index = idx;
2423 knew->private_value = vol_ctl;
2424 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2425 }
2426 if (sw_ctl) {
Takashi Iwai12c93df2012-12-19 14:38:33 +01002427 knew = snd_hda_gen_add_kctl(spec, NULL, &cap_sw_temp);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002428 if (!knew)
2429 return -ENOMEM;
2430 knew->index = idx;
2431 knew->private_value = sw_ctl;
2432 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2433 }
2434 return 0;
2435}
2436
2437/* return the vol ctl when used first in the imux list */
2438static unsigned int get_first_cap_ctl(struct hda_codec *codec, int idx, int type)
2439{
Takashi Iwai352f7f92012-12-19 12:52:06 +01002440 struct nid_path *path;
2441 unsigned int ctl;
2442 int i;
2443
Takashi Iwaic697b712013-01-07 17:09:26 +01002444 path = get_input_path(codec, 0, idx);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002445 if (!path)
2446 return 0;
2447 ctl = path->ctls[type];
2448 if (!ctl)
2449 return 0;
2450 for (i = 0; i < idx - 1; i++) {
Takashi Iwaic697b712013-01-07 17:09:26 +01002451 path = get_input_path(codec, 0, i);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002452 if (path && path->ctls[type] == ctl)
2453 return 0;
2454 }
2455 return ctl;
2456}
2457
2458/* create individual capture volume and switch controls per input */
2459static int create_multi_cap_vol_ctl(struct hda_codec *codec)
2460{
2461 struct hda_gen_spec *spec = codec->spec;
2462 struct hda_input_mux *imux = &spec->input_mux;
2463 int i, err, type, type_idx = 0;
2464 const char *prev_label = NULL;
2465
2466 for (i = 0; i < imux->num_items; i++) {
2467 const char *label;
2468 bool inv_dmic;
2469 label = hda_get_autocfg_input_label(codec, &spec->autocfg, i);
2470 if (prev_label && !strcmp(label, prev_label))
2471 type_idx++;
2472 else
2473 type_idx = 0;
2474 prev_label = label;
2475 inv_dmic = is_inv_dmic_pin(codec, spec->imux_pins[i]);
2476
2477 for (type = 0; type < 2; type++) {
2478 err = add_single_cap_ctl(codec, label, type_idx, type,
2479 get_first_cap_ctl(codec, i, type),
2480 inv_dmic);
2481 if (err < 0)
2482 return err;
2483 }
2484 }
2485 return 0;
2486}
2487
2488static int create_capture_mixers(struct hda_codec *codec)
2489{
2490 struct hda_gen_spec *spec = codec->spec;
2491 struct hda_input_mux *imux = &spec->input_mux;
2492 int i, n, nums, err;
2493
2494 if (spec->dyn_adc_switch)
2495 nums = 1;
2496 else
2497 nums = spec->num_adc_nids;
2498
2499 if (!spec->auto_mic && imux->num_items > 1) {
2500 struct snd_kcontrol_new *knew;
Takashi Iwai624d9142012-12-19 17:41:52 +01002501 const char *name;
2502 name = nums > 1 ? "Input Source" : "Capture Source";
2503 knew = snd_hda_gen_add_kctl(spec, name, &cap_src_temp);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002504 if (!knew)
2505 return -ENOMEM;
2506 knew->count = nums;
2507 }
2508
2509 for (n = 0; n < nums; n++) {
2510 bool multi = false;
2511 bool inv_dmic = false;
2512 int vol, sw;
2513
2514 vol = sw = 0;
2515 for (i = 0; i < imux->num_items; i++) {
2516 struct nid_path *path;
Takashi Iwaic697b712013-01-07 17:09:26 +01002517 path = get_input_path(codec, n, i);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002518 if (!path)
2519 continue;
2520 parse_capvol_in_path(codec, path);
2521 if (!vol)
2522 vol = path->ctls[NID_PATH_VOL_CTL];
2523 else if (vol != path->ctls[NID_PATH_VOL_CTL])
2524 multi = true;
2525 if (!sw)
2526 sw = path->ctls[NID_PATH_MUTE_CTL];
2527 else if (sw != path->ctls[NID_PATH_MUTE_CTL])
2528 multi = true;
2529 if (is_inv_dmic_pin(codec, spec->imux_pins[i]))
2530 inv_dmic = true;
2531 }
2532
2533 if (!multi)
2534 err = create_single_cap_vol_ctl(codec, n, vol, sw,
2535 inv_dmic);
2536 else if (!spec->multi_cap_vol)
2537 err = create_bind_cap_vol_ctl(codec, n, vol, sw);
2538 else
2539 err = create_multi_cap_vol_ctl(codec);
2540 if (err < 0)
2541 return err;
2542 }
2543
2544 return 0;
2545}
2546
2547/*
2548 * add mic boosts if needed
2549 */
2550static int parse_mic_boost(struct hda_codec *codec)
2551{
2552 struct hda_gen_spec *spec = codec->spec;
2553 struct auto_pin_cfg *cfg = &spec->autocfg;
Takashi Iwai071c73a2006-08-23 18:34:06 +02002554 int i, err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01002555 int type_idx = 0;
2556 hda_nid_t nid;
2557 const char *prev_label = NULL;
2558
2559 for (i = 0; i < cfg->num_inputs; i++) {
2560 if (cfg->inputs[i].type > AUTO_PIN_MIC)
2561 break;
2562 nid = cfg->inputs[i].pin;
2563 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) {
2564 const char *label;
Takashi Iwai5abd4882013-01-07 09:43:18 +01002565 char boost_label[44];
Takashi Iwai352f7f92012-12-19 12:52:06 +01002566 struct nid_path *path;
2567 unsigned int val;
2568
2569 label = hda_get_autocfg_input_label(codec, cfg, i);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002570 if (prev_label && !strcmp(label, prev_label))
2571 type_idx++;
2572 else
2573 type_idx = 0;
2574 prev_label = label;
2575
2576 snprintf(boost_label, sizeof(boost_label),
2577 "%s Boost Volume", label);
2578 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT);
2579 err = add_control(spec, HDA_CTL_WIDGET_VOL,
2580 boost_label, type_idx, val);
2581 if (err < 0)
2582 return err;
2583
2584 path = snd_hda_get_nid_path(codec, nid, 0);
2585 if (path)
2586 path->ctls[NID_PATH_BOOST_CTL] = val;
2587 }
2588 }
2589 return 0;
2590}
2591
2592/*
2593 * parse digital I/Os and set up NIDs in BIOS auto-parse mode
2594 */
2595static void parse_digital(struct hda_codec *codec)
2596{
2597 struct hda_gen_spec *spec = codec->spec;
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01002598 struct nid_path *path;
Takashi Iwai352f7f92012-12-19 12:52:06 +01002599 int i, nums;
2600 hda_nid_t dig_nid;
2601
2602 /* support multiple SPDIFs; the secondary is set up as a slave */
2603 nums = 0;
2604 for (i = 0; i < spec->autocfg.dig_outs; i++) {
2605 hda_nid_t pin = spec->autocfg.dig_out_pins[i];
2606 dig_nid = look_for_dac(codec, pin, true);
2607 if (!dig_nid)
2608 continue;
Takashi Iwai3ca529d2013-01-07 17:25:08 +01002609 path = snd_hda_add_new_path(codec, dig_nid, pin, 0);
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01002610 if (!path)
Takashi Iwai352f7f92012-12-19 12:52:06 +01002611 continue;
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01002612 print_nid_path("digout", path);
Takashi Iwaie1284af2013-01-03 16:33:02 +01002613 path->active = true;
Takashi Iwai196c17662013-01-04 15:01:40 +01002614 spec->digout_paths[i] = snd_hda_get_path_idx(codec, path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002615 if (!nums) {
2616 spec->multiout.dig_out_nid = dig_nid;
2617 spec->dig_out_type = spec->autocfg.dig_out_type[0];
2618 } else {
2619 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
2620 if (nums >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
2621 break;
2622 spec->slave_dig_outs[nums - 1] = dig_nid;
2623 }
2624 nums++;
2625 }
2626
2627 if (spec->autocfg.dig_in_pin) {
2628 dig_nid = codec->start_nid;
2629 for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
Takashi Iwai352f7f92012-12-19 12:52:06 +01002630 unsigned int wcaps = get_wcaps(codec, dig_nid);
2631 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
2632 continue;
2633 if (!(wcaps & AC_WCAP_DIGITAL))
2634 continue;
2635 path = snd_hda_add_new_path(codec,
2636 spec->autocfg.dig_in_pin,
Takashi Iwai3ca529d2013-01-07 17:25:08 +01002637 dig_nid, 0);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002638 if (path) {
Takashi Iwai0c8c0f52012-12-20 17:54:22 +01002639 print_nid_path("digin", path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002640 path->active = true;
2641 spec->dig_in_nid = dig_nid;
Takashi Iwai2430d7b2013-01-04 15:09:42 +01002642 spec->digin_path = snd_hda_get_path_idx(codec, path);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002643 break;
2644 }
2645 }
2646 }
2647}
2648
2649
2650/*
2651 * input MUX handling
2652 */
2653
2654static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur);
2655
2656/* select the given imux item; either unmute exclusively or select the route */
2657static int mux_select(struct hda_codec *codec, unsigned int adc_idx,
2658 unsigned int idx)
2659{
2660 struct hda_gen_spec *spec = codec->spec;
2661 const struct hda_input_mux *imux;
2662 struct nid_path *path;
2663
2664 imux = &spec->input_mux;
2665 if (!imux->num_items)
2666 return 0;
2667
2668 if (idx >= imux->num_items)
2669 idx = imux->num_items - 1;
2670 if (spec->cur_mux[adc_idx] == idx)
2671 return 0;
2672
Takashi Iwaic697b712013-01-07 17:09:26 +01002673 path = get_input_path(codec, adc_idx, spec->cur_mux[adc_idx]);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002674 if (!path)
2675 return 0;
2676 if (path->active)
2677 snd_hda_activate_path(codec, path, false, false);
2678
2679 spec->cur_mux[adc_idx] = idx;
2680
2681 if (spec->shared_mic_hp)
2682 update_shared_mic_hp(codec, spec->cur_mux[adc_idx]);
2683
2684 if (spec->dyn_adc_switch)
2685 dyn_adc_pcm_resetup(codec, idx);
2686
Takashi Iwaic697b712013-01-07 17:09:26 +01002687 path = get_input_path(codec, adc_idx, idx);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002688 if (!path)
2689 return 0;
2690 if (path->active)
2691 return 0;
2692 snd_hda_activate_path(codec, path, true, false);
2693 if (spec->cap_sync_hook)
2694 spec->cap_sync_hook(codec);
2695 return 1;
2696}
2697
2698
2699/*
2700 * Jack detections for HP auto-mute and mic-switch
2701 */
2702
2703/* check each pin in the given array; returns true if any of them is plugged */
2704static bool detect_jacks(struct hda_codec *codec, int num_pins, hda_nid_t *pins)
2705{
2706 int i, present = 0;
2707
2708 for (i = 0; i < num_pins; i++) {
2709 hda_nid_t nid = pins[i];
2710 if (!nid)
2711 break;
2712 present |= snd_hda_jack_detect(codec, nid);
2713 }
2714 return present;
2715}
2716
2717/* standard HP/line-out auto-mute helper */
2718static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins,
2719 bool mute, bool hp_out)
2720{
2721 struct hda_gen_spec *spec = codec->spec;
2722 unsigned int pin_bits = mute ? 0 : (hp_out ? PIN_HP : PIN_OUT);
2723 int i;
2724
2725 for (i = 0; i < num_pins; i++) {
2726 hda_nid_t nid = pins[i];
2727 unsigned int val;
2728 if (!nid)
2729 break;
2730 /* don't reset VREF value in case it's controlling
2731 * the amp (see alc861_fixup_asus_amp_vref_0f())
2732 */
2733 if (spec->keep_vref_in_automute) {
2734 val = snd_hda_codec_read(codec, nid, 0,
2735 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
2736 val &= ~PIN_HP;
2737 } else
2738 val = 0;
2739 val |= pin_bits;
Takashi Iwai7594aa32012-12-20 15:38:40 +01002740 snd_hda_set_pin_ctl_cache(codec, nid, val);
Takashi Iwaid5a9f1b2012-12-20 15:36:30 +01002741 set_pin_eapd(codec, nid, !mute);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002742 }
2743}
2744
2745/* Toggle outputs muting */
Takashi Iwai5d550e12012-12-19 15:16:44 +01002746void snd_hda_gen_update_outputs(struct hda_codec *codec)
Takashi Iwai352f7f92012-12-19 12:52:06 +01002747{
2748 struct hda_gen_spec *spec = codec->spec;
2749 int on;
2750
2751 /* Control HP pins/amps depending on master_mute state;
2752 * in general, HP pins/amps control should be enabled in all cases,
2753 * but currently set only for master_mute, just to be safe
2754 */
2755 if (!spec->shared_mic_hp) /* don't change HP-pin when shared with mic */
2756 do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
2757 spec->autocfg.hp_pins, spec->master_mute, true);
2758
2759 if (!spec->automute_speaker)
2760 on = 0;
2761 else
2762 on = spec->hp_jack_present | spec->line_jack_present;
2763 on |= spec->master_mute;
2764 do_automute(codec, ARRAY_SIZE(spec->autocfg.speaker_pins),
2765 spec->autocfg.speaker_pins, on, false);
2766
2767 /* toggle line-out mutes if needed, too */
2768 /* if LO is a copy of either HP or Speaker, don't need to handle it */
2769 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0] ||
2770 spec->autocfg.line_out_pins[0] == spec->autocfg.speaker_pins[0])
2771 return;
2772 if (!spec->automute_lo)
2773 on = 0;
2774 else
2775 on = spec->hp_jack_present;
2776 on |= spec->master_mute;
2777 do_automute(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
2778 spec->autocfg.line_out_pins, on, false);
2779}
Takashi Iwai5d550e12012-12-19 15:16:44 +01002780EXPORT_SYMBOL_HDA(snd_hda_gen_update_outputs);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002781
2782static void call_update_outputs(struct hda_codec *codec)
2783{
2784 struct hda_gen_spec *spec = codec->spec;
2785 if (spec->automute_hook)
2786 spec->automute_hook(codec);
2787 else
Takashi Iwai5d550e12012-12-19 15:16:44 +01002788 snd_hda_gen_update_outputs(codec);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002789}
2790
2791/* standard HP-automute helper */
Takashi Iwai5d550e12012-12-19 15:16:44 +01002792void snd_hda_gen_hp_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)
Takashi Iwai352f7f92012-12-19 12:52:06 +01002793{
2794 struct hda_gen_spec *spec = codec->spec;
2795
2796 spec->hp_jack_present =
2797 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
2798 spec->autocfg.hp_pins);
2799 if (!spec->detect_hp || (!spec->automute_speaker && !spec->automute_lo))
2800 return;
2801 call_update_outputs(codec);
2802}
Takashi Iwai5d550e12012-12-19 15:16:44 +01002803EXPORT_SYMBOL_HDA(snd_hda_gen_hp_automute);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002804
2805/* standard line-out-automute helper */
Takashi Iwai5d550e12012-12-19 15:16:44 +01002806void snd_hda_gen_line_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)
Takashi Iwai352f7f92012-12-19 12:52:06 +01002807{
2808 struct hda_gen_spec *spec = codec->spec;
2809
2810 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
2811 return;
2812 /* check LO jack only when it's different from HP */
2813 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0])
2814 return;
2815
2816 spec->line_jack_present =
2817 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
2818 spec->autocfg.line_out_pins);
2819 if (!spec->automute_speaker || !spec->detect_lo)
2820 return;
2821 call_update_outputs(codec);
2822}
Takashi Iwai5d550e12012-12-19 15:16:44 +01002823EXPORT_SYMBOL_HDA(snd_hda_gen_line_automute);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002824
2825/* standard mic auto-switch helper */
Takashi Iwai5d550e12012-12-19 15:16:44 +01002826void snd_hda_gen_mic_autoswitch(struct hda_codec *codec, struct hda_jack_tbl *jack)
Takashi Iwai352f7f92012-12-19 12:52:06 +01002827{
2828 struct hda_gen_spec *spec = codec->spec;
2829 int i;
2830
2831 if (!spec->auto_mic)
2832 return;
2833
2834 for (i = spec->am_num_entries - 1; i > 0; i--) {
2835 if (snd_hda_jack_detect(codec, spec->am_entry[i].pin)) {
2836 mux_select(codec, 0, spec->am_entry[i].idx);
2837 return;
2838 }
2839 }
2840 mux_select(codec, 0, spec->am_entry[0].idx);
2841}
Takashi Iwai5d550e12012-12-19 15:16:44 +01002842EXPORT_SYMBOL_HDA(snd_hda_gen_mic_autoswitch);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002843
2844/*
2845 * Auto-Mute mode mixer enum support
2846 */
2847static int automute_mode_info(struct snd_kcontrol *kcontrol,
2848 struct snd_ctl_elem_info *uinfo)
2849{
2850 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2851 struct hda_gen_spec *spec = codec->spec;
2852 static const char * const texts3[] = {
2853 "Disabled", "Speaker Only", "Line Out+Speaker"
Takashi Iwai071c73a2006-08-23 18:34:06 +02002854 };
Linus Torvalds1da177e2005-04-16 15:20:36 -07002855
Takashi Iwai352f7f92012-12-19 12:52:06 +01002856 if (spec->automute_speaker_possible && spec->automute_lo_possible)
2857 return snd_hda_enum_helper_info(kcontrol, uinfo, 3, texts3);
2858 return snd_hda_enum_bool_helper_info(kcontrol, uinfo);
2859}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002860
Takashi Iwai352f7f92012-12-19 12:52:06 +01002861static int automute_mode_get(struct snd_kcontrol *kcontrol,
2862 struct snd_ctl_elem_value *ucontrol)
2863{
2864 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2865 struct hda_gen_spec *spec = codec->spec;
2866 unsigned int val = 0;
2867 if (spec->automute_speaker)
2868 val++;
2869 if (spec->automute_lo)
2870 val++;
Takashi Iwai071c73a2006-08-23 18:34:06 +02002871
Takashi Iwai352f7f92012-12-19 12:52:06 +01002872 ucontrol->value.enumerated.item[0] = val;
2873 return 0;
2874}
2875
2876static int automute_mode_put(struct snd_kcontrol *kcontrol,
2877 struct snd_ctl_elem_value *ucontrol)
2878{
2879 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2880 struct hda_gen_spec *spec = codec->spec;
2881
2882 switch (ucontrol->value.enumerated.item[0]) {
2883 case 0:
2884 if (!spec->automute_speaker && !spec->automute_lo)
2885 return 0;
2886 spec->automute_speaker = 0;
2887 spec->automute_lo = 0;
2888 break;
2889 case 1:
2890 if (spec->automute_speaker_possible) {
2891 if (!spec->automute_lo && spec->automute_speaker)
2892 return 0;
2893 spec->automute_speaker = 1;
2894 spec->automute_lo = 0;
2895 } else if (spec->automute_lo_possible) {
2896 if (spec->automute_lo)
2897 return 0;
2898 spec->automute_lo = 1;
2899 } else
2900 return -EINVAL;
2901 break;
2902 case 2:
2903 if (!spec->automute_lo_possible || !spec->automute_speaker_possible)
2904 return -EINVAL;
2905 if (spec->automute_speaker && spec->automute_lo)
2906 return 0;
2907 spec->automute_speaker = 1;
2908 spec->automute_lo = 1;
2909 break;
2910 default:
2911 return -EINVAL;
2912 }
2913 call_update_outputs(codec);
2914 return 1;
2915}
2916
2917static const struct snd_kcontrol_new automute_mode_enum = {
2918 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2919 .name = "Auto-Mute Mode",
2920 .info = automute_mode_info,
2921 .get = automute_mode_get,
2922 .put = automute_mode_put,
2923};
2924
2925static int add_automute_mode_enum(struct hda_codec *codec)
2926{
2927 struct hda_gen_spec *spec = codec->spec;
2928
Takashi Iwai12c93df2012-12-19 14:38:33 +01002929 if (!snd_hda_gen_add_kctl(spec, NULL, &automute_mode_enum))
Takashi Iwai352f7f92012-12-19 12:52:06 +01002930 return -ENOMEM;
2931 return 0;
2932}
2933
2934/*
2935 * Check the availability of HP/line-out auto-mute;
2936 * Set up appropriately if really supported
2937 */
2938static int check_auto_mute_availability(struct hda_codec *codec)
2939{
2940 struct hda_gen_spec *spec = codec->spec;
2941 struct auto_pin_cfg *cfg = &spec->autocfg;
2942 int present = 0;
2943 int i, err;
2944
2945 if (cfg->hp_pins[0])
2946 present++;
2947 if (cfg->line_out_pins[0])
2948 present++;
2949 if (cfg->speaker_pins[0])
2950 present++;
2951 if (present < 2) /* need two different output types */
Takashi Iwai071c73a2006-08-23 18:34:06 +02002952 return 0;
Takashi Iwai352f7f92012-12-19 12:52:06 +01002953
2954 if (!cfg->speaker_pins[0] &&
2955 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
2956 memcpy(cfg->speaker_pins, cfg->line_out_pins,
2957 sizeof(cfg->speaker_pins));
2958 cfg->speaker_outs = cfg->line_outs;
Takashi Iwai071c73a2006-08-23 18:34:06 +02002959 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002960
Takashi Iwai352f7f92012-12-19 12:52:06 +01002961 if (!cfg->hp_pins[0] &&
2962 cfg->line_out_type == AUTO_PIN_HP_OUT) {
2963 memcpy(cfg->hp_pins, cfg->line_out_pins,
2964 sizeof(cfg->hp_pins));
2965 cfg->hp_outs = cfg->line_outs;
2966 }
2967
2968 for (i = 0; i < cfg->hp_outs; i++) {
2969 hda_nid_t nid = cfg->hp_pins[i];
2970 if (!is_jack_detectable(codec, nid))
2971 continue;
2972 snd_printdd("hda-codec: Enable HP auto-muting on NID 0x%x\n",
2973 nid);
2974 snd_hda_jack_detect_enable_callback(codec, nid, HDA_GEN_HP_EVENT,
Takashi Iwai2e03e952013-01-03 15:55:06 +01002975 spec->hp_automute_hook ?
2976 spec->hp_automute_hook :
Takashi Iwai5d550e12012-12-19 15:16:44 +01002977 snd_hda_gen_hp_automute);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002978 spec->detect_hp = 1;
2979 }
2980
2981 if (cfg->line_out_type == AUTO_PIN_LINE_OUT && cfg->line_outs) {
2982 if (cfg->speaker_outs)
2983 for (i = 0; i < cfg->line_outs; i++) {
2984 hda_nid_t nid = cfg->line_out_pins[i];
2985 if (!is_jack_detectable(codec, nid))
2986 continue;
2987 snd_printdd("hda-codec: Enable Line-Out auto-muting on NID 0x%x\n", nid);
2988 snd_hda_jack_detect_enable_callback(codec, nid,
2989 HDA_GEN_FRONT_EVENT,
Takashi Iwai2e03e952013-01-03 15:55:06 +01002990 spec->line_automute_hook ?
2991 spec->line_automute_hook :
Takashi Iwai5d550e12012-12-19 15:16:44 +01002992 snd_hda_gen_line_automute);
Takashi Iwai352f7f92012-12-19 12:52:06 +01002993 spec->detect_lo = 1;
2994 }
2995 spec->automute_lo_possible = spec->detect_hp;
2996 }
2997
2998 spec->automute_speaker_possible = cfg->speaker_outs &&
2999 (spec->detect_hp || spec->detect_lo);
3000
3001 spec->automute_lo = spec->automute_lo_possible;
3002 spec->automute_speaker = spec->automute_speaker_possible;
3003
3004 if (spec->automute_speaker_possible || spec->automute_lo_possible) {
3005 /* create a control for automute mode */
3006 err = add_automute_mode_enum(codec);
3007 if (err < 0)
3008 return err;
3009 }
3010 return 0;
3011}
3012
Takashi Iwai352f7f92012-12-19 12:52:06 +01003013/* check whether all auto-mic pins are valid; setup indices if OK */
3014static bool auto_mic_check_imux(struct hda_codec *codec)
3015{
3016 struct hda_gen_spec *spec = codec->spec;
3017 const struct hda_input_mux *imux;
3018 int i;
3019
3020 imux = &spec->input_mux;
3021 for (i = 0; i < spec->am_num_entries; i++) {
3022 spec->am_entry[i].idx =
3023 find_idx_in_nid_list(spec->am_entry[i].pin,
3024 spec->imux_pins, imux->num_items);
3025 if (spec->am_entry[i].idx < 0)
3026 return false; /* no corresponding imux */
3027 }
3028
3029 /* we don't need the jack detection for the first pin */
3030 for (i = 1; i < spec->am_num_entries; i++)
3031 snd_hda_jack_detect_enable_callback(codec,
3032 spec->am_entry[i].pin,
3033 HDA_GEN_MIC_EVENT,
Takashi Iwai2e03e952013-01-03 15:55:06 +01003034 spec->mic_autoswitch_hook ?
3035 spec->mic_autoswitch_hook :
Takashi Iwai5d550e12012-12-19 15:16:44 +01003036 snd_hda_gen_mic_autoswitch);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003037 return true;
3038}
3039
3040static int compare_attr(const void *ap, const void *bp)
3041{
3042 const struct automic_entry *a = ap;
3043 const struct automic_entry *b = bp;
3044 return (int)(a->attr - b->attr);
3045}
3046
3047/*
3048 * Check the availability of auto-mic switch;
3049 * Set up if really supported
3050 */
3051static int check_auto_mic_availability(struct hda_codec *codec)
3052{
3053 struct hda_gen_spec *spec = codec->spec;
3054 struct auto_pin_cfg *cfg = &spec->autocfg;
3055 unsigned int types;
3056 int i, num_pins;
3057
Takashi Iwaid12daf62013-01-07 16:32:11 +01003058 if (spec->suppress_auto_mic)
3059 return 0;
3060
Takashi Iwai352f7f92012-12-19 12:52:06 +01003061 types = 0;
3062 num_pins = 0;
3063 for (i = 0; i < cfg->num_inputs; i++) {
3064 hda_nid_t nid = cfg->inputs[i].pin;
3065 unsigned int attr;
3066 attr = snd_hda_codec_get_pincfg(codec, nid);
3067 attr = snd_hda_get_input_pin_attr(attr);
3068 if (types & (1 << attr))
3069 return 0; /* already occupied */
3070 switch (attr) {
3071 case INPUT_PIN_ATTR_INT:
3072 if (cfg->inputs[i].type != AUTO_PIN_MIC)
3073 return 0; /* invalid type */
3074 break;
3075 case INPUT_PIN_ATTR_UNUSED:
3076 return 0; /* invalid entry */
3077 default:
3078 if (cfg->inputs[i].type > AUTO_PIN_LINE_IN)
3079 return 0; /* invalid type */
3080 if (!spec->line_in_auto_switch &&
3081 cfg->inputs[i].type != AUTO_PIN_MIC)
3082 return 0; /* only mic is allowed */
3083 if (!is_jack_detectable(codec, nid))
3084 return 0; /* no unsol support */
3085 break;
3086 }
3087 if (num_pins >= MAX_AUTO_MIC_PINS)
3088 return 0;
3089 types |= (1 << attr);
3090 spec->am_entry[num_pins].pin = nid;
3091 spec->am_entry[num_pins].attr = attr;
3092 num_pins++;
3093 }
3094
3095 if (num_pins < 2)
3096 return 0;
3097
3098 spec->am_num_entries = num_pins;
3099 /* sort the am_entry in the order of attr so that the pin with a
3100 * higher attr will be selected when the jack is plugged.
3101 */
3102 sort(spec->am_entry, num_pins, sizeof(spec->am_entry[0]),
3103 compare_attr, NULL);
3104
3105 if (!auto_mic_check_imux(codec))
3106 return 0;
3107
3108 spec->auto_mic = 1;
3109 spec->num_adc_nids = 1;
3110 spec->cur_mux[0] = spec->am_entry[0].idx;
3111 snd_printdd("hda-codec: Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n",
3112 spec->am_entry[0].pin,
3113 spec->am_entry[1].pin,
3114 spec->am_entry[2].pin);
3115
3116 return 0;
3117}
3118
3119
Takashi Iwai9eb413e2012-12-19 14:41:21 +01003120/*
3121 * Parse the given BIOS configuration and set up the hda_gen_spec
3122 *
3123 * return 1 if successful, 0 if the proper config is not found,
Takashi Iwai352f7f92012-12-19 12:52:06 +01003124 * or a negative error code
3125 */
3126int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
Takashi Iwai9eb413e2012-12-19 14:41:21 +01003127 struct auto_pin_cfg *cfg)
Takashi Iwai352f7f92012-12-19 12:52:06 +01003128{
3129 struct hda_gen_spec *spec = codec->spec;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003130 int err;
3131
Takashi Iwai9eb413e2012-12-19 14:41:21 +01003132 if (cfg != &spec->autocfg) {
3133 spec->autocfg = *cfg;
3134 cfg = &spec->autocfg;
3135 }
3136
Takashi Iwai352f7f92012-12-19 12:52:06 +01003137 if (!cfg->line_outs) {
3138 if (cfg->dig_outs || cfg->dig_in_pin) {
3139 spec->multiout.max_channels = 2;
3140 spec->no_analog = 1;
3141 goto dig_only;
3142 }
3143 return 0; /* can't find valid BIOS pin config */
3144 }
3145
3146 if (!spec->no_primary_hp &&
3147 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT &&
3148 cfg->line_outs <= cfg->hp_outs) {
3149 /* use HP as primary out */
3150 cfg->speaker_outs = cfg->line_outs;
3151 memcpy(cfg->speaker_pins, cfg->line_out_pins,
3152 sizeof(cfg->speaker_pins));
3153 cfg->line_outs = cfg->hp_outs;
3154 memcpy(cfg->line_out_pins, cfg->hp_pins, sizeof(cfg->hp_pins));
3155 cfg->hp_outs = 0;
3156 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
3157 cfg->line_out_type = AUTO_PIN_HP_OUT;
3158 }
3159
3160 err = parse_output_paths(codec);
3161 if (err < 0)
3162 return err;
3163 err = create_multi_channel_mode(codec);
3164 if (err < 0)
3165 return err;
3166 err = create_multi_out_ctls(codec, cfg);
3167 if (err < 0)
3168 return err;
3169 err = create_hp_out_ctls(codec);
3170 if (err < 0)
3171 return err;
3172 err = create_speaker_out_ctls(codec);
3173 if (err < 0)
3174 return err;
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003175 err = create_indep_hp_ctls(codec);
3176 if (err < 0)
3177 return err;
Takashi Iwaic30aa7b2013-01-04 16:42:48 +01003178 err = create_loopback_mixing_ctl(codec);
3179 if (err < 0)
3180 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003181 err = create_shared_input(codec);
3182 if (err < 0)
3183 return err;
3184 err = create_input_ctls(codec);
Takashi Iwaid13bd412008-07-30 15:01:45 +02003185 if (err < 0)
Takashi Iwai071c73a2006-08-23 18:34:06 +02003186 return err;
3187
Takashi Iwaia07a9492013-01-07 16:44:06 +01003188 spec->const_channel_count = spec->ext_channel_count;
3189 /* check the multiple speaker and headphone pins */
3190 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
3191 spec->const_channel_count = max(spec->const_channel_count,
3192 cfg->speaker_outs * 2);
3193 if (cfg->line_out_type != AUTO_PIN_HP_OUT)
3194 spec->const_channel_count = max(spec->const_channel_count,
3195 cfg->hp_outs * 2);
3196 spec->multiout.max_channels = max(spec->ext_channel_count,
3197 spec->const_channel_count);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003198
3199 err = check_auto_mute_availability(codec);
3200 if (err < 0)
3201 return err;
3202
3203 err = check_dyn_adc_switch(codec);
3204 if (err < 0)
3205 return err;
3206
3207 if (!spec->shared_mic_hp) {
3208 err = check_auto_mic_availability(codec);
Takashi Iwaid13bd412008-07-30 15:01:45 +02003209 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003210 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003211 }
Takashi Iwai071c73a2006-08-23 18:34:06 +02003212
Takashi Iwai352f7f92012-12-19 12:52:06 +01003213 err = create_capture_mixers(codec);
3214 if (err < 0)
3215 return err;
3216
3217 err = parse_mic_boost(codec);
3218 if (err < 0)
3219 return err;
3220
3221 dig_only:
3222 parse_digital(codec);
3223
3224 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003225}
Takashi Iwai352f7f92012-12-19 12:52:06 +01003226EXPORT_SYMBOL_HDA(snd_hda_gen_parse_auto_config);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003227
3228
3229/*
Takashi Iwai352f7f92012-12-19 12:52:06 +01003230 * Build control elements
Linus Torvalds1da177e2005-04-16 15:20:36 -07003231 */
Takashi Iwai352f7f92012-12-19 12:52:06 +01003232
3233/* slave controls for virtual master */
3234static const char * const slave_pfxs[] = {
3235 "Front", "Surround", "Center", "LFE", "Side",
3236 "Headphone", "Speaker", "Mono", "Line Out",
3237 "CLFE", "Bass Speaker", "PCM",
Takashi Iwaiee79c692013-01-07 09:57:42 +01003238 "Speaker Front", "Speaker Surround", "Speaker CLFE", "Speaker Side",
3239 "Headphone Front", "Headphone Surround", "Headphone CLFE",
3240 "Headphone Side",
Takashi Iwai352f7f92012-12-19 12:52:06 +01003241 NULL,
3242};
3243
3244int snd_hda_gen_build_controls(struct hda_codec *codec)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003245{
Takashi Iwai352f7f92012-12-19 12:52:06 +01003246 struct hda_gen_spec *spec = codec->spec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003247 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003248
Takashi Iwai36502d02012-12-19 15:15:10 +01003249 if (spec->kctls.used) {
3250 err = snd_hda_add_new_ctls(codec, spec->kctls.list);
3251 if (err < 0)
3252 return err;
3253 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003254
Takashi Iwai352f7f92012-12-19 12:52:06 +01003255 if (spec->multiout.dig_out_nid) {
3256 err = snd_hda_create_dig_out_ctls(codec,
3257 spec->multiout.dig_out_nid,
3258 spec->multiout.dig_out_nid,
3259 spec->pcm_rec[1].pcm_type);
3260 if (err < 0)
3261 return err;
3262 if (!spec->no_analog) {
3263 err = snd_hda_create_spdif_share_sw(codec,
3264 &spec->multiout);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003265 if (err < 0)
3266 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003267 spec->multiout.share_spdif = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003268 }
3269 }
Takashi Iwai352f7f92012-12-19 12:52:06 +01003270 if (spec->dig_in_nid) {
3271 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
3272 if (err < 0)
3273 return err;
3274 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003275
Takashi Iwai352f7f92012-12-19 12:52:06 +01003276 /* if we have no master control, let's create it */
3277 if (!spec->no_analog &&
3278 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
3279 unsigned int vmaster_tlv[4];
3280 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
3281 HDA_OUTPUT, vmaster_tlv);
3282 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
3283 vmaster_tlv, slave_pfxs,
3284 "Playback Volume");
3285 if (err < 0)
3286 return err;
3287 }
3288 if (!spec->no_analog &&
3289 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
3290 err = __snd_hda_add_vmaster(codec, "Master Playback Switch",
3291 NULL, slave_pfxs,
3292 "Playback Switch",
3293 true, &spec->vmaster_mute.sw_kctl);
3294 if (err < 0)
3295 return err;
3296 if (spec->vmaster_mute.hook)
Takashi Iwaifd25a972012-12-20 14:57:18 +01003297 snd_hda_add_vmaster_hook(codec, &spec->vmaster_mute,
3298 spec->vmaster_mute_enum);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003299 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003300
Takashi Iwai352f7f92012-12-19 12:52:06 +01003301 free_kctls(spec); /* no longer needed */
3302
3303 if (spec->shared_mic_hp) {
3304 int err;
3305 int nid = spec->autocfg.inputs[1].pin;
3306 err = snd_hda_jack_add_kctl(codec, nid, "Headphone Mic", 0);
3307 if (err < 0)
3308 return err;
3309 err = snd_hda_jack_detect_enable(codec, nid, 0);
3310 if (err < 0)
3311 return err;
3312 }
3313
3314 err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
3315 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003316 return err;
3317
3318 return 0;
3319}
Takashi Iwai352f7f92012-12-19 12:52:06 +01003320EXPORT_SYMBOL_HDA(snd_hda_gen_build_controls);
3321
Linus Torvalds1da177e2005-04-16 15:20:36 -07003322
3323/*
Takashi Iwai352f7f92012-12-19 12:52:06 +01003324 * PCM definitions
Linus Torvalds1da177e2005-04-16 15:20:36 -07003325 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003326
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003327static void call_pcm_playback_hook(struct hda_pcm_stream *hinfo,
3328 struct hda_codec *codec,
3329 struct snd_pcm_substream *substream,
3330 int action)
3331{
3332 struct hda_gen_spec *spec = codec->spec;
3333 if (spec->pcm_playback_hook)
3334 spec->pcm_playback_hook(hinfo, codec, substream, action);
3335}
3336
Takashi Iwai352f7f92012-12-19 12:52:06 +01003337/*
3338 * Analog playback callbacks
3339 */
3340static int playback_pcm_open(struct hda_pcm_stream *hinfo,
3341 struct hda_codec *codec,
3342 struct snd_pcm_substream *substream)
3343{
3344 struct hda_gen_spec *spec = codec->spec;
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003345 int err;
3346
3347 mutex_lock(&spec->pcm_mutex);
3348 err = snd_hda_multi_out_analog_open(codec,
3349 &spec->multiout, substream,
Takashi Iwai352f7f92012-12-19 12:52:06 +01003350 hinfo);
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003351 if (!err) {
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003352 spec->active_streams |= 1 << STREAM_MULTI_OUT;
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003353 call_pcm_playback_hook(hinfo, codec, substream,
3354 HDA_GEN_PCM_ACT_OPEN);
3355 }
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003356 mutex_unlock(&spec->pcm_mutex);
3357 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003358}
3359
3360static int playback_pcm_prepare(struct hda_pcm_stream *hinfo,
Takashi Iwai97ec5582006-03-21 11:29:07 +01003361 struct hda_codec *codec,
3362 unsigned int stream_tag,
3363 unsigned int format,
3364 struct snd_pcm_substream *substream)
3365{
Takashi Iwai352f7f92012-12-19 12:52:06 +01003366 struct hda_gen_spec *spec = codec->spec;
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003367 int err;
3368
3369 err = snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3370 stream_tag, format, substream);
3371 if (!err)
3372 call_pcm_playback_hook(hinfo, codec, substream,
3373 HDA_GEN_PCM_ACT_PREPARE);
3374 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003375}
Takashi Iwai97ec5582006-03-21 11:29:07 +01003376
Takashi Iwai352f7f92012-12-19 12:52:06 +01003377static int playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3378 struct hda_codec *codec,
3379 struct snd_pcm_substream *substream)
3380{
3381 struct hda_gen_spec *spec = codec->spec;
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003382 int err;
3383
3384 err = snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3385 if (!err)
3386 call_pcm_playback_hook(hinfo, codec, substream,
3387 HDA_GEN_PCM_ACT_CLEANUP);
3388 return err;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003389}
3390
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003391static int playback_pcm_close(struct hda_pcm_stream *hinfo,
3392 struct hda_codec *codec,
3393 struct snd_pcm_substream *substream)
3394{
3395 struct hda_gen_spec *spec = codec->spec;
3396 mutex_lock(&spec->pcm_mutex);
3397 spec->active_streams &= ~(1 << STREAM_MULTI_OUT);
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003398 call_pcm_playback_hook(hinfo, codec, substream,
3399 HDA_GEN_PCM_ACT_CLOSE);
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003400 mutex_unlock(&spec->pcm_mutex);
3401 return 0;
3402}
3403
3404static int alt_playback_pcm_open(struct hda_pcm_stream *hinfo,
3405 struct hda_codec *codec,
3406 struct snd_pcm_substream *substream)
3407{
3408 struct hda_gen_spec *spec = codec->spec;
3409 int err = 0;
3410
3411 mutex_lock(&spec->pcm_mutex);
3412 if (!spec->indep_hp_enabled)
3413 err = -EBUSY;
3414 else
3415 spec->active_streams |= 1 << STREAM_INDEP_HP;
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003416 call_pcm_playback_hook(hinfo, codec, substream,
3417 HDA_GEN_PCM_ACT_OPEN);
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003418 mutex_unlock(&spec->pcm_mutex);
3419 return err;
3420}
3421
3422static int alt_playback_pcm_close(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 mutex_lock(&spec->pcm_mutex);
3428 spec->active_streams &= ~(1 << STREAM_INDEP_HP);
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003429 call_pcm_playback_hook(hinfo, codec, substream,
3430 HDA_GEN_PCM_ACT_CLOSE);
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003431 mutex_unlock(&spec->pcm_mutex);
3432 return 0;
3433}
3434
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003435static int alt_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3436 struct hda_codec *codec,
3437 unsigned int stream_tag,
3438 unsigned int format,
3439 struct snd_pcm_substream *substream)
3440{
3441 snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format);
3442 call_pcm_playback_hook(hinfo, codec, substream,
3443 HDA_GEN_PCM_ACT_PREPARE);
3444 return 0;
3445}
3446
3447static int alt_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3448 struct hda_codec *codec,
3449 struct snd_pcm_substream *substream)
3450{
3451 snd_hda_codec_cleanup_stream(codec, hinfo->nid);
3452 call_pcm_playback_hook(hinfo, codec, substream,
3453 HDA_GEN_PCM_ACT_CLEANUP);
3454 return 0;
3455}
3456
Takashi Iwai352f7f92012-12-19 12:52:06 +01003457/*
3458 * Digital out
3459 */
3460static int dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3461 struct hda_codec *codec,
3462 struct snd_pcm_substream *substream)
3463{
3464 struct hda_gen_spec *spec = codec->spec;
3465 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3466}
3467
3468static int dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3469 struct hda_codec *codec,
3470 unsigned int stream_tag,
3471 unsigned int format,
3472 struct snd_pcm_substream *substream)
3473{
3474 struct hda_gen_spec *spec = codec->spec;
3475 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3476 stream_tag, format, substream);
3477}
3478
3479static int dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3480 struct hda_codec *codec,
3481 struct snd_pcm_substream *substream)
3482{
3483 struct hda_gen_spec *spec = codec->spec;
3484 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3485}
3486
3487static int dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3488 struct hda_codec *codec,
3489 struct snd_pcm_substream *substream)
3490{
3491 struct hda_gen_spec *spec = codec->spec;
3492 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3493}
3494
3495/*
3496 * Analog capture
3497 */
3498static int alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3499 struct hda_codec *codec,
3500 unsigned int stream_tag,
3501 unsigned int format,
3502 struct snd_pcm_substream *substream)
3503{
3504 struct hda_gen_spec *spec = codec->spec;
3505
3506 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
Takashi Iwai97ec5582006-03-21 11:29:07 +01003507 stream_tag, 0, format);
3508 return 0;
3509}
3510
Takashi Iwai352f7f92012-12-19 12:52:06 +01003511static int alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3512 struct hda_codec *codec,
3513 struct snd_pcm_substream *substream)
Takashi Iwai97ec5582006-03-21 11:29:07 +01003514{
Takashi Iwai352f7f92012-12-19 12:52:06 +01003515 struct hda_gen_spec *spec = codec->spec;
Takashi Iwai97ec5582006-03-21 11:29:07 +01003516
Takashi Iwai352f7f92012-12-19 12:52:06 +01003517 snd_hda_codec_cleanup_stream(codec,
3518 spec->adc_nids[substream->number + 1]);
Takashi Iwai97ec5582006-03-21 11:29:07 +01003519 return 0;
3520}
3521
Takashi Iwai352f7f92012-12-19 12:52:06 +01003522/*
3523 */
3524static const struct hda_pcm_stream pcm_analog_playback = {
3525 .substreams = 1,
3526 .channels_min = 2,
3527 .channels_max = 8,
3528 /* NID is set in build_pcms */
3529 .ops = {
3530 .open = playback_pcm_open,
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003531 .close = playback_pcm_close,
Takashi Iwai352f7f92012-12-19 12:52:06 +01003532 .prepare = playback_pcm_prepare,
3533 .cleanup = playback_pcm_cleanup
3534 },
3535};
Linus Torvalds1da177e2005-04-16 15:20:36 -07003536
Takashi Iwai352f7f92012-12-19 12:52:06 +01003537static const struct hda_pcm_stream pcm_analog_capture = {
3538 .substreams = 1,
3539 .channels_min = 2,
3540 .channels_max = 2,
3541 /* NID is set in build_pcms */
3542};
3543
3544static const struct hda_pcm_stream pcm_analog_alt_playback = {
3545 .substreams = 1,
3546 .channels_min = 2,
3547 .channels_max = 2,
3548 /* NID is set in build_pcms */
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003549 .ops = {
3550 .open = alt_playback_pcm_open,
Takashi Iwaie6b85f32013-01-07 11:54:34 +01003551 .close = alt_playback_pcm_close,
3552 .prepare = alt_playback_pcm_prepare,
3553 .cleanup = alt_playback_pcm_cleanup
Takashi Iwai38cf6f12012-12-21 14:09:42 +01003554 },
Takashi Iwai352f7f92012-12-19 12:52:06 +01003555};
3556
3557static const struct hda_pcm_stream pcm_analog_alt_capture = {
3558 .substreams = 2, /* can be overridden */
3559 .channels_min = 2,
3560 .channels_max = 2,
3561 /* NID is set in build_pcms */
3562 .ops = {
3563 .prepare = alt_capture_pcm_prepare,
3564 .cleanup = alt_capture_pcm_cleanup
3565 },
3566};
3567
3568static const struct hda_pcm_stream pcm_digital_playback = {
3569 .substreams = 1,
3570 .channels_min = 2,
3571 .channels_max = 2,
3572 /* NID is set in build_pcms */
3573 .ops = {
3574 .open = dig_playback_pcm_open,
3575 .close = dig_playback_pcm_close,
3576 .prepare = dig_playback_pcm_prepare,
3577 .cleanup = dig_playback_pcm_cleanup
3578 },
3579};
3580
3581static const struct hda_pcm_stream pcm_digital_capture = {
3582 .substreams = 1,
3583 .channels_min = 2,
3584 .channels_max = 2,
3585 /* NID is set in build_pcms */
3586};
3587
3588/* Used by build_pcms to flag that a PCM has no playback stream */
3589static const struct hda_pcm_stream pcm_null_stream = {
3590 .substreams = 0,
3591 .channels_min = 0,
3592 .channels_max = 0,
3593};
3594
3595/*
3596 * dynamic changing ADC PCM streams
3597 */
3598static bool dyn_adc_pcm_resetup(struct hda_codec *codec, int cur)
3599{
3600 struct hda_gen_spec *spec = codec->spec;
3601 hda_nid_t new_adc = spec->adc_nids[spec->dyn_adc_idx[cur]];
3602
3603 if (spec->cur_adc && spec->cur_adc != new_adc) {
3604 /* stream is running, let's swap the current ADC */
3605 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
3606 spec->cur_adc = new_adc;
3607 snd_hda_codec_setup_stream(codec, new_adc,
3608 spec->cur_adc_stream_tag, 0,
3609 spec->cur_adc_format);
3610 return true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003611 }
Takashi Iwai352f7f92012-12-19 12:52:06 +01003612 return false;
3613}
3614
3615/* analog capture with dynamic dual-adc changes */
3616static int dyn_adc_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3617 struct hda_codec *codec,
3618 unsigned int stream_tag,
3619 unsigned int format,
3620 struct snd_pcm_substream *substream)
3621{
3622 struct hda_gen_spec *spec = codec->spec;
3623 spec->cur_adc = spec->adc_nids[spec->dyn_adc_idx[spec->cur_mux[0]]];
3624 spec->cur_adc_stream_tag = stream_tag;
3625 spec->cur_adc_format = format;
3626 snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
3627 return 0;
3628}
3629
3630static int dyn_adc_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3631 struct hda_codec *codec,
3632 struct snd_pcm_substream *substream)
3633{
3634 struct hda_gen_spec *spec = codec->spec;
3635 snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
3636 spec->cur_adc = 0;
3637 return 0;
3638}
3639
3640static const struct hda_pcm_stream dyn_adc_pcm_analog_capture = {
3641 .substreams = 1,
3642 .channels_min = 2,
3643 .channels_max = 2,
3644 .nid = 0, /* fill later */
3645 .ops = {
3646 .prepare = dyn_adc_capture_pcm_prepare,
3647 .cleanup = dyn_adc_capture_pcm_cleanup
3648 },
3649};
3650
Takashi Iwaif873e532012-12-20 16:58:39 +01003651static void fill_pcm_stream_name(char *str, size_t len, const char *sfx,
3652 const char *chip_name)
3653{
3654 char *p;
3655
3656 if (*str)
3657 return;
3658 strlcpy(str, chip_name, len);
3659
3660 /* drop non-alnum chars after a space */
3661 for (p = strchr(str, ' '); p; p = strchr(p + 1, ' ')) {
3662 if (!isalnum(p[1])) {
3663 *p = 0;
3664 break;
3665 }
3666 }
3667 strlcat(str, sfx, len);
3668}
3669
Takashi Iwai352f7f92012-12-19 12:52:06 +01003670/* build PCM streams based on the parsed results */
3671int snd_hda_gen_build_pcms(struct hda_codec *codec)
3672{
3673 struct hda_gen_spec *spec = codec->spec;
3674 struct hda_pcm *info = spec->pcm_rec;
3675 const struct hda_pcm_stream *p;
3676 bool have_multi_adcs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003677
3678 codec->num_pcms = 1;
3679 codec->pcm_info = info;
3680
Takashi Iwai352f7f92012-12-19 12:52:06 +01003681 if (spec->no_analog)
3682 goto skip_analog;
3683
Takashi Iwaif873e532012-12-20 16:58:39 +01003684 fill_pcm_stream_name(spec->stream_name_analog,
3685 sizeof(spec->stream_name_analog),
3686 " Analog", codec->chip_name);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003687 info->name = spec->stream_name_analog;
3688
3689 if (spec->multiout.num_dacs > 0) {
3690 p = spec->stream_analog_playback;
3691 if (!p)
3692 p = &pcm_analog_playback;
3693 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3694 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3695 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
3696 spec->multiout.max_channels;
3697 if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT &&
3698 spec->autocfg.line_outs == 2)
3699 info->stream[SNDRV_PCM_STREAM_PLAYBACK].chmap =
3700 snd_pcm_2_1_chmaps;
3701 }
3702 if (spec->num_adc_nids) {
3703 p = spec->stream_analog_capture;
3704 if (!p) {
3705 if (spec->dyn_adc_switch)
3706 p = &dyn_adc_pcm_analog_capture;
3707 else
3708 p = &pcm_analog_capture;
3709 }
3710 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3711 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3712 }
3713
Takashi Iwai352f7f92012-12-19 12:52:06 +01003714 skip_analog:
3715 /* SPDIF for stream index #1 */
3716 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
Takashi Iwaif873e532012-12-20 16:58:39 +01003717 fill_pcm_stream_name(spec->stream_name_digital,
3718 sizeof(spec->stream_name_digital),
3719 " Digital", codec->chip_name);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003720 codec->num_pcms = 2;
3721 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3722 info = spec->pcm_rec + 1;
3723 info->name = spec->stream_name_digital;
3724 if (spec->dig_out_type)
3725 info->pcm_type = spec->dig_out_type;
3726 else
3727 info->pcm_type = HDA_PCM_TYPE_SPDIF;
3728 if (spec->multiout.dig_out_nid) {
3729 p = spec->stream_digital_playback;
3730 if (!p)
3731 p = &pcm_digital_playback;
3732 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3733 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3734 }
3735 if (spec->dig_in_nid) {
3736 p = spec->stream_digital_capture;
3737 if (!p)
3738 p = &pcm_digital_capture;
3739 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3740 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3741 }
3742 }
3743
3744 if (spec->no_analog)
3745 return 0;
3746
3747 /* If the use of more than one ADC is requested for the current
3748 * model, configure a second analog capture-only PCM.
3749 */
3750 have_multi_adcs = (spec->num_adc_nids > 1) &&
3751 !spec->dyn_adc_switch && !spec->auto_mic;
3752 /* Additional Analaog capture for index #2 */
3753 if (spec->alt_dac_nid || have_multi_adcs) {
3754 codec->num_pcms = 3;
3755 info = spec->pcm_rec + 2;
3756 info->name = spec->stream_name_analog;
3757 if (spec->alt_dac_nid) {
3758 p = spec->stream_analog_alt_playback;
3759 if (!p)
3760 p = &pcm_analog_alt_playback;
3761 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
3762 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3763 spec->alt_dac_nid;
3764 } else {
3765 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3766 pcm_null_stream;
3767 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3768 }
3769 if (have_multi_adcs) {
3770 p = spec->stream_analog_alt_capture;
3771 if (!p)
3772 p = &pcm_analog_alt_capture;
3773 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
3774 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3775 spec->adc_nids[1];
3776 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3777 spec->num_adc_nids - 1;
3778 } else {
3779 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3780 pcm_null_stream;
3781 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3782 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003783 }
3784
3785 return 0;
3786}
Takashi Iwai352f7f92012-12-19 12:52:06 +01003787EXPORT_SYMBOL_HDA(snd_hda_gen_build_pcms);
3788
3789
3790/*
3791 * Standard auto-parser initializations
3792 */
3793
Takashi Iwaid4156932013-01-07 10:08:02 +01003794/* configure the given path as a proper output */
3795static void set_output_and_unmute(struct hda_codec *codec,
Takashi Iwai196c17662013-01-04 15:01:40 +01003796 int pin_type, int path_idx)
Takashi Iwai352f7f92012-12-19 12:52:06 +01003797{
3798 struct nid_path *path;
Takashi Iwaid4156932013-01-07 10:08:02 +01003799 hda_nid_t pin;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003800
Takashi Iwai196c17662013-01-04 15:01:40 +01003801 path = snd_hda_get_path_from_idx(codec, path_idx);
Takashi Iwaid4156932013-01-07 10:08:02 +01003802 if (!path || !path->depth)
Takashi Iwai352f7f92012-12-19 12:52:06 +01003803 return;
Takashi Iwaid4156932013-01-07 10:08:02 +01003804 pin = path->path[path->depth - 1];
3805 snd_hda_set_pin_ctl_cache(codec, pin, pin_type);
Takashi Iwaie1284af2013-01-03 16:33:02 +01003806 snd_hda_activate_path(codec, path, path->active, true);
3807 set_pin_eapd(codec, pin, path->active);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003808}
3809
3810/* initialize primary output paths */
3811static void init_multi_out(struct hda_codec *codec)
3812{
3813 struct hda_gen_spec *spec = codec->spec;
3814 int pin_type;
3815 int i;
3816
3817 if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)
3818 pin_type = PIN_HP;
3819 else
3820 pin_type = PIN_OUT;
3821
Takashi Iwaid4156932013-01-07 10:08:02 +01003822 for (i = 0; i < spec->autocfg.line_outs; i++)
3823 set_output_and_unmute(codec, pin_type, spec->out_paths[i]);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003824}
3825
Takashi Iwaidb23fd12012-12-20 15:27:24 +01003826
3827static void __init_extra_out(struct hda_codec *codec, int num_outs,
Takashi Iwaid4156932013-01-07 10:08:02 +01003828 int *paths, int type)
Takashi Iwai352f7f92012-12-19 12:52:06 +01003829{
Takashi Iwai352f7f92012-12-19 12:52:06 +01003830 int i;
Takashi Iwai352f7f92012-12-19 12:52:06 +01003831
Takashi Iwaid4156932013-01-07 10:08:02 +01003832 for (i = 0; i < num_outs; i++)
3833 set_output_and_unmute(codec, type, paths[i]);
Takashi Iwaidb23fd12012-12-20 15:27:24 +01003834}
3835
3836/* initialize hp and speaker paths */
3837static void init_extra_out(struct hda_codec *codec)
3838{
3839 struct hda_gen_spec *spec = codec->spec;
3840
3841 if (spec->autocfg.line_out_type != AUTO_PIN_HP_OUT)
3842 __init_extra_out(codec, spec->autocfg.hp_outs,
Takashi Iwai196c17662013-01-04 15:01:40 +01003843 spec->hp_paths, PIN_HP);
Takashi Iwaidb23fd12012-12-20 15:27:24 +01003844 if (spec->autocfg.line_out_type != AUTO_PIN_SPEAKER_OUT)
3845 __init_extra_out(codec, spec->autocfg.speaker_outs,
Takashi Iwai196c17662013-01-04 15:01:40 +01003846 spec->speaker_paths, PIN_OUT);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003847}
3848
3849/* initialize multi-io paths */
3850static void init_multi_io(struct hda_codec *codec)
3851{
3852 struct hda_gen_spec *spec = codec->spec;
3853 int i;
3854
3855 for (i = 0; i < spec->multi_ios; i++) {
3856 hda_nid_t pin = spec->multi_io[i].pin;
3857 struct nid_path *path;
Takashi Iwai196c17662013-01-04 15:01:40 +01003858 path = get_multiio_path(codec, i);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003859 if (!path)
3860 continue;
3861 if (!spec->multi_io[i].ctl_in)
3862 spec->multi_io[i].ctl_in =
3863 snd_hda_codec_update_cache(codec, pin, 0,
3864 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3865 snd_hda_activate_path(codec, path, path->active, true);
3866 }
3867}
3868
3869/* set up the input pin config, depending on the given auto-pin type */
3870static void set_input_pin(struct hda_codec *codec, hda_nid_t nid,
3871 int auto_pin_type)
3872{
3873 unsigned int val = PIN_IN;
3874 if (auto_pin_type == AUTO_PIN_MIC)
3875 val |= snd_hda_get_default_vref(codec, nid);
Takashi Iwai7594aa32012-12-20 15:38:40 +01003876 snd_hda_set_pin_ctl_cache(codec, nid, val);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003877}
3878
3879/* set up input pins and loopback paths */
3880static void init_analog_input(struct hda_codec *codec)
3881{
3882 struct hda_gen_spec *spec = codec->spec;
3883 struct auto_pin_cfg *cfg = &spec->autocfg;
3884 int i;
3885
3886 for (i = 0; i < cfg->num_inputs; i++) {
3887 hda_nid_t nid = cfg->inputs[i].pin;
3888 if (is_input_pin(codec, nid))
3889 set_input_pin(codec, nid, cfg->inputs[i].type);
3890
3891 /* init loopback inputs */
3892 if (spec->mixer_nid) {
3893 struct nid_path *path;
Takashi Iwai196c17662013-01-04 15:01:40 +01003894 path = snd_hda_get_path_from_idx(codec, spec->loopback_paths[i]);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003895 if (path)
3896 snd_hda_activate_path(codec, path,
3897 path->active, false);
3898 }
3899 }
3900}
3901
3902/* initialize ADC paths */
3903static void init_input_src(struct hda_codec *codec)
3904{
3905 struct hda_gen_spec *spec = codec->spec;
3906 struct hda_input_mux *imux = &spec->input_mux;
3907 struct nid_path *path;
3908 int i, c, nums;
3909
3910 if (spec->dyn_adc_switch)
3911 nums = 1;
3912 else
3913 nums = spec->num_adc_nids;
3914
3915 for (c = 0; c < nums; c++) {
3916 for (i = 0; i < imux->num_items; i++) {
Takashi Iwaic697b712013-01-07 17:09:26 +01003917 path = get_input_path(codec, c, i);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003918 if (path) {
3919 bool active = path->active;
3920 if (i == spec->cur_mux[c])
3921 active = true;
3922 snd_hda_activate_path(codec, path, active, false);
3923 }
3924 }
3925 }
3926
3927 if (spec->shared_mic_hp)
3928 update_shared_mic_hp(codec, spec->cur_mux[0]);
3929
3930 if (spec->cap_sync_hook)
3931 spec->cap_sync_hook(codec);
3932}
3933
3934/* set right pin controls for digital I/O */
3935static void init_digital(struct hda_codec *codec)
3936{
3937 struct hda_gen_spec *spec = codec->spec;
3938 int i;
3939 hda_nid_t pin;
3940
Takashi Iwaid4156932013-01-07 10:08:02 +01003941 for (i = 0; i < spec->autocfg.dig_outs; i++)
3942 set_output_and_unmute(codec, PIN_OUT, spec->digout_paths[i]);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003943 pin = spec->autocfg.dig_in_pin;
Takashi Iwai2430d7b2013-01-04 15:09:42 +01003944 if (pin) {
3945 struct nid_path *path;
Takashi Iwai7594aa32012-12-20 15:38:40 +01003946 snd_hda_set_pin_ctl_cache(codec, pin, PIN_IN);
Takashi Iwai2430d7b2013-01-04 15:09:42 +01003947 path = snd_hda_get_path_from_idx(codec, spec->digin_path);
3948 if (path)
3949 snd_hda_activate_path(codec, path, path->active, false);
3950 }
Takashi Iwai352f7f92012-12-19 12:52:06 +01003951}
3952
Takashi Iwai973e4972012-12-20 15:16:09 +01003953/* clear unsol-event tags on unused pins; Conexant codecs seem to leave
3954 * invalid unsol tags by some reason
3955 */
3956static void clear_unsol_on_unused_pins(struct hda_codec *codec)
3957{
3958 int i;
3959
3960 for (i = 0; i < codec->init_pins.used; i++) {
3961 struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
3962 hda_nid_t nid = pin->nid;
3963 if (is_jack_detectable(codec, nid) &&
3964 !snd_hda_jack_tbl_get(codec, nid))
3965 snd_hda_codec_update_cache(codec, nid, 0,
3966 AC_VERB_SET_UNSOLICITED_ENABLE, 0);
3967 }
3968}
3969
Takashi Iwai5187ac12013-01-07 12:52:16 +01003970/*
3971 * initialize the generic spec;
3972 * this can be put as patch_ops.init function
3973 */
Takashi Iwai352f7f92012-12-19 12:52:06 +01003974int snd_hda_gen_init(struct hda_codec *codec)
3975{
3976 struct hda_gen_spec *spec = codec->spec;
3977
3978 if (spec->init_hook)
3979 spec->init_hook(codec);
3980
3981 snd_hda_apply_verbs(codec);
3982
Takashi Iwai3bbcd272012-12-20 11:50:58 +01003983 codec->cached_write = 1;
3984
Takashi Iwai352f7f92012-12-19 12:52:06 +01003985 init_multi_out(codec);
3986 init_extra_out(codec);
3987 init_multi_io(codec);
3988 init_analog_input(codec);
3989 init_input_src(codec);
3990 init_digital(codec);
3991
Takashi Iwai973e4972012-12-20 15:16:09 +01003992 clear_unsol_on_unused_pins(codec);
3993
Takashi Iwai352f7f92012-12-19 12:52:06 +01003994 /* call init functions of standard auto-mute helpers */
Takashi Iwai5d550e12012-12-19 15:16:44 +01003995 snd_hda_gen_hp_automute(codec, NULL);
3996 snd_hda_gen_line_automute(codec, NULL);
3997 snd_hda_gen_mic_autoswitch(codec, NULL);
Takashi Iwai352f7f92012-12-19 12:52:06 +01003998
Takashi Iwai3bbcd272012-12-20 11:50:58 +01003999 snd_hda_codec_flush_amp_cache(codec);
4000 snd_hda_codec_flush_cmd_cache(codec);
4001
Takashi Iwai352f7f92012-12-19 12:52:06 +01004002 if (spec->vmaster_mute.sw_kctl && spec->vmaster_mute.hook)
4003 snd_hda_sync_vmaster_hook(&spec->vmaster_mute);
4004
4005 hda_call_check_power_status(codec, 0x01);
4006 return 0;
4007}
Takashi Iwaifce52a32013-01-07 12:42:48 +01004008EXPORT_SYMBOL_HDA(snd_hda_gen_init);
4009
Takashi Iwai5187ac12013-01-07 12:52:16 +01004010/*
4011 * free the generic spec;
4012 * this can be put as patch_ops.free function
4013 */
Takashi Iwaifce52a32013-01-07 12:42:48 +01004014void snd_hda_gen_free(struct hda_codec *codec)
4015{
4016 snd_hda_gen_spec_free(codec->spec);
4017 kfree(codec->spec);
4018 codec->spec = NULL;
4019}
4020EXPORT_SYMBOL_HDA(snd_hda_gen_free);
4021
4022#ifdef CONFIG_PM
Takashi Iwai5187ac12013-01-07 12:52:16 +01004023/*
4024 * check the loopback power save state;
4025 * this can be put as patch_ops.check_power_status function
4026 */
Takashi Iwaifce52a32013-01-07 12:42:48 +01004027int snd_hda_gen_check_power_status(struct hda_codec *codec, hda_nid_t nid)
4028{
4029 struct hda_gen_spec *spec = codec->spec;
4030 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
4031}
4032EXPORT_SYMBOL_HDA(snd_hda_gen_check_power_status);
4033#endif
Takashi Iwai352f7f92012-12-19 12:52:06 +01004034
4035
4036/*
4037 * the generic codec support
4038 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07004039
Takashi Iwai352f7f92012-12-19 12:52:06 +01004040static const struct hda_codec_ops generic_patch_ops = {
4041 .build_controls = snd_hda_gen_build_controls,
4042 .build_pcms = snd_hda_gen_build_pcms,
4043 .init = snd_hda_gen_init,
Takashi Iwaifce52a32013-01-07 12:42:48 +01004044 .free = snd_hda_gen_free,
Takashi Iwai352f7f92012-12-19 12:52:06 +01004045 .unsol_event = snd_hda_jack_unsol_event,
Takashi Iwai83012a72012-08-24 18:38:08 +02004046#ifdef CONFIG_PM
Takashi Iwaifce52a32013-01-07 12:42:48 +01004047 .check_power_status = snd_hda_gen_check_power_status,
Takashi Iwaicb53c622007-08-10 17:21:45 +02004048#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07004049};
4050
Linus Torvalds1da177e2005-04-16 15:20:36 -07004051int snd_hda_parse_generic_codec(struct hda_codec *codec)
4052{
Takashi Iwai352f7f92012-12-19 12:52:06 +01004053 struct hda_gen_spec *spec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004054 int err;
4055
Takashi Iwaie560d8d2005-09-09 14:21:46 +02004056 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
Takashi Iwai352f7f92012-12-19 12:52:06 +01004057 if (!spec)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004058 return -ENOMEM;
Takashi Iwai352f7f92012-12-19 12:52:06 +01004059 snd_hda_gen_spec_init(spec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004060 codec->spec = spec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004061
Takashi Iwai9eb413e2012-12-19 14:41:21 +01004062 err = snd_hda_parse_pin_defcfg(codec, &spec->autocfg, NULL, 0);
4063 if (err < 0)
4064 return err;
4065
4066 err = snd_hda_gen_parse_auto_config(codec, &spec->autocfg);
Takashi Iwai352f7f92012-12-19 12:52:06 +01004067 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004068 goto error;
4069
4070 codec->patch_ops = generic_patch_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004071 return 0;
4072
Takashi Iwai352f7f92012-12-19 12:52:06 +01004073error:
Takashi Iwaifce52a32013-01-07 12:42:48 +01004074 snd_hda_gen_free(codec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004075 return err;
4076}
Takashi Iwaifce52a32013-01-07 12:42:48 +01004077EXPORT_SYMBOL_HDA(snd_hda_parse_generic_codec);