1 /*
2  * Universal Interface for Intel High Definition Audio Codec
3  *
4  * HD audio interface patch for Realtek ALC codecs
5  *
6  * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
7  *                    PeiSen Hou <pshou@realtek.com.tw>
8  *                    Takashi Iwai <tiwai@suse.de>
9  *                    Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
10  *
11  *  This driver is free software; you can redistribute it and/or modify
12  *  it under the terms of the GNU General Public License as published by
13  *  the Free Software Foundation; either version 2 of the License, or
14  *  (at your option) any later version.
15  *
16  *  This driver is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *  GNU General Public License for more details.
20  *
21  *  You should have received a copy of the GNU General Public License
22  *  along with this program; if not, write to the Free Software
23  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
24  */
25 
26 #include <linux/init.h>
27 #include <linux/delay.h>
28 #include <linux/slab.h>
29 #include <linux/pci.h>
30 #include <linux/module.h>
31 #include <sound/core.h>
32 #include <sound/jack.h>
33 #include "hda_codec.h"
34 #include "hda_local.h"
35 #include "hda_beep.h"
36 #include "hda_jack.h"
37 
38 /* unsol event tags */
39 #define ALC_FRONT_EVENT		0x01
40 #define ALC_DCVOL_EVENT		0x02
41 #define ALC_HP_EVENT		0x04
42 #define ALC_MIC_EVENT		0x08
43 
44 /* for GPIO Poll */
45 #define GPIO_MASK	0x03
46 
47 /* extra amp-initialization sequence types */
48 enum {
49 	ALC_INIT_NONE,
50 	ALC_INIT_DEFAULT,
51 	ALC_INIT_GPIO1,
52 	ALC_INIT_GPIO2,
53 	ALC_INIT_GPIO3,
54 };
55 
56 struct alc_customize_define {
57 	unsigned int  sku_cfg;
58 	unsigned char port_connectivity;
59 	unsigned char check_sum;
60 	unsigned char customization;
61 	unsigned char external_amp;
62 	unsigned int  enable_pcbeep:1;
63 	unsigned int  platform_type:1;
64 	unsigned int  swap:1;
65 	unsigned int  override:1;
66 	unsigned int  fixup:1; /* Means that this sku is set by driver, not read from hw */
67 };
68 
69 struct alc_fixup;
70 
71 struct alc_multi_io {
72 	hda_nid_t pin;		/* multi-io widget pin NID */
73 	hda_nid_t dac;		/* DAC to be connected */
74 	unsigned int ctl_in;	/* cached input-pin control value */
75 };
76 
77 enum {
78 	ALC_AUTOMUTE_PIN,	/* change the pin control */
79 	ALC_AUTOMUTE_AMP,	/* mute/unmute the pin AMP */
80 	ALC_AUTOMUTE_MIXER,	/* mute/unmute mixer widget AMP */
81 };
82 
83 #define MAX_VOL_NIDS	0x40
84 
85 struct alc_spec {
86 	/* codec parameterization */
87 	const struct snd_kcontrol_new *mixers[5];	/* mixer arrays */
88 	unsigned int num_mixers;
89 	const struct snd_kcontrol_new *cap_mixer;	/* capture mixer */
90 	unsigned int beep_amp;	/* beep amp value, set via set_beep_amp() */
91 
92 	const struct hda_verb *init_verbs[10];	/* initialization verbs
93 						 * don't forget NULL
94 						 * termination!
95 						 */
96 	unsigned int num_init_verbs;
97 
98 	char stream_name_analog[32];	/* analog PCM stream */
99 	const struct hda_pcm_stream *stream_analog_playback;
100 	const struct hda_pcm_stream *stream_analog_capture;
101 	const struct hda_pcm_stream *stream_analog_alt_playback;
102 	const struct hda_pcm_stream *stream_analog_alt_capture;
103 
104 	char stream_name_digital[32];	/* digital PCM stream */
105 	const struct hda_pcm_stream *stream_digital_playback;
106 	const struct hda_pcm_stream *stream_digital_capture;
107 
108 	/* playback */
109 	struct hda_multi_out multiout;	/* playback set-up
110 					 * max_channels, dacs must be set
111 					 * dig_out_nid and hp_nid are optional
112 					 */
113 	hda_nid_t alt_dac_nid;
114 	hda_nid_t slave_dig_outs[3];	/* optional - for auto-parsing */
115 	int dig_out_type;
116 
117 	/* capture */
118 	unsigned int num_adc_nids;
119 	const hda_nid_t *adc_nids;
120 	const hda_nid_t *capsrc_nids;
121 	hda_nid_t dig_in_nid;		/* digital-in NID; optional */
122 	hda_nid_t mixer_nid;		/* analog-mixer NID */
123 	DECLARE_BITMAP(vol_ctls, MAX_VOL_NIDS << 1);
124 	DECLARE_BITMAP(sw_ctls, MAX_VOL_NIDS << 1);
125 
126 	/* capture setup for dynamic dual-adc switch */
127 	hda_nid_t cur_adc;
128 	unsigned int cur_adc_stream_tag;
129 	unsigned int cur_adc_format;
130 
131 	/* capture source */
132 	unsigned int num_mux_defs;
133 	const struct hda_input_mux *input_mux;
134 	unsigned int cur_mux[3];
135 	hda_nid_t ext_mic_pin;
136 	hda_nid_t dock_mic_pin;
137 	hda_nid_t int_mic_pin;
138 
139 	/* channel model */
140 	const struct hda_channel_mode *channel_mode;
141 	int num_channel_mode;
142 	int need_dac_fix;
143 	int const_channel_count;
144 	int ext_channel_count;
145 
146 	/* PCM information */
147 	struct hda_pcm pcm_rec[3];	/* used in alc_build_pcms() */
148 
149 	/* dynamic controls, init_verbs and input_mux */
150 	struct auto_pin_cfg autocfg;
151 	struct alc_customize_define cdefine;
152 	struct snd_array kctls;
153 	struct hda_input_mux private_imux[3];
154 	hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
155 	hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
156 	hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
157 	hda_nid_t imux_pins[HDA_MAX_NUM_INPUTS];
158 	unsigned int dyn_adc_idx[HDA_MAX_NUM_INPUTS];
159 	int int_mic_idx, ext_mic_idx, dock_mic_idx; /* for auto-mic */
160 
161 	/* hooks */
162 	void (*init_hook)(struct hda_codec *codec);
163 	void (*unsol_event)(struct hda_codec *codec, unsigned int res);
164 #ifdef CONFIG_SND_HDA_POWER_SAVE
165 	void (*power_hook)(struct hda_codec *codec);
166 #endif
167 	void (*shutup)(struct hda_codec *codec);
168 	void (*automute_hook)(struct hda_codec *codec);
169 
170 	/* for pin sensing */
171 	unsigned int hp_jack_present:1;
172 	unsigned int line_jack_present:1;
173 	unsigned int master_mute:1;
174 	unsigned int auto_mic:1;
175 	unsigned int auto_mic_valid_imux:1;	/* valid imux for auto-mic */
176 	unsigned int automute_speaker:1; /* automute speaker outputs */
177 	unsigned int automute_lo:1; /* automute LO outputs */
178 	unsigned int detect_hp:1;	/* Headphone detection enabled */
179 	unsigned int detect_lo:1;	/* Line-out detection enabled */
180 	unsigned int automute_speaker_possible:1; /* there are speakers and either LO or HP */
181 	unsigned int automute_lo_possible:1;	  /* there are line outs and HP */
182 	unsigned int keep_vref_in_automute:1; /* Don't clear VREF in automute */
183 
184 	/* other flags */
185 	unsigned int no_analog :1; /* digital I/O only */
186 	unsigned int dyn_adc_switch:1; /* switch ADCs (for ALC275) */
187 	unsigned int single_input_src:1;
188 	unsigned int vol_in_capsrc:1; /* use capsrc volume (ADC has no vol) */
189 	unsigned int parse_flags; /* passed to snd_hda_parse_pin_defcfg() */
190 	unsigned int shared_mic_hp:1; /* HP/Mic-in sharing */
191 
192 	/* auto-mute control */
193 	int automute_mode;
194 	hda_nid_t automute_mixer_nid[AUTO_CFG_MAX_OUTS];
195 
196 	int init_amp;
197 	int codec_variant;	/* flag for other variants */
198 
199 	/* for virtual master */
200 	hda_nid_t vmaster_nid;
201 #ifdef CONFIG_SND_HDA_POWER_SAVE
202 	struct hda_loopback_check loopback;
203 #endif
204 
205 	/* for PLL fix */
206 	hda_nid_t pll_nid;
207 	unsigned int pll_coef_idx, pll_coef_bit;
208 	unsigned int coef0;
209 
210 	/* fix-up list */
211 	int fixup_id;
212 	const struct alc_fixup *fixup_list;
213 	const char *fixup_name;
214 
215 	/* multi-io */
216 	int multi_ios;
217 	struct alc_multi_io multi_io[4];
218 
219 	/* bind volumes */
220 	struct snd_array bind_ctls;
221 };
222 
223 #define ALC_MODEL_AUTO		0	/* common for all chips */
224 
check_amp_caps(struct hda_codec * codec,hda_nid_t nid,int dir,unsigned int bits)225 static bool check_amp_caps(struct hda_codec *codec, hda_nid_t nid,
226 			   int dir, unsigned int bits)
227 {
228 	if (!nid)
229 		return false;
230 	if (get_wcaps(codec, nid) & (1 << (dir + 1)))
231 		if (query_amp_caps(codec, nid, dir) & bits)
232 			return true;
233 	return false;
234 }
235 
236 #define nid_has_mute(codec, nid, dir) \
237 	check_amp_caps(codec, nid, dir, AC_AMPCAP_MUTE)
238 #define nid_has_volume(codec, nid, dir) \
239 	check_amp_caps(codec, nid, dir, AC_AMPCAP_NUM_STEPS)
240 
241 /*
242  * input MUX handling
243  */
alc_mux_enum_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)244 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
245 			     struct snd_ctl_elem_info *uinfo)
246 {
247 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
248 	struct alc_spec *spec = codec->spec;
249 	unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
250 	if (mux_idx >= spec->num_mux_defs)
251 		mux_idx = 0;
252 	if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
253 		mux_idx = 0;
254 	return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
255 }
256 
alc_mux_enum_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)257 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
258 			    struct snd_ctl_elem_value *ucontrol)
259 {
260 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
261 	struct alc_spec *spec = codec->spec;
262 	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
263 
264 	ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
265 	return 0;
266 }
267 
alc_dyn_adc_pcm_resetup(struct hda_codec * codec,int cur)268 static bool alc_dyn_adc_pcm_resetup(struct hda_codec *codec, int cur)
269 {
270 	struct alc_spec *spec = codec->spec;
271 	hda_nid_t new_adc = spec->adc_nids[spec->dyn_adc_idx[cur]];
272 
273 	if (spec->cur_adc && spec->cur_adc != new_adc) {
274 		/* stream is running, let's swap the current ADC */
275 		__snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
276 		spec->cur_adc = new_adc;
277 		snd_hda_codec_setup_stream(codec, new_adc,
278 					   spec->cur_adc_stream_tag, 0,
279 					   spec->cur_adc_format);
280 		return true;
281 	}
282 	return false;
283 }
284 
get_capsrc(struct alc_spec * spec,int idx)285 static inline hda_nid_t get_capsrc(struct alc_spec *spec, int idx)
286 {
287 	return spec->capsrc_nids ?
288 		spec->capsrc_nids[idx] : spec->adc_nids[idx];
289 }
290 
291 static void call_update_outputs(struct hda_codec *codec);
292 
293 /* select the given imux item; either unmute exclusively or select the route */
alc_mux_select(struct hda_codec * codec,unsigned int adc_idx,unsigned int idx,bool force)294 static int alc_mux_select(struct hda_codec *codec, unsigned int adc_idx,
295 			  unsigned int idx, bool force)
296 {
297 	struct alc_spec *spec = codec->spec;
298 	const struct hda_input_mux *imux;
299 	unsigned int mux_idx;
300 	int i, type, num_conns;
301 	hda_nid_t nid;
302 
303 	mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
304 	imux = &spec->input_mux[mux_idx];
305 	if (!imux->num_items && mux_idx > 0)
306 		imux = &spec->input_mux[0];
307 	if (!imux->num_items)
308 		return 0;
309 
310 	if (idx >= imux->num_items)
311 		idx = imux->num_items - 1;
312 	if (spec->cur_mux[adc_idx] == idx && !force)
313 		return 0;
314 	spec->cur_mux[adc_idx] = idx;
315 
316 	/* for shared I/O, change the pin-control accordingly */
317 	if (spec->shared_mic_hp) {
318 		/* NOTE: this assumes that there are only two inputs, the
319 		 * first is the real internal mic and the second is HP jack.
320 		 */
321 		snd_hda_codec_write(codec, spec->autocfg.inputs[1].pin, 0,
322 				    AC_VERB_SET_PIN_WIDGET_CONTROL,
323 				    spec->cur_mux[adc_idx] ?
324 				    PIN_VREF80 : PIN_HP);
325 		spec->automute_speaker = !spec->cur_mux[adc_idx];
326 		call_update_outputs(codec);
327 	}
328 
329 	if (spec->dyn_adc_switch) {
330 		alc_dyn_adc_pcm_resetup(codec, idx);
331 		adc_idx = spec->dyn_adc_idx[idx];
332 	}
333 
334 	nid = get_capsrc(spec, adc_idx);
335 
336 	/* no selection? */
337 	num_conns = snd_hda_get_conn_list(codec, nid, NULL);
338 	if (num_conns <= 1)
339 		return 1;
340 
341 	type = get_wcaps_type(get_wcaps(codec, nid));
342 	if (type == AC_WID_AUD_MIX) {
343 		/* Matrix-mixer style (e.g. ALC882) */
344 		int active = imux->items[idx].index;
345 		for (i = 0; i < num_conns; i++) {
346 			unsigned int v = (i == active) ? 0 : HDA_AMP_MUTE;
347 			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, i,
348 						 HDA_AMP_MUTE, v);
349 		}
350 	} else {
351 		/* MUX style (e.g. ALC880) */
352 		snd_hda_codec_write_cache(codec, nid, 0,
353 					  AC_VERB_SET_CONNECT_SEL,
354 					  imux->items[idx].index);
355 	}
356 	return 1;
357 }
358 
alc_mux_enum_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)359 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
360 			    struct snd_ctl_elem_value *ucontrol)
361 {
362 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
363 	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
364 	return alc_mux_select(codec, adc_idx,
365 			      ucontrol->value.enumerated.item[0], false);
366 }
367 
368 /*
369  * set up the input pin config (depending on the given auto-pin type)
370  */
alc_set_input_pin(struct hda_codec * codec,hda_nid_t nid,int auto_pin_type)371 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
372 			      int auto_pin_type)
373 {
374 	unsigned int val = PIN_IN;
375 
376 	if (auto_pin_type == AUTO_PIN_MIC) {
377 		unsigned int pincap;
378 		unsigned int oldval;
379 		oldval = snd_hda_codec_read(codec, nid, 0,
380 					    AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
381 		pincap = snd_hda_query_pin_caps(codec, nid);
382 		pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
383 		/* if the default pin setup is vref50, we give it priority */
384 		if ((pincap & AC_PINCAP_VREF_80) && oldval != PIN_VREF50)
385 			val = PIN_VREF80;
386 		else if (pincap & AC_PINCAP_VREF_50)
387 			val = PIN_VREF50;
388 		else if (pincap & AC_PINCAP_VREF_100)
389 			val = PIN_VREF100;
390 		else if (pincap & AC_PINCAP_VREF_GRD)
391 			val = PIN_VREFGRD;
392 	}
393 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
394 }
395 
396 /*
397  * Append the given mixer and verb elements for the later use
398  * The mixer array is referred in build_controls(), and init_verbs are
399  * called in init().
400  */
add_mixer(struct alc_spec * spec,const struct snd_kcontrol_new * mix)401 static void add_mixer(struct alc_spec *spec, const struct snd_kcontrol_new *mix)
402 {
403 	if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
404 		return;
405 	spec->mixers[spec->num_mixers++] = mix;
406 }
407 
add_verb(struct alc_spec * spec,const struct hda_verb * verb)408 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
409 {
410 	if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
411 		return;
412 	spec->init_verbs[spec->num_init_verbs++] = verb;
413 }
414 
415 /*
416  * GPIO setup tables, used in initialization
417  */
418 /* Enable GPIO mask and set output */
419 static const struct hda_verb alc_gpio1_init_verbs[] = {
420 	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
421 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
422 	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
423 	{ }
424 };
425 
426 static const struct hda_verb alc_gpio2_init_verbs[] = {
427 	{0x01, AC_VERB_SET_GPIO_MASK, 0x02},
428 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
429 	{0x01, AC_VERB_SET_GPIO_DATA, 0x02},
430 	{ }
431 };
432 
433 static const struct hda_verb alc_gpio3_init_verbs[] = {
434 	{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
435 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
436 	{0x01, AC_VERB_SET_GPIO_DATA, 0x03},
437 	{ }
438 };
439 
440 /*
441  * Fix hardware PLL issue
442  * On some codecs, the analog PLL gating control must be off while
443  * the default value is 1.
444  */
alc_fix_pll(struct hda_codec * codec)445 static void alc_fix_pll(struct hda_codec *codec)
446 {
447 	struct alc_spec *spec = codec->spec;
448 	unsigned int val;
449 
450 	if (!spec->pll_nid)
451 		return;
452 	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
453 			    spec->pll_coef_idx);
454 	val = snd_hda_codec_read(codec, spec->pll_nid, 0,
455 				 AC_VERB_GET_PROC_COEF, 0);
456 	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
457 			    spec->pll_coef_idx);
458 	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
459 			    val & ~(1 << spec->pll_coef_bit));
460 }
461 
alc_fix_pll_init(struct hda_codec * codec,hda_nid_t nid,unsigned int coef_idx,unsigned int coef_bit)462 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
463 			     unsigned int coef_idx, unsigned int coef_bit)
464 {
465 	struct alc_spec *spec = codec->spec;
466 	spec->pll_nid = nid;
467 	spec->pll_coef_idx = coef_idx;
468 	spec->pll_coef_bit = coef_bit;
469 	alc_fix_pll(codec);
470 }
471 
472 /*
473  * Jack detections for HP auto-mute and mic-switch
474  */
475 
476 /* check each pin in the given array; returns true if any of them is plugged */
detect_jacks(struct hda_codec * codec,int num_pins,hda_nid_t * pins)477 static bool detect_jacks(struct hda_codec *codec, int num_pins, hda_nid_t *pins)
478 {
479 	int i, present = 0;
480 
481 	for (i = 0; i < num_pins; i++) {
482 		hda_nid_t nid = pins[i];
483 		if (!nid)
484 			break;
485 		present |= snd_hda_jack_detect(codec, nid);
486 	}
487 	return present;
488 }
489 
490 /* standard HP/line-out auto-mute helper */
do_automute(struct hda_codec * codec,int num_pins,hda_nid_t * pins,bool mute,bool hp_out)491 static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins,
492 			bool mute, bool hp_out)
493 {
494 	struct alc_spec *spec = codec->spec;
495 	unsigned int mute_bits = mute ? HDA_AMP_MUTE : 0;
496 	unsigned int pin_bits = mute ? 0 : (hp_out ? PIN_HP : PIN_OUT);
497 	int i;
498 
499 	for (i = 0; i < num_pins; i++) {
500 		hda_nid_t nid = pins[i];
501 		unsigned int val;
502 		if (!nid)
503 			break;
504 		switch (spec->automute_mode) {
505 		case ALC_AUTOMUTE_PIN:
506 			/* don't reset VREF value in case it's controlling
507 			 * the amp (see alc861_fixup_asus_amp_vref_0f())
508 			 */
509 			if (spec->keep_vref_in_automute) {
510 				val = snd_hda_codec_read(codec, nid, 0,
511 					AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
512 				val &= ~PIN_HP;
513 			} else
514 				val = 0;
515 			val |= pin_bits;
516 			snd_hda_codec_write(codec, nid, 0,
517 					    AC_VERB_SET_PIN_WIDGET_CONTROL,
518 					    val);
519 			break;
520 		case ALC_AUTOMUTE_AMP:
521 			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
522 						 HDA_AMP_MUTE, mute_bits);
523 			break;
524 		case ALC_AUTOMUTE_MIXER:
525 			nid = spec->automute_mixer_nid[i];
526 			if (!nid)
527 				break;
528 			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
529 						 HDA_AMP_MUTE, mute_bits);
530 			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 1,
531 						 HDA_AMP_MUTE, mute_bits);
532 			break;
533 		}
534 	}
535 }
536 
537 /* Toggle outputs muting */
update_outputs(struct hda_codec * codec)538 static void update_outputs(struct hda_codec *codec)
539 {
540 	struct alc_spec *spec = codec->spec;
541 	int on;
542 
543 	/* Control HP pins/amps depending on master_mute state;
544 	 * in general, HP pins/amps control should be enabled in all cases,
545 	 * but currently set only for master_mute, just to be safe
546 	 */
547 	if (!spec->shared_mic_hp) /* don't change HP-pin when shared with mic */
548 		do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
549 		    spec->autocfg.hp_pins, spec->master_mute, true);
550 
551 	if (!spec->automute_speaker)
552 		on = 0;
553 	else
554 		on = spec->hp_jack_present | spec->line_jack_present;
555 	on |= spec->master_mute;
556 	do_automute(codec, ARRAY_SIZE(spec->autocfg.speaker_pins),
557 		    spec->autocfg.speaker_pins, on, false);
558 
559 	/* toggle line-out mutes if needed, too */
560 	/* if LO is a copy of either HP or Speaker, don't need to handle it */
561 	if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0] ||
562 	    spec->autocfg.line_out_pins[0] == spec->autocfg.speaker_pins[0])
563 		return;
564 	if (!spec->automute_lo)
565 		on = 0;
566 	else
567 		on = spec->hp_jack_present;
568 	on |= spec->master_mute;
569 	do_automute(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
570 		    spec->autocfg.line_out_pins, on, false);
571 }
572 
call_update_outputs(struct hda_codec * codec)573 static void call_update_outputs(struct hda_codec *codec)
574 {
575 	struct alc_spec *spec = codec->spec;
576 	if (spec->automute_hook)
577 		spec->automute_hook(codec);
578 	else
579 		update_outputs(codec);
580 }
581 
582 /* standard HP-automute helper */
alc_hp_automute(struct hda_codec * codec)583 static void alc_hp_automute(struct hda_codec *codec)
584 {
585 	struct alc_spec *spec = codec->spec;
586 
587 	spec->hp_jack_present =
588 		detect_jacks(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
589 			     spec->autocfg.hp_pins);
590 	if (!spec->detect_hp || (!spec->automute_speaker && !spec->automute_lo))
591 		return;
592 	call_update_outputs(codec);
593 }
594 
595 /* standard line-out-automute helper */
alc_line_automute(struct hda_codec * codec)596 static void alc_line_automute(struct hda_codec *codec)
597 {
598 	struct alc_spec *spec = codec->spec;
599 
600 	/* check LO jack only when it's different from HP */
601 	if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0])
602 		return;
603 
604 	spec->line_jack_present =
605 		detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
606 			     spec->autocfg.line_out_pins);
607 	if (!spec->automute_speaker || !spec->detect_lo)
608 		return;
609 	call_update_outputs(codec);
610 }
611 
612 #define get_connection_index(codec, mux, nid) \
613 	snd_hda_get_conn_index(codec, mux, nid, 0)
614 
615 /* standard mic auto-switch helper */
alc_mic_automute(struct hda_codec * codec)616 static void alc_mic_automute(struct hda_codec *codec)
617 {
618 	struct alc_spec *spec = codec->spec;
619 	hda_nid_t *pins = spec->imux_pins;
620 
621 	if (!spec->auto_mic || !spec->auto_mic_valid_imux)
622 		return;
623 	if (snd_BUG_ON(!spec->adc_nids))
624 		return;
625 	if (snd_BUG_ON(spec->int_mic_idx < 0 || spec->ext_mic_idx < 0))
626 		return;
627 
628 	if (snd_hda_jack_detect(codec, pins[spec->ext_mic_idx]))
629 		alc_mux_select(codec, 0, spec->ext_mic_idx, false);
630 	else if (spec->dock_mic_idx >= 0 &&
631 		   snd_hda_jack_detect(codec, pins[spec->dock_mic_idx]))
632 		alc_mux_select(codec, 0, spec->dock_mic_idx, false);
633 	else
634 		alc_mux_select(codec, 0, spec->int_mic_idx, false);
635 }
636 
637 /* handle the specified unsol action (ALC_XXX_EVENT) */
alc_exec_unsol_event(struct hda_codec * codec,int action)638 static void alc_exec_unsol_event(struct hda_codec *codec, int action)
639 {
640 	switch (action) {
641 	case ALC_HP_EVENT:
642 		alc_hp_automute(codec);
643 		break;
644 	case ALC_FRONT_EVENT:
645 		alc_line_automute(codec);
646 		break;
647 	case ALC_MIC_EVENT:
648 		alc_mic_automute(codec);
649 		break;
650 	}
651 	snd_hda_jack_report_sync(codec);
652 }
653 
654 /* unsolicited event for HP jack sensing */
alc_sku_unsol_event(struct hda_codec * codec,unsigned int res)655 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
656 {
657 	if (codec->vendor_id == 0x10ec0880)
658 		res >>= 28;
659 	else
660 		res >>= 26;
661 	res = snd_hda_jack_get_action(codec, res);
662 	alc_exec_unsol_event(codec, res);
663 }
664 
665 /* call init functions of standard auto-mute helpers */
alc_inithook(struct hda_codec * codec)666 static void alc_inithook(struct hda_codec *codec)
667 {
668 	alc_hp_automute(codec);
669 	alc_line_automute(codec);
670 	alc_mic_automute(codec);
671 }
672 
673 /* additional initialization for ALC888 variants */
alc888_coef_init(struct hda_codec * codec)674 static void alc888_coef_init(struct hda_codec *codec)
675 {
676 	unsigned int tmp;
677 
678 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
679 	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
680 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
681 	if ((tmp & 0xf0) == 0x20)
682 		/* alc888S-VC */
683 		snd_hda_codec_read(codec, 0x20, 0,
684 				   AC_VERB_SET_PROC_COEF, 0x830);
685 	 else
686 		 /* alc888-VB */
687 		 snd_hda_codec_read(codec, 0x20, 0,
688 				    AC_VERB_SET_PROC_COEF, 0x3030);
689 }
690 
691 /* additional initialization for ALC889 variants */
alc889_coef_init(struct hda_codec * codec)692 static void alc889_coef_init(struct hda_codec *codec)
693 {
694 	unsigned int tmp;
695 
696 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
697 	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
698 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
699 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
700 }
701 
702 /* turn on/off EAPD control (only if available) */
set_eapd(struct hda_codec * codec,hda_nid_t nid,int on)703 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
704 {
705 	if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
706 		return;
707 	if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
708 		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
709 				    on ? 2 : 0);
710 }
711 
712 /* turn on/off EAPD controls of the codec */
alc_auto_setup_eapd(struct hda_codec * codec,bool on)713 static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
714 {
715 	/* We currently only handle front, HP */
716 	static hda_nid_t pins[] = {
717 		0x0f, 0x10, 0x14, 0x15, 0
718 	};
719 	hda_nid_t *p;
720 	for (p = pins; *p; p++)
721 		set_eapd(codec, *p, on);
722 }
723 
724 /* generic shutup callback;
725  * just turning off EPAD and a little pause for avoiding pop-noise
726  */
alc_eapd_shutup(struct hda_codec * codec)727 static void alc_eapd_shutup(struct hda_codec *codec)
728 {
729 	alc_auto_setup_eapd(codec, false);
730 	msleep(200);
731 }
732 
733 /* generic EAPD initialization */
alc_auto_init_amp(struct hda_codec * codec,int type)734 static void alc_auto_init_amp(struct hda_codec *codec, int type)
735 {
736 	unsigned int tmp;
737 
738 	alc_auto_setup_eapd(codec, true);
739 	switch (type) {
740 	case ALC_INIT_GPIO1:
741 		snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
742 		break;
743 	case ALC_INIT_GPIO2:
744 		snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
745 		break;
746 	case ALC_INIT_GPIO3:
747 		snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
748 		break;
749 	case ALC_INIT_DEFAULT:
750 		switch (codec->vendor_id) {
751 		case 0x10ec0260:
752 			snd_hda_codec_write(codec, 0x1a, 0,
753 					    AC_VERB_SET_COEF_INDEX, 7);
754 			tmp = snd_hda_codec_read(codec, 0x1a, 0,
755 						 AC_VERB_GET_PROC_COEF, 0);
756 			snd_hda_codec_write(codec, 0x1a, 0,
757 					    AC_VERB_SET_COEF_INDEX, 7);
758 			snd_hda_codec_write(codec, 0x1a, 0,
759 					    AC_VERB_SET_PROC_COEF,
760 					    tmp | 0x2010);
761 			break;
762 		case 0x10ec0262:
763 		case 0x10ec0880:
764 		case 0x10ec0882:
765 		case 0x10ec0883:
766 		case 0x10ec0885:
767 		case 0x10ec0887:
768 		/*case 0x10ec0889:*/ /* this causes an SPDIF problem */
769 			alc889_coef_init(codec);
770 			break;
771 		case 0x10ec0888:
772 			alc888_coef_init(codec);
773 			break;
774 #if 0 /* XXX: This may cause the silent output on speaker on some machines */
775 		case 0x10ec0267:
776 		case 0x10ec0268:
777 			snd_hda_codec_write(codec, 0x20, 0,
778 					    AC_VERB_SET_COEF_INDEX, 7);
779 			tmp = snd_hda_codec_read(codec, 0x20, 0,
780 						 AC_VERB_GET_PROC_COEF, 0);
781 			snd_hda_codec_write(codec, 0x20, 0,
782 					    AC_VERB_SET_COEF_INDEX, 7);
783 			snd_hda_codec_write(codec, 0x20, 0,
784 					    AC_VERB_SET_PROC_COEF,
785 					    tmp | 0x3000);
786 			break;
787 #endif /* XXX */
788 		}
789 		break;
790 	}
791 }
792 
793 /*
794  * Auto-Mute mode mixer enum support
795  */
alc_automute_mode_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)796 static int alc_automute_mode_info(struct snd_kcontrol *kcontrol,
797 				  struct snd_ctl_elem_info *uinfo)
798 {
799 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
800 	struct alc_spec *spec = codec->spec;
801 	static const char * const texts2[] = {
802 		"Disabled", "Enabled"
803 	};
804 	static const char * const texts3[] = {
805 		"Disabled", "Speaker Only", "Line Out+Speaker"
806 	};
807 	const char * const *texts;
808 
809 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
810 	uinfo->count = 1;
811 	if (spec->automute_speaker_possible && spec->automute_lo_possible) {
812 		uinfo->value.enumerated.items = 3;
813 		texts = texts3;
814 	} else {
815 		uinfo->value.enumerated.items = 2;
816 		texts = texts2;
817 	}
818 	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
819 		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
820 	strcpy(uinfo->value.enumerated.name,
821 	       texts[uinfo->value.enumerated.item]);
822 	return 0;
823 }
824 
alc_automute_mode_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)825 static int alc_automute_mode_get(struct snd_kcontrol *kcontrol,
826 				 struct snd_ctl_elem_value *ucontrol)
827 {
828 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
829 	struct alc_spec *spec = codec->spec;
830 	unsigned int val = 0;
831 	if (spec->automute_speaker)
832 		val++;
833 	if (spec->automute_lo)
834 		val++;
835 
836 	ucontrol->value.enumerated.item[0] = val;
837 	return 0;
838 }
839 
alc_automute_mode_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)840 static int alc_automute_mode_put(struct snd_kcontrol *kcontrol,
841 				 struct snd_ctl_elem_value *ucontrol)
842 {
843 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
844 	struct alc_spec *spec = codec->spec;
845 
846 	switch (ucontrol->value.enumerated.item[0]) {
847 	case 0:
848 		if (!spec->automute_speaker && !spec->automute_lo)
849 			return 0;
850 		spec->automute_speaker = 0;
851 		spec->automute_lo = 0;
852 		break;
853 	case 1:
854 		if (spec->automute_speaker_possible) {
855 			if (!spec->automute_lo && spec->automute_speaker)
856 				return 0;
857 			spec->automute_speaker = 1;
858 			spec->automute_lo = 0;
859 		} else if (spec->automute_lo_possible) {
860 			if (spec->automute_lo)
861 				return 0;
862 			spec->automute_lo = 1;
863 		} else
864 			return -EINVAL;
865 		break;
866 	case 2:
867 		if (!spec->automute_lo_possible || !spec->automute_speaker_possible)
868 			return -EINVAL;
869 		if (spec->automute_speaker && spec->automute_lo)
870 			return 0;
871 		spec->automute_speaker = 1;
872 		spec->automute_lo = 1;
873 		break;
874 	default:
875 		return -EINVAL;
876 	}
877 	call_update_outputs(codec);
878 	return 1;
879 }
880 
881 static const struct snd_kcontrol_new alc_automute_mode_enum = {
882 	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
883 	.name = "Auto-Mute Mode",
884 	.info = alc_automute_mode_info,
885 	.get = alc_automute_mode_get,
886 	.put = alc_automute_mode_put,
887 };
888 
alc_kcontrol_new(struct alc_spec * spec)889 static struct snd_kcontrol_new *alc_kcontrol_new(struct alc_spec *spec)
890 {
891 	snd_array_init(&spec->kctls, sizeof(struct snd_kcontrol_new), 32);
892 	return snd_array_new(&spec->kctls);
893 }
894 
alc_add_automute_mode_enum(struct hda_codec * codec)895 static int alc_add_automute_mode_enum(struct hda_codec *codec)
896 {
897 	struct alc_spec *spec = codec->spec;
898 	struct snd_kcontrol_new *knew;
899 
900 	knew = alc_kcontrol_new(spec);
901 	if (!knew)
902 		return -ENOMEM;
903 	*knew = alc_automute_mode_enum;
904 	knew->name = kstrdup("Auto-Mute Mode", GFP_KERNEL);
905 	if (!knew->name)
906 		return -ENOMEM;
907 	return 0;
908 }
909 
910 /*
911  * Check the availability of HP/line-out auto-mute;
912  * Set up appropriately if really supported
913  */
alc_init_automute(struct hda_codec * codec)914 static void alc_init_automute(struct hda_codec *codec)
915 {
916 	struct alc_spec *spec = codec->spec;
917 	struct auto_pin_cfg *cfg = &spec->autocfg;
918 	int present = 0;
919 	int i;
920 
921 	if (cfg->hp_pins[0])
922 		present++;
923 	if (cfg->line_out_pins[0])
924 		present++;
925 	if (cfg->speaker_pins[0])
926 		present++;
927 	if (present < 2) /* need two different output types */
928 		return;
929 
930 	if (!cfg->speaker_pins[0] &&
931 	    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
932 		memcpy(cfg->speaker_pins, cfg->line_out_pins,
933 		       sizeof(cfg->speaker_pins));
934 		cfg->speaker_outs = cfg->line_outs;
935 	}
936 
937 	if (!cfg->hp_pins[0] &&
938 	    cfg->line_out_type == AUTO_PIN_HP_OUT) {
939 		memcpy(cfg->hp_pins, cfg->line_out_pins,
940 		       sizeof(cfg->hp_pins));
941 		cfg->hp_outs = cfg->line_outs;
942 	}
943 
944 	spec->automute_mode = ALC_AUTOMUTE_PIN;
945 
946 	for (i = 0; i < cfg->hp_outs; i++) {
947 		hda_nid_t nid = cfg->hp_pins[i];
948 		if (!is_jack_detectable(codec, nid))
949 			continue;
950 		snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
951 			    nid);
952 		snd_hda_jack_detect_enable(codec, nid, ALC_HP_EVENT);
953 		spec->detect_hp = 1;
954 	}
955 
956 	if (cfg->line_out_type == AUTO_PIN_LINE_OUT && cfg->line_outs) {
957 		if (cfg->speaker_outs)
958 			for (i = 0; i < cfg->line_outs; i++) {
959 				hda_nid_t nid = cfg->line_out_pins[i];
960 				if (!is_jack_detectable(codec, nid))
961 					continue;
962 				snd_printdd("realtek: Enable Line-Out "
963 					    "auto-muting on NID 0x%x\n", nid);
964 				snd_hda_jack_detect_enable(codec, nid,
965 							   ALC_FRONT_EVENT);
966 				spec->detect_lo = 1;
967 		}
968 		spec->automute_lo_possible = spec->detect_hp;
969 	}
970 
971 	spec->automute_speaker_possible = cfg->speaker_outs &&
972 		(spec->detect_hp || spec->detect_lo);
973 
974 	spec->automute_lo = spec->automute_lo_possible;
975 	spec->automute_speaker = spec->automute_speaker_possible;
976 
977 	if (spec->automute_speaker_possible || spec->automute_lo_possible) {
978 		/* create a control for automute mode */
979 		alc_add_automute_mode_enum(codec);
980 		spec->unsol_event = alc_sku_unsol_event;
981 	}
982 }
983 
984 /* return the position of NID in the list, or -1 if not found */
find_idx_in_nid_list(hda_nid_t nid,const hda_nid_t * list,int nums)985 static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
986 {
987 	int i;
988 	for (i = 0; i < nums; i++)
989 		if (list[i] == nid)
990 			return i;
991 	return -1;
992 }
993 
994 /* check whether dynamic ADC-switching is available */
alc_check_dyn_adc_switch(struct hda_codec * codec)995 static bool alc_check_dyn_adc_switch(struct hda_codec *codec)
996 {
997 	struct alc_spec *spec = codec->spec;
998 	struct hda_input_mux *imux = &spec->private_imux[0];
999 	int i, n, idx;
1000 	hda_nid_t cap, pin;
1001 
1002 	if (imux != spec->input_mux) /* no dynamic imux? */
1003 		return false;
1004 
1005 	for (n = 0; n < spec->num_adc_nids; n++) {
1006 		cap = spec->private_capsrc_nids[n];
1007 		for (i = 0; i < imux->num_items; i++) {
1008 			pin = spec->imux_pins[i];
1009 			if (!pin)
1010 				return false;
1011 			if (get_connection_index(codec, cap, pin) < 0)
1012 				break;
1013 		}
1014 		if (i >= imux->num_items)
1015 			return true; /* no ADC-switch is needed */
1016 	}
1017 
1018 	for (i = 0; i < imux->num_items; i++) {
1019 		pin = spec->imux_pins[i];
1020 		for (n = 0; n < spec->num_adc_nids; n++) {
1021 			cap = spec->private_capsrc_nids[n];
1022 			idx = get_connection_index(codec, cap, pin);
1023 			if (idx >= 0) {
1024 				imux->items[i].index = idx;
1025 				spec->dyn_adc_idx[i] = n;
1026 				break;
1027 			}
1028 		}
1029 	}
1030 
1031 	snd_printdd("realtek: enabling ADC switching\n");
1032 	spec->dyn_adc_switch = 1;
1033 	return true;
1034 }
1035 
1036 /* rebuild imux for matching with the given auto-mic pins (if not yet) */
alc_rebuild_imux_for_auto_mic(struct hda_codec * codec)1037 static bool alc_rebuild_imux_for_auto_mic(struct hda_codec *codec)
1038 {
1039 	struct alc_spec *spec = codec->spec;
1040 	struct hda_input_mux *imux;
1041 	static char * const texts[3] = {
1042 		"Mic", "Internal Mic", "Dock Mic"
1043 	};
1044 	int i;
1045 
1046 	if (!spec->auto_mic)
1047 		return false;
1048 	imux = &spec->private_imux[0];
1049 	if (spec->input_mux == imux)
1050 		return true;
1051 	spec->imux_pins[0] = spec->ext_mic_pin;
1052 	spec->imux_pins[1] = spec->int_mic_pin;
1053 	spec->imux_pins[2] = spec->dock_mic_pin;
1054 	for (i = 0; i < 3; i++) {
1055 		strcpy(imux->items[i].label, texts[i]);
1056 		if (spec->imux_pins[i]) {
1057 			hda_nid_t pin = spec->imux_pins[i];
1058 			int c;
1059 			for (c = 0; c < spec->num_adc_nids; c++) {
1060 				hda_nid_t cap = get_capsrc(spec, c);
1061 				int idx = get_connection_index(codec, cap, pin);
1062 				if (idx >= 0) {
1063 					imux->items[i].index = idx;
1064 					break;
1065 				}
1066 			}
1067 			imux->num_items = i + 1;
1068 		}
1069 	}
1070 	spec->num_mux_defs = 1;
1071 	spec->input_mux = imux;
1072 	return true;
1073 }
1074 
1075 /* check whether all auto-mic pins are valid; setup indices if OK */
alc_auto_mic_check_imux(struct hda_codec * codec)1076 static bool alc_auto_mic_check_imux(struct hda_codec *codec)
1077 {
1078 	struct alc_spec *spec = codec->spec;
1079 	const struct hda_input_mux *imux;
1080 
1081 	if (!spec->auto_mic)
1082 		return false;
1083 	if (spec->auto_mic_valid_imux)
1084 		return true; /* already checked */
1085 
1086 	/* fill up imux indices */
1087 	if (!alc_check_dyn_adc_switch(codec)) {
1088 		spec->auto_mic = 0;
1089 		return false;
1090 	}
1091 
1092 	imux = spec->input_mux;
1093 	spec->ext_mic_idx = find_idx_in_nid_list(spec->ext_mic_pin,
1094 					spec->imux_pins, imux->num_items);
1095 	spec->int_mic_idx = find_idx_in_nid_list(spec->int_mic_pin,
1096 					spec->imux_pins, imux->num_items);
1097 	spec->dock_mic_idx = find_idx_in_nid_list(spec->dock_mic_pin,
1098 					spec->imux_pins, imux->num_items);
1099 	if (spec->ext_mic_idx < 0 || spec->int_mic_idx < 0) {
1100 		spec->auto_mic = 0;
1101 		return false; /* no corresponding imux */
1102 	}
1103 
1104 	snd_hda_jack_detect_enable(codec, spec->ext_mic_pin, ALC_MIC_EVENT);
1105 	if (spec->dock_mic_pin)
1106 		snd_hda_jack_detect_enable(codec, spec->dock_mic_pin,
1107 					   ALC_MIC_EVENT);
1108 
1109 	spec->auto_mic_valid_imux = 1;
1110 	spec->auto_mic = 1;
1111 	return true;
1112 }
1113 
1114 /*
1115  * Check the availability of auto-mic switch;
1116  * Set up if really supported
1117  */
alc_init_auto_mic(struct hda_codec * codec)1118 static void alc_init_auto_mic(struct hda_codec *codec)
1119 {
1120 	struct alc_spec *spec = codec->spec;
1121 	struct auto_pin_cfg *cfg = &spec->autocfg;
1122 	hda_nid_t fixed, ext, dock;
1123 	int i;
1124 
1125 	if (spec->shared_mic_hp)
1126 		return; /* no auto-mic for the shared I/O */
1127 
1128 	spec->ext_mic_idx = spec->int_mic_idx = spec->dock_mic_idx = -1;
1129 
1130 	fixed = ext = dock = 0;
1131 	for (i = 0; i < cfg->num_inputs; i++) {
1132 		hda_nid_t nid = cfg->inputs[i].pin;
1133 		unsigned int defcfg;
1134 		defcfg = snd_hda_codec_get_pincfg(codec, nid);
1135 		switch (snd_hda_get_input_pin_attr(defcfg)) {
1136 		case INPUT_PIN_ATTR_INT:
1137 			if (fixed)
1138 				return; /* already occupied */
1139 			if (cfg->inputs[i].type != AUTO_PIN_MIC)
1140 				return; /* invalid type */
1141 			fixed = nid;
1142 			break;
1143 		case INPUT_PIN_ATTR_UNUSED:
1144 			return; /* invalid entry */
1145 		case INPUT_PIN_ATTR_DOCK:
1146 			if (dock)
1147 				return; /* already occupied */
1148 			if (cfg->inputs[i].type > AUTO_PIN_LINE_IN)
1149 				return; /* invalid type */
1150 			dock = nid;
1151 			break;
1152 		default:
1153 			if (ext)
1154 				return; /* already occupied */
1155 			if (cfg->inputs[i].type != AUTO_PIN_MIC)
1156 				return; /* invalid type */
1157 			ext = nid;
1158 			break;
1159 		}
1160 	}
1161 	if (!ext && dock) {
1162 		ext = dock;
1163 		dock = 0;
1164 	}
1165 	if (!ext || !fixed)
1166 		return;
1167 	if (!is_jack_detectable(codec, ext))
1168 		return; /* no unsol support */
1169 	if (dock && !is_jack_detectable(codec, dock))
1170 		return; /* no unsol support */
1171 
1172 	/* check imux indices */
1173 	spec->ext_mic_pin = ext;
1174 	spec->int_mic_pin = fixed;
1175 	spec->dock_mic_pin = dock;
1176 
1177 	spec->auto_mic = 1;
1178 	if (!alc_auto_mic_check_imux(codec))
1179 		return;
1180 
1181 	snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n",
1182 		    ext, fixed, dock);
1183 	spec->unsol_event = alc_sku_unsol_event;
1184 }
1185 
1186 /* check the availabilities of auto-mute and auto-mic switches */
alc_auto_check_switches(struct hda_codec * codec)1187 static void alc_auto_check_switches(struct hda_codec *codec)
1188 {
1189 	alc_init_automute(codec);
1190 	alc_init_auto_mic(codec);
1191 }
1192 
1193 /*
1194  * Realtek SSID verification
1195  */
1196 
1197 /* Could be any non-zero and even value. When used as fixup, tells
1198  * the driver to ignore any present sku defines.
1199  */
1200 #define ALC_FIXUP_SKU_IGNORE (2)
1201 
alc_auto_parse_customize_define(struct hda_codec * codec)1202 static int alc_auto_parse_customize_define(struct hda_codec *codec)
1203 {
1204 	unsigned int ass, tmp, i;
1205 	unsigned nid = 0;
1206 	struct alc_spec *spec = codec->spec;
1207 
1208 	spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
1209 
1210 	if (spec->cdefine.fixup) {
1211 		ass = spec->cdefine.sku_cfg;
1212 		if (ass == ALC_FIXUP_SKU_IGNORE)
1213 			return -1;
1214 		goto do_sku;
1215 	}
1216 
1217 	ass = codec->subsystem_id & 0xffff;
1218 	if (ass != codec->bus->pci->subsystem_device && (ass & 1))
1219 		goto do_sku;
1220 
1221 	nid = 0x1d;
1222 	if (codec->vendor_id == 0x10ec0260)
1223 		nid = 0x17;
1224 	ass = snd_hda_codec_get_pincfg(codec, nid);
1225 
1226 	if (!(ass & 1)) {
1227 		printk(KERN_INFO "hda_codec: %s: SKU not ready 0x%08x\n",
1228 		       codec->chip_name, ass);
1229 		return -1;
1230 	}
1231 
1232 	/* check sum */
1233 	tmp = 0;
1234 	for (i = 1; i < 16; i++) {
1235 		if ((ass >> i) & 1)
1236 			tmp++;
1237 	}
1238 	if (((ass >> 16) & 0xf) != tmp)
1239 		return -1;
1240 
1241 	spec->cdefine.port_connectivity = ass >> 30;
1242 	spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
1243 	spec->cdefine.check_sum = (ass >> 16) & 0xf;
1244 	spec->cdefine.customization = ass >> 8;
1245 do_sku:
1246 	spec->cdefine.sku_cfg = ass;
1247 	spec->cdefine.external_amp = (ass & 0x38) >> 3;
1248 	spec->cdefine.platform_type = (ass & 0x4) >> 2;
1249 	spec->cdefine.swap = (ass & 0x2) >> 1;
1250 	spec->cdefine.override = ass & 0x1;
1251 
1252 	snd_printd("SKU: Nid=0x%x sku_cfg=0x%08x\n",
1253 		   nid, spec->cdefine.sku_cfg);
1254 	snd_printd("SKU: port_connectivity=0x%x\n",
1255 		   spec->cdefine.port_connectivity);
1256 	snd_printd("SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
1257 	snd_printd("SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
1258 	snd_printd("SKU: customization=0x%08x\n", spec->cdefine.customization);
1259 	snd_printd("SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
1260 	snd_printd("SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
1261 	snd_printd("SKU: swap=0x%x\n", spec->cdefine.swap);
1262 	snd_printd("SKU: override=0x%x\n", spec->cdefine.override);
1263 
1264 	return 0;
1265 }
1266 
1267 /* return true if the given NID is found in the list */
found_in_nid_list(hda_nid_t nid,const hda_nid_t * list,int nums)1268 static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
1269 {
1270 	return find_idx_in_nid_list(nid, list, nums) >= 0;
1271 }
1272 
1273 /* check subsystem ID and set up device-specific initialization;
1274  * return 1 if initialized, 0 if invalid SSID
1275  */
1276 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1277  *	31 ~ 16 :	Manufacture ID
1278  *	15 ~ 8	:	SKU ID
1279  *	7  ~ 0	:	Assembly ID
1280  *	port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1281  */
alc_subsystem_id(struct hda_codec * codec,hda_nid_t porta,hda_nid_t porte,hda_nid_t portd,hda_nid_t porti)1282 static int alc_subsystem_id(struct hda_codec *codec,
1283 			    hda_nid_t porta, hda_nid_t porte,
1284 			    hda_nid_t portd, hda_nid_t porti)
1285 {
1286 	unsigned int ass, tmp, i;
1287 	unsigned nid;
1288 	struct alc_spec *spec = codec->spec;
1289 
1290 	if (spec->cdefine.fixup) {
1291 		ass = spec->cdefine.sku_cfg;
1292 		if (ass == ALC_FIXUP_SKU_IGNORE)
1293 			return 0;
1294 		goto do_sku;
1295 	}
1296 
1297 	ass = codec->subsystem_id & 0xffff;
1298 	if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1299 		goto do_sku;
1300 
1301 	/* invalid SSID, check the special NID pin defcfg instead */
1302 	/*
1303 	 * 31~30	: port connectivity
1304 	 * 29~21	: reserve
1305 	 * 20		: PCBEEP input
1306 	 * 19~16	: Check sum (15:1)
1307 	 * 15~1		: Custom
1308 	 * 0		: override
1309 	*/
1310 	nid = 0x1d;
1311 	if (codec->vendor_id == 0x10ec0260)
1312 		nid = 0x17;
1313 	ass = snd_hda_codec_get_pincfg(codec, nid);
1314 	snd_printd("realtek: No valid SSID, "
1315 		   "checking pincfg 0x%08x for NID 0x%x\n",
1316 		   ass, nid);
1317 	if (!(ass & 1))
1318 		return 0;
1319 	if ((ass >> 30) != 1)	/* no physical connection */
1320 		return 0;
1321 
1322 	/* check sum */
1323 	tmp = 0;
1324 	for (i = 1; i < 16; i++) {
1325 		if ((ass >> i) & 1)
1326 			tmp++;
1327 	}
1328 	if (((ass >> 16) & 0xf) != tmp)
1329 		return 0;
1330 do_sku:
1331 	snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1332 		   ass & 0xffff, codec->vendor_id);
1333 	/*
1334 	 * 0 : override
1335 	 * 1 :	Swap Jack
1336 	 * 2 : 0 --> Desktop, 1 --> Laptop
1337 	 * 3~5 : External Amplifier control
1338 	 * 7~6 : Reserved
1339 	*/
1340 	tmp = (ass & 0x38) >> 3;	/* external Amp control */
1341 	switch (tmp) {
1342 	case 1:
1343 		spec->init_amp = ALC_INIT_GPIO1;
1344 		break;
1345 	case 3:
1346 		spec->init_amp = ALC_INIT_GPIO2;
1347 		break;
1348 	case 7:
1349 		spec->init_amp = ALC_INIT_GPIO3;
1350 		break;
1351 	case 5:
1352 	default:
1353 		spec->init_amp = ALC_INIT_DEFAULT;
1354 		break;
1355 	}
1356 
1357 	/* is laptop or Desktop and enable the function "Mute internal speaker
1358 	 * when the external headphone out jack is plugged"
1359 	 */
1360 	if (!(ass & 0x8000))
1361 		return 1;
1362 	/*
1363 	 * 10~8 : Jack location
1364 	 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1365 	 * 14~13: Resvered
1366 	 * 15   : 1 --> enable the function "Mute internal speaker
1367 	 *	        when the external headphone out jack is plugged"
1368 	 */
1369 	if (!spec->autocfg.hp_pins[0] &&
1370 	    !(spec->autocfg.line_out_pins[0] &&
1371 	      spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)) {
1372 		hda_nid_t nid;
1373 		tmp = (ass >> 11) & 0x3;	/* HP to chassis */
1374 		if (tmp == 0)
1375 			nid = porta;
1376 		else if (tmp == 1)
1377 			nid = porte;
1378 		else if (tmp == 2)
1379 			nid = portd;
1380 		else if (tmp == 3)
1381 			nid = porti;
1382 		else
1383 			return 1;
1384 		if (found_in_nid_list(nid, spec->autocfg.line_out_pins,
1385 				      spec->autocfg.line_outs))
1386 			return 1;
1387 		spec->autocfg.hp_pins[0] = nid;
1388 	}
1389 	return 1;
1390 }
1391 
1392 /* Check the validity of ALC subsystem-id
1393  * ports contains an array of 4 pin NIDs for port-A, E, D and I */
alc_ssid_check(struct hda_codec * codec,const hda_nid_t * ports)1394 static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
1395 {
1396 	if (!alc_subsystem_id(codec, ports[0], ports[1], ports[2], ports[3])) {
1397 		struct alc_spec *spec = codec->spec;
1398 		snd_printd("realtek: "
1399 			   "Enable default setup for auto mode as fallback\n");
1400 		spec->init_amp = ALC_INIT_DEFAULT;
1401 	}
1402 }
1403 
1404 /*
1405  * Fix-up pin default configurations and add default verbs
1406  */
1407 
1408 struct alc_pincfg {
1409 	hda_nid_t nid;
1410 	u32 val;
1411 };
1412 
1413 struct alc_model_fixup {
1414 	const int id;
1415 	const char *name;
1416 };
1417 
1418 struct alc_fixup {
1419 	int type;
1420 	bool chained;
1421 	int chain_id;
1422 	union {
1423 		unsigned int sku;
1424 		const struct alc_pincfg *pins;
1425 		const struct hda_verb *verbs;
1426 		void (*func)(struct hda_codec *codec,
1427 			     const struct alc_fixup *fix,
1428 			     int action);
1429 	} v;
1430 };
1431 
1432 enum {
1433 	ALC_FIXUP_INVALID,
1434 	ALC_FIXUP_SKU,
1435 	ALC_FIXUP_PINS,
1436 	ALC_FIXUP_VERBS,
1437 	ALC_FIXUP_FUNC,
1438 };
1439 
1440 enum {
1441 	ALC_FIXUP_ACT_PRE_PROBE,
1442 	ALC_FIXUP_ACT_PROBE,
1443 	ALC_FIXUP_ACT_INIT,
1444 };
1445 
alc_apply_fixup(struct hda_codec * codec,int action)1446 static void alc_apply_fixup(struct hda_codec *codec, int action)
1447 {
1448 	struct alc_spec *spec = codec->spec;
1449 	int id = spec->fixup_id;
1450 #ifdef CONFIG_SND_DEBUG_VERBOSE
1451 	const char *modelname = spec->fixup_name;
1452 #endif
1453 	int depth = 0;
1454 
1455 	if (!spec->fixup_list)
1456 		return;
1457 
1458 	while (id >= 0) {
1459 		const struct alc_fixup *fix = spec->fixup_list + id;
1460 		const struct alc_pincfg *cfg;
1461 
1462 		switch (fix->type) {
1463 		case ALC_FIXUP_SKU:
1464 			if (action != ALC_FIXUP_ACT_PRE_PROBE || !fix->v.sku)
1465 				break;
1466 			snd_printdd(KERN_INFO "hda_codec: %s: "
1467 				    "Apply sku override for %s\n",
1468 				    codec->chip_name, modelname);
1469 			spec->cdefine.sku_cfg = fix->v.sku;
1470 			spec->cdefine.fixup = 1;
1471 			break;
1472 		case ALC_FIXUP_PINS:
1473 			cfg = fix->v.pins;
1474 			if (action != ALC_FIXUP_ACT_PRE_PROBE || !cfg)
1475 				break;
1476 			snd_printdd(KERN_INFO "hda_codec: %s: "
1477 				    "Apply pincfg for %s\n",
1478 				    codec->chip_name, modelname);
1479 			for (; cfg->nid; cfg++)
1480 				snd_hda_codec_set_pincfg(codec, cfg->nid,
1481 							 cfg->val);
1482 			break;
1483 		case ALC_FIXUP_VERBS:
1484 			if (action != ALC_FIXUP_ACT_PROBE || !fix->v.verbs)
1485 				break;
1486 			snd_printdd(KERN_INFO "hda_codec: %s: "
1487 				    "Apply fix-verbs for %s\n",
1488 				    codec->chip_name, modelname);
1489 			add_verb(codec->spec, fix->v.verbs);
1490 			break;
1491 		case ALC_FIXUP_FUNC:
1492 			if (!fix->v.func)
1493 				break;
1494 			snd_printdd(KERN_INFO "hda_codec: %s: "
1495 				    "Apply fix-func for %s\n",
1496 				    codec->chip_name, modelname);
1497 			fix->v.func(codec, fix, action);
1498 			break;
1499 		default:
1500 			snd_printk(KERN_ERR "hda_codec: %s: "
1501 				   "Invalid fixup type %d\n",
1502 				   codec->chip_name, fix->type);
1503 			break;
1504 		}
1505 		if (!fix->chained)
1506 			break;
1507 		if (++depth > 10)
1508 			break;
1509 		id = fix->chain_id;
1510 	}
1511 }
1512 
alc_pick_fixup(struct hda_codec * codec,const struct alc_model_fixup * models,const struct snd_pci_quirk * quirk,const struct alc_fixup * fixlist)1513 static void alc_pick_fixup(struct hda_codec *codec,
1514 			   const struct alc_model_fixup *models,
1515 			   const struct snd_pci_quirk *quirk,
1516 			   const struct alc_fixup *fixlist)
1517 {
1518 	struct alc_spec *spec = codec->spec;
1519 	const struct snd_pci_quirk *q;
1520 	int id = -1;
1521 	const char *name = NULL;
1522 
1523 	if (codec->modelname && models) {
1524 		while (models->name) {
1525 			if (!strcmp(codec->modelname, models->name)) {
1526 				id = models->id;
1527 				name = models->name;
1528 				break;
1529 			}
1530 			models++;
1531 		}
1532 	}
1533 	if (id < 0) {
1534 		q = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1535 		if (q) {
1536 			id = q->value;
1537 #ifdef CONFIG_SND_DEBUG_VERBOSE
1538 			name = q->name;
1539 #endif
1540 		}
1541 	}
1542 	if (id < 0) {
1543 		for (q = quirk; q->subvendor; q++) {
1544 			unsigned int vendorid =
1545 				q->subdevice | (q->subvendor << 16);
1546 			if (vendorid == codec->subsystem_id) {
1547 				id = q->value;
1548 #ifdef CONFIG_SND_DEBUG_VERBOSE
1549 				name = q->name;
1550 #endif
1551 				break;
1552 			}
1553 		}
1554 	}
1555 
1556 	spec->fixup_id = id;
1557 	if (id >= 0) {
1558 		spec->fixup_list = fixlist;
1559 		spec->fixup_name = name;
1560 	}
1561 }
1562 
1563 /*
1564  * COEF access helper functions
1565  */
alc_read_coef_idx(struct hda_codec * codec,unsigned int coef_idx)1566 static int alc_read_coef_idx(struct hda_codec *codec,
1567 			unsigned int coef_idx)
1568 {
1569 	unsigned int val;
1570 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1571 		    		coef_idx);
1572 	val = snd_hda_codec_read(codec, 0x20, 0,
1573 			 	AC_VERB_GET_PROC_COEF, 0);
1574 	return val;
1575 }
1576 
alc_write_coef_idx(struct hda_codec * codec,unsigned int coef_idx,unsigned int coef_val)1577 static void alc_write_coef_idx(struct hda_codec *codec, unsigned int coef_idx,
1578 							unsigned int coef_val)
1579 {
1580 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1581 			    coef_idx);
1582 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF,
1583 			    coef_val);
1584 }
1585 
1586 /* a special bypass for COEF 0; read the cached value at the second time */
alc_get_coef0(struct hda_codec * codec)1587 static unsigned int alc_get_coef0(struct hda_codec *codec)
1588 {
1589 	struct alc_spec *spec = codec->spec;
1590 	if (!spec->coef0)
1591 		spec->coef0 = alc_read_coef_idx(codec, 0);
1592 	return spec->coef0;
1593 }
1594 
1595 /*
1596  * Digital I/O handling
1597  */
1598 
1599 /* set right pin controls for digital I/O */
alc_auto_init_digital(struct hda_codec * codec)1600 static void alc_auto_init_digital(struct hda_codec *codec)
1601 {
1602 	struct alc_spec *spec = codec->spec;
1603 	int i;
1604 	hda_nid_t pin, dac;
1605 
1606 	for (i = 0; i < spec->autocfg.dig_outs; i++) {
1607 		pin = spec->autocfg.dig_out_pins[i];
1608 		if (!pin)
1609 			continue;
1610 		snd_hda_codec_write(codec, pin, 0,
1611 				    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
1612 		if (!i)
1613 			dac = spec->multiout.dig_out_nid;
1614 		else
1615 			dac = spec->slave_dig_outs[i - 1];
1616 		if (!dac || !(get_wcaps(codec, dac) & AC_WCAP_OUT_AMP))
1617 			continue;
1618 		snd_hda_codec_write(codec, dac, 0,
1619 				    AC_VERB_SET_AMP_GAIN_MUTE,
1620 				    AMP_OUT_UNMUTE);
1621 	}
1622 	pin = spec->autocfg.dig_in_pin;
1623 	if (pin)
1624 		snd_hda_codec_write(codec, pin, 0,
1625 				    AC_VERB_SET_PIN_WIDGET_CONTROL,
1626 				    PIN_IN);
1627 }
1628 
1629 /* parse digital I/Os and set up NIDs in BIOS auto-parse mode */
alc_auto_parse_digital(struct hda_codec * codec)1630 static void alc_auto_parse_digital(struct hda_codec *codec)
1631 {
1632 	struct alc_spec *spec = codec->spec;
1633 	int i, err, nums;
1634 	hda_nid_t dig_nid;
1635 
1636 	/* support multiple SPDIFs; the secondary is set up as a slave */
1637 	nums = 0;
1638 	for (i = 0; i < spec->autocfg.dig_outs; i++) {
1639 		hda_nid_t conn[4];
1640 		err = snd_hda_get_connections(codec,
1641 					      spec->autocfg.dig_out_pins[i],
1642 					      conn, ARRAY_SIZE(conn));
1643 		if (err <= 0)
1644 			continue;
1645 		dig_nid = conn[0]; /* assume the first element is audio-out */
1646 		if (!nums) {
1647 			spec->multiout.dig_out_nid = dig_nid;
1648 			spec->dig_out_type = spec->autocfg.dig_out_type[0];
1649 		} else {
1650 			spec->multiout.slave_dig_outs = spec->slave_dig_outs;
1651 			if (nums >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
1652 				break;
1653 			spec->slave_dig_outs[nums - 1] = dig_nid;
1654 		}
1655 		nums++;
1656 	}
1657 
1658 	if (spec->autocfg.dig_in_pin) {
1659 		dig_nid = codec->start_nid;
1660 		for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
1661 			unsigned int wcaps = get_wcaps(codec, dig_nid);
1662 			if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
1663 				continue;
1664 			if (!(wcaps & AC_WCAP_DIGITAL))
1665 				continue;
1666 			if (!(wcaps & AC_WCAP_CONN_LIST))
1667 				continue;
1668 			err = get_connection_index(codec, dig_nid,
1669 						   spec->autocfg.dig_in_pin);
1670 			if (err >= 0) {
1671 				spec->dig_in_nid = dig_nid;
1672 				break;
1673 			}
1674 		}
1675 	}
1676 }
1677 
1678 /*
1679  * capture mixer elements
1680  */
alc_cap_vol_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)1681 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
1682 			    struct snd_ctl_elem_info *uinfo)
1683 {
1684 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1685 	struct alc_spec *spec = codec->spec;
1686 	unsigned long val;
1687 	int err;
1688 
1689 	mutex_lock(&codec->control_mutex);
1690 	if (spec->vol_in_capsrc)
1691 		val = HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[0], 3, 0, HDA_OUTPUT);
1692 	else
1693 		val = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0, HDA_INPUT);
1694 	kcontrol->private_value = val;
1695 	err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
1696 	mutex_unlock(&codec->control_mutex);
1697 	return err;
1698 }
1699 
alc_cap_vol_tlv(struct snd_kcontrol * kcontrol,int op_flag,unsigned int size,unsigned int __user * tlv)1700 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1701 			   unsigned int size, unsigned int __user *tlv)
1702 {
1703 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1704 	struct alc_spec *spec = codec->spec;
1705 	unsigned long val;
1706 	int err;
1707 
1708 	mutex_lock(&codec->control_mutex);
1709 	if (spec->vol_in_capsrc)
1710 		val = HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[0], 3, 0, HDA_OUTPUT);
1711 	else
1712 		val = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0, HDA_INPUT);
1713 	kcontrol->private_value = val;
1714 	err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
1715 	mutex_unlock(&codec->control_mutex);
1716 	return err;
1717 }
1718 
1719 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
1720 			     struct snd_ctl_elem_value *ucontrol);
1721 
alc_cap_getput_caller(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol,getput_call_t func,bool check_adc_switch)1722 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
1723 				 struct snd_ctl_elem_value *ucontrol,
1724 				 getput_call_t func, bool check_adc_switch)
1725 {
1726 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1727 	struct alc_spec *spec = codec->spec;
1728 	int i, err = 0;
1729 
1730 	mutex_lock(&codec->control_mutex);
1731 	if (check_adc_switch && spec->dyn_adc_switch) {
1732 		for (i = 0; i < spec->num_adc_nids; i++) {
1733 			kcontrol->private_value =
1734 				HDA_COMPOSE_AMP_VAL(spec->adc_nids[i],
1735 						    3, 0, HDA_INPUT);
1736 			err = func(kcontrol, ucontrol);
1737 			if (err < 0)
1738 				goto error;
1739 		}
1740 	} else {
1741 		i = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1742 		if (spec->vol_in_capsrc)
1743 			kcontrol->private_value =
1744 				HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[i],
1745 						    3, 0, HDA_OUTPUT);
1746 		else
1747 			kcontrol->private_value =
1748 				HDA_COMPOSE_AMP_VAL(spec->adc_nids[i],
1749 						    3, 0, HDA_INPUT);
1750 		err = func(kcontrol, ucontrol);
1751 	}
1752  error:
1753 	mutex_unlock(&codec->control_mutex);
1754 	return err;
1755 }
1756 
alc_cap_vol_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1757 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
1758 			   struct snd_ctl_elem_value *ucontrol)
1759 {
1760 	return alc_cap_getput_caller(kcontrol, ucontrol,
1761 				     snd_hda_mixer_amp_volume_get, false);
1762 }
1763 
alc_cap_vol_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1764 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
1765 			   struct snd_ctl_elem_value *ucontrol)
1766 {
1767 	return alc_cap_getput_caller(kcontrol, ucontrol,
1768 				     snd_hda_mixer_amp_volume_put, true);
1769 }
1770 
1771 /* capture mixer elements */
1772 #define alc_cap_sw_info		snd_ctl_boolean_stereo_info
1773 
alc_cap_sw_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1774 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
1775 			  struct snd_ctl_elem_value *ucontrol)
1776 {
1777 	return alc_cap_getput_caller(kcontrol, ucontrol,
1778 				     snd_hda_mixer_amp_switch_get, false);
1779 }
1780 
alc_cap_sw_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1781 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
1782 			  struct snd_ctl_elem_value *ucontrol)
1783 {
1784 	return alc_cap_getput_caller(kcontrol, ucontrol,
1785 				     snd_hda_mixer_amp_switch_put, true);
1786 }
1787 
1788 #define _DEFINE_CAPMIX(num) \
1789 	{ \
1790 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1791 		.name = "Capture Switch", \
1792 		.access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
1793 		.count = num, \
1794 		.info = alc_cap_sw_info, \
1795 		.get = alc_cap_sw_get, \
1796 		.put = alc_cap_sw_put, \
1797 	}, \
1798 	{ \
1799 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1800 		.name = "Capture Volume", \
1801 		.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
1802 			   SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
1803 			   SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
1804 		.count = num, \
1805 		.info = alc_cap_vol_info, \
1806 		.get = alc_cap_vol_get, \
1807 		.put = alc_cap_vol_put, \
1808 		.tlv = { .c = alc_cap_vol_tlv }, \
1809 	}
1810 
1811 #define _DEFINE_CAPSRC(num) \
1812 	{ \
1813 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1814 		/* .name = "Capture Source", */ \
1815 		.name = "Input Source", \
1816 		.count = num, \
1817 		.info = alc_mux_enum_info, \
1818 		.get = alc_mux_enum_get, \
1819 		.put = alc_mux_enum_put, \
1820 	}
1821 
1822 #define DEFINE_CAPMIX(num) \
1823 static const struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
1824 	_DEFINE_CAPMIX(num),				      \
1825 	_DEFINE_CAPSRC(num),				      \
1826 	{ } /* end */					      \
1827 }
1828 
1829 #define DEFINE_CAPMIX_NOSRC(num) \
1830 static const struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
1831 	_DEFINE_CAPMIX(num),					    \
1832 	{ } /* end */						    \
1833 }
1834 
1835 /* up to three ADCs */
1836 DEFINE_CAPMIX(1);
1837 DEFINE_CAPMIX(2);
1838 DEFINE_CAPMIX(3);
1839 DEFINE_CAPMIX_NOSRC(1);
1840 DEFINE_CAPMIX_NOSRC(2);
1841 DEFINE_CAPMIX_NOSRC(3);
1842 
1843 /*
1844  * virtual master controls
1845  */
1846 
1847 /*
1848  * slave controls for virtual master
1849  */
1850 static const char * const alc_slave_vols[] = {
1851 	"Front Playback Volume",
1852 	"Surround Playback Volume",
1853 	"Center Playback Volume",
1854 	"LFE Playback Volume",
1855 	"Side Playback Volume",
1856 	"Headphone Playback Volume",
1857 	"Speaker Playback Volume",
1858 	"Mono Playback Volume",
1859 	"Line Out Playback Volume",
1860 	"CLFE Playback Volume",
1861 	"Bass Speaker Playback Volume",
1862 	"PCM Playback Volume",
1863 	NULL,
1864 };
1865 
1866 static const char * const alc_slave_sws[] = {
1867 	"Front Playback Switch",
1868 	"Surround Playback Switch",
1869 	"Center Playback Switch",
1870 	"LFE Playback Switch",
1871 	"Side Playback Switch",
1872 	"Headphone Playback Switch",
1873 	"Speaker Playback Switch",
1874 	"Mono Playback Switch",
1875 	"IEC958 Playback Switch",
1876 	"Line Out Playback Switch",
1877 	"CLFE Playback Switch",
1878 	"Bass Speaker Playback Switch",
1879 	"PCM Playback Switch",
1880 	NULL,
1881 };
1882 
1883 /*
1884  * build control elements
1885  */
1886 
1887 #define NID_MAPPING		(-1)
1888 
1889 #define SUBDEV_SPEAKER_		(0 << 6)
1890 #define SUBDEV_HP_		(1 << 6)
1891 #define SUBDEV_LINE_		(2 << 6)
1892 #define SUBDEV_SPEAKER(x)	(SUBDEV_SPEAKER_ | ((x) & 0x3f))
1893 #define SUBDEV_HP(x)		(SUBDEV_HP_ | ((x) & 0x3f))
1894 #define SUBDEV_LINE(x)		(SUBDEV_LINE_ | ((x) & 0x3f))
1895 
1896 static void alc_free_kctls(struct hda_codec *codec);
1897 
1898 #ifdef CONFIG_SND_HDA_INPUT_BEEP
1899 /* additional beep mixers; the actual parameters are overwritten at build */
1900 static const struct snd_kcontrol_new alc_beep_mixer[] = {
1901 	HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1902 	HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1903 	{ } /* end */
1904 };
1905 #endif
1906 
__alc_build_controls(struct hda_codec * codec)1907 static int __alc_build_controls(struct hda_codec *codec)
1908 {
1909 	struct alc_spec *spec = codec->spec;
1910 	struct snd_kcontrol *kctl = NULL;
1911 	const struct snd_kcontrol_new *knew;
1912 	int i, j, err;
1913 	unsigned int u;
1914 	hda_nid_t nid;
1915 
1916 	for (i = 0; i < spec->num_mixers; i++) {
1917 		err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
1918 		if (err < 0)
1919 			return err;
1920 	}
1921 	if (spec->cap_mixer) {
1922 		err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
1923 		if (err < 0)
1924 			return err;
1925 	}
1926 	if (spec->multiout.dig_out_nid) {
1927 		err = snd_hda_create_spdif_out_ctls(codec,
1928 						    spec->multiout.dig_out_nid,
1929 						    spec->multiout.dig_out_nid);
1930 		if (err < 0)
1931 			return err;
1932 		if (!spec->no_analog) {
1933 			err = snd_hda_create_spdif_share_sw(codec,
1934 							    &spec->multiout);
1935 			if (err < 0)
1936 				return err;
1937 			spec->multiout.share_spdif = 1;
1938 		}
1939 	}
1940 	if (spec->dig_in_nid) {
1941 		err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
1942 		if (err < 0)
1943 			return err;
1944 	}
1945 
1946 #ifdef CONFIG_SND_HDA_INPUT_BEEP
1947 	/* create beep controls if needed */
1948 	if (spec->beep_amp) {
1949 		const struct snd_kcontrol_new *knew;
1950 		for (knew = alc_beep_mixer; knew->name; knew++) {
1951 			struct snd_kcontrol *kctl;
1952 			kctl = snd_ctl_new1(knew, codec);
1953 			if (!kctl)
1954 				return -ENOMEM;
1955 			kctl->private_value = spec->beep_amp;
1956 			err = snd_hda_ctl_add(codec, 0, kctl);
1957 			if (err < 0)
1958 				return err;
1959 		}
1960 	}
1961 #endif
1962 
1963 	/* if we have no master control, let's create it */
1964 	if (!spec->no_analog &&
1965 	    !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
1966 		unsigned int vmaster_tlv[4];
1967 		snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
1968 					HDA_OUTPUT, vmaster_tlv);
1969 		err = snd_hda_add_vmaster(codec, "Master Playback Volume",
1970 					  vmaster_tlv, alc_slave_vols);
1971 		if (err < 0)
1972 			return err;
1973 	}
1974 	if (!spec->no_analog &&
1975 	    !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
1976 		err = snd_hda_add_vmaster(codec, "Master Playback Switch",
1977 					  NULL, alc_slave_sws);
1978 		if (err < 0)
1979 			return err;
1980 	}
1981 
1982 	/* assign Capture Source enums to NID */
1983 	if (spec->capsrc_nids || spec->adc_nids) {
1984 		kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
1985 		if (!kctl)
1986 			kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
1987 		for (i = 0; kctl && i < kctl->count; i++) {
1988 			err = snd_hda_add_nid(codec, kctl, i,
1989 					      get_capsrc(spec, i));
1990 			if (err < 0)
1991 				return err;
1992 		}
1993 	}
1994 	if (spec->cap_mixer && spec->adc_nids) {
1995 		const char *kname = kctl ? kctl->id.name : NULL;
1996 		for (knew = spec->cap_mixer; knew->name; knew++) {
1997 			if (kname && strcmp(knew->name, kname) == 0)
1998 				continue;
1999 			kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2000 			for (i = 0; kctl && i < kctl->count; i++) {
2001 				err = snd_hda_add_nid(codec, kctl, i,
2002 						      spec->adc_nids[i]);
2003 				if (err < 0)
2004 					return err;
2005 			}
2006 		}
2007 	}
2008 
2009 	/* other nid->control mapping */
2010 	for (i = 0; i < spec->num_mixers; i++) {
2011 		for (knew = spec->mixers[i]; knew->name; knew++) {
2012 			if (knew->iface != NID_MAPPING)
2013 				continue;
2014 			kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2015 			if (kctl == NULL)
2016 				continue;
2017 			u = knew->subdevice;
2018 			for (j = 0; j < 4; j++, u >>= 8) {
2019 				nid = u & 0x3f;
2020 				if (nid == 0)
2021 					continue;
2022 				switch (u & 0xc0) {
2023 				case SUBDEV_SPEAKER_:
2024 					nid = spec->autocfg.speaker_pins[nid];
2025 					break;
2026 				case SUBDEV_LINE_:
2027 					nid = spec->autocfg.line_out_pins[nid];
2028 					break;
2029 				case SUBDEV_HP_:
2030 					nid = spec->autocfg.hp_pins[nid];
2031 					break;
2032 				default:
2033 					continue;
2034 				}
2035 				err = snd_hda_add_nid(codec, kctl, 0, nid);
2036 				if (err < 0)
2037 					return err;
2038 			}
2039 			u = knew->private_value;
2040 			for (j = 0; j < 4; j++, u >>= 8) {
2041 				nid = u & 0xff;
2042 				if (nid == 0)
2043 					continue;
2044 				err = snd_hda_add_nid(codec, kctl, 0, nid);
2045 				if (err < 0)
2046 					return err;
2047 			}
2048 		}
2049 	}
2050 
2051 	alc_free_kctls(codec); /* no longer needed */
2052 
2053 	return 0;
2054 }
2055 
alc_build_controls(struct hda_codec * codec)2056 static int alc_build_controls(struct hda_codec *codec)
2057 {
2058 	struct alc_spec *spec = codec->spec;
2059 	int err = __alc_build_controls(codec);
2060 	if (err < 0)
2061 		return err;
2062 	return snd_hda_jack_add_kctls(codec, &spec->autocfg);
2063 }
2064 
2065 
2066 /*
2067  * Common callbacks
2068  */
2069 
2070 static void alc_init_special_input_src(struct hda_codec *codec);
2071 static int alc269_fill_coef(struct hda_codec *codec);
2072 
alc_init(struct hda_codec * codec)2073 static int alc_init(struct hda_codec *codec)
2074 {
2075 	struct alc_spec *spec = codec->spec;
2076 	unsigned int i;
2077 
2078 	if (codec->vendor_id == 0x10ec0269)
2079 		alc269_fill_coef(codec);
2080 
2081 	alc_fix_pll(codec);
2082 	alc_auto_init_amp(codec, spec->init_amp);
2083 
2084 	for (i = 0; i < spec->num_init_verbs; i++)
2085 		snd_hda_sequence_write(codec, spec->init_verbs[i]);
2086 	alc_init_special_input_src(codec);
2087 
2088 	if (spec->init_hook)
2089 		spec->init_hook(codec);
2090 
2091 	alc_apply_fixup(codec, ALC_FIXUP_ACT_INIT);
2092 
2093 	snd_hda_jack_report_sync(codec);
2094 
2095 	hda_call_check_power_status(codec, 0x01);
2096 	return 0;
2097 }
2098 
alc_unsol_event(struct hda_codec * codec,unsigned int res)2099 static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
2100 {
2101 	struct alc_spec *spec = codec->spec;
2102 
2103 	if (spec->unsol_event)
2104 		spec->unsol_event(codec, res);
2105 }
2106 
2107 #ifdef CONFIG_SND_HDA_POWER_SAVE
alc_check_power_status(struct hda_codec * codec,hda_nid_t nid)2108 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
2109 {
2110 	struct alc_spec *spec = codec->spec;
2111 	return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
2112 }
2113 #endif
2114 
2115 /*
2116  * Analog playback callbacks
2117  */
alc_playback_pcm_open(struct hda_pcm_stream * hinfo,struct hda_codec * codec,struct snd_pcm_substream * substream)2118 static int alc_playback_pcm_open(struct hda_pcm_stream *hinfo,
2119 				    struct hda_codec *codec,
2120 				    struct snd_pcm_substream *substream)
2121 {
2122 	struct alc_spec *spec = codec->spec;
2123 	return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
2124 					     hinfo);
2125 }
2126 
alc_playback_pcm_prepare(struct hda_pcm_stream * hinfo,struct hda_codec * codec,unsigned int stream_tag,unsigned int format,struct snd_pcm_substream * substream)2127 static int alc_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2128 				       struct hda_codec *codec,
2129 				       unsigned int stream_tag,
2130 				       unsigned int format,
2131 				       struct snd_pcm_substream *substream)
2132 {
2133 	struct alc_spec *spec = codec->spec;
2134 	return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
2135 						stream_tag, format, substream);
2136 }
2137 
alc_playback_pcm_cleanup(struct hda_pcm_stream * hinfo,struct hda_codec * codec,struct snd_pcm_substream * substream)2138 static int alc_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2139 				       struct hda_codec *codec,
2140 				       struct snd_pcm_substream *substream)
2141 {
2142 	struct alc_spec *spec = codec->spec;
2143 	return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
2144 }
2145 
2146 /*
2147  * Digital out
2148  */
alc_dig_playback_pcm_open(struct hda_pcm_stream * hinfo,struct hda_codec * codec,struct snd_pcm_substream * substream)2149 static int alc_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
2150 					struct hda_codec *codec,
2151 					struct snd_pcm_substream *substream)
2152 {
2153 	struct alc_spec *spec = codec->spec;
2154 	return snd_hda_multi_out_dig_open(codec, &spec->multiout);
2155 }
2156 
alc_dig_playback_pcm_prepare(struct hda_pcm_stream * hinfo,struct hda_codec * codec,unsigned int stream_tag,unsigned int format,struct snd_pcm_substream * substream)2157 static int alc_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2158 					   struct hda_codec *codec,
2159 					   unsigned int stream_tag,
2160 					   unsigned int format,
2161 					   struct snd_pcm_substream *substream)
2162 {
2163 	struct alc_spec *spec = codec->spec;
2164 	return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
2165 					     stream_tag, format, substream);
2166 }
2167 
alc_dig_playback_pcm_cleanup(struct hda_pcm_stream * hinfo,struct hda_codec * codec,struct snd_pcm_substream * substream)2168 static int alc_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2169 					   struct hda_codec *codec,
2170 					   struct snd_pcm_substream *substream)
2171 {
2172 	struct alc_spec *spec = codec->spec;
2173 	return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
2174 }
2175 
alc_dig_playback_pcm_close(struct hda_pcm_stream * hinfo,struct hda_codec * codec,struct snd_pcm_substream * substream)2176 static int alc_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
2177 					 struct hda_codec *codec,
2178 					 struct snd_pcm_substream *substream)
2179 {
2180 	struct alc_spec *spec = codec->spec;
2181 	return snd_hda_multi_out_dig_close(codec, &spec->multiout);
2182 }
2183 
2184 /*
2185  * Analog capture
2186  */
alc_alt_capture_pcm_prepare(struct hda_pcm_stream * hinfo,struct hda_codec * codec,unsigned int stream_tag,unsigned int format,struct snd_pcm_substream * substream)2187 static int alc_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
2188 				      struct hda_codec *codec,
2189 				      unsigned int stream_tag,
2190 				      unsigned int format,
2191 				      struct snd_pcm_substream *substream)
2192 {
2193 	struct alc_spec *spec = codec->spec;
2194 
2195 	snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
2196 				   stream_tag, 0, format);
2197 	return 0;
2198 }
2199 
alc_alt_capture_pcm_cleanup(struct hda_pcm_stream * hinfo,struct hda_codec * codec,struct snd_pcm_substream * substream)2200 static int alc_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
2201 				      struct hda_codec *codec,
2202 				      struct snd_pcm_substream *substream)
2203 {
2204 	struct alc_spec *spec = codec->spec;
2205 
2206 	snd_hda_codec_cleanup_stream(codec,
2207 				     spec->adc_nids[substream->number + 1]);
2208 	return 0;
2209 }
2210 
2211 /* analog capture with dynamic dual-adc changes */
dyn_adc_capture_pcm_prepare(struct hda_pcm_stream * hinfo,struct hda_codec * codec,unsigned int stream_tag,unsigned int format,struct snd_pcm_substream * substream)2212 static int dyn_adc_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
2213 				       struct hda_codec *codec,
2214 				       unsigned int stream_tag,
2215 				       unsigned int format,
2216 				       struct snd_pcm_substream *substream)
2217 {
2218 	struct alc_spec *spec = codec->spec;
2219 	spec->cur_adc = spec->adc_nids[spec->dyn_adc_idx[spec->cur_mux[0]]];
2220 	spec->cur_adc_stream_tag = stream_tag;
2221 	spec->cur_adc_format = format;
2222 	snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
2223 	return 0;
2224 }
2225 
dyn_adc_capture_pcm_cleanup(struct hda_pcm_stream * hinfo,struct hda_codec * codec,struct snd_pcm_substream * substream)2226 static int dyn_adc_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
2227 				       struct hda_codec *codec,
2228 				       struct snd_pcm_substream *substream)
2229 {
2230 	struct alc_spec *spec = codec->spec;
2231 	snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
2232 	spec->cur_adc = 0;
2233 	return 0;
2234 }
2235 
2236 static const struct hda_pcm_stream dyn_adc_pcm_analog_capture = {
2237 	.substreams = 1,
2238 	.channels_min = 2,
2239 	.channels_max = 2,
2240 	.nid = 0, /* fill later */
2241 	.ops = {
2242 		.prepare = dyn_adc_capture_pcm_prepare,
2243 		.cleanup = dyn_adc_capture_pcm_cleanup
2244 	},
2245 };
2246 
2247 /*
2248  */
2249 static const struct hda_pcm_stream alc_pcm_analog_playback = {
2250 	.substreams = 1,
2251 	.channels_min = 2,
2252 	.channels_max = 8,
2253 	/* NID is set in alc_build_pcms */
2254 	.ops = {
2255 		.open = alc_playback_pcm_open,
2256 		.prepare = alc_playback_pcm_prepare,
2257 		.cleanup = alc_playback_pcm_cleanup
2258 	},
2259 };
2260 
2261 static const struct hda_pcm_stream alc_pcm_analog_capture = {
2262 	.substreams = 1,
2263 	.channels_min = 2,
2264 	.channels_max = 2,
2265 	/* NID is set in alc_build_pcms */
2266 };
2267 
2268 static const struct hda_pcm_stream alc_pcm_analog_alt_playback = {
2269 	.substreams = 1,
2270 	.channels_min = 2,
2271 	.channels_max = 2,
2272 	/* NID is set in alc_build_pcms */
2273 };
2274 
2275 static const struct hda_pcm_stream alc_pcm_analog_alt_capture = {
2276 	.substreams = 2, /* can be overridden */
2277 	.channels_min = 2,
2278 	.channels_max = 2,
2279 	/* NID is set in alc_build_pcms */
2280 	.ops = {
2281 		.prepare = alc_alt_capture_pcm_prepare,
2282 		.cleanup = alc_alt_capture_pcm_cleanup
2283 	},
2284 };
2285 
2286 static const struct hda_pcm_stream alc_pcm_digital_playback = {
2287 	.substreams = 1,
2288 	.channels_min = 2,
2289 	.channels_max = 2,
2290 	/* NID is set in alc_build_pcms */
2291 	.ops = {
2292 		.open = alc_dig_playback_pcm_open,
2293 		.close = alc_dig_playback_pcm_close,
2294 		.prepare = alc_dig_playback_pcm_prepare,
2295 		.cleanup = alc_dig_playback_pcm_cleanup
2296 	},
2297 };
2298 
2299 static const struct hda_pcm_stream alc_pcm_digital_capture = {
2300 	.substreams = 1,
2301 	.channels_min = 2,
2302 	.channels_max = 2,
2303 	/* NID is set in alc_build_pcms */
2304 };
2305 
2306 /* Used by alc_build_pcms to flag that a PCM has no playback stream */
2307 static const struct hda_pcm_stream alc_pcm_null_stream = {
2308 	.substreams = 0,
2309 	.channels_min = 0,
2310 	.channels_max = 0,
2311 };
2312 
alc_build_pcms(struct hda_codec * codec)2313 static int alc_build_pcms(struct hda_codec *codec)
2314 {
2315 	struct alc_spec *spec = codec->spec;
2316 	struct hda_pcm *info = spec->pcm_rec;
2317 	const struct hda_pcm_stream *p;
2318 	bool have_multi_adcs;
2319 	int i;
2320 
2321 	codec->num_pcms = 1;
2322 	codec->pcm_info = info;
2323 
2324 	if (spec->no_analog)
2325 		goto skip_analog;
2326 
2327 	snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
2328 		 "%s Analog", codec->chip_name);
2329 	info->name = spec->stream_name_analog;
2330 
2331 	if (spec->multiout.num_dacs > 0) {
2332 		p = spec->stream_analog_playback;
2333 		if (!p)
2334 			p = &alc_pcm_analog_playback;
2335 		info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
2336 		info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
2337 	}
2338 	if (spec->adc_nids) {
2339 		p = spec->stream_analog_capture;
2340 		if (!p) {
2341 			if (spec->dyn_adc_switch)
2342 				p = &dyn_adc_pcm_analog_capture;
2343 			else
2344 				p = &alc_pcm_analog_capture;
2345 		}
2346 		info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
2347 		info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
2348 	}
2349 
2350 	if (spec->channel_mode) {
2351 		info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
2352 		for (i = 0; i < spec->num_channel_mode; i++) {
2353 			if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
2354 				info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
2355 			}
2356 		}
2357 	}
2358 
2359  skip_analog:
2360 	/* SPDIF for stream index #1 */
2361 	if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
2362 		snprintf(spec->stream_name_digital,
2363 			 sizeof(spec->stream_name_digital),
2364 			 "%s Digital", codec->chip_name);
2365 		codec->num_pcms = 2;
2366 	        codec->slave_dig_outs = spec->multiout.slave_dig_outs;
2367 		info = spec->pcm_rec + 1;
2368 		info->name = spec->stream_name_digital;
2369 		if (spec->dig_out_type)
2370 			info->pcm_type = spec->dig_out_type;
2371 		else
2372 			info->pcm_type = HDA_PCM_TYPE_SPDIF;
2373 		if (spec->multiout.dig_out_nid) {
2374 			p = spec->stream_digital_playback;
2375 			if (!p)
2376 				p = &alc_pcm_digital_playback;
2377 			info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
2378 			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
2379 		}
2380 		if (spec->dig_in_nid) {
2381 			p = spec->stream_digital_capture;
2382 			if (!p)
2383 				p = &alc_pcm_digital_capture;
2384 			info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
2385 			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
2386 		}
2387 		/* FIXME: do we need this for all Realtek codec models? */
2388 		codec->spdif_status_reset = 1;
2389 	}
2390 
2391 	if (spec->no_analog)
2392 		return 0;
2393 
2394 	/* If the use of more than one ADC is requested for the current
2395 	 * model, configure a second analog capture-only PCM.
2396 	 */
2397 	have_multi_adcs = (spec->num_adc_nids > 1) &&
2398 		!spec->dyn_adc_switch && !spec->auto_mic &&
2399 		(!spec->input_mux || spec->input_mux->num_items > 1);
2400 	/* Additional Analaog capture for index #2 */
2401 	if (spec->alt_dac_nid || have_multi_adcs) {
2402 		codec->num_pcms = 3;
2403 		info = spec->pcm_rec + 2;
2404 		info->name = spec->stream_name_analog;
2405 		if (spec->alt_dac_nid) {
2406 			p = spec->stream_analog_alt_playback;
2407 			if (!p)
2408 				p = &alc_pcm_analog_alt_playback;
2409 			info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
2410 			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
2411 				spec->alt_dac_nid;
2412 		} else {
2413 			info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
2414 				alc_pcm_null_stream;
2415 			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
2416 		}
2417 		if (have_multi_adcs) {
2418 			p = spec->stream_analog_alt_capture;
2419 			if (!p)
2420 				p = &alc_pcm_analog_alt_capture;
2421 			info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
2422 			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
2423 				spec->adc_nids[1];
2424 			info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
2425 				spec->num_adc_nids - 1;
2426 		} else {
2427 			info->stream[SNDRV_PCM_STREAM_CAPTURE] =
2428 				alc_pcm_null_stream;
2429 			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
2430 		}
2431 	}
2432 
2433 	return 0;
2434 }
2435 
alc_shutup(struct hda_codec * codec)2436 static inline void alc_shutup(struct hda_codec *codec)
2437 {
2438 	struct alc_spec *spec = codec->spec;
2439 
2440 	if (spec && spec->shutup)
2441 		spec->shutup(codec);
2442 	snd_hda_shutup_pins(codec);
2443 }
2444 
alc_free_kctls(struct hda_codec * codec)2445 static void alc_free_kctls(struct hda_codec *codec)
2446 {
2447 	struct alc_spec *spec = codec->spec;
2448 
2449 	if (spec->kctls.list) {
2450 		struct snd_kcontrol_new *kctl = spec->kctls.list;
2451 		int i;
2452 		for (i = 0; i < spec->kctls.used; i++)
2453 			kfree(kctl[i].name);
2454 	}
2455 	snd_array_free(&spec->kctls);
2456 }
2457 
alc_free_bind_ctls(struct hda_codec * codec)2458 static void alc_free_bind_ctls(struct hda_codec *codec)
2459 {
2460 	struct alc_spec *spec = codec->spec;
2461 	if (spec->bind_ctls.list) {
2462 		struct hda_bind_ctls **ctl = spec->bind_ctls.list;
2463 		int i;
2464 		for (i = 0; i < spec->bind_ctls.used; i++)
2465 			kfree(ctl[i]);
2466 	}
2467 	snd_array_free(&spec->bind_ctls);
2468 }
2469 
alc_free(struct hda_codec * codec)2470 static void alc_free(struct hda_codec *codec)
2471 {
2472 	struct alc_spec *spec = codec->spec;
2473 
2474 	if (!spec)
2475 		return;
2476 
2477 	alc_shutup(codec);
2478 	alc_free_kctls(codec);
2479 	alc_free_bind_ctls(codec);
2480 	kfree(spec);
2481 	snd_hda_detach_beep_device(codec);
2482 }
2483 
2484 #ifdef CONFIG_SND_HDA_POWER_SAVE
alc_power_eapd(struct hda_codec * codec)2485 static void alc_power_eapd(struct hda_codec *codec)
2486 {
2487 	alc_auto_setup_eapd(codec, false);
2488 }
2489 
alc_suspend(struct hda_codec * codec,pm_message_t state)2490 static int alc_suspend(struct hda_codec *codec, pm_message_t state)
2491 {
2492 	struct alc_spec *spec = codec->spec;
2493 	alc_shutup(codec);
2494 	if (spec && spec->power_hook)
2495 		spec->power_hook(codec);
2496 	return 0;
2497 }
2498 #endif
2499 
2500 #ifdef CONFIG_PM
alc_resume(struct hda_codec * codec)2501 static int alc_resume(struct hda_codec *codec)
2502 {
2503 	msleep(150); /* to avoid pop noise */
2504 	codec->patch_ops.init(codec);
2505 	snd_hda_codec_resume_amp(codec);
2506 	snd_hda_codec_resume_cache(codec);
2507 	hda_call_check_power_status(codec, 0x01);
2508 	return 0;
2509 }
2510 #endif
2511 
2512 /*
2513  */
2514 static const struct hda_codec_ops alc_patch_ops = {
2515 	.build_controls = alc_build_controls,
2516 	.build_pcms = alc_build_pcms,
2517 	.init = alc_init,
2518 	.free = alc_free,
2519 	.unsol_event = alc_unsol_event,
2520 #ifdef CONFIG_PM
2521 	.resume = alc_resume,
2522 #endif
2523 #ifdef CONFIG_SND_HDA_POWER_SAVE
2524 	.suspend = alc_suspend,
2525 	.check_power_status = alc_check_power_status,
2526 #endif
2527 	.reboot_notify = alc_shutup,
2528 };
2529 
2530 /* replace the codec chip_name with the given string */
alc_codec_rename(struct hda_codec * codec,const char * name)2531 static int alc_codec_rename(struct hda_codec *codec, const char *name)
2532 {
2533 	kfree(codec->chip_name);
2534 	codec->chip_name = kstrdup(name, GFP_KERNEL);
2535 	if (!codec->chip_name) {
2536 		alc_free(codec);
2537 		return -ENOMEM;
2538 	}
2539 	return 0;
2540 }
2541 
2542 /*
2543  * Rename codecs appropriately from COEF value
2544  */
2545 struct alc_codec_rename_table {
2546 	unsigned int vendor_id;
2547 	unsigned short coef_mask;
2548 	unsigned short coef_bits;
2549 	const char *name;
2550 };
2551 
2552 static struct alc_codec_rename_table rename_tbl[] = {
2553 	{ 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
2554 	{ 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
2555 	{ 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
2556 	{ 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
2557 	{ 0x10ec0269, 0xffff, 0xa023, "ALC259" },
2558 	{ 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
2559 	{ 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
2560 	{ 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
2561 	{ 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
2562 	{ 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
2563 	{ 0x10ec0899, 0x2000, 0x2000, "ALC899" },
2564 	{ 0x10ec0892, 0xffff, 0x8020, "ALC661" },
2565 	{ 0x10ec0892, 0xffff, 0x8011, "ALC661" },
2566 	{ 0x10ec0892, 0xffff, 0x4011, "ALC656" },
2567 	{ } /* terminator */
2568 };
2569 
alc_codec_rename_from_preset(struct hda_codec * codec)2570 static int alc_codec_rename_from_preset(struct hda_codec *codec)
2571 {
2572 	const struct alc_codec_rename_table *p;
2573 
2574 	for (p = rename_tbl; p->vendor_id; p++) {
2575 		if (p->vendor_id != codec->vendor_id)
2576 			continue;
2577 		if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
2578 			return alc_codec_rename(codec, p->name);
2579 	}
2580 	return 0;
2581 }
2582 
2583 /*
2584  * Automatic parse of I/O pins from the BIOS configuration
2585  */
2586 
2587 enum {
2588 	ALC_CTL_WIDGET_VOL,
2589 	ALC_CTL_WIDGET_MUTE,
2590 	ALC_CTL_BIND_MUTE,
2591 	ALC_CTL_BIND_VOL,
2592 	ALC_CTL_BIND_SW,
2593 };
2594 static const struct snd_kcontrol_new alc_control_templates[] = {
2595 	HDA_CODEC_VOLUME(NULL, 0, 0, 0),
2596 	HDA_CODEC_MUTE(NULL, 0, 0, 0),
2597 	HDA_BIND_MUTE(NULL, 0, 0, 0),
2598 	HDA_BIND_VOL(NULL, 0),
2599 	HDA_BIND_SW(NULL, 0),
2600 };
2601 
2602 /* add dynamic controls */
add_control(struct alc_spec * spec,int type,const char * name,int cidx,unsigned long val)2603 static int add_control(struct alc_spec *spec, int type, const char *name,
2604 		       int cidx, unsigned long val)
2605 {
2606 	struct snd_kcontrol_new *knew;
2607 
2608 	knew = alc_kcontrol_new(spec);
2609 	if (!knew)
2610 		return -ENOMEM;
2611 	*knew = alc_control_templates[type];
2612 	knew->name = kstrdup(name, GFP_KERNEL);
2613 	if (!knew->name)
2614 		return -ENOMEM;
2615 	knew->index = cidx;
2616 	if (get_amp_nid_(val))
2617 		knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2618 	knew->private_value = val;
2619 	return 0;
2620 }
2621 
add_control_with_pfx(struct alc_spec * spec,int type,const char * pfx,const char * dir,const char * sfx,int cidx,unsigned long val)2622 static int add_control_with_pfx(struct alc_spec *spec, int type,
2623 				const char *pfx, const char *dir,
2624 				const char *sfx, int cidx, unsigned long val)
2625 {
2626 	char name[32];
2627 	snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
2628 	return add_control(spec, type, name, cidx, val);
2629 }
2630 
2631 #define add_pb_vol_ctrl(spec, type, pfx, val)			\
2632 	add_control_with_pfx(spec, type, pfx, "Playback", "Volume", 0, val)
2633 #define add_pb_sw_ctrl(spec, type, pfx, val)			\
2634 	add_control_with_pfx(spec, type, pfx, "Playback", "Switch", 0, val)
2635 #define __add_pb_vol_ctrl(spec, type, pfx, cidx, val)			\
2636 	add_control_with_pfx(spec, type, pfx, "Playback", "Volume", cidx, val)
2637 #define __add_pb_sw_ctrl(spec, type, pfx, cidx, val)			\
2638 	add_control_with_pfx(spec, type, pfx, "Playback", "Switch", cidx, val)
2639 
2640 static const char * const channel_name[4] = {
2641 	"Front", "Surround", "CLFE", "Side"
2642 };
2643 
alc_get_line_out_pfx(struct alc_spec * spec,int ch,bool can_be_master,int * index)2644 static const char *alc_get_line_out_pfx(struct alc_spec *spec, int ch,
2645 					bool can_be_master, int *index)
2646 {
2647 	struct auto_pin_cfg *cfg = &spec->autocfg;
2648 
2649 	*index = 0;
2650 	if (cfg->line_outs == 1 && !spec->multi_ios &&
2651 	    !cfg->hp_outs && !cfg->speaker_outs && can_be_master)
2652 		return "Master";
2653 
2654 	switch (cfg->line_out_type) {
2655 	case AUTO_PIN_SPEAKER_OUT:
2656 		if (cfg->line_outs == 1)
2657 			return "Speaker";
2658 		if (cfg->line_outs == 2)
2659 			return ch ? "Bass Speaker" : "Speaker";
2660 		break;
2661 	case AUTO_PIN_HP_OUT:
2662 		/* for multi-io case, only the primary out */
2663 		if (ch && spec->multi_ios)
2664 			break;
2665 		*index = ch;
2666 		return "Headphone";
2667 	default:
2668 		if (cfg->line_outs == 1 && !spec->multi_ios)
2669 			return "PCM";
2670 		break;
2671 	}
2672 	if (snd_BUG_ON(ch >= ARRAY_SIZE(channel_name)))
2673 		return "PCM";
2674 
2675 	return channel_name[ch];
2676 }
2677 
2678 /* create input playback/capture controls for the given pin */
new_analog_input(struct alc_spec * spec,hda_nid_t pin,const char * ctlname,int ctlidx,int idx,hda_nid_t mix_nid)2679 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
2680 			    const char *ctlname, int ctlidx,
2681 			    int idx, hda_nid_t mix_nid)
2682 {
2683 	int err;
2684 
2685 	err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname, ctlidx,
2686 			  HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
2687 	if (err < 0)
2688 		return err;
2689 	err = __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, ctlidx,
2690 			  HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
2691 	if (err < 0)
2692 		return err;
2693 	return 0;
2694 }
2695 
alc_is_input_pin(struct hda_codec * codec,hda_nid_t nid)2696 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
2697 {
2698 	unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
2699 	return (pincap & AC_PINCAP_IN) != 0;
2700 }
2701 
2702 /* Parse the codec tree and retrieve ADCs and corresponding capsrc MUXs */
alc_auto_fill_adc_caps(struct hda_codec * codec)2703 static int alc_auto_fill_adc_caps(struct hda_codec *codec)
2704 {
2705 	struct alc_spec *spec = codec->spec;
2706 	hda_nid_t nid;
2707 	hda_nid_t *adc_nids = spec->private_adc_nids;
2708 	hda_nid_t *cap_nids = spec->private_capsrc_nids;
2709 	int max_nums = ARRAY_SIZE(spec->private_adc_nids);
2710 	int i, nums = 0;
2711 
2712 	if (spec->shared_mic_hp)
2713 		max_nums = 1; /* no multi streams with the shared HP/mic */
2714 
2715 	nid = codec->start_nid;
2716 	for (i = 0; i < codec->num_nodes; i++, nid++) {
2717 		hda_nid_t src;
2718 		const hda_nid_t *list;
2719 		unsigned int caps = get_wcaps(codec, nid);
2720 		int type = get_wcaps_type(caps);
2721 
2722 		if (type != AC_WID_AUD_IN || (caps & AC_WCAP_DIGITAL))
2723 			continue;
2724 		adc_nids[nums] = nid;
2725 		cap_nids[nums] = nid;
2726 		src = nid;
2727 		for (;;) {
2728 			int n;
2729 			type = get_wcaps_type(get_wcaps(codec, src));
2730 			if (type == AC_WID_PIN)
2731 				break;
2732 			if (type == AC_WID_AUD_SEL) {
2733 				cap_nids[nums] = src;
2734 				break;
2735 			}
2736 			n = snd_hda_get_conn_list(codec, src, &list);
2737 			if (n > 1) {
2738 				cap_nids[nums] = src;
2739 				break;
2740 			} else if (n != 1)
2741 				break;
2742 			src = *list;
2743 		}
2744 		if (++nums >= max_nums)
2745 			break;
2746 	}
2747 	spec->adc_nids = spec->private_adc_nids;
2748 	spec->capsrc_nids = spec->private_capsrc_nids;
2749 	spec->num_adc_nids = nums;
2750 	return nums;
2751 }
2752 
2753 /* create playback/capture controls for input pins */
alc_auto_create_input_ctls(struct hda_codec * codec)2754 static int alc_auto_create_input_ctls(struct hda_codec *codec)
2755 {
2756 	struct alc_spec *spec = codec->spec;
2757 	const struct auto_pin_cfg *cfg = &spec->autocfg;
2758 	hda_nid_t mixer = spec->mixer_nid;
2759 	struct hda_input_mux *imux = &spec->private_imux[0];
2760 	int num_adcs;
2761 	int i, c, err, idx, type_idx = 0;
2762 	const char *prev_label = NULL;
2763 
2764 	num_adcs = alc_auto_fill_adc_caps(codec);
2765 	if (num_adcs < 0)
2766 		return 0;
2767 
2768 	for (i = 0; i < cfg->num_inputs; i++) {
2769 		hda_nid_t pin;
2770 		const char *label;
2771 
2772 		pin = cfg->inputs[i].pin;
2773 		if (!alc_is_input_pin(codec, pin))
2774 			continue;
2775 
2776 		label = hda_get_autocfg_input_label(codec, cfg, i);
2777 		if (spec->shared_mic_hp && !strcmp(label, "Misc"))
2778 			label = "Headphone Mic";
2779 		if (prev_label && !strcmp(label, prev_label))
2780 			type_idx++;
2781 		else
2782 			type_idx = 0;
2783 		prev_label = label;
2784 
2785 		if (mixer) {
2786 			idx = get_connection_index(codec, mixer, pin);
2787 			if (idx >= 0) {
2788 				err = new_analog_input(spec, pin,
2789 						       label, type_idx,
2790 						       idx, mixer);
2791 				if (err < 0)
2792 					return err;
2793 			}
2794 		}
2795 
2796 		for (c = 0; c < num_adcs; c++) {
2797 			hda_nid_t cap = get_capsrc(spec, c);
2798 			idx = get_connection_index(codec, cap, pin);
2799 			if (idx >= 0) {
2800 				spec->imux_pins[imux->num_items] = pin;
2801 				snd_hda_add_imux_item(imux, label, idx, NULL);
2802 				break;
2803 			}
2804 		}
2805 	}
2806 
2807 	spec->num_mux_defs = 1;
2808 	spec->input_mux = imux;
2809 
2810 	return 0;
2811 }
2812 
2813 /* create a shared input with the headphone out */
alc_auto_create_shared_input(struct hda_codec * codec)2814 static int alc_auto_create_shared_input(struct hda_codec *codec)
2815 {
2816 	struct alc_spec *spec = codec->spec;
2817 	struct auto_pin_cfg *cfg = &spec->autocfg;
2818 	unsigned int defcfg;
2819 	hda_nid_t nid;
2820 
2821 	/* only one internal input pin? */
2822 	if (cfg->num_inputs != 1)
2823 		return 0;
2824 	defcfg = snd_hda_codec_get_pincfg(codec, cfg->inputs[0].pin);
2825 	if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
2826 		return 0;
2827 
2828 	if (cfg->hp_outs == 1 && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
2829 		nid = cfg->hp_pins[0]; /* OK, we have a single HP-out */
2830 	else if (cfg->line_outs == 1 && cfg->line_out_type == AUTO_PIN_HP_OUT)
2831 		nid = cfg->line_out_pins[0]; /* OK, we have a single line-out */
2832 	else
2833 		return 0; /* both not available */
2834 
2835 	if (!(snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_IN))
2836 		return 0; /* no input */
2837 
2838 	cfg->inputs[1].pin = nid;
2839 	cfg->inputs[1].type = AUTO_PIN_MIC;
2840 	cfg->num_inputs = 2;
2841 	spec->shared_mic_hp = 1;
2842 	snd_printdd("realtek: Enable shared I/O jack on NID 0x%x\n", nid);
2843 	return 0;
2844 }
2845 
alc_set_pin_output(struct hda_codec * codec,hda_nid_t nid,unsigned int pin_type)2846 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
2847 			       unsigned int pin_type)
2848 {
2849 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
2850 			    pin_type);
2851 	/* unmute pin */
2852 	if (nid_has_mute(codec, nid, HDA_OUTPUT))
2853 		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
2854 			    AMP_OUT_UNMUTE);
2855 }
2856 
get_pin_type(int line_out_type)2857 static int get_pin_type(int line_out_type)
2858 {
2859 	if (line_out_type == AUTO_PIN_HP_OUT)
2860 		return PIN_HP;
2861 	else
2862 		return PIN_OUT;
2863 }
2864 
alc_auto_init_analog_input(struct hda_codec * codec)2865 static void alc_auto_init_analog_input(struct hda_codec *codec)
2866 {
2867 	struct alc_spec *spec = codec->spec;
2868 	struct auto_pin_cfg *cfg = &spec->autocfg;
2869 	int i;
2870 
2871 	for (i = 0; i < cfg->num_inputs; i++) {
2872 		hda_nid_t nid = cfg->inputs[i].pin;
2873 		if (alc_is_input_pin(codec, nid)) {
2874 			alc_set_input_pin(codec, nid, cfg->inputs[i].type);
2875 			if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
2876 				snd_hda_codec_write(codec, nid, 0,
2877 						    AC_VERB_SET_AMP_GAIN_MUTE,
2878 						    AMP_OUT_MUTE);
2879 		}
2880 	}
2881 
2882 	/* mute all loopback inputs */
2883 	if (spec->mixer_nid) {
2884 		int nums = snd_hda_get_conn_list(codec, spec->mixer_nid, NULL);
2885 		for (i = 0; i < nums; i++)
2886 			snd_hda_codec_write(codec, spec->mixer_nid, 0,
2887 					    AC_VERB_SET_AMP_GAIN_MUTE,
2888 					    AMP_IN_MUTE(i));
2889 	}
2890 }
2891 
2892 /* convert from MIX nid to DAC */
alc_auto_mix_to_dac(struct hda_codec * codec,hda_nid_t nid)2893 static hda_nid_t alc_auto_mix_to_dac(struct hda_codec *codec, hda_nid_t nid)
2894 {
2895 	hda_nid_t list[5];
2896 	int i, num;
2897 
2898 	if (get_wcaps_type(get_wcaps(codec, nid)) == AC_WID_AUD_OUT)
2899 		return nid;
2900 	num = snd_hda_get_connections(codec, nid, list, ARRAY_SIZE(list));
2901 	for (i = 0; i < num; i++) {
2902 		if (get_wcaps_type(get_wcaps(codec, list[i])) == AC_WID_AUD_OUT)
2903 			return list[i];
2904 	}
2905 	return 0;
2906 }
2907 
2908 /* go down to the selector widget before the mixer */
alc_go_down_to_selector(struct hda_codec * codec,hda_nid_t pin)2909 static hda_nid_t alc_go_down_to_selector(struct hda_codec *codec, hda_nid_t pin)
2910 {
2911 	hda_nid_t srcs[5];
2912 	int num = snd_hda_get_connections(codec, pin, srcs,
2913 					  ARRAY_SIZE(srcs));
2914 	if (num != 1 ||
2915 	    get_wcaps_type(get_wcaps(codec, srcs[0])) != AC_WID_AUD_SEL)
2916 		return pin;
2917 	return srcs[0];
2918 }
2919 
2920 /* get MIX nid connected to the given pin targeted to DAC */
alc_auto_dac_to_mix(struct hda_codec * codec,hda_nid_t pin,hda_nid_t dac)2921 static hda_nid_t alc_auto_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
2922 				   hda_nid_t dac)
2923 {
2924 	hda_nid_t mix[5];
2925 	int i, num;
2926 
2927 	pin = alc_go_down_to_selector(codec, pin);
2928 	num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
2929 	for (i = 0; i < num; i++) {
2930 		if (alc_auto_mix_to_dac(codec, mix[i]) == dac)
2931 			return mix[i];
2932 	}
2933 	return 0;
2934 }
2935 
2936 /* select the connection from pin to DAC if needed */
alc_auto_select_dac(struct hda_codec * codec,hda_nid_t pin,hda_nid_t dac)2937 static int alc_auto_select_dac(struct hda_codec *codec, hda_nid_t pin,
2938 			       hda_nid_t dac)
2939 {
2940 	hda_nid_t mix[5];
2941 	int i, num;
2942 
2943 	pin = alc_go_down_to_selector(codec, pin);
2944 	num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
2945 	if (num < 2)
2946 		return 0;
2947 	for (i = 0; i < num; i++) {
2948 		if (alc_auto_mix_to_dac(codec, mix[i]) == dac) {
2949 			snd_hda_codec_update_cache(codec, pin, 0,
2950 						   AC_VERB_SET_CONNECT_SEL, i);
2951 			return 0;
2952 		}
2953 	}
2954 	return 0;
2955 }
2956 
2957 /* look for an empty DAC slot */
alc_auto_look_for_dac(struct hda_codec * codec,hda_nid_t pin)2958 static hda_nid_t alc_auto_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
2959 {
2960 	struct alc_spec *spec = codec->spec;
2961 	hda_nid_t srcs[5];
2962 	int i, num;
2963 
2964 	pin = alc_go_down_to_selector(codec, pin);
2965 	num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
2966 	for (i = 0; i < num; i++) {
2967 		hda_nid_t nid = alc_auto_mix_to_dac(codec, srcs[i]);
2968 		if (!nid)
2969 			continue;
2970 		if (found_in_nid_list(nid, spec->multiout.dac_nids,
2971 				      ARRAY_SIZE(spec->private_dac_nids)))
2972 			continue;
2973 		if (found_in_nid_list(nid, spec->multiout.hp_out_nid,
2974 				      ARRAY_SIZE(spec->multiout.hp_out_nid)))
2975 		    continue;
2976 		if (found_in_nid_list(nid, spec->multiout.extra_out_nid,
2977 				      ARRAY_SIZE(spec->multiout.extra_out_nid)))
2978 		    continue;
2979 		return nid;
2980 	}
2981 	return 0;
2982 }
2983 
2984 /* check whether the DAC is reachable from the pin */
alc_auto_is_dac_reachable(struct hda_codec * codec,hda_nid_t pin,hda_nid_t dac)2985 static bool alc_auto_is_dac_reachable(struct hda_codec *codec,
2986 				      hda_nid_t pin, hda_nid_t dac)
2987 {
2988 	hda_nid_t srcs[5];
2989 	int i, num;
2990 
2991 	pin = alc_go_down_to_selector(codec, pin);
2992 	num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
2993 	for (i = 0; i < num; i++) {
2994 		hda_nid_t nid = alc_auto_mix_to_dac(codec, srcs[i]);
2995 		if (nid == dac)
2996 			return true;
2997 	}
2998 	return false;
2999 }
3000 
get_dac_if_single(struct hda_codec * codec,hda_nid_t pin)3001 static hda_nid_t get_dac_if_single(struct hda_codec *codec, hda_nid_t pin)
3002 {
3003 	hda_nid_t sel = alc_go_down_to_selector(codec, pin);
3004 	if (snd_hda_get_conn_list(codec, sel, NULL) == 1)
3005 		return alc_auto_look_for_dac(codec, pin);
3006 	return 0;
3007 }
3008 
3009 /* return 0 if no possible DAC is found, 1 if one or more found */
alc_auto_fill_extra_dacs(struct hda_codec * codec,int num_outs,const hda_nid_t * pins,hda_nid_t * dacs)3010 static int alc_auto_fill_extra_dacs(struct hda_codec *codec, int num_outs,
3011 				    const hda_nid_t *pins, hda_nid_t *dacs)
3012 {
3013 	int i;
3014 
3015 	if (num_outs && !dacs[0]) {
3016 		dacs[0] = alc_auto_look_for_dac(codec, pins[0]);
3017 		if (!dacs[0])
3018 			return 0;
3019 	}
3020 
3021 	for (i = 1; i < num_outs; i++)
3022 		dacs[i] = get_dac_if_single(codec, pins[i]);
3023 	for (i = 1; i < num_outs; i++) {
3024 		if (!dacs[i])
3025 			dacs[i] = alc_auto_look_for_dac(codec, pins[i]);
3026 	}
3027 	return 1;
3028 }
3029 
3030 static int alc_auto_fill_multi_ios(struct hda_codec *codec,
3031 				   unsigned int location, int offset);
3032 static hda_nid_t alc_look_for_out_vol_nid(struct hda_codec *codec,
3033 					  hda_nid_t pin, hda_nid_t dac);
3034 
3035 /* fill in the dac_nids table from the parsed pin configuration */
alc_auto_fill_dac_nids(struct hda_codec * codec)3036 static int alc_auto_fill_dac_nids(struct hda_codec *codec)
3037 {
3038 	struct alc_spec *spec = codec->spec;
3039 	struct auto_pin_cfg *cfg = &spec->autocfg;
3040 	unsigned int location, defcfg;
3041 	int num_pins;
3042 	bool redone = false;
3043 	int i;
3044 
3045  again:
3046 	/* set num_dacs once to full for alc_auto_look_for_dac() */
3047 	spec->multiout.num_dacs = cfg->line_outs;
3048 	spec->multiout.hp_out_nid[0] = 0;
3049 	spec->multiout.extra_out_nid[0] = 0;
3050 	memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids));
3051 	spec->multiout.dac_nids = spec->private_dac_nids;
3052 	spec->multi_ios = 0;
3053 
3054 	/* fill hard-wired DACs first */
3055 	if (!redone) {
3056 		for (i = 0; i < cfg->line_outs; i++)
3057 			spec->private_dac_nids[i] =
3058 				get_dac_if_single(codec, cfg->line_out_pins[i]);
3059 		if (cfg->hp_outs)
3060 			spec->multiout.hp_out_nid[0] =
3061 				get_dac_if_single(codec, cfg->hp_pins[0]);
3062 		if (cfg->speaker_outs)
3063 			spec->multiout.extra_out_nid[0] =
3064 				get_dac_if_single(codec, cfg->speaker_pins[0]);
3065 	}
3066 
3067 	for (i = 0; i < cfg->line_outs; i++) {
3068 		hda_nid_t pin = cfg->line_out_pins[i];
3069 		if (spec->private_dac_nids[i])
3070 			continue;
3071 		spec->private_dac_nids[i] = alc_auto_look_for_dac(codec, pin);
3072 		if (!spec->private_dac_nids[i] && !redone) {
3073 			/* if we can't find primary DACs, re-probe without
3074 			 * checking the hard-wired DACs
3075 			 */
3076 			redone = true;
3077 			goto again;
3078 		}
3079 	}
3080 
3081 	/* re-count num_dacs and squash invalid entries */
3082 	spec->multiout.num_dacs = 0;
3083 	for (i = 0; i < cfg->line_outs; i++) {
3084 		if (spec->private_dac_nids[i])
3085 			spec->multiout.num_dacs++;
3086 		else {
3087 			memmove(spec->private_dac_nids + i,
3088 				spec->private_dac_nids + i + 1,
3089 				sizeof(hda_nid_t) * (cfg->line_outs - i - 1));
3090 			spec->private_dac_nids[cfg->line_outs - 1] = 0;
3091 		}
3092 	}
3093 
3094 	if (cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
3095 		/* try to fill multi-io first */
3096 		defcfg = snd_hda_codec_get_pincfg(codec, cfg->line_out_pins[0]);
3097 		location = get_defcfg_location(defcfg);
3098 
3099 		num_pins = alc_auto_fill_multi_ios(codec, location, 0);
3100 		if (num_pins > 0) {
3101 			spec->multi_ios = num_pins;
3102 			spec->ext_channel_count = 2;
3103 			spec->multiout.num_dacs = num_pins + 1;
3104 		}
3105 	}
3106 
3107 	if (cfg->line_out_type != AUTO_PIN_HP_OUT)
3108 		alc_auto_fill_extra_dacs(codec, cfg->hp_outs, cfg->hp_pins,
3109 				 spec->multiout.hp_out_nid);
3110 	if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
3111 		int err = alc_auto_fill_extra_dacs(codec, cfg->speaker_outs,
3112 					cfg->speaker_pins,
3113 					spec->multiout.extra_out_nid);
3114 		/* if no speaker volume is assigned, try again as the primary
3115 		 * output
3116 		 */
3117 		if (!err && cfg->speaker_outs > 0 &&
3118 		    cfg->line_out_type == AUTO_PIN_HP_OUT) {
3119 			cfg->hp_outs = cfg->line_outs;
3120 			memcpy(cfg->hp_pins, cfg->line_out_pins,
3121 			       sizeof(cfg->hp_pins));
3122 			cfg->line_outs = cfg->speaker_outs;
3123 			memcpy(cfg->line_out_pins, cfg->speaker_pins,
3124 			       sizeof(cfg->speaker_pins));
3125 			cfg->speaker_outs = 0;
3126 			memset(cfg->speaker_pins, 0, sizeof(cfg->speaker_pins));
3127 			cfg->line_out_type = AUTO_PIN_SPEAKER_OUT;
3128 			redone = false;
3129 			goto again;
3130 		}
3131 	}
3132 
3133 	if (!spec->multi_ios &&
3134 	    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT &&
3135 	    cfg->hp_outs) {
3136 		/* try multi-ios with HP + inputs */
3137 		defcfg = snd_hda_codec_get_pincfg(codec, cfg->hp_pins[0]);
3138 		location = get_defcfg_location(defcfg);
3139 
3140 		num_pins = alc_auto_fill_multi_ios(codec, location, 1);
3141 		if (num_pins > 0) {
3142 			spec->multi_ios = num_pins;
3143 			spec->ext_channel_count = 2;
3144 			spec->multiout.num_dacs = num_pins + 1;
3145 		}
3146 	}
3147 
3148 	if (cfg->line_out_pins[0])
3149 		spec->vmaster_nid =
3150 			alc_look_for_out_vol_nid(codec, cfg->line_out_pins[0],
3151 						 spec->multiout.dac_nids[0]);
3152 	return 0;
3153 }
3154 
get_ctl_pos(unsigned int data)3155 static inline unsigned int get_ctl_pos(unsigned int data)
3156 {
3157 	hda_nid_t nid = get_amp_nid_(data);
3158 	unsigned int dir;
3159 	if (snd_BUG_ON(nid >= MAX_VOL_NIDS))
3160 		return 0;
3161 	dir = get_amp_direction_(data);
3162 	return (nid << 1) | dir;
3163 }
3164 
3165 #define is_ctl_used(bits, data) \
3166 	test_bit(get_ctl_pos(data), bits)
3167 #define mark_ctl_usage(bits, data) \
3168 	set_bit(get_ctl_pos(data), bits)
3169 
alc_auto_add_vol_ctl(struct hda_codec * codec,const char * pfx,int cidx,hda_nid_t nid,unsigned int chs)3170 static int alc_auto_add_vol_ctl(struct hda_codec *codec,
3171 			      const char *pfx, int cidx,
3172 			      hda_nid_t nid, unsigned int chs)
3173 {
3174 	struct alc_spec *spec = codec->spec;
3175 	unsigned int val;
3176 	if (!nid)
3177 		return 0;
3178 	val = HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT);
3179 	if (is_ctl_used(spec->vol_ctls, val) && chs != 2) /* exclude LFE */
3180 		return 0;
3181 	mark_ctl_usage(spec->vol_ctls, val);
3182 	return __add_pb_vol_ctrl(codec->spec, ALC_CTL_WIDGET_VOL, pfx, cidx,
3183 				 val);
3184 }
3185 
alc_auto_add_stereo_vol(struct hda_codec * codec,const char * pfx,int cidx,hda_nid_t nid)3186 static int alc_auto_add_stereo_vol(struct hda_codec *codec,
3187 				   const char *pfx, int cidx,
3188 				   hda_nid_t nid)
3189 {
3190 	int chs = 1;
3191 	if (get_wcaps(codec, nid) & AC_WCAP_STEREO)
3192 		chs = 3;
3193 	return alc_auto_add_vol_ctl(codec, pfx, cidx, nid, chs);
3194 }
3195 
3196 /* create a mute-switch for the given mixer widget;
3197  * if it has multiple sources (e.g. DAC and loopback), create a bind-mute
3198  */
alc_auto_add_sw_ctl(struct hda_codec * codec,const char * pfx,int cidx,hda_nid_t nid,unsigned int chs)3199 static int alc_auto_add_sw_ctl(struct hda_codec *codec,
3200 			     const char *pfx, int cidx,
3201 			     hda_nid_t nid, unsigned int chs)
3202 {
3203 	struct alc_spec *spec = codec->spec;
3204 	int wid_type;
3205 	int type;
3206 	unsigned long val;
3207 	if (!nid)
3208 		return 0;
3209 	wid_type = get_wcaps_type(get_wcaps(codec, nid));
3210 	if (wid_type == AC_WID_PIN || wid_type == AC_WID_AUD_OUT) {
3211 		type = ALC_CTL_WIDGET_MUTE;
3212 		val = HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT);
3213 	} else if (snd_hda_get_conn_list(codec, nid, NULL) == 1) {
3214 		type = ALC_CTL_WIDGET_MUTE;
3215 		val = HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT);
3216 	} else {
3217 		type = ALC_CTL_BIND_MUTE;
3218 		val = HDA_COMPOSE_AMP_VAL(nid, chs, 2, HDA_INPUT);
3219 	}
3220 	if (is_ctl_used(spec->sw_ctls, val) && chs != 2) /* exclude LFE */
3221 		return 0;
3222 	mark_ctl_usage(spec->sw_ctls, val);
3223 	return __add_pb_sw_ctrl(codec->spec, type, pfx, cidx, val);
3224 }
3225 
alc_auto_add_stereo_sw(struct hda_codec * codec,const char * pfx,int cidx,hda_nid_t nid)3226 static int alc_auto_add_stereo_sw(struct hda_codec *codec, const char *pfx,
3227 				  int cidx, hda_nid_t nid)
3228 {
3229 	int chs = 1;
3230 	if (get_wcaps(codec, nid) & AC_WCAP_STEREO)
3231 		chs = 3;
3232 	return alc_auto_add_sw_ctl(codec, pfx, cidx, nid, chs);
3233 }
3234 
alc_look_for_out_mute_nid(struct hda_codec * codec,hda_nid_t pin,hda_nid_t dac)3235 static hda_nid_t alc_look_for_out_mute_nid(struct hda_codec *codec,
3236 					   hda_nid_t pin, hda_nid_t dac)
3237 {
3238 	hda_nid_t mix = alc_auto_dac_to_mix(codec, pin, dac);
3239 	if (nid_has_mute(codec, pin, HDA_OUTPUT))
3240 		return pin;
3241 	else if (mix && nid_has_mute(codec, mix, HDA_INPUT))
3242 		return mix;
3243 	else if (nid_has_mute(codec, dac, HDA_OUTPUT))
3244 		return dac;
3245 	return 0;
3246 }
3247 
alc_look_for_out_vol_nid(struct hda_codec * codec,hda_nid_t pin,hda_nid_t dac)3248 static hda_nid_t alc_look_for_out_vol_nid(struct hda_codec *codec,
3249 					  hda_nid_t pin, hda_nid_t dac)
3250 {
3251 	hda_nid_t mix = alc_auto_dac_to_mix(codec, pin, dac);
3252 	if (nid_has_volume(codec, dac, HDA_OUTPUT))
3253 		return dac;
3254 	else if (nid_has_volume(codec, mix, HDA_OUTPUT))
3255 		return mix;
3256 	else if (nid_has_volume(codec, pin, HDA_OUTPUT))
3257 		return pin;
3258 	return 0;
3259 }
3260 
3261 /* add playback controls from the parsed DAC table */
alc_auto_create_multi_out_ctls(struct hda_codec * codec,const struct auto_pin_cfg * cfg)3262 static int alc_auto_create_multi_out_ctls(struct hda_codec *codec,
3263 					     const struct auto_pin_cfg *cfg)
3264 {
3265 	struct alc_spec *spec = codec->spec;
3266 	int i, err, noutputs;
3267 
3268 	noutputs = cfg->line_outs;
3269 	if (spec->multi_ios > 0 && cfg->line_outs < 3)
3270 		noutputs += spec->multi_ios;
3271 
3272 	for (i = 0; i < noutputs; i++) {
3273 		const char *name;
3274 		int index;
3275 		hda_nid_t dac, pin;
3276 		hda_nid_t sw, vol;
3277 
3278 		dac = spec->multiout.dac_nids[i];
3279 		if (!dac)
3280 			continue;
3281 		if (i >= cfg->line_outs)
3282 			pin = spec->multi_io[i - 1].pin;
3283 		else
3284 			pin = cfg->line_out_pins[i];
3285 
3286 		sw = alc_look_for_out_mute_nid(codec, pin, dac);
3287 		vol = alc_look_for_out_vol_nid(codec, pin, dac);
3288 		name = alc_get_line_out_pfx(spec, i, true, &index);
3289 		if (!name || !strcmp(name, "CLFE")) {
3290 			/* Center/LFE */
3291 			err = alc_auto_add_vol_ctl(codec, "Center", 0, vol, 1);
3292 			if (err < 0)
3293 				return err;
3294 			err = alc_auto_add_vol_ctl(codec, "LFE", 0, vol, 2);
3295 			if (err < 0)
3296 				return err;
3297 			err = alc_auto_add_sw_ctl(codec, "Center", 0, sw, 1);
3298 			if (err < 0)
3299 				return err;
3300 			err = alc_auto_add_sw_ctl(codec, "LFE", 0, sw, 2);
3301 			if (err < 0)
3302 				return err;
3303 		} else {
3304 			err = alc_auto_add_stereo_vol(codec, name, index, vol);
3305 			if (err < 0)
3306 				return err;
3307 			err = alc_auto_add_stereo_sw(codec, name, index, sw);
3308 			if (err < 0)
3309 				return err;
3310 		}
3311 	}
3312 	return 0;
3313 }
3314 
alc_auto_create_extra_out(struct hda_codec * codec,hda_nid_t pin,hda_nid_t dac,const char * pfx,int cidx)3315 static int alc_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
3316 				     hda_nid_t dac, const char *pfx,
3317 				     int cidx)
3318 {
3319 	struct alc_spec *spec = codec->spec;
3320 	hda_nid_t sw, vol;
3321 	int err;
3322 
3323 	if (!dac) {
3324 		unsigned int val;
3325 		/* the corresponding DAC is already occupied */
3326 		if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
3327 			return 0; /* no way */
3328 		/* create a switch only */
3329 		val = HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT);
3330 		if (is_ctl_used(spec->sw_ctls, val))
3331 			return 0; /* already created */
3332 		mark_ctl_usage(spec->sw_ctls, val);
3333 		return __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, cidx, val);
3334 	}
3335 
3336 	sw = alc_look_for_out_mute_nid(codec, pin, dac);
3337 	vol = alc_look_for_out_vol_nid(codec, pin, dac);
3338 	err = alc_auto_add_stereo_vol(codec, pfx, cidx, vol);
3339 	if (err < 0)
3340 		return err;
3341 	err = alc_auto_add_stereo_sw(codec, pfx, cidx, sw);
3342 	if (err < 0)
3343 		return err;
3344 	return 0;
3345 }
3346 
new_bind_ctl(struct hda_codec * codec,unsigned int nums,struct hda_ctl_ops * ops)3347 static struct hda_bind_ctls *new_bind_ctl(struct hda_codec *codec,
3348 					  unsigned int nums,
3349 					  struct hda_ctl_ops *ops)
3350 {
3351 	struct alc_spec *spec = codec->spec;
3352 	struct hda_bind_ctls **ctlp, *ctl;
3353 	snd_array_init(&spec->bind_ctls, sizeof(ctl), 8);
3354 	ctlp = snd_array_new(&spec->bind_ctls);
3355 	if (!ctlp)
3356 		return NULL;
3357 	ctl = kzalloc(sizeof(*ctl) + sizeof(long) * (nums + 1), GFP_KERNEL);
3358 	*ctlp = ctl;
3359 	if (ctl)
3360 		ctl->ops = ops;
3361 	return ctl;
3362 }
3363 
3364 /* add playback controls for speaker and HP outputs */
alc_auto_create_extra_outs(struct hda_codec * codec,int num_pins,const hda_nid_t * pins,const hda_nid_t * dacs,const char * pfx)3365 static int alc_auto_create_extra_outs(struct hda_codec *codec, int num_pins,
3366 				      const hda_nid_t *pins,
3367 				      const hda_nid_t *dacs,
3368 				      const char *pfx)
3369 {
3370 	struct alc_spec *spec = codec->spec;
3371 	struct hda_bind_ctls *ctl;
3372 	char name[32];
3373 	int i, n, err;
3374 
3375 	if (!num_pins || !pins[0])
3376 		return 0;
3377 
3378 	if (num_pins == 1) {
3379 		hda_nid_t dac = *dacs;
3380 		if (!dac)
3381 			dac = spec->multiout.dac_nids[0];
3382 		return alc_auto_create_extra_out(codec, *pins, dac, pfx, 0);
3383 	}
3384 
3385 	if (dacs[num_pins - 1]) {
3386 		/* OK, we have a multi-output system with individual volumes */
3387 		for (i = 0; i < num_pins; i++) {
3388 			if (num_pins >= 3) {
3389 				snprintf(name, sizeof(name), "%s %s",
3390 					 pfx, channel_name[i]);
3391 				err = alc_auto_create_extra_out(codec, pins[i], dacs[i],
3392 								name, 0);
3393 			} else {
3394 				err = alc_auto_create_extra_out(codec, pins[i], dacs[i],
3395 								pfx, i);
3396 			}
3397 			if (err < 0)
3398 				return err;
3399 		}
3400 		return 0;
3401 	}
3402 
3403 	/* Let's create a bind-controls */
3404 	ctl = new_bind_ctl(codec, num_pins, &snd_hda_bind_sw);
3405 	if (!ctl)
3406 		return -ENOMEM;
3407 	n = 0;
3408 	for (i = 0; i < num_pins; i++) {
3409 		if (get_wcaps(codec, pins[i]) & AC_WCAP_OUT_AMP)
3410 			ctl->values[n++] =
3411 				HDA_COMPOSE_AMP_VAL(pins[i], 3, 0, HDA_OUTPUT);
3412 	}
3413 	if (n) {
3414 		snprintf(name, sizeof(name), "%s Playback Switch", pfx);
3415 		err = add_control(spec, ALC_CTL_BIND_SW, name, 0, (long)ctl);
3416 		if (err < 0)
3417 			return err;
3418 	}
3419 
3420 	ctl = new_bind_ctl(codec, num_pins, &snd_hda_bind_vol);
3421 	if (!ctl)
3422 		return -ENOMEM;
3423 	n = 0;
3424 	for (i = 0; i < num_pins; i++) {
3425 		hda_nid_t vol;
3426 		if (!pins[i] || !dacs[i])
3427 			continue;
3428 		vol = alc_look_for_out_vol_nid(codec, pins[i], dacs[i]);
3429 		if (vol)
3430 			ctl->values[n++] =
3431 				HDA_COMPOSE_AMP_VAL(vol, 3, 0, HDA_OUTPUT);
3432 	}
3433 	if (n) {
3434 		snprintf(name, sizeof(name), "%s Playback Volume", pfx);
3435 		err = add_control(spec, ALC_CTL_BIND_VOL, name, 0, (long)ctl);
3436 		if (err < 0)
3437 			return err;
3438 	}
3439 	return 0;
3440 }
3441 
alc_auto_create_hp_out(struct hda_codec * codec)3442 static int alc_auto_create_hp_out(struct hda_codec *codec)
3443 {
3444 	struct alc_spec *spec = codec->spec;
3445 	return alc_auto_create_extra_outs(codec, spec->autocfg.hp_outs,
3446 					  spec->autocfg.hp_pins,
3447 					  spec->multiout.hp_out_nid,
3448 					  "Headphone");
3449 }
3450 
alc_auto_create_speaker_out(struct hda_codec * codec)3451 static int alc_auto_create_speaker_out(struct hda_codec *codec)
3452 {
3453 	struct alc_spec *spec = codec->spec;
3454 	return alc_auto_create_extra_outs(codec, spec->autocfg.speaker_outs,
3455 					  spec->autocfg.speaker_pins,
3456 					  spec->multiout.extra_out_nid,
3457 					  "Speaker");
3458 }
3459 
alc_auto_set_output_and_unmute(struct hda_codec * codec,hda_nid_t pin,int pin_type,hda_nid_t dac)3460 static void alc_auto_set_output_and_unmute(struct hda_codec *codec,
3461 					      hda_nid_t pin, int pin_type,
3462 					      hda_nid_t dac)
3463 {
3464 	int i, num;
3465 	hda_nid_t nid, mix = 0;
3466 	hda_nid_t srcs[HDA_MAX_CONNECTIONS];
3467 
3468 	alc_set_pin_output(codec, pin, pin_type);
3469 	nid = alc_go_down_to_selector(codec, pin);
3470 	num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
3471 	for (i = 0; i < num; i++) {
3472 		if (alc_auto_mix_to_dac(codec, srcs[i]) != dac)
3473 			continue;
3474 		mix = srcs[i];
3475 		break;
3476 	}
3477 	if (!mix)
3478 		return;
3479 
3480 	/* need the manual connection? */
3481 	if (num > 1)
3482 		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
3483 	/* unmute mixer widget inputs */
3484 	if (nid_has_mute(codec, mix, HDA_INPUT)) {
3485 		snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
3486 			    AMP_IN_UNMUTE(0));
3487 		snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
3488 			    AMP_IN_UNMUTE(1));
3489 	}
3490 	/* initialize volume */
3491 	nid = alc_look_for_out_vol_nid(codec, pin, dac);
3492 	if (nid)
3493 		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
3494 				    AMP_OUT_ZERO);
3495 
3496 	/* unmute DAC if it's not assigned to a mixer */
3497 	nid = alc_look_for_out_mute_nid(codec, pin, dac);
3498 	if (nid == mix && nid_has_mute(codec, dac, HDA_OUTPUT))
3499 		snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
3500 				    AMP_OUT_ZERO);
3501 }
3502 
alc_auto_init_multi_out(struct hda_codec * codec)3503 static void alc_auto_init_multi_out(struct hda_codec *codec)
3504 {
3505 	struct alc_spec *spec = codec->spec;
3506 	int pin_type = get_pin_type(spec->autocfg.line_out_type);
3507 	int i;
3508 
3509 	for (i = 0; i <= HDA_SIDE; i++) {
3510 		hda_nid_t nid = spec->autocfg.line_out_pins[i];
3511 		if (nid)
3512 			alc_auto_set_output_and_unmute(codec, nid, pin_type,
3513 					spec->multiout.dac_nids[i]);
3514 	}
3515 }
3516 
alc_auto_init_extra_out(struct hda_codec * codec)3517 static void alc_auto_init_extra_out(struct hda_codec *codec)
3518 {
3519 	struct alc_spec *spec = codec->spec;
3520 	int i;
3521 	hda_nid_t pin, dac;
3522 
3523 	for (i = 0; i < spec->autocfg.hp_outs; i++) {
3524 		if (spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)
3525 			break;
3526 		pin = spec->autocfg.hp_pins[i];
3527 		if (!pin)
3528 			break;
3529 		dac = spec->multiout.hp_out_nid[i];
3530 		if (!dac) {
3531 			if (i > 0 && spec->multiout.hp_out_nid[0])
3532 				dac = spec->multiout.hp_out_nid[0];
3533 			else
3534 				dac = spec->multiout.dac_nids[0];
3535 		}
3536 		alc_auto_set_output_and_unmute(codec, pin, PIN_HP, dac);
3537 	}
3538 	for (i = 0; i < spec->autocfg.speaker_outs; i++) {
3539 		if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
3540 			break;
3541 		pin = spec->autocfg.speaker_pins[i];
3542 		if (!pin)
3543 			break;
3544 		dac = spec->multiout.extra_out_nid[i];
3545 		if (!dac) {
3546 			if (i > 0 && spec->multiout.extra_out_nid[0])
3547 				dac = spec->multiout.extra_out_nid[0];
3548 			else
3549 				dac = spec->multiout.dac_nids[0];
3550 		}
3551 		alc_auto_set_output_and_unmute(codec, pin, PIN_OUT, dac);
3552 	}
3553 }
3554 
3555 /*
3556  * multi-io helper
3557  */
alc_auto_fill_multi_ios(struct hda_codec * codec,unsigned int location,int offset)3558 static int alc_auto_fill_multi_ios(struct hda_codec *codec,
3559 				   unsigned int location,
3560 				   int offset)
3561 {
3562 	struct alc_spec *spec = codec->spec;
3563 	struct auto_pin_cfg *cfg = &spec->autocfg;
3564 	hda_nid_t prime_dac = spec->private_dac_nids[0];
3565 	int type, i, dacs, num_pins = 0;
3566 
3567 	dacs = spec->multiout.num_dacs;
3568 	for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
3569 		for (i = 0; i < cfg->num_inputs; i++) {
3570 			hda_nid_t nid = cfg->inputs[i].pin;
3571 			hda_nid_t dac = 0;
3572 			unsigned int defcfg, caps;
3573 			if (cfg->inputs[i].type != type)
3574 				continue;
3575 			defcfg = snd_hda_codec_get_pincfg(codec, nid);
3576 			if (get_defcfg_connect(defcfg) != AC_JACK_PORT_COMPLEX)
3577 				continue;
3578 			if (location && get_defcfg_location(defcfg) != location)
3579 				continue;
3580 			caps = snd_hda_query_pin_caps(codec, nid);
3581 			if (!(caps & AC_PINCAP_OUT))
3582 				continue;
3583 			if (offset && offset + num_pins < dacs) {
3584 				dac = spec->private_dac_nids[offset + num_pins];
3585 				if (!alc_auto_is_dac_reachable(codec, nid, dac))
3586 					dac = 0;
3587 			}
3588 			if (!dac)
3589 				dac = alc_auto_look_for_dac(codec, nid);
3590 			if (!dac)
3591 				continue;
3592 			spec->multi_io[num_pins].pin = nid;
3593 			spec->multi_io[num_pins].dac = dac;
3594 			num_pins++;
3595 			spec->private_dac_nids[spec->multiout.num_dacs++] = dac;
3596 		}
3597 	}
3598 	spec->multiout.num_dacs = dacs;
3599 	if (num_pins < 2) {
3600 		/* clear up again */
3601 		memset(spec->private_dac_nids + dacs, 0,
3602 		       sizeof(hda_nid_t) * (AUTO_CFG_MAX_OUTS - dacs));
3603 		spec->private_dac_nids[0] = prime_dac;
3604 		return 0;
3605 	}
3606 	return num_pins;
3607 }
3608 
alc_auto_ch_mode_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)3609 static int alc_auto_ch_mode_info(struct snd_kcontrol *kcontrol,
3610 				 struct snd_ctl_elem_info *uinfo)
3611 {
3612 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3613 	struct alc_spec *spec = codec->spec;
3614 
3615 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3616 	uinfo->count = 1;
3617 	uinfo->value.enumerated.items = spec->multi_ios + 1;
3618 	if (uinfo->value.enumerated.item > spec->multi_ios)
3619 		uinfo->value.enumerated.item = spec->multi_ios;
3620 	sprintf(uinfo->value.enumerated.name, "%dch",
3621 		(uinfo->value.enumerated.item + 1) * 2);
3622 	return 0;
3623 }
3624 
alc_auto_ch_mode_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)3625 static int alc_auto_ch_mode_get(struct snd_kcontrol *kcontrol,
3626 				struct snd_ctl_elem_value *ucontrol)
3627 {
3628 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3629 	struct alc_spec *spec = codec->spec;
3630 	ucontrol->value.enumerated.item[0] = (spec->ext_channel_count - 1) / 2;
3631 	return 0;
3632 }
3633 
alc_set_multi_io(struct hda_codec * codec,int idx,bool output)3634 static int alc_set_multi_io(struct hda_codec *codec, int idx, bool output)
3635 {
3636 	struct alc_spec *spec = codec->spec;
3637 	hda_nid_t nid = spec->multi_io[idx].pin;
3638 
3639 	if (!spec->multi_io[idx].ctl_in)
3640 		spec->multi_io[idx].ctl_in =
3641 			snd_hda_codec_read(codec, nid, 0,
3642 					   AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3643 	if (output) {
3644 		snd_hda_codec_update_cache(codec, nid, 0,
3645 					   AC_VERB_SET_PIN_WIDGET_CONTROL,
3646 					   PIN_OUT);
3647 		if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
3648 			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3649 						 HDA_AMP_MUTE, 0);
3650 		alc_auto_select_dac(codec, nid, spec->multi_io[idx].dac);
3651 	} else {
3652 		if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
3653 			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3654 						 HDA_AMP_MUTE, HDA_AMP_MUTE);
3655 		snd_hda_codec_update_cache(codec, nid, 0,
3656 					   AC_VERB_SET_PIN_WIDGET_CONTROL,
3657 					   spec->multi_io[idx].ctl_in);
3658 	}
3659 	return 0;
3660 }
3661 
alc_auto_ch_mode_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)3662 static int alc_auto_ch_mode_put(struct snd_kcontrol *kcontrol,
3663 				struct snd_ctl_elem_value *ucontrol)
3664 {
3665 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3666 	struct alc_spec *spec = codec->spec;
3667 	int i, ch;
3668 
3669 	ch = ucontrol->value.enumerated.item[0];
3670 	if (ch < 0 || ch > spec->multi_ios)
3671 		return -EINVAL;
3672 	if (ch == (spec->ext_channel_count - 1) / 2)
3673 		return 0;
3674 	spec->ext_channel_count = (ch + 1) * 2;
3675 	for (i = 0; i < spec->multi_ios; i++)
3676 		alc_set_multi_io(codec, i, i < ch);
3677 	spec->multiout.max_channels = spec->ext_channel_count;
3678 	if (spec->need_dac_fix && !spec->const_channel_count)
3679 		spec->multiout.num_dacs = spec->multiout.max_channels / 2;
3680 	return 1;
3681 }
3682 
3683 static const struct snd_kcontrol_new alc_auto_channel_mode_enum = {
3684 	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3685 	.name = "Channel Mode",
3686 	.info = alc_auto_ch_mode_info,
3687 	.get = alc_auto_ch_mode_get,
3688 	.put = alc_auto_ch_mode_put,
3689 };
3690 
alc_auto_add_multi_channel_mode(struct hda_codec * codec)3691 static int alc_auto_add_multi_channel_mode(struct hda_codec *codec)
3692 {
3693 	struct alc_spec *spec = codec->spec;
3694 
3695 	if (spec->multi_ios > 0) {
3696 		struct snd_kcontrol_new *knew;
3697 
3698 		knew = alc_kcontrol_new(spec);
3699 		if (!knew)
3700 			return -ENOMEM;
3701 		*knew = alc_auto_channel_mode_enum;
3702 		knew->name = kstrdup("Channel Mode", GFP_KERNEL);
3703 		if (!knew->name)
3704 			return -ENOMEM;
3705 	}
3706 	return 0;
3707 }
3708 
3709 /* filter out invalid adc_nids (and capsrc_nids) that don't give all
3710  * active input pins
3711  */
alc_remove_invalid_adc_nids(struct hda_codec * codec)3712 static void alc_remove_invalid_adc_nids(struct hda_codec *codec)
3713 {
3714 	struct alc_spec *spec = codec->spec;
3715 	const struct hda_input_mux *imux;
3716 	hda_nid_t adc_nids[ARRAY_SIZE(spec->private_adc_nids)];
3717 	hda_nid_t capsrc_nids[ARRAY_SIZE(spec->private_adc_nids)];
3718 	int i, n, nums;
3719 
3720 	imux = spec->input_mux;
3721 	if (!imux)
3722 		return;
3723 	if (spec->dyn_adc_switch)
3724 		return;
3725 
3726 	nums = 0;
3727 	for (n = 0; n < spec->num_adc_nids; n++) {
3728 		hda_nid_t cap = spec->private_capsrc_nids[n];
3729 		int num_conns = snd_hda_get_conn_list(codec, cap, NULL);
3730 		for (i = 0; i < imux->num_items; i++) {
3731 			hda_nid_t pin = spec->imux_pins[i];
3732 			if (pin) {
3733 				if (get_connection_index(codec, cap, pin) < 0)
3734 					break;
3735 			} else if (num_conns <= imux->items[i].index)
3736 				break;
3737 		}
3738 		if (i >= imux->num_items) {
3739 			adc_nids[nums] = spec->private_adc_nids[n];
3740 			capsrc_nids[nums++] = cap;
3741 		}
3742 	}
3743 	if (!nums) {
3744 		/* check whether ADC-switch is possible */
3745 		if (!alc_check_dyn_adc_switch(codec)) {
3746 			printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
3747 			       " using fallback 0x%x\n",
3748 			       codec->chip_name, spec->private_adc_nids[0]);
3749 			spec->num_adc_nids = 1;
3750 			spec->auto_mic = 0;
3751 			return;
3752 		}
3753 	} else if (nums != spec->num_adc_nids) {
3754 		memcpy(spec->private_adc_nids, adc_nids,
3755 		       nums * sizeof(hda_nid_t));
3756 		memcpy(spec->private_capsrc_nids, capsrc_nids,
3757 		       nums * sizeof(hda_nid_t));
3758 		spec->num_adc_nids = nums;
3759 	}
3760 
3761 	if (spec->auto_mic)
3762 		alc_auto_mic_check_imux(codec); /* check auto-mic setups */
3763 	else if (spec->input_mux->num_items == 1)
3764 		spec->num_adc_nids = 1; /* reduce to a single ADC */
3765 }
3766 
3767 /*
3768  * initialize ADC paths
3769  */
alc_auto_init_adc(struct hda_codec * codec,int adc_idx)3770 static void alc_auto_init_adc(struct hda_codec *codec, int adc_idx)
3771 {
3772 	struct alc_spec *spec = codec->spec;
3773 	hda_nid_t nid;
3774 
3775 	nid = spec->adc_nids[adc_idx];
3776 	/* mute ADC */
3777 	if (nid_has_mute(codec, nid, HDA_INPUT)) {
3778 		snd_hda_codec_write(codec, nid, 0,
3779 				    AC_VERB_SET_AMP_GAIN_MUTE,
3780 				    AMP_IN_MUTE(0));
3781 		return;
3782 	}
3783 	if (!spec->capsrc_nids)
3784 		return;
3785 	nid = spec->capsrc_nids[adc_idx];
3786 	if (nid_has_mute(codec, nid, HDA_OUTPUT))
3787 		snd_hda_codec_write(codec, nid, 0,
3788 				    AC_VERB_SET_AMP_GAIN_MUTE,
3789 				    AMP_OUT_MUTE);
3790 }
3791 
alc_auto_init_input_src(struct hda_codec * codec)3792 static void alc_auto_init_input_src(struct hda_codec *codec)
3793 {
3794 	struct alc_spec *spec = codec->spec;
3795 	int c, nums;
3796 
3797 	for (c = 0; c < spec->num_adc_nids; c++)
3798 		alc_auto_init_adc(codec, c);
3799 	if (spec->dyn_adc_switch)
3800 		nums = 1;
3801 	else
3802 		nums = spec->num_adc_nids;
3803 	for (c = 0; c < nums; c++)
3804 		alc_mux_select(codec, c, spec->cur_mux[c], true);
3805 }
3806 
3807 /* add mic boosts if needed */
alc_auto_add_mic_boost(struct hda_codec * codec)3808 static int alc_auto_add_mic_boost(struct hda_codec *codec)
3809 {
3810 	struct alc_spec *spec = codec->spec;
3811 	struct auto_pin_cfg *cfg = &spec->autocfg;
3812 	int i, err;
3813 	int type_idx = 0;
3814 	hda_nid_t nid;
3815 	const char *prev_label = NULL;
3816 
3817 	for (i = 0; i < cfg->num_inputs; i++) {
3818 		if (cfg->inputs[i].type > AUTO_PIN_MIC)
3819 			break;
3820 		nid = cfg->inputs[i].pin;
3821 		if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) {
3822 			const char *label;
3823 			char boost_label[32];
3824 
3825 			label = hda_get_autocfg_input_label(codec, cfg, i);
3826 			if (spec->shared_mic_hp && !strcmp(label, "Misc"))
3827 				label = "Headphone Mic";
3828 			if (prev_label && !strcmp(label, prev_label))
3829 				type_idx++;
3830 			else
3831 				type_idx = 0;
3832 			prev_label = label;
3833 
3834 			snprintf(boost_label, sizeof(boost_label),
3835 				 "%s Boost Volume", label);
3836 			err = add_control(spec, ALC_CTL_WIDGET_VOL,
3837 					  boost_label, type_idx,
3838 				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
3839 			if (err < 0)
3840 				return err;
3841 		}
3842 	}
3843 	return 0;
3844 }
3845 
3846 /* select or unmute the given capsrc route */
select_or_unmute_capsrc(struct hda_codec * codec,hda_nid_t cap,int idx)3847 static void select_or_unmute_capsrc(struct hda_codec *codec, hda_nid_t cap,
3848 				    int idx)
3849 {
3850 	if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
3851 		snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
3852 					 HDA_AMP_MUTE, 0);
3853 	} else if (snd_hda_get_conn_list(codec, cap, NULL) > 1) {
3854 		snd_hda_codec_write_cache(codec, cap, 0,
3855 					  AC_VERB_SET_CONNECT_SEL, idx);
3856 	}
3857 }
3858 
3859 /* set the default connection to that pin */
init_capsrc_for_pin(struct hda_codec * codec,hda_nid_t pin)3860 static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin)
3861 {
3862 	struct alc_spec *spec = codec->spec;
3863 	int i;
3864 
3865 	if (!pin)
3866 		return 0;
3867 	for (i = 0; i < spec->num_adc_nids; i++) {
3868 		hda_nid_t cap = get_capsrc(spec, i);
3869 		int idx;
3870 
3871 		idx = get_connection_index(codec, cap, pin);
3872 		if (idx < 0)
3873 			continue;
3874 		select_or_unmute_capsrc(codec, cap, idx);
3875 		return i; /* return the found index */
3876 	}
3877 	return -1; /* not found */
3878 }
3879 
3880 /* initialize some special cases for input sources */
alc_init_special_input_src(struct hda_codec * codec)3881 static void alc_init_special_input_src(struct hda_codec *codec)
3882 {
3883 	struct alc_spec *spec = codec->spec;
3884 	int i;
3885 
3886 	for (i = 0; i < spec->autocfg.num_inputs; i++)
3887 		init_capsrc_for_pin(codec, spec->autocfg.inputs[i].pin);
3888 }
3889 
3890 /* assign appropriate capture mixers */
set_capture_mixer(struct hda_codec * codec)3891 static void set_capture_mixer(struct hda_codec *codec)
3892 {
3893 	struct alc_spec *spec = codec->spec;
3894 	static const struct snd_kcontrol_new *caps[2][3] = {
3895 		{ alc_capture_mixer_nosrc1,
3896 		  alc_capture_mixer_nosrc2,
3897 		  alc_capture_mixer_nosrc3 },
3898 		{ alc_capture_mixer1,
3899 		  alc_capture_mixer2,
3900 		  alc_capture_mixer3 },
3901 	};
3902 
3903 	/* check whether either of ADC or MUX has a volume control */
3904 	if (!nid_has_volume(codec, spec->adc_nids[0], HDA_INPUT)) {
3905 		if (!spec->capsrc_nids)
3906 			return; /* no volume */
3907 		if (!nid_has_volume(codec, spec->capsrc_nids[0], HDA_OUTPUT))
3908 			return; /* no volume in capsrc, too */
3909 		spec->vol_in_capsrc = 1;
3910 	}
3911 
3912 	if (spec->num_adc_nids > 0) {
3913 		int mux = 0;
3914 		int num_adcs = 0;
3915 
3916 		if (spec->input_mux && spec->input_mux->num_items > 1)
3917 			mux = 1;
3918 		if (spec->auto_mic) {
3919 			num_adcs = 1;
3920 			mux = 0;
3921 		} else if (spec->dyn_adc_switch)
3922 			num_adcs = 1;
3923 		if (!num_adcs) {
3924 			if (spec->num_adc_nids > 3)
3925 				spec->num_adc_nids = 3;
3926 			else if (!spec->num_adc_nids)
3927 				return;
3928 			num_adcs = spec->num_adc_nids;
3929 		}
3930 		spec->cap_mixer = caps[mux][num_adcs - 1];
3931 	}
3932 }
3933 
3934 /*
3935  * standard auto-parser initializations
3936  */
alc_auto_init_std(struct hda_codec * codec)3937 static void alc_auto_init_std(struct hda_codec *codec)
3938 {
3939 	struct alc_spec *spec = codec->spec;
3940 	alc_auto_init_multi_out(codec);
3941 	alc_auto_init_extra_out(codec);
3942 	alc_auto_init_analog_input(codec);
3943 	alc_auto_init_input_src(codec);
3944 	alc_auto_init_digital(codec);
3945 	if (spec->unsol_event)
3946 		alc_inithook(codec);
3947 }
3948 
3949 /*
3950  * Digital-beep handlers
3951  */
3952 #ifdef CONFIG_SND_HDA_INPUT_BEEP
3953 #define set_beep_amp(spec, nid, idx, dir) \
3954 	((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
3955 
3956 static const struct snd_pci_quirk beep_white_list[] = {
3957 	SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
3958 	SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
3959 	SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
3960 	SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
3961 	SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
3962 	{}
3963 };
3964 
has_cdefine_beep(struct hda_codec * codec)3965 static inline int has_cdefine_beep(struct hda_codec *codec)
3966 {
3967 	struct alc_spec *spec = codec->spec;
3968 	const struct snd_pci_quirk *q;
3969 	q = snd_pci_quirk_lookup(codec->bus->pci, beep_white_list);
3970 	if (q)
3971 		return q->value;
3972 	return spec->cdefine.enable_pcbeep;
3973 }
3974 #else
3975 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
3976 #define has_cdefine_beep(codec)		0
3977 #endif
3978 
3979 /* parse the BIOS configuration and set up the alc_spec */
3980 /* return 1 if successful, 0 if the proper config is not found,
3981  * or a negative error code
3982  */
alc_parse_auto_config(struct hda_codec * codec,const hda_nid_t * ignore_nids,const hda_nid_t * ssid_nids)3983 static int alc_parse_auto_config(struct hda_codec *codec,
3984 				 const hda_nid_t *ignore_nids,
3985 				 const hda_nid_t *ssid_nids)
3986 {
3987 	struct alc_spec *spec = codec->spec;
3988 	struct auto_pin_cfg *cfg = &spec->autocfg;
3989 	int err;
3990 
3991 	err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
3992 				       spec->parse_flags);
3993 	if (err < 0)
3994 		return err;
3995 	if (!cfg->line_outs) {
3996 		if (cfg->dig_outs || cfg->dig_in_pin) {
3997 			spec->multiout.max_channels = 2;
3998 			spec->no_analog = 1;
3999 			goto dig_only;
4000 		}
4001 		return 0; /* can't find valid BIOS pin config */
4002 	}
4003 
4004 	if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT &&
4005 	    cfg->line_outs <= cfg->hp_outs) {
4006 		/* use HP as primary out */
4007 		cfg->speaker_outs = cfg->line_outs;
4008 		memcpy(cfg->speaker_pins, cfg->line_out_pins,
4009 		       sizeof(cfg->speaker_pins));
4010 		cfg->line_outs = cfg->hp_outs;
4011 		memcpy(cfg->line_out_pins, cfg->hp_pins, sizeof(cfg->hp_pins));
4012 		cfg->hp_outs = 0;
4013 		memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
4014 		cfg->line_out_type = AUTO_PIN_HP_OUT;
4015 	}
4016 
4017 	err = alc_auto_fill_dac_nids(codec);
4018 	if (err < 0)
4019 		return err;
4020 	err = alc_auto_add_multi_channel_mode(codec);
4021 	if (err < 0)
4022 		return err;
4023 	err = alc_auto_create_multi_out_ctls(codec, cfg);
4024 	if (err < 0)
4025 		return err;
4026 	err = alc_auto_create_hp_out(codec);
4027 	if (err < 0)
4028 		return err;
4029 	err = alc_auto_create_speaker_out(codec);
4030 	if (err < 0)
4031 		return err;
4032 	err = alc_auto_create_shared_input(codec);
4033 	if (err < 0)
4034 		return err;
4035 	err = alc_auto_create_input_ctls(codec);
4036 	if (err < 0)
4037 		return err;
4038 
4039 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4040 
4041  dig_only:
4042 	alc_auto_parse_digital(codec);
4043 
4044 	if (!spec->no_analog)
4045 		alc_remove_invalid_adc_nids(codec);
4046 
4047 	if (ssid_nids)
4048 		alc_ssid_check(codec, ssid_nids);
4049 
4050 	if (!spec->no_analog) {
4051 		alc_auto_check_switches(codec);
4052 		err = alc_auto_add_mic_boost(codec);
4053 		if (err < 0)
4054 			return err;
4055 	}
4056 
4057 	if (spec->kctls.list)
4058 		add_mixer(spec, spec->kctls.list);
4059 
4060 	return 1;
4061 }
4062 
alc880_parse_auto_config(struct hda_codec * codec)4063 static int alc880_parse_auto_config(struct hda_codec *codec)
4064 {
4065 	static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
4066 	static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
4067 	return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
4068 }
4069 
4070 #ifdef CONFIG_SND_HDA_POWER_SAVE
4071 static const struct hda_amp_list alc880_loopbacks[] = {
4072 	{ 0x0b, HDA_INPUT, 0 },
4073 	{ 0x0b, HDA_INPUT, 1 },
4074 	{ 0x0b, HDA_INPUT, 2 },
4075 	{ 0x0b, HDA_INPUT, 3 },
4076 	{ 0x0b, HDA_INPUT, 4 },
4077 	{ } /* end */
4078 };
4079 #endif
4080 
4081 /*
4082  * ALC880 fix-ups
4083  */
4084 enum {
4085 	ALC880_FIXUP_GPIO2,
4086 	ALC880_FIXUP_MEDION_RIM,
4087 };
4088 
4089 static const struct alc_fixup alc880_fixups[] = {
4090 	[ALC880_FIXUP_GPIO2] = {
4091 		.type = ALC_FIXUP_VERBS,
4092 		.v.verbs = alc_gpio2_init_verbs,
4093 	},
4094 	[ALC880_FIXUP_MEDION_RIM] = {
4095 		.type = ALC_FIXUP_VERBS,
4096 		.v.verbs = (const struct hda_verb[]) {
4097 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
4098 			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
4099 			{ }
4100 		},
4101 		.chained = true,
4102 		.chain_id = ALC880_FIXUP_GPIO2,
4103 	},
4104 };
4105 
4106 static const struct snd_pci_quirk alc880_fixup_tbl[] = {
4107 	SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
4108 	{}
4109 };
4110 
4111 
4112 /*
4113  * board setups
4114  */
4115 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4116 #define alc_board_config \
4117 	snd_hda_check_board_config
4118 #define alc_board_codec_sid_config \
4119 	snd_hda_check_board_codec_sid_config
4120 #include "alc_quirks.c"
4121 #else
4122 #define alc_board_config(codec, nums, models, tbl)	-1
4123 #define alc_board_codec_sid_config(codec, nums, models, tbl)	-1
4124 #define setup_preset(codec, x)	/* NOP */
4125 #endif
4126 
4127 /*
4128  * OK, here we have finally the patch for ALC880
4129  */
4130 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4131 #include "alc880_quirks.c"
4132 #endif
4133 
patch_alc880(struct hda_codec * codec)4134 static int patch_alc880(struct hda_codec *codec)
4135 {
4136 	struct alc_spec *spec;
4137 	int board_config;
4138 	int err;
4139 
4140 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4141 	if (spec == NULL)
4142 		return -ENOMEM;
4143 
4144 	codec->spec = spec;
4145 
4146 	spec->mixer_nid = 0x0b;
4147 	spec->need_dac_fix = 1;
4148 
4149 	board_config = alc_board_config(codec, ALC880_MODEL_LAST,
4150 					alc880_models, alc880_cfg_tbl);
4151 	if (board_config < 0) {
4152 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4153 		       codec->chip_name);
4154 		board_config = ALC_MODEL_AUTO;
4155 	}
4156 
4157 	if (board_config == ALC_MODEL_AUTO) {
4158 		alc_pick_fixup(codec, NULL, alc880_fixup_tbl, alc880_fixups);
4159 		alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
4160 	}
4161 
4162 	if (board_config == ALC_MODEL_AUTO) {
4163 		/* automatic parse from the BIOS config */
4164 		err = alc880_parse_auto_config(codec);
4165 		if (err < 0)
4166 			goto error;
4167 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4168 		else if (!err) {
4169 			printk(KERN_INFO
4170 			       "hda_codec: Cannot set up configuration "
4171 			       "from BIOS.  Using 3-stack mode...\n");
4172 			board_config = ALC880_3ST;
4173 		}
4174 #endif
4175 	}
4176 
4177 	if (board_config != ALC_MODEL_AUTO) {
4178 		spec->vmaster_nid = 0x0c;
4179 		setup_preset(codec, &alc880_presets[board_config]);
4180 	}
4181 
4182 	if (!spec->no_analog && !spec->adc_nids) {
4183 		alc_auto_fill_adc_caps(codec);
4184 		alc_rebuild_imux_for_auto_mic(codec);
4185 		alc_remove_invalid_adc_nids(codec);
4186 	}
4187 
4188 	if (!spec->no_analog && !spec->cap_mixer)
4189 		set_capture_mixer(codec);
4190 
4191 	if (!spec->no_analog) {
4192 		err = snd_hda_attach_beep_device(codec, 0x1);
4193 		if (err < 0)
4194 			goto error;
4195 		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
4196 	}
4197 
4198 	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
4199 
4200 	codec->patch_ops = alc_patch_ops;
4201 	if (board_config == ALC_MODEL_AUTO)
4202 		spec->init_hook = alc_auto_init_std;
4203 	else
4204 		codec->patch_ops.build_controls = __alc_build_controls;
4205 #ifdef CONFIG_SND_HDA_POWER_SAVE
4206 	if (!spec->loopback.amplist)
4207 		spec->loopback.amplist = alc880_loopbacks;
4208 #endif
4209 
4210 	return 0;
4211 
4212  error:
4213 	alc_free(codec);
4214 	return err;
4215 }
4216 
4217 
4218 /*
4219  * ALC260 support
4220  */
alc260_parse_auto_config(struct hda_codec * codec)4221 static int alc260_parse_auto_config(struct hda_codec *codec)
4222 {
4223 	static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
4224 	static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
4225 	return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
4226 }
4227 
4228 #ifdef CONFIG_SND_HDA_POWER_SAVE
4229 static const struct hda_amp_list alc260_loopbacks[] = {
4230 	{ 0x07, HDA_INPUT, 0 },
4231 	{ 0x07, HDA_INPUT, 1 },
4232 	{ 0x07, HDA_INPUT, 2 },
4233 	{ 0x07, HDA_INPUT, 3 },
4234 	{ 0x07, HDA_INPUT, 4 },
4235 	{ } /* end */
4236 };
4237 #endif
4238 
4239 /*
4240  * Pin config fixes
4241  */
4242 enum {
4243 	PINFIX_HP_DC5750,
4244 };
4245 
4246 static const struct alc_fixup alc260_fixups[] = {
4247 	[PINFIX_HP_DC5750] = {
4248 		.type = ALC_FIXUP_PINS,
4249 		.v.pins = (const struct alc_pincfg[]) {
4250 			{ 0x11, 0x90130110 }, /* speaker */
4251 			{ }
4252 		}
4253 	},
4254 };
4255 
4256 static const struct snd_pci_quirk alc260_fixup_tbl[] = {
4257 	SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", PINFIX_HP_DC5750),
4258 	{}
4259 };
4260 
4261 /*
4262  */
4263 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4264 #include "alc260_quirks.c"
4265 #endif
4266 
patch_alc260(struct hda_codec * codec)4267 static int patch_alc260(struct hda_codec *codec)
4268 {
4269 	struct alc_spec *spec;
4270 	int err, board_config;
4271 
4272 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4273 	if (spec == NULL)
4274 		return -ENOMEM;
4275 
4276 	codec->spec = spec;
4277 
4278 	spec->mixer_nid = 0x07;
4279 
4280 	board_config = alc_board_config(codec, ALC260_MODEL_LAST,
4281 					alc260_models, alc260_cfg_tbl);
4282 	if (board_config < 0) {
4283 		snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4284 			   codec->chip_name);
4285 		board_config = ALC_MODEL_AUTO;
4286 	}
4287 
4288 	if (board_config == ALC_MODEL_AUTO) {
4289 		alc_pick_fixup(codec, NULL, alc260_fixup_tbl, alc260_fixups);
4290 		alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
4291 	}
4292 
4293 	if (board_config == ALC_MODEL_AUTO) {
4294 		/* automatic parse from the BIOS config */
4295 		err = alc260_parse_auto_config(codec);
4296 		if (err < 0)
4297 			goto error;
4298 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4299 		else if (!err) {
4300 			printk(KERN_INFO
4301 			       "hda_codec: Cannot set up configuration "
4302 			       "from BIOS.  Using base mode...\n");
4303 			board_config = ALC260_BASIC;
4304 		}
4305 #endif
4306 	}
4307 
4308 	if (board_config != ALC_MODEL_AUTO) {
4309 		setup_preset(codec, &alc260_presets[board_config]);
4310 		spec->vmaster_nid = 0x08;
4311 	}
4312 
4313 	if (!spec->no_analog && !spec->adc_nids) {
4314 		alc_auto_fill_adc_caps(codec);
4315 		alc_rebuild_imux_for_auto_mic(codec);
4316 		alc_remove_invalid_adc_nids(codec);
4317 	}
4318 
4319 	if (!spec->no_analog && !spec->cap_mixer)
4320 		set_capture_mixer(codec);
4321 
4322 	if (!spec->no_analog) {
4323 		err = snd_hda_attach_beep_device(codec, 0x1);
4324 		if (err < 0)
4325 			goto error;
4326 		set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
4327 	}
4328 
4329 	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
4330 
4331 	codec->patch_ops = alc_patch_ops;
4332 	if (board_config == ALC_MODEL_AUTO)
4333 		spec->init_hook = alc_auto_init_std;
4334 	else
4335 		codec->patch_ops.build_controls = __alc_build_controls;
4336 	spec->shutup = alc_eapd_shutup;
4337 #ifdef CONFIG_SND_HDA_POWER_SAVE
4338 	if (!spec->loopback.amplist)
4339 		spec->loopback.amplist = alc260_loopbacks;
4340 #endif
4341 
4342 	return 0;
4343 
4344  error:
4345 	alc_free(codec);
4346 	return err;
4347 }
4348 
4349 
4350 /*
4351  * ALC882/883/885/888/889 support
4352  *
4353  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
4354  * configuration.  Each pin widget can choose any input DACs and a mixer.
4355  * Each ADC is connected from a mixer of all inputs.  This makes possible
4356  * 6-channel independent captures.
4357  *
4358  * In addition, an independent DAC for the multi-playback (not used in this
4359  * driver yet).
4360  */
4361 #ifdef CONFIG_SND_HDA_POWER_SAVE
4362 #define alc882_loopbacks	alc880_loopbacks
4363 #endif
4364 
4365 /*
4366  * Pin config fixes
4367  */
4368 enum {
4369 	ALC882_FIXUP_ABIT_AW9D_MAX,
4370 	ALC882_FIXUP_LENOVO_Y530,
4371 	ALC882_FIXUP_PB_M5210,
4372 	ALC882_FIXUP_ACER_ASPIRE_7736,
4373 	ALC882_FIXUP_ASUS_W90V,
4374 	ALC889_FIXUP_CD,
4375 	ALC889_FIXUP_VAIO_TT,
4376 	ALC888_FIXUP_EEE1601,
4377 	ALC882_FIXUP_EAPD,
4378 	ALC883_FIXUP_EAPD,
4379 	ALC883_FIXUP_ACER_EAPD,
4380 	ALC882_FIXUP_GPIO3,
4381 	ALC889_FIXUP_COEF,
4382 	ALC882_FIXUP_ASUS_W2JC,
4383 	ALC882_FIXUP_ACER_ASPIRE_4930G,
4384 	ALC882_FIXUP_ACER_ASPIRE_8930G,
4385 	ALC882_FIXUP_ASPIRE_8930G_VERBS,
4386 	ALC885_FIXUP_MACPRO_GPIO,
4387 	ALC889_FIXUP_DAC_ROUTE,
4388 };
4389 
alc889_fixup_coef(struct hda_codec * codec,const struct alc_fixup * fix,int action)4390 static void alc889_fixup_coef(struct hda_codec *codec,
4391 			      const struct alc_fixup *fix, int action)
4392 {
4393 	if (action != ALC_FIXUP_ACT_INIT)
4394 		return;
4395 	alc889_coef_init(codec);
4396 }
4397 
4398 /* toggle speaker-output according to the hp-jack state */
alc882_gpio_mute(struct hda_codec * codec,int pin,int muted)4399 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
4400 {
4401 	unsigned int gpiostate, gpiomask, gpiodir;
4402 
4403 	gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
4404 				       AC_VERB_GET_GPIO_DATA, 0);
4405 
4406 	if (!muted)
4407 		gpiostate |= (1 << pin);
4408 	else
4409 		gpiostate &= ~(1 << pin);
4410 
4411 	gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
4412 				      AC_VERB_GET_GPIO_MASK, 0);
4413 	gpiomask |= (1 << pin);
4414 
4415 	gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
4416 				     AC_VERB_GET_GPIO_DIRECTION, 0);
4417 	gpiodir |= (1 << pin);
4418 
4419 
4420 	snd_hda_codec_write(codec, codec->afg, 0,
4421 			    AC_VERB_SET_GPIO_MASK, gpiomask);
4422 	snd_hda_codec_write(codec, codec->afg, 0,
4423 			    AC_VERB_SET_GPIO_DIRECTION, gpiodir);
4424 
4425 	msleep(1);
4426 
4427 	snd_hda_codec_write(codec, codec->afg, 0,
4428 			    AC_VERB_SET_GPIO_DATA, gpiostate);
4429 }
4430 
4431 /* set up GPIO at initialization */
alc885_fixup_macpro_gpio(struct hda_codec * codec,const struct alc_fixup * fix,int action)4432 static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
4433 				     const struct alc_fixup *fix, int action)
4434 {
4435 	if (action != ALC_FIXUP_ACT_INIT)
4436 		return;
4437 	alc882_gpio_mute(codec, 0, 0);
4438 	alc882_gpio_mute(codec, 1, 0);
4439 }
4440 
4441 /* Fix the connection of some pins for ALC889:
4442  * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
4443  * work correctly (bko#42740)
4444  */
alc889_fixup_dac_route(struct hda_codec * codec,const struct alc_fixup * fix,int action)4445 static void alc889_fixup_dac_route(struct hda_codec *codec,
4446 				   const struct alc_fixup *fix, int action)
4447 {
4448 	if (action == ALC_FIXUP_ACT_PRE_PROBE) {
4449 		/* fake the connections during parsing the tree */
4450 		hda_nid_t conn1[2] = { 0x0c, 0x0d };
4451 		hda_nid_t conn2[2] = { 0x0e, 0x0f };
4452 		snd_hda_override_conn_list(codec, 0x14, 2, conn1);
4453 		snd_hda_override_conn_list(codec, 0x15, 2, conn1);
4454 		snd_hda_override_conn_list(codec, 0x18, 2, conn2);
4455 		snd_hda_override_conn_list(codec, 0x1a, 2, conn2);
4456 	} else if (action == ALC_FIXUP_ACT_PROBE) {
4457 		/* restore the connections */
4458 		hda_nid_t conn[5] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
4459 		snd_hda_override_conn_list(codec, 0x14, 5, conn);
4460 		snd_hda_override_conn_list(codec, 0x15, 5, conn);
4461 		snd_hda_override_conn_list(codec, 0x18, 5, conn);
4462 		snd_hda_override_conn_list(codec, 0x1a, 5, conn);
4463 	}
4464 }
4465 
4466 static const struct alc_fixup alc882_fixups[] = {
4467 	[ALC882_FIXUP_ABIT_AW9D_MAX] = {
4468 		.type = ALC_FIXUP_PINS,
4469 		.v.pins = (const struct alc_pincfg[]) {
4470 			{ 0x15, 0x01080104 }, /* side */
4471 			{ 0x16, 0x01011012 }, /* rear */
4472 			{ 0x17, 0x01016011 }, /* clfe */
4473 			{ }
4474 		}
4475 	},
4476 	[ALC882_FIXUP_LENOVO_Y530] = {
4477 		.type = ALC_FIXUP_PINS,
4478 		.v.pins = (const struct alc_pincfg[]) {
4479 			{ 0x15, 0x99130112 }, /* rear int speakers */
4480 			{ 0x16, 0x99130111 }, /* subwoofer */
4481 			{ }
4482 		}
4483 	},
4484 	[ALC882_FIXUP_PB_M5210] = {
4485 		.type = ALC_FIXUP_VERBS,
4486 		.v.verbs = (const struct hda_verb[]) {
4487 			{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 },
4488 			{}
4489 		}
4490 	},
4491 	[ALC882_FIXUP_ACER_ASPIRE_7736] = {
4492 		.type = ALC_FIXUP_SKU,
4493 		.v.sku = ALC_FIXUP_SKU_IGNORE,
4494 	},
4495 	[ALC882_FIXUP_ASUS_W90V] = {
4496 		.type = ALC_FIXUP_PINS,
4497 		.v.pins = (const struct alc_pincfg[]) {
4498 			{ 0x16, 0x99130110 }, /* fix sequence for CLFE */
4499 			{ }
4500 		}
4501 	},
4502 	[ALC889_FIXUP_CD] = {
4503 		.type = ALC_FIXUP_PINS,
4504 		.v.pins = (const struct alc_pincfg[]) {
4505 			{ 0x1c, 0x993301f0 }, /* CD */
4506 			{ }
4507 		}
4508 	},
4509 	[ALC889_FIXUP_VAIO_TT] = {
4510 		.type = ALC_FIXUP_PINS,
4511 		.v.pins = (const struct alc_pincfg[]) {
4512 			{ 0x17, 0x90170111 }, /* hidden surround speaker */
4513 			{ }
4514 		}
4515 	},
4516 	[ALC888_FIXUP_EEE1601] = {
4517 		.type = ALC_FIXUP_VERBS,
4518 		.v.verbs = (const struct hda_verb[]) {
4519 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
4520 			{ 0x20, AC_VERB_SET_PROC_COEF,  0x0838 },
4521 			{ }
4522 		}
4523 	},
4524 	[ALC882_FIXUP_EAPD] = {
4525 		.type = ALC_FIXUP_VERBS,
4526 		.v.verbs = (const struct hda_verb[]) {
4527 			/* change to EAPD mode */
4528 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
4529 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
4530 			{ }
4531 		}
4532 	},
4533 	[ALC883_FIXUP_EAPD] = {
4534 		.type = ALC_FIXUP_VERBS,
4535 		.v.verbs = (const struct hda_verb[]) {
4536 			/* change to EAPD mode */
4537 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
4538 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
4539 			{ }
4540 		}
4541 	},
4542 	[ALC883_FIXUP_ACER_EAPD] = {
4543 		.type = ALC_FIXUP_VERBS,
4544 		.v.verbs = (const struct hda_verb[]) {
4545 			/* eanable EAPD on Acer laptops */
4546 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
4547 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
4548 			{ }
4549 		}
4550 	},
4551 	[ALC882_FIXUP_GPIO3] = {
4552 		.type = ALC_FIXUP_VERBS,
4553 		.v.verbs = alc_gpio3_init_verbs,
4554 	},
4555 	[ALC882_FIXUP_ASUS_W2JC] = {
4556 		.type = ALC_FIXUP_VERBS,
4557 		.v.verbs = alc_gpio1_init_verbs,
4558 		.chained = true,
4559 		.chain_id = ALC882_FIXUP_EAPD,
4560 	},
4561 	[ALC889_FIXUP_COEF] = {
4562 		.type = ALC_FIXUP_FUNC,
4563 		.v.func = alc889_fixup_coef,
4564 	},
4565 	[ALC882_FIXUP_ACER_ASPIRE_4930G] = {
4566 		.type = ALC_FIXUP_PINS,
4567 		.v.pins = (const struct alc_pincfg[]) {
4568 			{ 0x16, 0x99130111 }, /* CLFE speaker */
4569 			{ 0x17, 0x99130112 }, /* surround speaker */
4570 			{ }
4571 		}
4572 	},
4573 	[ALC882_FIXUP_ACER_ASPIRE_8930G] = {
4574 		.type = ALC_FIXUP_PINS,
4575 		.v.pins = (const struct alc_pincfg[]) {
4576 			{ 0x16, 0x99130111 }, /* CLFE speaker */
4577 			{ 0x1b, 0x99130112 }, /* surround speaker */
4578 			{ }
4579 		},
4580 		.chained = true,
4581 		.chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
4582 	},
4583 	[ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
4584 		/* additional init verbs for Acer Aspire 8930G */
4585 		.type = ALC_FIXUP_VERBS,
4586 		.v.verbs = (const struct hda_verb[]) {
4587 			/* Enable all DACs */
4588 			/* DAC DISABLE/MUTE 1? */
4589 			/*  setting bits 1-5 disables DAC nids 0x02-0x06
4590 			 *  apparently. Init=0x38 */
4591 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
4592 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
4593 			/* DAC DISABLE/MUTE 2? */
4594 			/*  some bit here disables the other DACs.
4595 			 *  Init=0x4900 */
4596 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
4597 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
4598 			/* DMIC fix
4599 			 * This laptop has a stereo digital microphone.
4600 			 * The mics are only 1cm apart which makes the stereo
4601 			 * useless. However, either the mic or the ALC889
4602 			 * makes the signal become a difference/sum signal
4603 			 * instead of standard stereo, which is annoying.
4604 			 * So instead we flip this bit which makes the
4605 			 * codec replicate the sum signal to both channels,
4606 			 * turning it into a normal mono mic.
4607 			 */
4608 			/* DMIC_CONTROL? Init value = 0x0001 */
4609 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
4610 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
4611 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
4612 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
4613 			{ }
4614 		}
4615 	},
4616 	[ALC885_FIXUP_MACPRO_GPIO] = {
4617 		.type = ALC_FIXUP_FUNC,
4618 		.v.func = alc885_fixup_macpro_gpio,
4619 	},
4620 	[ALC889_FIXUP_DAC_ROUTE] = {
4621 		.type = ALC_FIXUP_FUNC,
4622 		.v.func = alc889_fixup_dac_route,
4623 	},
4624 };
4625 
4626 static const struct snd_pci_quirk alc882_fixup_tbl[] = {
4627 	SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
4628 	SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
4629 	SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
4630 	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
4631 	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
4632 	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
4633 	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
4634 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
4635 	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
4636 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
4637 	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
4638 		      ALC882_FIXUP_ACER_ASPIRE_8930G),
4639 	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
4640 		      ALC882_FIXUP_ACER_ASPIRE_8930G),
4641 	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
4642 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
4643 	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
4644 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
4645 	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
4646 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
4647 	SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
4648 	SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
4649 	SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
4650 	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
4651 	SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
4652 	SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
4653 	SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
4654 	SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
4655 
4656 	/* All Apple entries are in codec SSIDs */
4657 	SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_FIXUP_MACPRO_GPIO),
4658 	SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
4659 	SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
4660 	SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
4661 	SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
4662 
4663 	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
4664 	SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
4665 	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3", ALC889_FIXUP_CD),
4666 	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
4667 	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
4668 	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
4669 	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
4670 	SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
4671 	{}
4672 };
4673 
4674 /*
4675  * BIOS auto configuration
4676  */
4677 /* almost identical with ALC880 parser... */
alc882_parse_auto_config(struct hda_codec * codec)4678 static int alc882_parse_auto_config(struct hda_codec *codec)
4679 {
4680 	static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
4681 	static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
4682 	return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
4683 }
4684 
4685 /*
4686  */
4687 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4688 #include "alc882_quirks.c"
4689 #endif
4690 
patch_alc882(struct hda_codec * codec)4691 static int patch_alc882(struct hda_codec *codec)
4692 {
4693 	struct alc_spec *spec;
4694 	int err, board_config;
4695 
4696 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4697 	if (spec == NULL)
4698 		return -ENOMEM;
4699 
4700 	codec->spec = spec;
4701 
4702 	spec->mixer_nid = 0x0b;
4703 
4704 	switch (codec->vendor_id) {
4705 	case 0x10ec0882:
4706 	case 0x10ec0885:
4707 		break;
4708 	default:
4709 		/* ALC883 and variants */
4710 		alc_fix_pll_init(codec, 0x20, 0x0a, 10);
4711 		break;
4712 	}
4713 
4714 	err = alc_codec_rename_from_preset(codec);
4715 	if (err < 0)
4716 		goto error;
4717 
4718 	board_config = alc_board_config(codec, ALC882_MODEL_LAST,
4719 					alc882_models, NULL);
4720 	if (board_config < 0)
4721 		board_config = alc_board_codec_sid_config(codec,
4722 			ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
4723 
4724 	if (board_config < 0) {
4725 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4726 		       codec->chip_name);
4727 		board_config = ALC_MODEL_AUTO;
4728 	}
4729 
4730 	if (board_config == ALC_MODEL_AUTO) {
4731 		alc_pick_fixup(codec, NULL, alc882_fixup_tbl, alc882_fixups);
4732 		alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
4733 	}
4734 
4735 	alc_auto_parse_customize_define(codec);
4736 
4737 	if (board_config == ALC_MODEL_AUTO) {
4738 		/* automatic parse from the BIOS config */
4739 		err = alc882_parse_auto_config(codec);
4740 		if (err < 0)
4741 			goto error;
4742 	}
4743 
4744 	if (board_config != ALC_MODEL_AUTO) {
4745 		setup_preset(codec, &alc882_presets[board_config]);
4746 		spec->vmaster_nid = 0x0c;
4747 	}
4748 
4749 	if (!spec->no_analog && !spec->adc_nids) {
4750 		alc_auto_fill_adc_caps(codec);
4751 		alc_rebuild_imux_for_auto_mic(codec);
4752 		alc_remove_invalid_adc_nids(codec);
4753 	}
4754 
4755 	if (!spec->no_analog && !spec->cap_mixer)
4756 		set_capture_mixer(codec);
4757 
4758 	if (!spec->no_analog && has_cdefine_beep(codec)) {
4759 		err = snd_hda_attach_beep_device(codec, 0x1);
4760 		if (err < 0)
4761 			goto error;
4762 		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
4763 	}
4764 
4765 	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
4766 
4767 	codec->patch_ops = alc_patch_ops;
4768 	if (board_config == ALC_MODEL_AUTO)
4769 		spec->init_hook = alc_auto_init_std;
4770 	else
4771 		codec->patch_ops.build_controls = __alc_build_controls;
4772 
4773 #ifdef CONFIG_SND_HDA_POWER_SAVE
4774 	if (!spec->loopback.amplist)
4775 		spec->loopback.amplist = alc882_loopbacks;
4776 #endif
4777 
4778 	return 0;
4779 
4780  error:
4781 	alc_free(codec);
4782 	return err;
4783 }
4784 
4785 
4786 /*
4787  * ALC262 support
4788  */
alc262_parse_auto_config(struct hda_codec * codec)4789 static int alc262_parse_auto_config(struct hda_codec *codec)
4790 {
4791 	static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
4792 	static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
4793 	return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
4794 }
4795 
4796 /*
4797  * Pin config fixes
4798  */
4799 enum {
4800 	ALC262_FIXUP_FSC_H270,
4801 	ALC262_FIXUP_HP_Z200,
4802 	ALC262_FIXUP_TYAN,
4803 	ALC262_FIXUP_LENOVO_3000,
4804 	ALC262_FIXUP_BENQ,
4805 	ALC262_FIXUP_BENQ_T31,
4806 };
4807 
4808 static const struct alc_fixup alc262_fixups[] = {
4809 	[ALC262_FIXUP_FSC_H270] = {
4810 		.type = ALC_FIXUP_PINS,
4811 		.v.pins = (const struct alc_pincfg[]) {
4812 			{ 0x14, 0x99130110 }, /* speaker */
4813 			{ 0x15, 0x0221142f }, /* front HP */
4814 			{ 0x1b, 0x0121141f }, /* rear HP */
4815 			{ }
4816 		}
4817 	},
4818 	[ALC262_FIXUP_HP_Z200] = {
4819 		.type = ALC_FIXUP_PINS,
4820 		.v.pins = (const struct alc_pincfg[]) {
4821 			{ 0x16, 0x99130120 }, /* internal speaker */
4822 			{ }
4823 		}
4824 	},
4825 	[ALC262_FIXUP_TYAN] = {
4826 		.type = ALC_FIXUP_PINS,
4827 		.v.pins = (const struct alc_pincfg[]) {
4828 			{ 0x14, 0x1993e1f0 }, /* int AUX */
4829 			{ }
4830 		}
4831 	},
4832 	[ALC262_FIXUP_LENOVO_3000] = {
4833 		.type = ALC_FIXUP_VERBS,
4834 		.v.verbs = (const struct hda_verb[]) {
4835 			{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 },
4836 			{}
4837 		},
4838 		.chained = true,
4839 		.chain_id = ALC262_FIXUP_BENQ,
4840 	},
4841 	[ALC262_FIXUP_BENQ] = {
4842 		.type = ALC_FIXUP_VERBS,
4843 		.v.verbs = (const struct hda_verb[]) {
4844 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
4845 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
4846 			{}
4847 		}
4848 	},
4849 	[ALC262_FIXUP_BENQ_T31] = {
4850 		.type = ALC_FIXUP_VERBS,
4851 		.v.verbs = (const struct hda_verb[]) {
4852 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
4853 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
4854 			{}
4855 		}
4856 	},
4857 };
4858 
4859 static const struct snd_pci_quirk alc262_fixup_tbl[] = {
4860 	SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
4861 	SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FIXUP_BENQ),
4862 	SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
4863 	SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
4864 	SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
4865 	SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
4866 	SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
4867 	SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
4868 	{}
4869 };
4870 
4871 
4872 #ifdef CONFIG_SND_HDA_POWER_SAVE
4873 #define alc262_loopbacks	alc880_loopbacks
4874 #endif
4875 
4876 /*
4877  */
patch_alc262(struct hda_codec * codec)4878 static int patch_alc262(struct hda_codec *codec)
4879 {
4880 	struct alc_spec *spec;
4881 	int err;
4882 
4883 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4884 	if (spec == NULL)
4885 		return -ENOMEM;
4886 
4887 	codec->spec = spec;
4888 
4889 	spec->mixer_nid = 0x0b;
4890 
4891 #if 0
4892 	/* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
4893 	 * under-run
4894 	 */
4895 	{
4896 	int tmp;
4897 	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
4898 	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
4899 	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
4900 	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
4901 	}
4902 #endif
4903 	alc_auto_parse_customize_define(codec);
4904 
4905 	alc_fix_pll_init(codec, 0x20, 0x0a, 10);
4906 
4907 	alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups);
4908 	alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
4909 
4910 	/* automatic parse from the BIOS config */
4911 	err = alc262_parse_auto_config(codec);
4912 	if (err < 0)
4913 		goto error;
4914 
4915 	if (!spec->no_analog && !spec->adc_nids) {
4916 		alc_auto_fill_adc_caps(codec);
4917 		alc_rebuild_imux_for_auto_mic(codec);
4918 		alc_remove_invalid_adc_nids(codec);
4919 	}
4920 
4921 	if (!spec->no_analog && !spec->cap_mixer)
4922 		set_capture_mixer(codec);
4923 
4924 	if (!spec->no_analog && has_cdefine_beep(codec)) {
4925 		err = snd_hda_attach_beep_device(codec, 0x1);
4926 		if (err < 0)
4927 			goto error;
4928 		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
4929 	}
4930 
4931 	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
4932 
4933 	codec->patch_ops = alc_patch_ops;
4934 	spec->init_hook = alc_auto_init_std;
4935 	spec->shutup = alc_eapd_shutup;
4936 
4937 #ifdef CONFIG_SND_HDA_POWER_SAVE
4938 	if (!spec->loopback.amplist)
4939 		spec->loopback.amplist = alc262_loopbacks;
4940 #endif
4941 
4942 	return 0;
4943 
4944  error:
4945 	alc_free(codec);
4946 	return err;
4947 }
4948 
4949 /*
4950  *  ALC268
4951  */
4952 /* bind Beep switches of both NID 0x0f and 0x10 */
4953 static const struct hda_bind_ctls alc268_bind_beep_sw = {
4954 	.ops = &snd_hda_bind_sw,
4955 	.values = {
4956 		HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
4957 		HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
4958 		0
4959 	},
4960 };
4961 
4962 static const struct snd_kcontrol_new alc268_beep_mixer[] = {
4963 	HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
4964 	HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
4965 	{ }
4966 };
4967 
4968 /* set PCBEEP vol = 0, mute connections */
4969 static const struct hda_verb alc268_beep_init_verbs[] = {
4970 	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4971 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4972 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4973 	{ }
4974 };
4975 
4976 /*
4977  * BIOS auto configuration
4978  */
alc268_parse_auto_config(struct hda_codec * codec)4979 static int alc268_parse_auto_config(struct hda_codec *codec)
4980 {
4981 	static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
4982 	struct alc_spec *spec = codec->spec;
4983 	int err = alc_parse_auto_config(codec, NULL, alc268_ssids);
4984 	if (err > 0) {
4985 		if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d) {
4986 			add_mixer(spec, alc268_beep_mixer);
4987 			add_verb(spec, alc268_beep_init_verbs);
4988 		}
4989 	}
4990 	return err;
4991 }
4992 
4993 /*
4994  */
patch_alc268(struct hda_codec * codec)4995 static int patch_alc268(struct hda_codec *codec)
4996 {
4997 	struct alc_spec *spec;
4998 	int i, has_beep, err;
4999 
5000 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5001 	if (spec == NULL)
5002 		return -ENOMEM;
5003 
5004 	codec->spec = spec;
5005 
5006 	/* ALC268 has no aa-loopback mixer */
5007 
5008 	/* automatic parse from the BIOS config */
5009 	err = alc268_parse_auto_config(codec);
5010 	if (err < 0)
5011 		goto error;
5012 
5013 	has_beep = 0;
5014 	for (i = 0; i < spec->num_mixers; i++) {
5015 		if (spec->mixers[i] == alc268_beep_mixer) {
5016 			has_beep = 1;
5017 			break;
5018 		}
5019 	}
5020 
5021 	if (has_beep) {
5022 		err = snd_hda_attach_beep_device(codec, 0x1);
5023 		if (err < 0)
5024 			goto error;
5025 		if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
5026 			/* override the amp caps for beep generator */
5027 			snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
5028 					  (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
5029 					  (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
5030 					  (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
5031 					  (0 << AC_AMPCAP_MUTE_SHIFT));
5032 	}
5033 
5034 	if (!spec->no_analog && !spec->adc_nids) {
5035 		alc_auto_fill_adc_caps(codec);
5036 		alc_rebuild_imux_for_auto_mic(codec);
5037 		alc_remove_invalid_adc_nids(codec);
5038 	}
5039 
5040 	if (!spec->no_analog && !spec->cap_mixer)
5041 		set_capture_mixer(codec);
5042 
5043 	codec->patch_ops = alc_patch_ops;
5044 	spec->init_hook = alc_auto_init_std;
5045 	spec->shutup = alc_eapd_shutup;
5046 
5047 	return 0;
5048 
5049  error:
5050 	alc_free(codec);
5051 	return err;
5052 }
5053 
5054 /*
5055  * ALC269
5056  */
5057 #ifdef CONFIG_SND_HDA_POWER_SAVE
5058 #define alc269_loopbacks	alc880_loopbacks
5059 #endif
5060 
5061 static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
5062 	.substreams = 1,
5063 	.channels_min = 2,
5064 	.channels_max = 8,
5065 	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
5066 	/* NID is set in alc_build_pcms */
5067 	.ops = {
5068 		.open = alc_playback_pcm_open,
5069 		.prepare = alc_playback_pcm_prepare,
5070 		.cleanup = alc_playback_pcm_cleanup
5071 	},
5072 };
5073 
5074 static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
5075 	.substreams = 1,
5076 	.channels_min = 2,
5077 	.channels_max = 2,
5078 	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
5079 	/* NID is set in alc_build_pcms */
5080 };
5081 
5082 #ifdef CONFIG_SND_HDA_POWER_SAVE
alc269_mic2_for_mute_led(struct hda_codec * codec)5083 static int alc269_mic2_for_mute_led(struct hda_codec *codec)
5084 {
5085 	switch (codec->subsystem_id) {
5086 	case 0x103c1586:
5087 		return 1;
5088 	}
5089 	return 0;
5090 }
5091 
alc269_mic2_mute_check_ps(struct hda_codec * codec,hda_nid_t nid)5092 static int alc269_mic2_mute_check_ps(struct hda_codec *codec, hda_nid_t nid)
5093 {
5094 	/* update mute-LED according to the speaker mute state */
5095 	if (nid == 0x01 || nid == 0x14) {
5096 		int pinval;
5097 		if (snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0) &
5098 		    HDA_AMP_MUTE)
5099 			pinval = 0x24;
5100 		else
5101 			pinval = 0x20;
5102 		/* mic2 vref pin is used for mute LED control */
5103 		snd_hda_codec_update_cache(codec, 0x19, 0,
5104 					   AC_VERB_SET_PIN_WIDGET_CONTROL,
5105 					   pinval);
5106 	}
5107 	return alc_check_power_status(codec, nid);
5108 }
5109 #endif /* CONFIG_SND_HDA_POWER_SAVE */
5110 
5111 /* different alc269-variants */
5112 enum {
5113 	ALC269_TYPE_ALC269VA,
5114 	ALC269_TYPE_ALC269VB,
5115 	ALC269_TYPE_ALC269VC,
5116 };
5117 
5118 /*
5119  * BIOS auto configuration
5120  */
alc269_parse_auto_config(struct hda_codec * codec)5121 static int alc269_parse_auto_config(struct hda_codec *codec)
5122 {
5123 	static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
5124 	static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
5125 	static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
5126 	struct alc_spec *spec = codec->spec;
5127 	const hda_nid_t *ssids = spec->codec_variant == ALC269_TYPE_ALC269VA ?
5128 		alc269va_ssids : alc269_ssids;
5129 
5130 	return alc_parse_auto_config(codec, alc269_ignore, ssids);
5131 }
5132 
alc269_toggle_power_output(struct hda_codec * codec,int power_up)5133 static void alc269_toggle_power_output(struct hda_codec *codec, int power_up)
5134 {
5135 	int val = alc_read_coef_idx(codec, 0x04);
5136 	if (power_up)
5137 		val |= 1 << 11;
5138 	else
5139 		val &= ~(1 << 11);
5140 	alc_write_coef_idx(codec, 0x04, val);
5141 }
5142 
alc269_shutup(struct hda_codec * codec)5143 static void alc269_shutup(struct hda_codec *codec)
5144 {
5145 	if ((alc_get_coef0(codec) & 0x00ff) == 0x017)
5146 		alc269_toggle_power_output(codec, 0);
5147 	if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
5148 		alc269_toggle_power_output(codec, 0);
5149 		msleep(150);
5150 	}
5151 }
5152 
5153 #ifdef CONFIG_PM
alc269_resume(struct hda_codec * codec)5154 static int alc269_resume(struct hda_codec *codec)
5155 {
5156 	if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
5157 		alc269_toggle_power_output(codec, 0);
5158 		msleep(150);
5159 	}
5160 
5161 	codec->patch_ops.init(codec);
5162 
5163 	if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
5164 		alc269_toggle_power_output(codec, 1);
5165 		msleep(200);
5166 	}
5167 
5168 	if ((alc_get_coef0(codec) & 0x00ff) == 0x018)
5169 		alc269_toggle_power_output(codec, 1);
5170 
5171 	snd_hda_codec_resume_amp(codec);
5172 	snd_hda_codec_resume_cache(codec);
5173 	hda_call_check_power_status(codec, 0x01);
5174 	return 0;
5175 }
5176 #endif /* CONFIG_PM */
5177 
alc269_fixup_hweq(struct hda_codec * codec,const struct alc_fixup * fix,int action)5178 static void alc269_fixup_hweq(struct hda_codec *codec,
5179 			       const struct alc_fixup *fix, int action)
5180 {
5181 	int coef;
5182 
5183 	if (action != ALC_FIXUP_ACT_INIT)
5184 		return;
5185 	coef = alc_read_coef_idx(codec, 0x1e);
5186 	alc_write_coef_idx(codec, 0x1e, coef | 0x80);
5187 }
5188 
alc271_fixup_dmic(struct hda_codec * codec,const struct alc_fixup * fix,int action)5189 static void alc271_fixup_dmic(struct hda_codec *codec,
5190 			      const struct alc_fixup *fix, int action)
5191 {
5192 	static const struct hda_verb verbs[] = {
5193 		{0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
5194 		{0x20, AC_VERB_SET_PROC_COEF, 0x4000},
5195 		{}
5196 	};
5197 	unsigned int cfg;
5198 
5199 	if (strcmp(codec->chip_name, "ALC271X"))
5200 		return;
5201 	cfg = snd_hda_codec_get_pincfg(codec, 0x12);
5202 	if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
5203 		snd_hda_sequence_write(codec, verbs);
5204 }
5205 
alc269_fixup_pcm_44k(struct hda_codec * codec,const struct alc_fixup * fix,int action)5206 static void alc269_fixup_pcm_44k(struct hda_codec *codec,
5207 				 const struct alc_fixup *fix, int action)
5208 {
5209 	struct alc_spec *spec = codec->spec;
5210 
5211 	if (action != ALC_FIXUP_ACT_PROBE)
5212 		return;
5213 
5214 	/* Due to a hardware problem on Lenovo Ideadpad, we need to
5215 	 * fix the sample rate of analog I/O to 44.1kHz
5216 	 */
5217 	spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
5218 	spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
5219 }
5220 
alc269_fixup_stereo_dmic(struct hda_codec * codec,const struct alc_fixup * fix,int action)5221 static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
5222 				     const struct alc_fixup *fix, int action)
5223 {
5224 	int coef;
5225 
5226 	if (action != ALC_FIXUP_ACT_INIT)
5227 		return;
5228 	/* The digital-mic unit sends PDM (differential signal) instead of
5229 	 * the standard PCM, thus you can't record a valid mono stream as is.
5230 	 * Below is a workaround specific to ALC269 to control the dmic
5231 	 * signal source as mono.
5232 	 */
5233 	coef = alc_read_coef_idx(codec, 0x07);
5234 	alc_write_coef_idx(codec, 0x07, coef | 0x80);
5235 }
5236 
alc269_quanta_automute(struct hda_codec * codec)5237 static void alc269_quanta_automute(struct hda_codec *codec)
5238 {
5239 	update_outputs(codec);
5240 
5241 	snd_hda_codec_write(codec, 0x20, 0,
5242 			AC_VERB_SET_COEF_INDEX, 0x0c);
5243 	snd_hda_codec_write(codec, 0x20, 0,
5244 			AC_VERB_SET_PROC_COEF, 0x680);
5245 
5246 	snd_hda_codec_write(codec, 0x20, 0,
5247 			AC_VERB_SET_COEF_INDEX, 0x0c);
5248 	snd_hda_codec_write(codec, 0x20, 0,
5249 			AC_VERB_SET_PROC_COEF, 0x480);
5250 }
5251 
alc269_fixup_quanta_mute(struct hda_codec * codec,const struct alc_fixup * fix,int action)5252 static void alc269_fixup_quanta_mute(struct hda_codec *codec,
5253 				     const struct alc_fixup *fix, int action)
5254 {
5255 	struct alc_spec *spec = codec->spec;
5256 	if (action != ALC_FIXUP_ACT_PROBE)
5257 		return;
5258 	spec->automute_hook = alc269_quanta_automute;
5259 }
5260 
5261 enum {
5262 	ALC269_FIXUP_SONY_VAIO,
5263 	ALC275_FIXUP_SONY_VAIO_GPIO2,
5264 	ALC269_FIXUP_DELL_M101Z,
5265 	ALC269_FIXUP_SKU_IGNORE,
5266 	ALC269_FIXUP_ASUS_G73JW,
5267 	ALC269_FIXUP_LENOVO_EAPD,
5268 	ALC275_FIXUP_SONY_HWEQ,
5269 	ALC271_FIXUP_DMIC,
5270 	ALC269_FIXUP_PCM_44K,
5271 	ALC269_FIXUP_STEREO_DMIC,
5272 	ALC269_FIXUP_QUANTA_MUTE,
5273 	ALC269_FIXUP_LIFEBOOK,
5274 	ALC269_FIXUP_AMIC,
5275 	ALC269_FIXUP_DMIC,
5276 	ALC269VB_FIXUP_AMIC,
5277 	ALC269VB_FIXUP_DMIC,
5278 };
5279 
5280 static const struct alc_fixup alc269_fixups[] = {
5281 	[ALC269_FIXUP_SONY_VAIO] = {
5282 		.type = ALC_FIXUP_VERBS,
5283 		.v.verbs = (const struct hda_verb[]) {
5284 			{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
5285 			{}
5286 		}
5287 	},
5288 	[ALC275_FIXUP_SONY_VAIO_GPIO2] = {
5289 		.type = ALC_FIXUP_VERBS,
5290 		.v.verbs = (const struct hda_verb[]) {
5291 			{0x01, AC_VERB_SET_GPIO_MASK, 0x04},
5292 			{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04},
5293 			{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5294 			{ }
5295 		},
5296 		.chained = true,
5297 		.chain_id = ALC269_FIXUP_SONY_VAIO
5298 	},
5299 	[ALC269_FIXUP_DELL_M101Z] = {
5300 		.type = ALC_FIXUP_VERBS,
5301 		.v.verbs = (const struct hda_verb[]) {
5302 			/* Enables internal speaker */
5303 			{0x20, AC_VERB_SET_COEF_INDEX, 13},
5304 			{0x20, AC_VERB_SET_PROC_COEF, 0x4040},
5305 			{}
5306 		}
5307 	},
5308 	[ALC269_FIXUP_SKU_IGNORE] = {
5309 		.type = ALC_FIXUP_SKU,
5310 		.v.sku = ALC_FIXUP_SKU_IGNORE,
5311 	},
5312 	[ALC269_FIXUP_ASUS_G73JW] = {
5313 		.type = ALC_FIXUP_PINS,
5314 		.v.pins = (const struct alc_pincfg[]) {
5315 			{ 0x17, 0x99130111 }, /* subwoofer */
5316 			{ }
5317 		}
5318 	},
5319 	[ALC269_FIXUP_LENOVO_EAPD] = {
5320 		.type = ALC_FIXUP_VERBS,
5321 		.v.verbs = (const struct hda_verb[]) {
5322 			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
5323 			{}
5324 		}
5325 	},
5326 	[ALC275_FIXUP_SONY_HWEQ] = {
5327 		.type = ALC_FIXUP_FUNC,
5328 		.v.func = alc269_fixup_hweq,
5329 		.chained = true,
5330 		.chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
5331 	},
5332 	[ALC271_FIXUP_DMIC] = {
5333 		.type = ALC_FIXUP_FUNC,
5334 		.v.func = alc271_fixup_dmic,
5335 	},
5336 	[ALC269_FIXUP_PCM_44K] = {
5337 		.type = ALC_FIXUP_FUNC,
5338 		.v.func = alc269_fixup_pcm_44k,
5339 	},
5340 	[ALC269_FIXUP_STEREO_DMIC] = {
5341 		.type = ALC_FIXUP_FUNC,
5342 		.v.func = alc269_fixup_stereo_dmic,
5343 	},
5344 	[ALC269_FIXUP_QUANTA_MUTE] = {
5345 		.type = ALC_FIXUP_FUNC,
5346 		.v.func = alc269_fixup_quanta_mute,
5347 	},
5348 	[ALC269_FIXUP_LIFEBOOK] = {
5349 		.type = ALC_FIXUP_PINS,
5350 		.v.pins = (const struct alc_pincfg[]) {
5351 			{ 0x1a, 0x2101103f }, /* dock line-out */
5352 			{ 0x1b, 0x23a11040 }, /* dock mic-in */
5353 			{ }
5354 		},
5355 		.chained = true,
5356 		.chain_id = ALC269_FIXUP_QUANTA_MUTE
5357 	},
5358 	[ALC269_FIXUP_AMIC] = {
5359 		.type = ALC_FIXUP_PINS,
5360 		.v.pins = (const struct alc_pincfg[]) {
5361 			{ 0x14, 0x99130110 }, /* speaker */
5362 			{ 0x15, 0x0121401f }, /* HP out */
5363 			{ 0x18, 0x01a19c20 }, /* mic */
5364 			{ 0x19, 0x99a3092f }, /* int-mic */
5365 			{ }
5366 		},
5367 	},
5368 	[ALC269_FIXUP_DMIC] = {
5369 		.type = ALC_FIXUP_PINS,
5370 		.v.pins = (const struct alc_pincfg[]) {
5371 			{ 0x12, 0x99a3092f }, /* int-mic */
5372 			{ 0x14, 0x99130110 }, /* speaker */
5373 			{ 0x15, 0x0121401f }, /* HP out */
5374 			{ 0x18, 0x01a19c20 }, /* mic */
5375 			{ }
5376 		},
5377 	},
5378 	[ALC269VB_FIXUP_AMIC] = {
5379 		.type = ALC_FIXUP_PINS,
5380 		.v.pins = (const struct alc_pincfg[]) {
5381 			{ 0x14, 0x99130110 }, /* speaker */
5382 			{ 0x18, 0x01a19c20 }, /* mic */
5383 			{ 0x19, 0x99a3092f }, /* int-mic */
5384 			{ 0x21, 0x0121401f }, /* HP out */
5385 			{ }
5386 		},
5387 	},
5388 	[ALC269VB_FIXUP_DMIC] = {
5389 		.type = ALC_FIXUP_PINS,
5390 		.v.pins = (const struct alc_pincfg[]) {
5391 			{ 0x12, 0x99a3092f }, /* int-mic */
5392 			{ 0x14, 0x99130110 }, /* speaker */
5393 			{ 0x18, 0x01a19c20 }, /* mic */
5394 			{ 0x21, 0x0121401f }, /* HP out */
5395 			{ }
5396 		},
5397 	},
5398 };
5399 
5400 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
5401 	SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
5402 	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
5403 	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
5404 	SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
5405 	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
5406 	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
5407 	SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
5408 	SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
5409 	SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
5410 	SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
5411 	SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
5412 	SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
5413 	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
5414 	SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
5415 	SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
5416 	SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
5417 	SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
5418 	SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
5419 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_QUANTA_MUTE),
5420 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Lenovo Ideapd", ALC269_FIXUP_PCM_44K),
5421 	SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
5422 
5423 #if 1
5424 	/* Below is a quirk table taken from the old code.
5425 	 * Basically the device should work as is without the fixup table.
5426 	 * If BIOS doesn't give a proper info, enable the corresponding
5427 	 * fixup entry.
5428 	 */
5429 	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
5430 		      ALC269_FIXUP_AMIC),
5431 	SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
5432 	SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
5433 	SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
5434 	SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
5435 	SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
5436 	SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
5437 	SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
5438 	SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
5439 	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
5440 	SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
5441 	SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
5442 	SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
5443 	SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
5444 	SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
5445 	SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
5446 	SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
5447 	SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
5448 	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
5449 	SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
5450 	SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
5451 	SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
5452 	SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
5453 	SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
5454 	SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
5455 	SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
5456 	SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
5457 	SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
5458 	SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
5459 	SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
5460 	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
5461 	SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
5462 	SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
5463 	SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
5464 	SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
5465 	SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
5466 	SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
5467 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
5468 	SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
5469 	SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
5470 #endif
5471 	{}
5472 };
5473 
5474 static const struct alc_model_fixup alc269_fixup_models[] = {
5475 	{.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
5476 	{.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
5477 	{}
5478 };
5479 
5480 
alc269_fill_coef(struct hda_codec * codec)5481 static int alc269_fill_coef(struct hda_codec *codec)
5482 {
5483 	struct alc_spec *spec = codec->spec;
5484 	int val;
5485 
5486 	if (spec->codec_variant != ALC269_TYPE_ALC269VB)
5487 		return 0;
5488 
5489 	if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
5490 		alc_write_coef_idx(codec, 0xf, 0x960b);
5491 		alc_write_coef_idx(codec, 0xe, 0x8817);
5492 	}
5493 
5494 	if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
5495 		alc_write_coef_idx(codec, 0xf, 0x960b);
5496 		alc_write_coef_idx(codec, 0xe, 0x8814);
5497 	}
5498 
5499 	if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
5500 		val = alc_read_coef_idx(codec, 0x04);
5501 		/* Power up output pin */
5502 		alc_write_coef_idx(codec, 0x04, val | (1<<11));
5503 	}
5504 
5505 	if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
5506 		val = alc_read_coef_idx(codec, 0xd);
5507 		if ((val & 0x0c00) >> 10 != 0x1) {
5508 			/* Capless ramp up clock control */
5509 			alc_write_coef_idx(codec, 0xd, val | (1<<10));
5510 		}
5511 		val = alc_read_coef_idx(codec, 0x17);
5512 		if ((val & 0x01c0) >> 6 != 0x4) {
5513 			/* Class D power on reset */
5514 			alc_write_coef_idx(codec, 0x17, val | (1<<7));
5515 		}
5516 	}
5517 
5518 	val = alc_read_coef_idx(codec, 0xd); /* Class D */
5519 	alc_write_coef_idx(codec, 0xd, val | (1<<14));
5520 
5521 	val = alc_read_coef_idx(codec, 0x4); /* HP */
5522 	alc_write_coef_idx(codec, 0x4, val | (1<<11));
5523 
5524 	return 0;
5525 }
5526 
5527 /*
5528  */
patch_alc269(struct hda_codec * codec)5529 static int patch_alc269(struct hda_codec *codec)
5530 {
5531 	struct alc_spec *spec;
5532 	int err = 0;
5533 
5534 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5535 	if (spec == NULL)
5536 		return -ENOMEM;
5537 
5538 	codec->spec = spec;
5539 
5540 	spec->mixer_nid = 0x0b;
5541 
5542 	alc_auto_parse_customize_define(codec);
5543 
5544 	err = alc_codec_rename_from_preset(codec);
5545 	if (err < 0)
5546 		goto error;
5547 
5548 	if (codec->vendor_id == 0x10ec0269) {
5549 		spec->codec_variant = ALC269_TYPE_ALC269VA;
5550 		switch (alc_get_coef0(codec) & 0x00f0) {
5551 		case 0x0010:
5552 			if (codec->bus->pci->subsystem_vendor == 0x1025 &&
5553 			    spec->cdefine.platform_type == 1)
5554 				err = alc_codec_rename(codec, "ALC271X");
5555 			spec->codec_variant = ALC269_TYPE_ALC269VB;
5556 			break;
5557 		case 0x0020:
5558 			if (codec->bus->pci->subsystem_vendor == 0x17aa &&
5559 			    codec->bus->pci->subsystem_device == 0x21f3)
5560 				err = alc_codec_rename(codec, "ALC3202");
5561 			spec->codec_variant = ALC269_TYPE_ALC269VC;
5562 			break;
5563 		default:
5564 			alc_fix_pll_init(codec, 0x20, 0x04, 15);
5565 		}
5566 		if (err < 0)
5567 			goto error;
5568 		alc269_fill_coef(codec);
5569 	}
5570 
5571 	alc_pick_fixup(codec, alc269_fixup_models,
5572 		       alc269_fixup_tbl, alc269_fixups);
5573 	alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
5574 
5575 	/* automatic parse from the BIOS config */
5576 	err = alc269_parse_auto_config(codec);
5577 	if (err < 0)
5578 		goto error;
5579 
5580 	if (!spec->no_analog && !spec->adc_nids) {
5581 		alc_auto_fill_adc_caps(codec);
5582 		alc_rebuild_imux_for_auto_mic(codec);
5583 		alc_remove_invalid_adc_nids(codec);
5584 	}
5585 
5586 	if (!spec->no_analog && !spec->cap_mixer)
5587 		set_capture_mixer(codec);
5588 
5589 	if (!spec->no_analog && has_cdefine_beep(codec)) {
5590 		err = snd_hda_attach_beep_device(codec, 0x1);
5591 		if (err < 0)
5592 			goto error;
5593 		set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
5594 	}
5595 
5596 	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
5597 
5598 	codec->patch_ops = alc_patch_ops;
5599 #ifdef CONFIG_PM
5600 	codec->patch_ops.resume = alc269_resume;
5601 #endif
5602 	spec->init_hook = alc_auto_init_std;
5603 	spec->shutup = alc269_shutup;
5604 
5605 #ifdef CONFIG_SND_HDA_POWER_SAVE
5606 	if (!spec->loopback.amplist)
5607 		spec->loopback.amplist = alc269_loopbacks;
5608 	if (alc269_mic2_for_mute_led(codec))
5609 		codec->patch_ops.check_power_status = alc269_mic2_mute_check_ps;
5610 #endif
5611 
5612 	return 0;
5613 
5614  error:
5615 	alc_free(codec);
5616 	return err;
5617 }
5618 
5619 /*
5620  * ALC861
5621  */
5622 
alc861_parse_auto_config(struct hda_codec * codec)5623 static int alc861_parse_auto_config(struct hda_codec *codec)
5624 {
5625 	static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
5626 	static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
5627 	return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
5628 }
5629 
5630 #ifdef CONFIG_SND_HDA_POWER_SAVE
5631 static const struct hda_amp_list alc861_loopbacks[] = {
5632 	{ 0x15, HDA_INPUT, 0 },
5633 	{ 0x15, HDA_INPUT, 1 },
5634 	{ 0x15, HDA_INPUT, 2 },
5635 	{ 0x15, HDA_INPUT, 3 },
5636 	{ } /* end */
5637 };
5638 #endif
5639 
5640 
5641 /* Pin config fixes */
5642 enum {
5643 	PINFIX_FSC_AMILO_PI1505,
5644 	PINFIX_ASUS_A6RP,
5645 };
5646 
5647 /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
alc861_fixup_asus_amp_vref_0f(struct hda_codec * codec,const struct alc_fixup * fix,int action)5648 static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
5649 			const struct alc_fixup *fix, int action)
5650 {
5651 	struct alc_spec *spec = codec->spec;
5652 	unsigned int val;
5653 
5654 	if (action != ALC_FIXUP_ACT_INIT)
5655 		return;
5656 	val = snd_hda_codec_read(codec, 0x0f, 0,
5657 				 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
5658 	if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
5659 		val |= AC_PINCTL_IN_EN;
5660 	val |= AC_PINCTL_VREF_50;
5661 	snd_hda_codec_write(codec, 0x0f, 0,
5662 			    AC_VERB_SET_PIN_WIDGET_CONTROL, val);
5663 	spec->keep_vref_in_automute = 1;
5664 }
5665 
5666 static const struct alc_fixup alc861_fixups[] = {
5667 	[PINFIX_FSC_AMILO_PI1505] = {
5668 		.type = ALC_FIXUP_PINS,
5669 		.v.pins = (const struct alc_pincfg[]) {
5670 			{ 0x0b, 0x0221101f }, /* HP */
5671 			{ 0x0f, 0x90170310 }, /* speaker */
5672 			{ }
5673 		}
5674 	},
5675 	[PINFIX_ASUS_A6RP] = {
5676 		.type = ALC_FIXUP_FUNC,
5677 		.v.func = alc861_fixup_asus_amp_vref_0f,
5678 	},
5679 };
5680 
5681 static const struct snd_pci_quirk alc861_fixup_tbl[] = {
5682 	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", PINFIX_ASUS_A6RP),
5683 	SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", PINFIX_ASUS_A6RP),
5684 	SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", PINFIX_ASUS_A6RP),
5685 	SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
5686 	{}
5687 };
5688 
5689 /*
5690  */
patch_alc861(struct hda_codec * codec)5691 static int patch_alc861(struct hda_codec *codec)
5692 {
5693 	struct alc_spec *spec;
5694 	int err;
5695 
5696 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5697 	if (spec == NULL)
5698 		return -ENOMEM;
5699 
5700 	codec->spec = spec;
5701 
5702 	spec->mixer_nid = 0x15;
5703 
5704 	alc_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
5705 	alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
5706 
5707 	/* automatic parse from the BIOS config */
5708 	err = alc861_parse_auto_config(codec);
5709 	if (err < 0)
5710 		goto error;
5711 
5712 	if (!spec->no_analog && !spec->adc_nids) {
5713 		alc_auto_fill_adc_caps(codec);
5714 		alc_rebuild_imux_for_auto_mic(codec);
5715 		alc_remove_invalid_adc_nids(codec);
5716 	}
5717 
5718 	if (!spec->no_analog && !spec->cap_mixer)
5719 		set_capture_mixer(codec);
5720 
5721 	if (!spec->no_analog) {
5722 		err = snd_hda_attach_beep_device(codec, 0x23);
5723 		if (err < 0)
5724 			goto error;
5725 		set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
5726 	}
5727 
5728 	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
5729 
5730 	codec->patch_ops = alc_patch_ops;
5731 	spec->init_hook = alc_auto_init_std;
5732 #ifdef CONFIG_SND_HDA_POWER_SAVE
5733 	spec->power_hook = alc_power_eapd;
5734 	if (!spec->loopback.amplist)
5735 		spec->loopback.amplist = alc861_loopbacks;
5736 #endif
5737 
5738 	return 0;
5739 
5740  error:
5741 	alc_free(codec);
5742 	return err;
5743 }
5744 
5745 /*
5746  * ALC861-VD support
5747  *
5748  * Based on ALC882
5749  *
5750  * In addition, an independent DAC
5751  */
5752 #ifdef CONFIG_SND_HDA_POWER_SAVE
5753 #define alc861vd_loopbacks	alc880_loopbacks
5754 #endif
5755 
alc861vd_parse_auto_config(struct hda_codec * codec)5756 static int alc861vd_parse_auto_config(struct hda_codec *codec)
5757 {
5758 	static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
5759 	static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
5760 	return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
5761 }
5762 
5763 enum {
5764 	ALC660VD_FIX_ASUS_GPIO1,
5765 	ALC861VD_FIX_DALLAS,
5766 };
5767 
5768 /* exclude VREF80 */
alc861vd_fixup_dallas(struct hda_codec * codec,const struct alc_fixup * fix,int action)5769 static void alc861vd_fixup_dallas(struct hda_codec *codec,
5770 				  const struct alc_fixup *fix, int action)
5771 {
5772 	if (action == ALC_FIXUP_ACT_PRE_PROBE) {
5773 		snd_hda_override_pin_caps(codec, 0x18, 0x00001714);
5774 		snd_hda_override_pin_caps(codec, 0x19, 0x0000171c);
5775 	}
5776 }
5777 
5778 static const struct alc_fixup alc861vd_fixups[] = {
5779 	[ALC660VD_FIX_ASUS_GPIO1] = {
5780 		.type = ALC_FIXUP_VERBS,
5781 		.v.verbs = (const struct hda_verb[]) {
5782 			/* reset GPIO1 */
5783 			{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
5784 			{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5785 			{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5786 			{ }
5787 		}
5788 	},
5789 	[ALC861VD_FIX_DALLAS] = {
5790 		.type = ALC_FIXUP_FUNC,
5791 		.v.func = alc861vd_fixup_dallas,
5792 	},
5793 };
5794 
5795 static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
5796 	SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
5797 	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
5798 	SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
5799 	{}
5800 };
5801 
5802 static const struct hda_verb alc660vd_eapd_verbs[] = {
5803 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
5804 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
5805 	{ }
5806 };
5807 
5808 /*
5809  */
patch_alc861vd(struct hda_codec * codec)5810 static int patch_alc861vd(struct hda_codec *codec)
5811 {
5812 	struct alc_spec *spec;
5813 	int err;
5814 
5815 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5816 	if (spec == NULL)
5817 		return -ENOMEM;
5818 
5819 	codec->spec = spec;
5820 
5821 	spec->mixer_nid = 0x0b;
5822 
5823 	alc_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
5824 	alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
5825 
5826 	/* automatic parse from the BIOS config */
5827 	err = alc861vd_parse_auto_config(codec);
5828 	if (err < 0)
5829 		goto error;
5830 
5831 	if (codec->vendor_id == 0x10ec0660) {
5832 		/* always turn on EAPD */
5833 		add_verb(spec, alc660vd_eapd_verbs);
5834 	}
5835 
5836 	if (!spec->no_analog && !spec->adc_nids) {
5837 		alc_auto_fill_adc_caps(codec);
5838 		alc_rebuild_imux_for_auto_mic(codec);
5839 		alc_remove_invalid_adc_nids(codec);
5840 	}
5841 
5842 	if (!spec->no_analog && !spec->cap_mixer)
5843 		set_capture_mixer(codec);
5844 
5845 	if (!spec->no_analog) {
5846 		err = snd_hda_attach_beep_device(codec, 0x23);
5847 		if (err < 0)
5848 			goto error;
5849 		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
5850 	}
5851 
5852 	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
5853 
5854 	codec->patch_ops = alc_patch_ops;
5855 
5856 	spec->init_hook = alc_auto_init_std;
5857 	spec->shutup = alc_eapd_shutup;
5858 #ifdef CONFIG_SND_HDA_POWER_SAVE
5859 	if (!spec->loopback.amplist)
5860 		spec->loopback.amplist = alc861vd_loopbacks;
5861 #endif
5862 
5863 	return 0;
5864 
5865  error:
5866 	alc_free(codec);
5867 	return err;
5868 }
5869 
5870 /*
5871  * ALC662 support
5872  *
5873  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
5874  * configuration.  Each pin widget can choose any input DACs and a mixer.
5875  * Each ADC is connected from a mixer of all inputs.  This makes possible
5876  * 6-channel independent captures.
5877  *
5878  * In addition, an independent DAC for the multi-playback (not used in this
5879  * driver yet).
5880  */
5881 #ifdef CONFIG_SND_HDA_POWER_SAVE
5882 #define alc662_loopbacks	alc880_loopbacks
5883 #endif
5884 
5885 /*
5886  * BIOS auto configuration
5887  */
5888 
alc662_parse_auto_config(struct hda_codec * codec)5889 static int alc662_parse_auto_config(struct hda_codec *codec)
5890 {
5891 	static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
5892 	static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
5893 	static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
5894 	const hda_nid_t *ssids;
5895 
5896 	if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
5897 	    codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
5898 		ssids = alc663_ssids;
5899 	else
5900 		ssids = alc662_ssids;
5901 	return alc_parse_auto_config(codec, alc662_ignore, ssids);
5902 }
5903 
alc272_fixup_mario(struct hda_codec * codec,const struct alc_fixup * fix,int action)5904 static void alc272_fixup_mario(struct hda_codec *codec,
5905 			       const struct alc_fixup *fix, int action)
5906 {
5907 	if (action != ALC_FIXUP_ACT_PROBE)
5908 		return;
5909 	if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
5910 				      (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
5911 				      (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
5912 				      (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
5913 				      (0 << AC_AMPCAP_MUTE_SHIFT)))
5914 		printk(KERN_WARNING
5915 		       "hda_codec: failed to override amp caps for NID 0x2\n");
5916 }
5917 
5918 enum {
5919 	ALC662_FIXUP_ASPIRE,
5920 	ALC662_FIXUP_IDEAPAD,
5921 	ALC272_FIXUP_MARIO,
5922 	ALC662_FIXUP_CZC_P10T,
5923 	ALC662_FIXUP_SKU_IGNORE,
5924 	ALC662_FIXUP_HP_RP5800,
5925 	ALC662_FIXUP_ASUS_MODE1,
5926 	ALC662_FIXUP_ASUS_MODE2,
5927 	ALC662_FIXUP_ASUS_MODE3,
5928 	ALC662_FIXUP_ASUS_MODE4,
5929 	ALC662_FIXUP_ASUS_MODE5,
5930 	ALC662_FIXUP_ASUS_MODE6,
5931 	ALC662_FIXUP_ASUS_MODE7,
5932 	ALC662_FIXUP_ASUS_MODE8,
5933 };
5934 
5935 static const struct alc_fixup alc662_fixups[] = {
5936 	[ALC662_FIXUP_ASPIRE] = {
5937 		.type = ALC_FIXUP_PINS,
5938 		.v.pins = (const struct alc_pincfg[]) {
5939 			{ 0x15, 0x99130112 }, /* subwoofer */
5940 			{ }
5941 		}
5942 	},
5943 	[ALC662_FIXUP_IDEAPAD] = {
5944 		.type = ALC_FIXUP_PINS,
5945 		.v.pins = (const struct alc_pincfg[]) {
5946 			{ 0x17, 0x99130112 }, /* subwoofer */
5947 			{ }
5948 		}
5949 	},
5950 	[ALC272_FIXUP_MARIO] = {
5951 		.type = ALC_FIXUP_FUNC,
5952 		.v.func = alc272_fixup_mario,
5953 	},
5954 	[ALC662_FIXUP_CZC_P10T] = {
5955 		.type = ALC_FIXUP_VERBS,
5956 		.v.verbs = (const struct hda_verb[]) {
5957 			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
5958 			{}
5959 		}
5960 	},
5961 	[ALC662_FIXUP_SKU_IGNORE] = {
5962 		.type = ALC_FIXUP_SKU,
5963 		.v.sku = ALC_FIXUP_SKU_IGNORE,
5964 	},
5965 	[ALC662_FIXUP_HP_RP5800] = {
5966 		.type = ALC_FIXUP_PINS,
5967 		.v.pins = (const struct alc_pincfg[]) {
5968 			{ 0x14, 0x0221201f }, /* HP out */
5969 			{ }
5970 		},
5971 		.chained = true,
5972 		.chain_id = ALC662_FIXUP_SKU_IGNORE
5973 	},
5974 	[ALC662_FIXUP_ASUS_MODE1] = {
5975 		.type = ALC_FIXUP_PINS,
5976 		.v.pins = (const struct alc_pincfg[]) {
5977 			{ 0x14, 0x99130110 }, /* speaker */
5978 			{ 0x18, 0x01a19c20 }, /* mic */
5979 			{ 0x19, 0x99a3092f }, /* int-mic */
5980 			{ 0x21, 0x0121401f }, /* HP out */
5981 			{ }
5982 		},
5983 		.chained = true,
5984 		.chain_id = ALC662_FIXUP_SKU_IGNORE
5985 	},
5986 	[ALC662_FIXUP_ASUS_MODE2] = {
5987 		.type = ALC_FIXUP_PINS,
5988 		.v.pins = (const struct alc_pincfg[]) {
5989 			{ 0x14, 0x99130110 }, /* speaker */
5990 			{ 0x18, 0x01a19820 }, /* mic */
5991 			{ 0x19, 0x99a3092f }, /* int-mic */
5992 			{ 0x1b, 0x0121401f }, /* HP out */
5993 			{ }
5994 		},
5995 		.chained = true,
5996 		.chain_id = ALC662_FIXUP_SKU_IGNORE
5997 	},
5998 	[ALC662_FIXUP_ASUS_MODE3] = {
5999 		.type = ALC_FIXUP_PINS,
6000 		.v.pins = (const struct alc_pincfg[]) {
6001 			{ 0x14, 0x99130110 }, /* speaker */
6002 			{ 0x15, 0x0121441f }, /* HP */
6003 			{ 0x18, 0x01a19840 }, /* mic */
6004 			{ 0x19, 0x99a3094f }, /* int-mic */
6005 			{ 0x21, 0x01211420 }, /* HP2 */
6006 			{ }
6007 		},
6008 		.chained = true,
6009 		.chain_id = ALC662_FIXUP_SKU_IGNORE
6010 	},
6011 	[ALC662_FIXUP_ASUS_MODE4] = {
6012 		.type = ALC_FIXUP_PINS,
6013 		.v.pins = (const struct alc_pincfg[]) {
6014 			{ 0x14, 0x99130110 }, /* speaker */
6015 			{ 0x16, 0x99130111 }, /* speaker */
6016 			{ 0x18, 0x01a19840 }, /* mic */
6017 			{ 0x19, 0x99a3094f }, /* int-mic */
6018 			{ 0x21, 0x0121441f }, /* HP */
6019 			{ }
6020 		},
6021 		.chained = true,
6022 		.chain_id = ALC662_FIXUP_SKU_IGNORE
6023 	},
6024 	[ALC662_FIXUP_ASUS_MODE5] = {
6025 		.type = ALC_FIXUP_PINS,
6026 		.v.pins = (const struct alc_pincfg[]) {
6027 			{ 0x14, 0x99130110 }, /* speaker */
6028 			{ 0x15, 0x0121441f }, /* HP */
6029 			{ 0x16, 0x99130111 }, /* speaker */
6030 			{ 0x18, 0x01a19840 }, /* mic */
6031 			{ 0x19, 0x99a3094f }, /* int-mic */
6032 			{ }
6033 		},
6034 		.chained = true,
6035 		.chain_id = ALC662_FIXUP_SKU_IGNORE
6036 	},
6037 	[ALC662_FIXUP_ASUS_MODE6] = {
6038 		.type = ALC_FIXUP_PINS,
6039 		.v.pins = (const struct alc_pincfg[]) {
6040 			{ 0x14, 0x99130110 }, /* speaker */
6041 			{ 0x15, 0x01211420 }, /* HP2 */
6042 			{ 0x18, 0x01a19840 }, /* mic */
6043 			{ 0x19, 0x99a3094f }, /* int-mic */
6044 			{ 0x1b, 0x0121441f }, /* HP */
6045 			{ }
6046 		},
6047 		.chained = true,
6048 		.chain_id = ALC662_FIXUP_SKU_IGNORE
6049 	},
6050 	[ALC662_FIXUP_ASUS_MODE7] = {
6051 		.type = ALC_FIXUP_PINS,
6052 		.v.pins = (const struct alc_pincfg[]) {
6053 			{ 0x14, 0x99130110 }, /* speaker */
6054 			{ 0x17, 0x99130111 }, /* speaker */
6055 			{ 0x18, 0x01a19840 }, /* mic */
6056 			{ 0x19, 0x99a3094f }, /* int-mic */
6057 			{ 0x1b, 0x01214020 }, /* HP */
6058 			{ 0x21, 0x0121401f }, /* HP */
6059 			{ }
6060 		},
6061 		.chained = true,
6062 		.chain_id = ALC662_FIXUP_SKU_IGNORE
6063 	},
6064 	[ALC662_FIXUP_ASUS_MODE8] = {
6065 		.type = ALC_FIXUP_PINS,
6066 		.v.pins = (const struct alc_pincfg[]) {
6067 			{ 0x14, 0x99130110 }, /* speaker */
6068 			{ 0x12, 0x99a30970 }, /* int-mic */
6069 			{ 0x15, 0x01214020 }, /* HP */
6070 			{ 0x17, 0x99130111 }, /* speaker */
6071 			{ 0x18, 0x01a19840 }, /* mic */
6072 			{ 0x21, 0x0121401f }, /* HP */
6073 			{ }
6074 		},
6075 		.chained = true,
6076 		.chain_id = ALC662_FIXUP_SKU_IGNORE
6077 	},
6078 };
6079 
6080 static const struct snd_pci_quirk alc662_fixup_tbl[] = {
6081 	SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
6082 	SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
6083 	SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
6084 	SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
6085 	SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
6086 	SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
6087 	SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
6088 	SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
6089 	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
6090 	SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
6091 
6092 #if 0
6093 	/* Below is a quirk table taken from the old code.
6094 	 * Basically the device should work as is without the fixup table.
6095 	 * If BIOS doesn't give a proper info, enable the corresponding
6096 	 * fixup entry.
6097 	 */
6098 	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
6099 	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
6100 	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
6101 	SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
6102 	SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
6103 	SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
6104 	SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
6105 	SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
6106 	SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
6107 	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
6108 	SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
6109 	SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
6110 	SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
6111 	SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
6112 	SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
6113 	SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
6114 	SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
6115 	SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
6116 	SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
6117 	SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
6118 	SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
6119 	SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
6120 	SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
6121 	SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
6122 	SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
6123 	SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
6124 	SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
6125 	SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
6126 	SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
6127 	SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
6128 	SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
6129 	SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
6130 	SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
6131 	SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
6132 	SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
6133 	SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
6134 	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
6135 	SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
6136 	SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
6137 	SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
6138 	SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
6139 	SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
6140 	SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
6141 	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
6142 	SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
6143 	SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
6144 	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
6145 	SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
6146 	SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
6147 	SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
6148 #endif
6149 	{}
6150 };
6151 
6152 static const struct alc_model_fixup alc662_fixup_models[] = {
6153 	{.id = ALC272_FIXUP_MARIO, .name = "mario"},
6154 	{.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
6155 	{.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
6156 	{.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
6157 	{.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
6158 	{.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
6159 	{.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
6160 	{.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
6161 	{.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
6162 	{}
6163 };
6164 
6165 
6166 /*
6167  */
patch_alc662(struct hda_codec * codec)6168 static int patch_alc662(struct hda_codec *codec)
6169 {
6170 	struct alc_spec *spec;
6171 	int err = 0;
6172 
6173 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6174 	if (!spec)
6175 		return -ENOMEM;
6176 
6177 	codec->spec = spec;
6178 
6179 	spec->mixer_nid = 0x0b;
6180 
6181 	/* handle multiple HPs as is */
6182 	spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
6183 
6184 	alc_auto_parse_customize_define(codec);
6185 
6186 	alc_fix_pll_init(codec, 0x20, 0x04, 15);
6187 
6188 	err = alc_codec_rename_from_preset(codec);
6189 	if (err < 0)
6190 		goto error;
6191 
6192 	if ((alc_get_coef0(codec) & (1 << 14)) &&
6193 	    codec->bus->pci->subsystem_vendor == 0x1025 &&
6194 	    spec->cdefine.platform_type == 1) {
6195 		if (alc_codec_rename(codec, "ALC272X") < 0)
6196 			goto error;
6197 	}
6198 
6199 	alc_pick_fixup(codec, alc662_fixup_models,
6200 		       alc662_fixup_tbl, alc662_fixups);
6201 	alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
6202 	/* automatic parse from the BIOS config */
6203 	err = alc662_parse_auto_config(codec);
6204 	if (err < 0)
6205 		goto error;
6206 
6207 	if (!spec->no_analog && !spec->adc_nids) {
6208 		alc_auto_fill_adc_caps(codec);
6209 		alc_rebuild_imux_for_auto_mic(codec);
6210 		alc_remove_invalid_adc_nids(codec);
6211 	}
6212 
6213 	if (!spec->no_analog && !spec->cap_mixer)
6214 		set_capture_mixer(codec);
6215 
6216 	if (!spec->no_analog && has_cdefine_beep(codec)) {
6217 		err = snd_hda_attach_beep_device(codec, 0x1);
6218 		if (err < 0)
6219 			goto error;
6220 		switch (codec->vendor_id) {
6221 		case 0x10ec0662:
6222 			set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
6223 			break;
6224 		case 0x10ec0272:
6225 		case 0x10ec0663:
6226 		case 0x10ec0665:
6227 			set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
6228 			break;
6229 		case 0x10ec0273:
6230 			set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
6231 			break;
6232 		}
6233 	}
6234 
6235 	alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
6236 
6237 	codec->patch_ops = alc_patch_ops;
6238 	spec->init_hook = alc_auto_init_std;
6239 	spec->shutup = alc_eapd_shutup;
6240 
6241 #ifdef CONFIG_SND_HDA_POWER_SAVE
6242 	if (!spec->loopback.amplist)
6243 		spec->loopback.amplist = alc662_loopbacks;
6244 #endif
6245 
6246 	return 0;
6247 
6248  error:
6249 	alc_free(codec);
6250 	return err;
6251 }
6252 
6253 /*
6254  * ALC680 support
6255  */
6256 
alc680_parse_auto_config(struct hda_codec * codec)6257 static int alc680_parse_auto_config(struct hda_codec *codec)
6258 {
6259 	return alc_parse_auto_config(codec, NULL, NULL);
6260 }
6261 
6262 /*
6263  */
patch_alc680(struct hda_codec * codec)6264 static int patch_alc680(struct hda_codec *codec)
6265 {
6266 	struct alc_spec *spec;
6267 	int err;
6268 
6269 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6270 	if (spec == NULL)
6271 		return -ENOMEM;
6272 
6273 	codec->spec = spec;
6274 
6275 	/* ALC680 has no aa-loopback mixer */
6276 
6277 	/* automatic parse from the BIOS config */
6278 	err = alc680_parse_auto_config(codec);
6279 	if (err < 0) {
6280 		alc_free(codec);
6281 		return err;
6282 	}
6283 
6284 	if (!spec->no_analog && !spec->cap_mixer)
6285 		set_capture_mixer(codec);
6286 
6287 	codec->patch_ops = alc_patch_ops;
6288 	spec->init_hook = alc_auto_init_std;
6289 
6290 	return 0;
6291 }
6292 
6293 /*
6294  * patch entries
6295  */
6296 static const struct hda_codec_preset snd_hda_preset_realtek[] = {
6297 	{ .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 },
6298 	{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
6299 	{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
6300 	{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
6301 	{ .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
6302 	{ .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
6303 	{ .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
6304 	{ .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
6305 	{ .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
6306 	{ .id = 0x10ec0276, .name = "ALC276", .patch = patch_alc269 },
6307 	{ .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
6308 	  .patch = patch_alc861 },
6309 	{ .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
6310 	{ .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
6311 	{ .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
6312 	{ .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
6313 	  .patch = patch_alc882 },
6314 	{ .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
6315 	  .patch = patch_alc662 },
6316 	{ .id = 0x10ec0662, .rev = 0x100300, .name = "ALC662 rev3",
6317 	  .patch = patch_alc662 },
6318 	{ .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
6319 	{ .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
6320 	{ .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
6321 	{ .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 },
6322 	{ .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
6323 	{ .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
6324 	{ .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
6325 	{ .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
6326 	  .patch = patch_alc882 },
6327 	{ .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
6328 	  .patch = patch_alc882 },
6329 	{ .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
6330 	{ .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
6331 	{ .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
6332 	  .patch = patch_alc882 },
6333 	{ .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc882 },
6334 	{ .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
6335 	{ .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
6336 	{ .id = 0x10ec0899, .name = "ALC898", .patch = patch_alc882 },
6337 	{} /* terminator */
6338 };
6339 
6340 MODULE_ALIAS("snd-hda-codec-id:10ec*");
6341 
6342 MODULE_LICENSE("GPL");
6343 MODULE_DESCRIPTION("Realtek HD-audio codec");
6344 
6345 static struct hda_codec_preset_list realtek_list = {
6346 	.preset = snd_hda_preset_realtek,
6347 	.owner = THIS_MODULE,
6348 };
6349 
patch_realtek_init(void)6350 static int __init patch_realtek_init(void)
6351 {
6352 	return snd_hda_add_codec_preset(&realtek_list);
6353 }
6354 
patch_realtek_exit(void)6355 static void __exit patch_realtek_exit(void)
6356 {
6357 	snd_hda_delete_codec_preset(&realtek_list);
6358 }
6359 
6360 module_init(patch_realtek_init)
6361 module_exit(patch_realtek_exit)
6362