xref: /openbmc/linux/sound/pci/hda/patch_realtek.c (revision 5d4a2e29)
1 /*
2  * Universal Interface for Intel High Definition Audio Codec
3  *
4  * HD audio interface patch for ALC 260/880/882 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 <sound/core.h>
31 #include "hda_codec.h"
32 #include "hda_local.h"
33 #include "hda_beep.h"
34 
35 #define ALC880_FRONT_EVENT		0x01
36 #define ALC880_DCVOL_EVENT		0x02
37 #define ALC880_HP_EVENT			0x04
38 #define ALC880_MIC_EVENT		0x08
39 
40 /* ALC880 board config type */
41 enum {
42 	ALC880_3ST,
43 	ALC880_3ST_DIG,
44 	ALC880_5ST,
45 	ALC880_5ST_DIG,
46 	ALC880_W810,
47 	ALC880_Z71V,
48 	ALC880_6ST,
49 	ALC880_6ST_DIG,
50 	ALC880_F1734,
51 	ALC880_ASUS,
52 	ALC880_ASUS_DIG,
53 	ALC880_ASUS_W1V,
54 	ALC880_ASUS_DIG2,
55 	ALC880_FUJITSU,
56 	ALC880_UNIWILL_DIG,
57 	ALC880_UNIWILL,
58 	ALC880_UNIWILL_P53,
59 	ALC880_CLEVO,
60 	ALC880_TCL_S700,
61 	ALC880_LG,
62 	ALC880_LG_LW,
63 	ALC880_MEDION_RIM,
64 #ifdef CONFIG_SND_DEBUG
65 	ALC880_TEST,
66 #endif
67 	ALC880_AUTO,
68 	ALC880_MODEL_LAST /* last tag */
69 };
70 
71 /* ALC260 models */
72 enum {
73 	ALC260_BASIC,
74 	ALC260_HP,
75 	ALC260_HP_DC7600,
76 	ALC260_HP_3013,
77 	ALC260_FUJITSU_S702X,
78 	ALC260_ACER,
79 	ALC260_WILL,
80 	ALC260_REPLACER_672V,
81 	ALC260_FAVORIT100,
82 #ifdef CONFIG_SND_DEBUG
83 	ALC260_TEST,
84 #endif
85 	ALC260_AUTO,
86 	ALC260_MODEL_LAST /* last tag */
87 };
88 
89 /* ALC262 models */
90 enum {
91 	ALC262_BASIC,
92 	ALC262_HIPPO,
93 	ALC262_HIPPO_1,
94 	ALC262_FUJITSU,
95 	ALC262_HP_BPC,
96 	ALC262_HP_BPC_D7000_WL,
97 	ALC262_HP_BPC_D7000_WF,
98 	ALC262_HP_TC_T5735,
99 	ALC262_HP_RP5700,
100 	ALC262_BENQ_ED8,
101 	ALC262_SONY_ASSAMD,
102 	ALC262_BENQ_T31,
103 	ALC262_ULTRA,
104 	ALC262_LENOVO_3000,
105 	ALC262_NEC,
106 	ALC262_TOSHIBA_S06,
107 	ALC262_TOSHIBA_RX1,
108 	ALC262_TYAN,
109 	ALC262_AUTO,
110 	ALC262_MODEL_LAST /* last tag */
111 };
112 
113 /* ALC268 models */
114 enum {
115 	ALC267_QUANTA_IL1,
116 	ALC268_3ST,
117 	ALC268_TOSHIBA,
118 	ALC268_ACER,
119 	ALC268_ACER_DMIC,
120 	ALC268_ACER_ASPIRE_ONE,
121 	ALC268_DELL,
122 	ALC268_ZEPTO,
123 #ifdef CONFIG_SND_DEBUG
124 	ALC268_TEST,
125 #endif
126 	ALC268_AUTO,
127 	ALC268_MODEL_LAST /* last tag */
128 };
129 
130 /* ALC269 models */
131 enum {
132 	ALC269_BASIC,
133 	ALC269_QUANTA_FL1,
134 	ALC269_AMIC,
135 	ALC269_DMIC,
136 	ALC269VB_AMIC,
137 	ALC269VB_DMIC,
138 	ALC269_FUJITSU,
139 	ALC269_LIFEBOOK,
140 	ALC269_AUTO,
141 	ALC269_MODEL_LAST /* last tag */
142 };
143 
144 /* ALC861 models */
145 enum {
146 	ALC861_3ST,
147 	ALC660_3ST,
148 	ALC861_3ST_DIG,
149 	ALC861_6ST_DIG,
150 	ALC861_UNIWILL_M31,
151 	ALC861_TOSHIBA,
152 	ALC861_ASUS,
153 	ALC861_ASUS_LAPTOP,
154 	ALC861_AUTO,
155 	ALC861_MODEL_LAST,
156 };
157 
158 /* ALC861-VD models */
159 enum {
160 	ALC660VD_3ST,
161 	ALC660VD_3ST_DIG,
162 	ALC660VD_ASUS_V1S,
163 	ALC861VD_3ST,
164 	ALC861VD_3ST_DIG,
165 	ALC861VD_6ST_DIG,
166 	ALC861VD_LENOVO,
167 	ALC861VD_DALLAS,
168 	ALC861VD_HP,
169 	ALC861VD_AUTO,
170 	ALC861VD_MODEL_LAST,
171 };
172 
173 /* ALC662 models */
174 enum {
175 	ALC662_3ST_2ch_DIG,
176 	ALC662_3ST_6ch_DIG,
177 	ALC662_3ST_6ch,
178 	ALC662_5ST_DIG,
179 	ALC662_LENOVO_101E,
180 	ALC662_ASUS_EEEPC_P701,
181 	ALC662_ASUS_EEEPC_EP20,
182 	ALC663_ASUS_M51VA,
183 	ALC663_ASUS_G71V,
184 	ALC663_ASUS_H13,
185 	ALC663_ASUS_G50V,
186 	ALC662_ECS,
187 	ALC663_ASUS_MODE1,
188 	ALC662_ASUS_MODE2,
189 	ALC663_ASUS_MODE3,
190 	ALC663_ASUS_MODE4,
191 	ALC663_ASUS_MODE5,
192 	ALC663_ASUS_MODE6,
193 	ALC663_ASUS_MODE7,
194 	ALC663_ASUS_MODE8,
195 	ALC272_DELL,
196 	ALC272_DELL_ZM1,
197 	ALC272_SAMSUNG_NC10,
198 	ALC662_AUTO,
199 	ALC662_MODEL_LAST,
200 };
201 
202 /* ALC882 models */
203 enum {
204 	ALC882_3ST_DIG,
205 	ALC882_6ST_DIG,
206 	ALC882_ARIMA,
207 	ALC882_W2JC,
208 	ALC882_TARGA,
209 	ALC882_ASUS_A7J,
210 	ALC882_ASUS_A7M,
211 	ALC885_MACPRO,
212 	ALC885_MBA21,
213 	ALC885_MBP3,
214 	ALC885_MB5,
215 	ALC885_MACMINI3,
216 	ALC885_IMAC24,
217 	ALC885_IMAC91,
218 	ALC883_3ST_2ch_DIG,
219 	ALC883_3ST_6ch_DIG,
220 	ALC883_3ST_6ch,
221 	ALC883_6ST_DIG,
222 	ALC883_TARGA_DIG,
223 	ALC883_TARGA_2ch_DIG,
224 	ALC883_TARGA_8ch_DIG,
225 	ALC883_ACER,
226 	ALC883_ACER_ASPIRE,
227 	ALC888_ACER_ASPIRE_4930G,
228 	ALC888_ACER_ASPIRE_6530G,
229 	ALC888_ACER_ASPIRE_8930G,
230 	ALC888_ACER_ASPIRE_7730G,
231 	ALC883_MEDION,
232 	ALC883_MEDION_MD2,
233 	ALC883_MEDION_WIM2160,
234 	ALC883_LAPTOP_EAPD,
235 	ALC883_LENOVO_101E_2ch,
236 	ALC883_LENOVO_NB0763,
237 	ALC888_LENOVO_MS7195_DIG,
238 	ALC888_LENOVO_SKY,
239 	ALC883_HAIER_W66,
240 	ALC888_3ST_HP,
241 	ALC888_6ST_DELL,
242 	ALC883_MITAC,
243 	ALC883_CLEVO_M540R,
244 	ALC883_CLEVO_M720,
245 	ALC883_FUJITSU_PI2515,
246 	ALC888_FUJITSU_XA3530,
247 	ALC883_3ST_6ch_INTEL,
248 	ALC889A_INTEL,
249 	ALC889_INTEL,
250 	ALC888_ASUS_M90V,
251 	ALC888_ASUS_EEE1601,
252 	ALC889A_MB31,
253 	ALC1200_ASUS_P5Q,
254 	ALC883_SONY_VAIO_TT,
255 	ALC882_AUTO,
256 	ALC882_MODEL_LAST,
257 };
258 
259 /* for GPIO Poll */
260 #define GPIO_MASK	0x03
261 
262 /* extra amp-initialization sequence types */
263 enum {
264 	ALC_INIT_NONE,
265 	ALC_INIT_DEFAULT,
266 	ALC_INIT_GPIO1,
267 	ALC_INIT_GPIO2,
268 	ALC_INIT_GPIO3,
269 };
270 
271 struct alc_mic_route {
272 	hda_nid_t pin;
273 	unsigned char mux_idx;
274 	unsigned char amix_idx;
275 };
276 
277 #define MUX_IDX_UNDEF	((unsigned char)-1)
278 
279 struct alc_customize_define {
280 	unsigned int  sku_cfg;
281 	unsigned char port_connectivity;
282 	unsigned char check_sum;
283 	unsigned char customization;
284 	unsigned char external_amp;
285 	unsigned int  enable_pcbeep:1;
286 	unsigned int  platform_type:1;
287 	unsigned int  swap:1;
288 	unsigned int  override:1;
289 };
290 
291 struct alc_spec {
292 	/* codec parameterization */
293 	struct snd_kcontrol_new *mixers[5];	/* mixer arrays */
294 	unsigned int num_mixers;
295 	struct snd_kcontrol_new *cap_mixer;	/* capture mixer */
296 	unsigned int beep_amp;	/* beep amp value, set via set_beep_amp() */
297 
298 	const struct hda_verb *init_verbs[10];	/* initialization verbs
299 						 * don't forget NULL
300 						 * termination!
301 						 */
302 	unsigned int num_init_verbs;
303 
304 	char stream_name_analog[32];	/* analog PCM stream */
305 	struct hda_pcm_stream *stream_analog_playback;
306 	struct hda_pcm_stream *stream_analog_capture;
307 	struct hda_pcm_stream *stream_analog_alt_playback;
308 	struct hda_pcm_stream *stream_analog_alt_capture;
309 
310 	char stream_name_digital[32];	/* digital PCM stream */
311 	struct hda_pcm_stream *stream_digital_playback;
312 	struct hda_pcm_stream *stream_digital_capture;
313 
314 	/* playback */
315 	struct hda_multi_out multiout;	/* playback set-up
316 					 * max_channels, dacs must be set
317 					 * dig_out_nid and hp_nid are optional
318 					 */
319 	hda_nid_t alt_dac_nid;
320 	hda_nid_t slave_dig_outs[3];	/* optional - for auto-parsing */
321 	int dig_out_type;
322 
323 	/* capture */
324 	unsigned int num_adc_nids;
325 	hda_nid_t *adc_nids;
326 	hda_nid_t *capsrc_nids;
327 	hda_nid_t dig_in_nid;		/* digital-in NID; optional */
328 
329 	/* capture source */
330 	unsigned int num_mux_defs;
331 	const struct hda_input_mux *input_mux;
332 	unsigned int cur_mux[3];
333 	struct alc_mic_route ext_mic;
334 	struct alc_mic_route int_mic;
335 
336 	/* channel model */
337 	const struct hda_channel_mode *channel_mode;
338 	int num_channel_mode;
339 	int need_dac_fix;
340 	int const_channel_count;
341 	int ext_channel_count;
342 
343 	/* PCM information */
344 	struct hda_pcm pcm_rec[3];	/* used in alc_build_pcms() */
345 
346 	/* dynamic controls, init_verbs and input_mux */
347 	struct auto_pin_cfg autocfg;
348 	struct alc_customize_define cdefine;
349 	struct snd_array kctls;
350 	struct hda_input_mux private_imux[3];
351 	hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
352 	hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
353 	hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
354 
355 	/* hooks */
356 	void (*init_hook)(struct hda_codec *codec);
357 	void (*unsol_event)(struct hda_codec *codec, unsigned int res);
358 #ifdef CONFIG_SND_HDA_POWER_SAVE
359 	void (*power_hook)(struct hda_codec *codec);
360 #endif
361 
362 	/* for pin sensing */
363 	unsigned int sense_updated: 1;
364 	unsigned int jack_present: 1;
365 	unsigned int master_sw: 1;
366 	unsigned int auto_mic:1;
367 
368 	/* other flags */
369 	unsigned int no_analog :1; /* digital I/O only */
370 	int init_amp;
371 
372 	/* for virtual master */
373 	hda_nid_t vmaster_nid;
374 #ifdef CONFIG_SND_HDA_POWER_SAVE
375 	struct hda_loopback_check loopback;
376 #endif
377 
378 	/* for PLL fix */
379 	hda_nid_t pll_nid;
380 	unsigned int pll_coef_idx, pll_coef_bit;
381 };
382 
383 /*
384  * configuration template - to be copied to the spec instance
385  */
386 struct alc_config_preset {
387 	struct snd_kcontrol_new *mixers[5]; /* should be identical size
388 					     * with spec
389 					     */
390 	struct snd_kcontrol_new *cap_mixer; /* capture mixer */
391 	const struct hda_verb *init_verbs[5];
392 	unsigned int num_dacs;
393 	hda_nid_t *dac_nids;
394 	hda_nid_t dig_out_nid;		/* optional */
395 	hda_nid_t hp_nid;		/* optional */
396 	hda_nid_t *slave_dig_outs;
397 	unsigned int num_adc_nids;
398 	hda_nid_t *adc_nids;
399 	hda_nid_t *capsrc_nids;
400 	hda_nid_t dig_in_nid;
401 	unsigned int num_channel_mode;
402 	const struct hda_channel_mode *channel_mode;
403 	int need_dac_fix;
404 	int const_channel_count;
405 	unsigned int num_mux_defs;
406 	const struct hda_input_mux *input_mux;
407 	void (*unsol_event)(struct hda_codec *, unsigned int);
408 	void (*setup)(struct hda_codec *);
409 	void (*init_hook)(struct hda_codec *);
410 #ifdef CONFIG_SND_HDA_POWER_SAVE
411 	struct hda_amp_list *loopbacks;
412 	void (*power_hook)(struct hda_codec *codec);
413 #endif
414 };
415 
416 
417 /*
418  * input MUX handling
419  */
420 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
421 			     struct snd_ctl_elem_info *uinfo)
422 {
423 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
424 	struct alc_spec *spec = codec->spec;
425 	unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
426 	if (mux_idx >= spec->num_mux_defs)
427 		mux_idx = 0;
428 	if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
429 		mux_idx = 0;
430 	return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
431 }
432 
433 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
434 			    struct snd_ctl_elem_value *ucontrol)
435 {
436 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
437 	struct alc_spec *spec = codec->spec;
438 	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
439 
440 	ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
441 	return 0;
442 }
443 
444 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
445 			    struct snd_ctl_elem_value *ucontrol)
446 {
447 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
448 	struct alc_spec *spec = codec->spec;
449 	const struct hda_input_mux *imux;
450 	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
451 	unsigned int mux_idx;
452 	hda_nid_t nid = spec->capsrc_nids ?
453 		spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
454 	unsigned int type;
455 
456 	mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
457 	imux = &spec->input_mux[mux_idx];
458 	if (!imux->num_items && mux_idx > 0)
459 		imux = &spec->input_mux[0];
460 
461 	type = get_wcaps_type(get_wcaps(codec, nid));
462 	if (type == AC_WID_AUD_MIX) {
463 		/* Matrix-mixer style (e.g. ALC882) */
464 		unsigned int *cur_val = &spec->cur_mux[adc_idx];
465 		unsigned int i, idx;
466 
467 		idx = ucontrol->value.enumerated.item[0];
468 		if (idx >= imux->num_items)
469 			idx = imux->num_items - 1;
470 		if (*cur_val == idx)
471 			return 0;
472 		for (i = 0; i < imux->num_items; i++) {
473 			unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
474 			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
475 						 imux->items[i].index,
476 						 HDA_AMP_MUTE, v);
477 		}
478 		*cur_val = idx;
479 		return 1;
480 	} else {
481 		/* MUX style (e.g. ALC880) */
482 		return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
483 					     &spec->cur_mux[adc_idx]);
484 	}
485 }
486 
487 /*
488  * channel mode setting
489  */
490 static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
491 			    struct snd_ctl_elem_info *uinfo)
492 {
493 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
494 	struct alc_spec *spec = codec->spec;
495 	return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
496 				    spec->num_channel_mode);
497 }
498 
499 static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
500 			   struct snd_ctl_elem_value *ucontrol)
501 {
502 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
503 	struct alc_spec *spec = codec->spec;
504 	return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
505 				   spec->num_channel_mode,
506 				   spec->ext_channel_count);
507 }
508 
509 static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
510 			   struct snd_ctl_elem_value *ucontrol)
511 {
512 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
513 	struct alc_spec *spec = codec->spec;
514 	int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
515 				      spec->num_channel_mode,
516 				      &spec->ext_channel_count);
517 	if (err >= 0 && !spec->const_channel_count) {
518 		spec->multiout.max_channels = spec->ext_channel_count;
519 		if (spec->need_dac_fix)
520 			spec->multiout.num_dacs = spec->multiout.max_channels / 2;
521 	}
522 	return err;
523 }
524 
525 /*
526  * Control the mode of pin widget settings via the mixer.  "pc" is used
527  * instead of "%" to avoid consequences of accidently treating the % as
528  * being part of a format specifier.  Maximum allowed length of a value is
529  * 63 characters plus NULL terminator.
530  *
531  * Note: some retasking pin complexes seem to ignore requests for input
532  * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
533  * are requested.  Therefore order this list so that this behaviour will not
534  * cause problems when mixer clients move through the enum sequentially.
535  * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
536  * March 2006.
537  */
538 static char *alc_pin_mode_names[] = {
539 	"Mic 50pc bias", "Mic 80pc bias",
540 	"Line in", "Line out", "Headphone out",
541 };
542 static unsigned char alc_pin_mode_values[] = {
543 	PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
544 };
545 /* The control can present all 5 options, or it can limit the options based
546  * in the pin being assumed to be exclusively an input or an output pin.  In
547  * addition, "input" pins may or may not process the mic bias option
548  * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
549  * accept requests for bias as of chip versions up to March 2006) and/or
550  * wiring in the computer.
551  */
552 #define ALC_PIN_DIR_IN              0x00
553 #define ALC_PIN_DIR_OUT             0x01
554 #define ALC_PIN_DIR_INOUT           0x02
555 #define ALC_PIN_DIR_IN_NOMICBIAS    0x03
556 #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
557 
558 /* Info about the pin modes supported by the different pin direction modes.
559  * For each direction the minimum and maximum values are given.
560  */
561 static signed char alc_pin_mode_dir_info[5][2] = {
562 	{ 0, 2 },    /* ALC_PIN_DIR_IN */
563 	{ 3, 4 },    /* ALC_PIN_DIR_OUT */
564 	{ 0, 4 },    /* ALC_PIN_DIR_INOUT */
565 	{ 2, 2 },    /* ALC_PIN_DIR_IN_NOMICBIAS */
566 	{ 2, 4 },    /* ALC_PIN_DIR_INOUT_NOMICBIAS */
567 };
568 #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
569 #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
570 #define alc_pin_mode_n_items(_dir) \
571 	(alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
572 
573 static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
574 			     struct snd_ctl_elem_info *uinfo)
575 {
576 	unsigned int item_num = uinfo->value.enumerated.item;
577 	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
578 
579 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
580 	uinfo->count = 1;
581 	uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
582 
583 	if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
584 		item_num = alc_pin_mode_min(dir);
585 	strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
586 	return 0;
587 }
588 
589 static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
590 			    struct snd_ctl_elem_value *ucontrol)
591 {
592 	unsigned int i;
593 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
594 	hda_nid_t nid = kcontrol->private_value & 0xffff;
595 	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
596 	long *valp = ucontrol->value.integer.value;
597 	unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
598 						 AC_VERB_GET_PIN_WIDGET_CONTROL,
599 						 0x00);
600 
601 	/* Find enumerated value for current pinctl setting */
602 	i = alc_pin_mode_min(dir);
603 	while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
604 		i++;
605 	*valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
606 	return 0;
607 }
608 
609 static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
610 			    struct snd_ctl_elem_value *ucontrol)
611 {
612 	signed int change;
613 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
614 	hda_nid_t nid = kcontrol->private_value & 0xffff;
615 	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
616 	long val = *ucontrol->value.integer.value;
617 	unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
618 						 AC_VERB_GET_PIN_WIDGET_CONTROL,
619 						 0x00);
620 
621 	if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
622 		val = alc_pin_mode_min(dir);
623 
624 	change = pinctl != alc_pin_mode_values[val];
625 	if (change) {
626 		/* Set pin mode to that requested */
627 		snd_hda_codec_write_cache(codec, nid, 0,
628 					  AC_VERB_SET_PIN_WIDGET_CONTROL,
629 					  alc_pin_mode_values[val]);
630 
631 		/* Also enable the retasking pin's input/output as required
632 		 * for the requested pin mode.  Enum values of 2 or less are
633 		 * input modes.
634 		 *
635 		 * Dynamically switching the input/output buffers probably
636 		 * reduces noise slightly (particularly on input) so we'll
637 		 * do it.  However, having both input and output buffers
638 		 * enabled simultaneously doesn't seem to be problematic if
639 		 * this turns out to be necessary in the future.
640 		 */
641 		if (val <= 2) {
642 			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
643 						 HDA_AMP_MUTE, HDA_AMP_MUTE);
644 			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
645 						 HDA_AMP_MUTE, 0);
646 		} else {
647 			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
648 						 HDA_AMP_MUTE, HDA_AMP_MUTE);
649 			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
650 						 HDA_AMP_MUTE, 0);
651 		}
652 	}
653 	return change;
654 }
655 
656 #define ALC_PIN_MODE(xname, nid, dir) \
657 	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
658 	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
659 	  .info = alc_pin_mode_info, \
660 	  .get = alc_pin_mode_get, \
661 	  .put = alc_pin_mode_put, \
662 	  .private_value = nid | (dir<<16) }
663 
664 /* A switch control for ALC260 GPIO pins.  Multiple GPIOs can be ganged
665  * together using a mask with more than one bit set.  This control is
666  * currently used only by the ALC260 test model.  At this stage they are not
667  * needed for any "production" models.
668  */
669 #ifdef CONFIG_SND_DEBUG
670 #define alc_gpio_data_info	snd_ctl_boolean_mono_info
671 
672 static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
673 			     struct snd_ctl_elem_value *ucontrol)
674 {
675 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
676 	hda_nid_t nid = kcontrol->private_value & 0xffff;
677 	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
678 	long *valp = ucontrol->value.integer.value;
679 	unsigned int val = snd_hda_codec_read(codec, nid, 0,
680 					      AC_VERB_GET_GPIO_DATA, 0x00);
681 
682 	*valp = (val & mask) != 0;
683 	return 0;
684 }
685 static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
686 			     struct snd_ctl_elem_value *ucontrol)
687 {
688 	signed int change;
689 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
690 	hda_nid_t nid = kcontrol->private_value & 0xffff;
691 	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
692 	long val = *ucontrol->value.integer.value;
693 	unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
694 						    AC_VERB_GET_GPIO_DATA,
695 						    0x00);
696 
697 	/* Set/unset the masked GPIO bit(s) as needed */
698 	change = (val == 0 ? 0 : mask) != (gpio_data & mask);
699 	if (val == 0)
700 		gpio_data &= ~mask;
701 	else
702 		gpio_data |= mask;
703 	snd_hda_codec_write_cache(codec, nid, 0,
704 				  AC_VERB_SET_GPIO_DATA, gpio_data);
705 
706 	return change;
707 }
708 #define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
709 	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
710 	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
711 	  .info = alc_gpio_data_info, \
712 	  .get = alc_gpio_data_get, \
713 	  .put = alc_gpio_data_put, \
714 	  .private_value = nid | (mask<<16) }
715 #endif   /* CONFIG_SND_DEBUG */
716 
717 /* A switch control to allow the enabling of the digital IO pins on the
718  * ALC260.  This is incredibly simplistic; the intention of this control is
719  * to provide something in the test model allowing digital outputs to be
720  * identified if present.  If models are found which can utilise these
721  * outputs a more complete mixer control can be devised for those models if
722  * necessary.
723  */
724 #ifdef CONFIG_SND_DEBUG
725 #define alc_spdif_ctrl_info	snd_ctl_boolean_mono_info
726 
727 static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
728 			      struct snd_ctl_elem_value *ucontrol)
729 {
730 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
731 	hda_nid_t nid = kcontrol->private_value & 0xffff;
732 	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
733 	long *valp = ucontrol->value.integer.value;
734 	unsigned int val = snd_hda_codec_read(codec, nid, 0,
735 					      AC_VERB_GET_DIGI_CONVERT_1, 0x00);
736 
737 	*valp = (val & mask) != 0;
738 	return 0;
739 }
740 static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
741 			      struct snd_ctl_elem_value *ucontrol)
742 {
743 	signed int change;
744 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
745 	hda_nid_t nid = kcontrol->private_value & 0xffff;
746 	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
747 	long val = *ucontrol->value.integer.value;
748 	unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
749 						    AC_VERB_GET_DIGI_CONVERT_1,
750 						    0x00);
751 
752 	/* Set/unset the masked control bit(s) as needed */
753 	change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
754 	if (val==0)
755 		ctrl_data &= ~mask;
756 	else
757 		ctrl_data |= mask;
758 	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
759 				  ctrl_data);
760 
761 	return change;
762 }
763 #define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
764 	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
765 	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
766 	  .info = alc_spdif_ctrl_info, \
767 	  .get = alc_spdif_ctrl_get, \
768 	  .put = alc_spdif_ctrl_put, \
769 	  .private_value = nid | (mask<<16) }
770 #endif   /* CONFIG_SND_DEBUG */
771 
772 /* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
773  * Again, this is only used in the ALC26x test models to help identify when
774  * the EAPD line must be asserted for features to work.
775  */
776 #ifdef CONFIG_SND_DEBUG
777 #define alc_eapd_ctrl_info	snd_ctl_boolean_mono_info
778 
779 static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
780 			      struct snd_ctl_elem_value *ucontrol)
781 {
782 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
783 	hda_nid_t nid = kcontrol->private_value & 0xffff;
784 	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
785 	long *valp = ucontrol->value.integer.value;
786 	unsigned int val = snd_hda_codec_read(codec, nid, 0,
787 					      AC_VERB_GET_EAPD_BTLENABLE, 0x00);
788 
789 	*valp = (val & mask) != 0;
790 	return 0;
791 }
792 
793 static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
794 			      struct snd_ctl_elem_value *ucontrol)
795 {
796 	int change;
797 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
798 	hda_nid_t nid = kcontrol->private_value & 0xffff;
799 	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
800 	long val = *ucontrol->value.integer.value;
801 	unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
802 						    AC_VERB_GET_EAPD_BTLENABLE,
803 						    0x00);
804 
805 	/* Set/unset the masked control bit(s) as needed */
806 	change = (!val ? 0 : mask) != (ctrl_data & mask);
807 	if (!val)
808 		ctrl_data &= ~mask;
809 	else
810 		ctrl_data |= mask;
811 	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
812 				  ctrl_data);
813 
814 	return change;
815 }
816 
817 #define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
818 	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
819 	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
820 	  .info = alc_eapd_ctrl_info, \
821 	  .get = alc_eapd_ctrl_get, \
822 	  .put = alc_eapd_ctrl_put, \
823 	  .private_value = nid | (mask<<16) }
824 #endif   /* CONFIG_SND_DEBUG */
825 
826 /*
827  * set up the input pin config (depending on the given auto-pin type)
828  */
829 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
830 			      int auto_pin_type)
831 {
832 	unsigned int val = PIN_IN;
833 
834 	if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
835 		unsigned int pincap;
836 		pincap = snd_hda_query_pin_caps(codec, nid);
837 		pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
838 		if (pincap & AC_PINCAP_VREF_80)
839 			val = PIN_VREF80;
840 		else if (pincap & AC_PINCAP_VREF_50)
841 			val = PIN_VREF50;
842 		else if (pincap & AC_PINCAP_VREF_100)
843 			val = PIN_VREF100;
844 		else if (pincap & AC_PINCAP_VREF_GRD)
845 			val = PIN_VREFGRD;
846 	}
847 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
848 }
849 
850 /*
851  */
852 static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
853 {
854 	if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
855 		return;
856 	spec->mixers[spec->num_mixers++] = mix;
857 }
858 
859 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
860 {
861 	if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
862 		return;
863 	spec->init_verbs[spec->num_init_verbs++] = verb;
864 }
865 
866 /*
867  * set up from the preset table
868  */
869 static void setup_preset(struct hda_codec *codec,
870 			 const struct alc_config_preset *preset)
871 {
872 	struct alc_spec *spec = codec->spec;
873 	int i;
874 
875 	for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
876 		add_mixer(spec, preset->mixers[i]);
877 	spec->cap_mixer = preset->cap_mixer;
878 	for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
879 	     i++)
880 		add_verb(spec, preset->init_verbs[i]);
881 
882 	spec->channel_mode = preset->channel_mode;
883 	spec->num_channel_mode = preset->num_channel_mode;
884 	spec->need_dac_fix = preset->need_dac_fix;
885 	spec->const_channel_count = preset->const_channel_count;
886 
887 	if (preset->const_channel_count)
888 		spec->multiout.max_channels = preset->const_channel_count;
889 	else
890 		spec->multiout.max_channels = spec->channel_mode[0].channels;
891 	spec->ext_channel_count = spec->channel_mode[0].channels;
892 
893 	spec->multiout.num_dacs = preset->num_dacs;
894 	spec->multiout.dac_nids = preset->dac_nids;
895 	spec->multiout.dig_out_nid = preset->dig_out_nid;
896 	spec->multiout.slave_dig_outs = preset->slave_dig_outs;
897 	spec->multiout.hp_nid = preset->hp_nid;
898 
899 	spec->num_mux_defs = preset->num_mux_defs;
900 	if (!spec->num_mux_defs)
901 		spec->num_mux_defs = 1;
902 	spec->input_mux = preset->input_mux;
903 
904 	spec->num_adc_nids = preset->num_adc_nids;
905 	spec->adc_nids = preset->adc_nids;
906 	spec->capsrc_nids = preset->capsrc_nids;
907 	spec->dig_in_nid = preset->dig_in_nid;
908 
909 	spec->unsol_event = preset->unsol_event;
910 	spec->init_hook = preset->init_hook;
911 #ifdef CONFIG_SND_HDA_POWER_SAVE
912 	spec->power_hook = preset->power_hook;
913 	spec->loopback.amplist = preset->loopbacks;
914 #endif
915 
916 	if (preset->setup)
917 		preset->setup(codec);
918 }
919 
920 /* Enable GPIO mask and set output */
921 static struct hda_verb alc_gpio1_init_verbs[] = {
922 	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
923 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
924 	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
925 	{ }
926 };
927 
928 static struct hda_verb alc_gpio2_init_verbs[] = {
929 	{0x01, AC_VERB_SET_GPIO_MASK, 0x02},
930 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
931 	{0x01, AC_VERB_SET_GPIO_DATA, 0x02},
932 	{ }
933 };
934 
935 static struct hda_verb alc_gpio3_init_verbs[] = {
936 	{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
937 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
938 	{0x01, AC_VERB_SET_GPIO_DATA, 0x03},
939 	{ }
940 };
941 
942 /*
943  * Fix hardware PLL issue
944  * On some codecs, the analog PLL gating control must be off while
945  * the default value is 1.
946  */
947 static void alc_fix_pll(struct hda_codec *codec)
948 {
949 	struct alc_spec *spec = codec->spec;
950 	unsigned int val;
951 
952 	if (!spec->pll_nid)
953 		return;
954 	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
955 			    spec->pll_coef_idx);
956 	val = snd_hda_codec_read(codec, spec->pll_nid, 0,
957 				 AC_VERB_GET_PROC_COEF, 0);
958 	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
959 			    spec->pll_coef_idx);
960 	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
961 			    val & ~(1 << spec->pll_coef_bit));
962 }
963 
964 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
965 			     unsigned int coef_idx, unsigned int coef_bit)
966 {
967 	struct alc_spec *spec = codec->spec;
968 	spec->pll_nid = nid;
969 	spec->pll_coef_idx = coef_idx;
970 	spec->pll_coef_bit = coef_bit;
971 	alc_fix_pll(codec);
972 }
973 
974 static void alc_automute_pin(struct hda_codec *codec)
975 {
976 	struct alc_spec *spec = codec->spec;
977 	unsigned int nid = spec->autocfg.hp_pins[0];
978 	int i;
979 
980 	if (!nid)
981 		return;
982 	spec->jack_present = snd_hda_jack_detect(codec, nid);
983 	for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
984 		nid = spec->autocfg.speaker_pins[i];
985 		if (!nid)
986 			break;
987 		snd_hda_codec_write(codec, nid, 0,
988 				    AC_VERB_SET_PIN_WIDGET_CONTROL,
989 				    spec->jack_present ? 0 : PIN_OUT);
990 	}
991 }
992 
993 static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
994 				hda_nid_t nid)
995 {
996 	hda_nid_t conn[HDA_MAX_NUM_INPUTS];
997 	int i, nums;
998 
999 	nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
1000 	for (i = 0; i < nums; i++)
1001 		if (conn[i] == nid)
1002 			return i;
1003 	return -1;
1004 }
1005 
1006 static void alc_mic_automute(struct hda_codec *codec)
1007 {
1008 	struct alc_spec *spec = codec->spec;
1009 	struct alc_mic_route *dead, *alive;
1010 	unsigned int present, type;
1011 	hda_nid_t cap_nid;
1012 
1013 	if (!spec->auto_mic)
1014 		return;
1015 	if (!spec->int_mic.pin || !spec->ext_mic.pin)
1016 		return;
1017 	if (snd_BUG_ON(!spec->adc_nids))
1018 		return;
1019 
1020 	cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1021 
1022 	present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1023 	if (present) {
1024 		alive = &spec->ext_mic;
1025 		dead = &spec->int_mic;
1026 	} else {
1027 		alive = &spec->int_mic;
1028 		dead = &spec->ext_mic;
1029 	}
1030 
1031 	type = get_wcaps_type(get_wcaps(codec, cap_nid));
1032 	if (type == AC_WID_AUD_MIX) {
1033 		/* Matrix-mixer style (e.g. ALC882) */
1034 		snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1035 					 alive->mux_idx,
1036 					 HDA_AMP_MUTE, 0);
1037 		snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1038 					 dead->mux_idx,
1039 					 HDA_AMP_MUTE, HDA_AMP_MUTE);
1040 	} else {
1041 		/* MUX style (e.g. ALC880) */
1042 		snd_hda_codec_write_cache(codec, cap_nid, 0,
1043 					  AC_VERB_SET_CONNECT_SEL,
1044 					  alive->mux_idx);
1045 	}
1046 
1047 	/* FIXME: analog mixer */
1048 }
1049 
1050 /* unsolicited event for HP jack sensing */
1051 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1052 {
1053 	if (codec->vendor_id == 0x10ec0880)
1054 		res >>= 28;
1055 	else
1056 		res >>= 26;
1057 	switch (res) {
1058 	case ALC880_HP_EVENT:
1059 		alc_automute_pin(codec);
1060 		break;
1061 	case ALC880_MIC_EVENT:
1062 		alc_mic_automute(codec);
1063 		break;
1064 	}
1065 }
1066 
1067 static void alc_inithook(struct hda_codec *codec)
1068 {
1069 	alc_automute_pin(codec);
1070 	alc_mic_automute(codec);
1071 }
1072 
1073 /* additional initialization for ALC888 variants */
1074 static void alc888_coef_init(struct hda_codec *codec)
1075 {
1076 	unsigned int tmp;
1077 
1078 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1079 	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1080 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1081 	if ((tmp & 0xf0) == 0x20)
1082 		/* alc888S-VC */
1083 		snd_hda_codec_read(codec, 0x20, 0,
1084 				   AC_VERB_SET_PROC_COEF, 0x830);
1085 	 else
1086 		 /* alc888-VB */
1087 		 snd_hda_codec_read(codec, 0x20, 0,
1088 				    AC_VERB_SET_PROC_COEF, 0x3030);
1089 }
1090 
1091 static void alc889_coef_init(struct hda_codec *codec)
1092 {
1093 	unsigned int tmp;
1094 
1095 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1096 	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1097 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1098 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1099 }
1100 
1101 /* turn on/off EAPD control (only if available) */
1102 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
1103 {
1104 	if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
1105 		return;
1106 	if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
1107 		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
1108 				    on ? 2 : 0);
1109 }
1110 
1111 static void alc_auto_init_amp(struct hda_codec *codec, int type)
1112 {
1113 	unsigned int tmp;
1114 
1115 	switch (type) {
1116 	case ALC_INIT_GPIO1:
1117 		snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1118 		break;
1119 	case ALC_INIT_GPIO2:
1120 		snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1121 		break;
1122 	case ALC_INIT_GPIO3:
1123 		snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1124 		break;
1125 	case ALC_INIT_DEFAULT:
1126 		switch (codec->vendor_id) {
1127 		case 0x10ec0260:
1128 			set_eapd(codec, 0x0f, 1);
1129 			set_eapd(codec, 0x10, 1);
1130 			break;
1131 		case 0x10ec0262:
1132 		case 0x10ec0267:
1133 		case 0x10ec0268:
1134 		case 0x10ec0269:
1135 		case 0x10ec0270:
1136 		case 0x10ec0272:
1137 		case 0x10ec0660:
1138 		case 0x10ec0662:
1139 		case 0x10ec0663:
1140 		case 0x10ec0862:
1141 		case 0x10ec0889:
1142 			set_eapd(codec, 0x14, 1);
1143 			set_eapd(codec, 0x15, 1);
1144 			break;
1145 		}
1146 		switch (codec->vendor_id) {
1147 		case 0x10ec0260:
1148 			snd_hda_codec_write(codec, 0x1a, 0,
1149 					    AC_VERB_SET_COEF_INDEX, 7);
1150 			tmp = snd_hda_codec_read(codec, 0x1a, 0,
1151 						 AC_VERB_GET_PROC_COEF, 0);
1152 			snd_hda_codec_write(codec, 0x1a, 0,
1153 					    AC_VERB_SET_COEF_INDEX, 7);
1154 			snd_hda_codec_write(codec, 0x1a, 0,
1155 					    AC_VERB_SET_PROC_COEF,
1156 					    tmp | 0x2010);
1157 			break;
1158 		case 0x10ec0262:
1159 		case 0x10ec0880:
1160 		case 0x10ec0882:
1161 		case 0x10ec0883:
1162 		case 0x10ec0885:
1163 		case 0x10ec0887:
1164 		case 0x10ec0889:
1165 			alc889_coef_init(codec);
1166 			break;
1167 		case 0x10ec0888:
1168 			alc888_coef_init(codec);
1169 			break;
1170 #if 0 /* XXX: This may cause the silent output on speaker on some machines */
1171 		case 0x10ec0267:
1172 		case 0x10ec0268:
1173 			snd_hda_codec_write(codec, 0x20, 0,
1174 					    AC_VERB_SET_COEF_INDEX, 7);
1175 			tmp = snd_hda_codec_read(codec, 0x20, 0,
1176 						 AC_VERB_GET_PROC_COEF, 0);
1177 			snd_hda_codec_write(codec, 0x20, 0,
1178 					    AC_VERB_SET_COEF_INDEX, 7);
1179 			snd_hda_codec_write(codec, 0x20, 0,
1180 					    AC_VERB_SET_PROC_COEF,
1181 					    tmp | 0x3000);
1182 			break;
1183 #endif /* XXX */
1184 		}
1185 		break;
1186 	}
1187 }
1188 
1189 static void alc_init_auto_hp(struct hda_codec *codec)
1190 {
1191 	struct alc_spec *spec = codec->spec;
1192 
1193 	if (!spec->autocfg.hp_pins[0])
1194 		return;
1195 
1196 	if (!spec->autocfg.speaker_pins[0]) {
1197 		if (spec->autocfg.line_out_pins[0] &&
1198 		    spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
1199 			spec->autocfg.speaker_pins[0] =
1200 				spec->autocfg.line_out_pins[0];
1201 		else
1202 			return;
1203 	}
1204 
1205 	snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1206 		    spec->autocfg.hp_pins[0]);
1207 	snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1208 				  AC_VERB_SET_UNSOLICITED_ENABLE,
1209 				  AC_USRSP_EN | ALC880_HP_EVENT);
1210 	spec->unsol_event = alc_sku_unsol_event;
1211 }
1212 
1213 static void alc_init_auto_mic(struct hda_codec *codec)
1214 {
1215 	struct alc_spec *spec = codec->spec;
1216 	struct auto_pin_cfg *cfg = &spec->autocfg;
1217 	hda_nid_t fixed, ext;
1218 	int i;
1219 
1220 	/* there must be only two mic inputs exclusively */
1221 	for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1222 		if (cfg->input_pins[i])
1223 			return;
1224 
1225 	fixed = ext = 0;
1226 	for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1227 		hda_nid_t nid = cfg->input_pins[i];
1228 		unsigned int defcfg;
1229 		if (!nid)
1230 			return;
1231 		defcfg = snd_hda_codec_get_pincfg(codec, nid);
1232 		switch (get_defcfg_connect(defcfg)) {
1233 		case AC_JACK_PORT_FIXED:
1234 			if (fixed)
1235 				return; /* already occupied */
1236 			fixed = nid;
1237 			break;
1238 		case AC_JACK_PORT_COMPLEX:
1239 			if (ext)
1240 				return; /* already occupied */
1241 			ext = nid;
1242 			break;
1243 		default:
1244 			return; /* invalid entry */
1245 		}
1246 	}
1247 	if (!ext || !fixed)
1248 		return;
1249 	if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1250 		return; /* no unsol support */
1251 	snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1252 		    ext, fixed);
1253 	spec->ext_mic.pin = ext;
1254 	spec->int_mic.pin = fixed;
1255 	spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1256 	spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1257 	spec->auto_mic = 1;
1258 	snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1259 				  AC_VERB_SET_UNSOLICITED_ENABLE,
1260 				  AC_USRSP_EN | ALC880_MIC_EVENT);
1261 	spec->unsol_event = alc_sku_unsol_event;
1262 }
1263 
1264 static int alc_auto_parse_customize_define(struct hda_codec *codec)
1265 {
1266 	unsigned int ass, tmp, i;
1267 	unsigned nid = 0;
1268 	struct alc_spec *spec = codec->spec;
1269 
1270 	ass = codec->subsystem_id & 0xffff;
1271 	if (ass != codec->bus->pci->subsystem_device && (ass & 1))
1272 		goto do_sku;
1273 
1274 	nid = 0x1d;
1275 	if (codec->vendor_id == 0x10ec0260)
1276 		nid = 0x17;
1277 	ass = snd_hda_codec_get_pincfg(codec, nid);
1278 
1279 	if (!(ass & 1)) {
1280 		printk(KERN_INFO "hda_codec: %s: SKU not ready 0x%08x\n",
1281 		       codec->chip_name, ass);
1282 		return -1;
1283 	}
1284 
1285 	/* check sum */
1286 	tmp = 0;
1287 	for (i = 1; i < 16; i++) {
1288 		if ((ass >> i) & 1)
1289 			tmp++;
1290 	}
1291 	if (((ass >> 16) & 0xf) != tmp)
1292 		return -1;
1293 
1294 	spec->cdefine.port_connectivity = ass >> 30;
1295 	spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
1296 	spec->cdefine.check_sum = (ass >> 16) & 0xf;
1297 	spec->cdefine.customization = ass >> 8;
1298 do_sku:
1299 	spec->cdefine.sku_cfg = ass;
1300 	spec->cdefine.external_amp = (ass & 0x38) >> 3;
1301 	spec->cdefine.platform_type = (ass & 0x4) >> 2;
1302 	spec->cdefine.swap = (ass & 0x2) >> 1;
1303 	spec->cdefine.override = ass & 0x1;
1304 
1305 	snd_printd("SKU: Nid=0x%x sku_cfg=0x%08x\n",
1306 		   nid, spec->cdefine.sku_cfg);
1307 	snd_printd("SKU: port_connectivity=0x%x\n",
1308 		   spec->cdefine.port_connectivity);
1309 	snd_printd("SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
1310 	snd_printd("SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
1311 	snd_printd("SKU: customization=0x%08x\n", spec->cdefine.customization);
1312 	snd_printd("SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
1313 	snd_printd("SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
1314 	snd_printd("SKU: swap=0x%x\n", spec->cdefine.swap);
1315 	snd_printd("SKU: override=0x%x\n", spec->cdefine.override);
1316 
1317 	return 0;
1318 }
1319 
1320 /* check subsystem ID and set up device-specific initialization;
1321  * return 1 if initialized, 0 if invalid SSID
1322  */
1323 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1324  *	31 ~ 16 :	Manufacture ID
1325  *	15 ~ 8	:	SKU ID
1326  *	7  ~ 0	:	Assembly ID
1327  *	port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1328  */
1329 static int alc_subsystem_id(struct hda_codec *codec,
1330 			    hda_nid_t porta, hda_nid_t porte,
1331 			    hda_nid_t portd, hda_nid_t porti)
1332 {
1333 	unsigned int ass, tmp, i;
1334 	unsigned nid;
1335 	struct alc_spec *spec = codec->spec;
1336 
1337 	ass = codec->subsystem_id & 0xffff;
1338 	if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1339 		goto do_sku;
1340 
1341 	/* invalid SSID, check the special NID pin defcfg instead */
1342 	/*
1343 	 * 31~30	: port connectivity
1344 	 * 29~21	: reserve
1345 	 * 20		: PCBEEP input
1346 	 * 19~16	: Check sum (15:1)
1347 	 * 15~1		: Custom
1348 	 * 0		: override
1349 	*/
1350 	nid = 0x1d;
1351 	if (codec->vendor_id == 0x10ec0260)
1352 		nid = 0x17;
1353 	ass = snd_hda_codec_get_pincfg(codec, nid);
1354 	snd_printd("realtek: No valid SSID, "
1355 		   "checking pincfg 0x%08x for NID 0x%x\n",
1356 		   ass, nid);
1357 	if (!(ass & 1))
1358 		return 0;
1359 	if ((ass >> 30) != 1)	/* no physical connection */
1360 		return 0;
1361 
1362 	/* check sum */
1363 	tmp = 0;
1364 	for (i = 1; i < 16; i++) {
1365 		if ((ass >> i) & 1)
1366 			tmp++;
1367 	}
1368 	if (((ass >> 16) & 0xf) != tmp)
1369 		return 0;
1370 do_sku:
1371 	snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1372 		   ass & 0xffff, codec->vendor_id);
1373 	/*
1374 	 * 0 : override
1375 	 * 1 :	Swap Jack
1376 	 * 2 : 0 --> Desktop, 1 --> Laptop
1377 	 * 3~5 : External Amplifier control
1378 	 * 7~6 : Reserved
1379 	*/
1380 	tmp = (ass & 0x38) >> 3;	/* external Amp control */
1381 	switch (tmp) {
1382 	case 1:
1383 		spec->init_amp = ALC_INIT_GPIO1;
1384 		break;
1385 	case 3:
1386 		spec->init_amp = ALC_INIT_GPIO2;
1387 		break;
1388 	case 7:
1389 		spec->init_amp = ALC_INIT_GPIO3;
1390 		break;
1391 	case 5:
1392 		spec->init_amp = ALC_INIT_DEFAULT;
1393 		break;
1394 	}
1395 
1396 	/* is laptop or Desktop and enable the function "Mute internal speaker
1397 	 * when the external headphone out jack is plugged"
1398 	 */
1399 	if (!(ass & 0x8000))
1400 		return 1;
1401 	/*
1402 	 * 10~8 : Jack location
1403 	 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1404 	 * 14~13: Resvered
1405 	 * 15   : 1 --> enable the function "Mute internal speaker
1406 	 *	        when the external headphone out jack is plugged"
1407 	 */
1408 	if (!spec->autocfg.hp_pins[0]) {
1409 		hda_nid_t nid;
1410 		tmp = (ass >> 11) & 0x3;	/* HP to chassis */
1411 		if (tmp == 0)
1412 			nid = porta;
1413 		else if (tmp == 1)
1414 			nid = porte;
1415 		else if (tmp == 2)
1416 			nid = portd;
1417 		else if (tmp == 3)
1418 			nid = porti;
1419 		else
1420 			return 1;
1421 		for (i = 0; i < spec->autocfg.line_outs; i++)
1422 			if (spec->autocfg.line_out_pins[i] == nid)
1423 				return 1;
1424 		spec->autocfg.hp_pins[0] = nid;
1425 	}
1426 
1427 	alc_init_auto_hp(codec);
1428 	alc_init_auto_mic(codec);
1429 	return 1;
1430 }
1431 
1432 static void alc_ssid_check(struct hda_codec *codec,
1433 			   hda_nid_t porta, hda_nid_t porte,
1434 			   hda_nid_t portd, hda_nid_t porti)
1435 {
1436 	if (!alc_subsystem_id(codec, porta, porte, portd, porti)) {
1437 		struct alc_spec *spec = codec->spec;
1438 		snd_printd("realtek: "
1439 			   "Enable default setup for auto mode as fallback\n");
1440 		spec->init_amp = ALC_INIT_DEFAULT;
1441 		alc_init_auto_hp(codec);
1442 		alc_init_auto_mic(codec);
1443 	}
1444 }
1445 
1446 /*
1447  * Fix-up pin default configurations and add default verbs
1448  */
1449 
1450 struct alc_pincfg {
1451 	hda_nid_t nid;
1452 	u32 val;
1453 };
1454 
1455 struct alc_fixup {
1456 	const struct alc_pincfg *pins;
1457 	const struct hda_verb *verbs;
1458 };
1459 
1460 static void alc_pick_fixup(struct hda_codec *codec,
1461 			   const struct snd_pci_quirk *quirk,
1462 			   const struct alc_fixup *fix,
1463 			   int pre_init)
1464 {
1465 	const struct alc_pincfg *cfg;
1466 
1467 	quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1468 	if (!quirk)
1469 		return;
1470 	fix += quirk->value;
1471 	cfg = fix->pins;
1472 	if (pre_init && cfg) {
1473 #ifdef CONFIG_SND_DEBUG_VERBOSE
1474 		snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n",
1475 			    codec->chip_name, quirk->name);
1476 #endif
1477 		for (; cfg->nid; cfg++)
1478 			snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1479 	}
1480 	if (!pre_init && fix->verbs) {
1481 #ifdef CONFIG_SND_DEBUG_VERBOSE
1482 		snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-verbs for %s\n",
1483 			    codec->chip_name, quirk->name);
1484 #endif
1485 		add_verb(codec->spec, fix->verbs);
1486 	}
1487 }
1488 
1489 static int alc_read_coef_idx(struct hda_codec *codec,
1490 			unsigned int coef_idx)
1491 {
1492 	unsigned int val;
1493 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1494 		    		coef_idx);
1495 	val = snd_hda_codec_read(codec, 0x20, 0,
1496 			 	AC_VERB_GET_PROC_COEF, 0);
1497 	return val;
1498 }
1499 
1500 /*
1501  * ALC888
1502  */
1503 
1504 /*
1505  * 2ch mode
1506  */
1507 static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1508 /* Mic-in jack as mic in */
1509 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1510 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1511 /* Line-in jack as Line in */
1512 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1513 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1514 /* Line-Out as Front */
1515 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1516 	{ } /* end */
1517 };
1518 
1519 /*
1520  * 4ch mode
1521  */
1522 static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1523 /* Mic-in jack as mic in */
1524 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1525 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1526 /* Line-in jack as Surround */
1527 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1528 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1529 /* Line-Out as Front */
1530 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1531 	{ } /* end */
1532 };
1533 
1534 /*
1535  * 6ch mode
1536  */
1537 static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1538 /* Mic-in jack as CLFE */
1539 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1540 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1541 /* Line-in jack as Surround */
1542 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1543 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1544 /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1545 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1546 	{ } /* end */
1547 };
1548 
1549 /*
1550  * 8ch mode
1551  */
1552 static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1553 /* Mic-in jack as CLFE */
1554 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1555 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1556 /* Line-in jack as Surround */
1557 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1558 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1559 /* Line-Out as Side */
1560 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1561 	{ } /* end */
1562 };
1563 
1564 static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1565 	{ 2, alc888_4ST_ch2_intel_init },
1566 	{ 4, alc888_4ST_ch4_intel_init },
1567 	{ 6, alc888_4ST_ch6_intel_init },
1568 	{ 8, alc888_4ST_ch8_intel_init },
1569 };
1570 
1571 /*
1572  * ALC888 Fujitsu Siemens Amillo xa3530
1573  */
1574 
1575 static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1576 /* Front Mic: set to PIN_IN (empty by default) */
1577 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1578 /* Connect Internal HP to Front */
1579 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1580 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1581 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1582 /* Connect Bass HP to Front */
1583 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1584 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1585 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1586 /* Connect Line-Out side jack (SPDIF) to Side */
1587 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1588 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1589 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1590 /* Connect Mic jack to CLFE */
1591 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1592 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1593 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1594 /* Connect Line-in jack to Surround */
1595 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1596 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1597 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1598 /* Connect HP out jack to Front */
1599 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1600 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1601 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1602 /* Enable unsolicited event for HP jack and Line-out jack */
1603 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1604 	{0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1605 	{}
1606 };
1607 
1608 static void alc_automute_amp(struct hda_codec *codec)
1609 {
1610 	struct alc_spec *spec = codec->spec;
1611 	unsigned int mute;
1612 	hda_nid_t nid;
1613 	int i;
1614 
1615 	spec->jack_present = 0;
1616 	for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1617 		nid = spec->autocfg.hp_pins[i];
1618 		if (!nid)
1619 			break;
1620 		if (snd_hda_jack_detect(codec, nid)) {
1621 			spec->jack_present = 1;
1622 			break;
1623 		}
1624 	}
1625 
1626 	mute = spec->jack_present ? HDA_AMP_MUTE : 0;
1627 	/* Toggle internal speakers muting */
1628 	for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1629 		nid = spec->autocfg.speaker_pins[i];
1630 		if (!nid)
1631 			break;
1632 		snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1633 					 HDA_AMP_MUTE, mute);
1634 	}
1635 }
1636 
1637 static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1638 					 unsigned int res)
1639 {
1640 	if (codec->vendor_id == 0x10ec0880)
1641 		res >>= 28;
1642 	else
1643 		res >>= 26;
1644 	if (res == ALC880_HP_EVENT)
1645 		alc_automute_amp(codec);
1646 }
1647 
1648 static void alc889_automute_setup(struct hda_codec *codec)
1649 {
1650 	struct alc_spec *spec = codec->spec;
1651 
1652 	spec->autocfg.hp_pins[0] = 0x15;
1653 	spec->autocfg.speaker_pins[0] = 0x14;
1654 	spec->autocfg.speaker_pins[1] = 0x16;
1655 	spec->autocfg.speaker_pins[2] = 0x17;
1656 	spec->autocfg.speaker_pins[3] = 0x19;
1657 	spec->autocfg.speaker_pins[4] = 0x1a;
1658 }
1659 
1660 static void alc889_intel_init_hook(struct hda_codec *codec)
1661 {
1662 	alc889_coef_init(codec);
1663 	alc_automute_amp(codec);
1664 }
1665 
1666 static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
1667 {
1668 	struct alc_spec *spec = codec->spec;
1669 
1670 	spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1671 	spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1672 	spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1673 	spec->autocfg.speaker_pins[1] = 0x15; /* bass */
1674 }
1675 
1676 /*
1677  * ALC888 Acer Aspire 4930G model
1678  */
1679 
1680 static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1681 /* Front Mic: set to PIN_IN (empty by default) */
1682 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1683 /* Unselect Front Mic by default in input mixer 3 */
1684 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1685 /* Enable unsolicited event for HP jack */
1686 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1687 /* Connect Internal HP to front */
1688 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1689 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1690 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1691 /* Connect HP out to front */
1692 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1693 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1694 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1695 	{ }
1696 };
1697 
1698 /*
1699  * ALC888 Acer Aspire 6530G model
1700  */
1701 
1702 static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1703 /* Route to built-in subwoofer as well as speakers */
1704 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1705 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1706 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1707 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1708 /* Bias voltage on for external mic port */
1709 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
1710 /* Front Mic: set to PIN_IN (empty by default) */
1711 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1712 /* Unselect Front Mic by default in input mixer 3 */
1713 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1714 /* Enable unsolicited event for HP jack */
1715 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1716 /* Enable speaker output */
1717 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1718 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1719 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
1720 /* Enable headphone output */
1721 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1722 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1723 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1724 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
1725 	{ }
1726 };
1727 
1728 /*
1729  * ALC889 Acer Aspire 8930G model
1730  */
1731 
1732 static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
1733 /* Front Mic: set to PIN_IN (empty by default) */
1734 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1735 /* Unselect Front Mic by default in input mixer 3 */
1736 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1737 /* Enable unsolicited event for HP jack */
1738 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1739 /* Connect Internal Front to Front */
1740 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1741 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1742 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1743 /* Connect Internal Rear to Rear */
1744 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1745 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1746 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1747 /* Connect Internal CLFE to CLFE */
1748 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1749 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1750 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1751 /* Connect HP out to Front */
1752 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1753 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1754 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1755 /* Enable all DACs */
1756 /*  DAC DISABLE/MUTE 1? */
1757 /*  setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1758 	{0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1759 	{0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1760 /*  DAC DISABLE/MUTE 2? */
1761 /*  some bit here disables the other DACs. Init=0x4900 */
1762 	{0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1763 	{0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1764 /* DMIC fix
1765  * This laptop has a stereo digital microphone. The mics are only 1cm apart
1766  * which makes the stereo useless. However, either the mic or the ALC889
1767  * makes the signal become a difference/sum signal instead of standard
1768  * stereo, which is annoying. So instead we flip this bit which makes the
1769  * codec replicate the sum signal to both channels, turning it into a
1770  * normal mono mic.
1771  */
1772 /*  DMIC_CONTROL? Init value = 0x0001 */
1773 	{0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1774 	{0x20, AC_VERB_SET_PROC_COEF, 0x0003},
1775 	{ }
1776 };
1777 
1778 static struct hda_input_mux alc888_2_capture_sources[2] = {
1779 	/* Front mic only available on one ADC */
1780 	{
1781 		.num_items = 4,
1782 		.items = {
1783 			{ "Mic", 0x0 },
1784 			{ "Line", 0x2 },
1785 			{ "CD", 0x4 },
1786 			{ "Front Mic", 0xb },
1787 		},
1788 	},
1789 	{
1790 		.num_items = 3,
1791 		.items = {
1792 			{ "Mic", 0x0 },
1793 			{ "Line", 0x2 },
1794 			{ "CD", 0x4 },
1795 		},
1796 	}
1797 };
1798 
1799 static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
1800 	/* Interal mic only available on one ADC */
1801 	{
1802 		.num_items = 5,
1803 		.items = {
1804 			{ "Ext Mic", 0x0 },
1805 			{ "Line In", 0x2 },
1806 			{ "CD", 0x4 },
1807 			{ "Input Mix", 0xa },
1808 			{ "Int Mic", 0xb },
1809 		},
1810 	},
1811 	{
1812 		.num_items = 4,
1813 		.items = {
1814 			{ "Ext Mic", 0x0 },
1815 			{ "Line In", 0x2 },
1816 			{ "CD", 0x4 },
1817 			{ "Input Mix", 0xa },
1818 		},
1819 	}
1820 };
1821 
1822 static struct hda_input_mux alc889_capture_sources[3] = {
1823 	/* Digital mic only available on first "ADC" */
1824 	{
1825 		.num_items = 5,
1826 		.items = {
1827 			{ "Mic", 0x0 },
1828 			{ "Line", 0x2 },
1829 			{ "CD", 0x4 },
1830 			{ "Front Mic", 0xb },
1831 			{ "Input Mix", 0xa },
1832 		},
1833 	},
1834 	{
1835 		.num_items = 4,
1836 		.items = {
1837 			{ "Mic", 0x0 },
1838 			{ "Line", 0x2 },
1839 			{ "CD", 0x4 },
1840 			{ "Input Mix", 0xa },
1841 		},
1842 	},
1843 	{
1844 		.num_items = 4,
1845 		.items = {
1846 			{ "Mic", 0x0 },
1847 			{ "Line", 0x2 },
1848 			{ "CD", 0x4 },
1849 			{ "Input Mix", 0xa },
1850 		},
1851 	}
1852 };
1853 
1854 static struct snd_kcontrol_new alc888_base_mixer[] = {
1855 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1856 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1857 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1858 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1859 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1860 		HDA_OUTPUT),
1861 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1862 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1863 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1864 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1865 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1866 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1867 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1868 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1869 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1870 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1871 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1872 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1873 	{ } /* end */
1874 };
1875 
1876 static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
1877 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1878 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1879 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1880 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1881 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1882 		HDA_OUTPUT),
1883 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1884 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1885 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1886 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1887 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1888 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1889 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1890 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1891 	{ } /* end */
1892 };
1893 
1894 
1895 static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
1896 {
1897 	struct alc_spec *spec = codec->spec;
1898 
1899 	spec->autocfg.hp_pins[0] = 0x15;
1900 	spec->autocfg.speaker_pins[0] = 0x14;
1901 	spec->autocfg.speaker_pins[1] = 0x16;
1902 	spec->autocfg.speaker_pins[2] = 0x17;
1903 }
1904 
1905 static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
1906 {
1907 	struct alc_spec *spec = codec->spec;
1908 
1909 	spec->autocfg.hp_pins[0] = 0x15;
1910 	spec->autocfg.speaker_pins[0] = 0x14;
1911 	spec->autocfg.speaker_pins[1] = 0x16;
1912 	spec->autocfg.speaker_pins[2] = 0x17;
1913 }
1914 
1915 static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
1916 {
1917 	struct alc_spec *spec = codec->spec;
1918 
1919 	spec->autocfg.hp_pins[0] = 0x15;
1920 	spec->autocfg.speaker_pins[0] = 0x14;
1921 	spec->autocfg.speaker_pins[1] = 0x16;
1922 	spec->autocfg.speaker_pins[2] = 0x1b;
1923 }
1924 
1925 /*
1926  * ALC880 3-stack model
1927  *
1928  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
1929  * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
1930  *                 F-Mic = 0x1b, HP = 0x19
1931  */
1932 
1933 static hda_nid_t alc880_dac_nids[4] = {
1934 	/* front, rear, clfe, rear_surr */
1935 	0x02, 0x05, 0x04, 0x03
1936 };
1937 
1938 static hda_nid_t alc880_adc_nids[3] = {
1939 	/* ADC0-2 */
1940 	0x07, 0x08, 0x09,
1941 };
1942 
1943 /* The datasheet says the node 0x07 is connected from inputs,
1944  * but it shows zero connection in the real implementation on some devices.
1945  * Note: this is a 915GAV bug, fixed on 915GLV
1946  */
1947 static hda_nid_t alc880_adc_nids_alt[2] = {
1948 	/* ADC1-2 */
1949 	0x08, 0x09,
1950 };
1951 
1952 #define ALC880_DIGOUT_NID	0x06
1953 #define ALC880_DIGIN_NID	0x0a
1954 
1955 static struct hda_input_mux alc880_capture_source = {
1956 	.num_items = 4,
1957 	.items = {
1958 		{ "Mic", 0x0 },
1959 		{ "Front Mic", 0x3 },
1960 		{ "Line", 0x2 },
1961 		{ "CD", 0x4 },
1962 	},
1963 };
1964 
1965 /* channel source setting (2/6 channel selection for 3-stack) */
1966 /* 2ch mode */
1967 static struct hda_verb alc880_threestack_ch2_init[] = {
1968 	/* set line-in to input, mute it */
1969 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1970 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1971 	/* set mic-in to input vref 80%, mute it */
1972 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1973 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1974 	{ } /* end */
1975 };
1976 
1977 /* 6ch mode */
1978 static struct hda_verb alc880_threestack_ch6_init[] = {
1979 	/* set line-in to output, unmute it */
1980 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1981 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1982 	/* set mic-in to output, unmute it */
1983 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1984 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1985 	{ } /* end */
1986 };
1987 
1988 static struct hda_channel_mode alc880_threestack_modes[2] = {
1989 	{ 2, alc880_threestack_ch2_init },
1990 	{ 6, alc880_threestack_ch6_init },
1991 };
1992 
1993 static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
1994 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1995 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1996 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1997 	HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
1998 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1999 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2000 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2001 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2002 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2003 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2004 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2005 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2006 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2007 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2008 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
2009 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
2010 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
2011 	{
2012 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2013 		.name = "Channel Mode",
2014 		.info = alc_ch_mode_info,
2015 		.get = alc_ch_mode_get,
2016 		.put = alc_ch_mode_put,
2017 	},
2018 	{ } /* end */
2019 };
2020 
2021 /* capture mixer elements */
2022 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
2023 			    struct snd_ctl_elem_info *uinfo)
2024 {
2025 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2026 	struct alc_spec *spec = codec->spec;
2027 	int err;
2028 
2029 	mutex_lock(&codec->control_mutex);
2030 	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2031 						      HDA_INPUT);
2032 	err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
2033 	mutex_unlock(&codec->control_mutex);
2034 	return err;
2035 }
2036 
2037 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
2038 			   unsigned int size, unsigned int __user *tlv)
2039 {
2040 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2041 	struct alc_spec *spec = codec->spec;
2042 	int err;
2043 
2044 	mutex_lock(&codec->control_mutex);
2045 	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2046 						      HDA_INPUT);
2047 	err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
2048 	mutex_unlock(&codec->control_mutex);
2049 	return err;
2050 }
2051 
2052 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
2053 			     struct snd_ctl_elem_value *ucontrol);
2054 
2055 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
2056 				 struct snd_ctl_elem_value *ucontrol,
2057 				 getput_call_t func)
2058 {
2059 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2060 	struct alc_spec *spec = codec->spec;
2061 	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2062 	int err;
2063 
2064 	mutex_lock(&codec->control_mutex);
2065 	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
2066 						      3, 0, HDA_INPUT);
2067 	err = func(kcontrol, ucontrol);
2068 	mutex_unlock(&codec->control_mutex);
2069 	return err;
2070 }
2071 
2072 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
2073 			   struct snd_ctl_elem_value *ucontrol)
2074 {
2075 	return alc_cap_getput_caller(kcontrol, ucontrol,
2076 				     snd_hda_mixer_amp_volume_get);
2077 }
2078 
2079 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
2080 			   struct snd_ctl_elem_value *ucontrol)
2081 {
2082 	return alc_cap_getput_caller(kcontrol, ucontrol,
2083 				     snd_hda_mixer_amp_volume_put);
2084 }
2085 
2086 /* capture mixer elements */
2087 #define alc_cap_sw_info		snd_ctl_boolean_stereo_info
2088 
2089 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
2090 			  struct snd_ctl_elem_value *ucontrol)
2091 {
2092 	return alc_cap_getput_caller(kcontrol, ucontrol,
2093 				     snd_hda_mixer_amp_switch_get);
2094 }
2095 
2096 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2097 			  struct snd_ctl_elem_value *ucontrol)
2098 {
2099 	return alc_cap_getput_caller(kcontrol, ucontrol,
2100 				     snd_hda_mixer_amp_switch_put);
2101 }
2102 
2103 #define _DEFINE_CAPMIX(num) \
2104 	{ \
2105 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2106 		.name = "Capture Switch", \
2107 		.access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2108 		.count = num, \
2109 		.info = alc_cap_sw_info, \
2110 		.get = alc_cap_sw_get, \
2111 		.put = alc_cap_sw_put, \
2112 	}, \
2113 	{ \
2114 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2115 		.name = "Capture Volume", \
2116 		.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2117 			   SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2118 			   SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2119 		.count = num, \
2120 		.info = alc_cap_vol_info, \
2121 		.get = alc_cap_vol_get, \
2122 		.put = alc_cap_vol_put, \
2123 		.tlv = { .c = alc_cap_vol_tlv }, \
2124 	}
2125 
2126 #define _DEFINE_CAPSRC(num) \
2127 	{ \
2128 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2129 		/* .name = "Capture Source", */ \
2130 		.name = "Input Source", \
2131 		.count = num, \
2132 		.info = alc_mux_enum_info, \
2133 		.get = alc_mux_enum_get, \
2134 		.put = alc_mux_enum_put, \
2135 	}
2136 
2137 #define DEFINE_CAPMIX(num) \
2138 static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2139 	_DEFINE_CAPMIX(num),				      \
2140 	_DEFINE_CAPSRC(num),				      \
2141 	{ } /* end */					      \
2142 }
2143 
2144 #define DEFINE_CAPMIX_NOSRC(num) \
2145 static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2146 	_DEFINE_CAPMIX(num),					    \
2147 	{ } /* end */						    \
2148 }
2149 
2150 /* up to three ADCs */
2151 DEFINE_CAPMIX(1);
2152 DEFINE_CAPMIX(2);
2153 DEFINE_CAPMIX(3);
2154 DEFINE_CAPMIX_NOSRC(1);
2155 DEFINE_CAPMIX_NOSRC(2);
2156 DEFINE_CAPMIX_NOSRC(3);
2157 
2158 /*
2159  * ALC880 5-stack model
2160  *
2161  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2162  *      Side = 0x02 (0xd)
2163  * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2164  *                 Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2165  */
2166 
2167 /* additional mixers to alc880_three_stack_mixer */
2168 static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2169 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2170 	HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2171 	{ } /* end */
2172 };
2173 
2174 /* channel source setting (6/8 channel selection for 5-stack) */
2175 /* 6ch mode */
2176 static struct hda_verb alc880_fivestack_ch6_init[] = {
2177 	/* set line-in to input, mute it */
2178 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2179 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2180 	{ } /* end */
2181 };
2182 
2183 /* 8ch mode */
2184 static struct hda_verb alc880_fivestack_ch8_init[] = {
2185 	/* set line-in to output, unmute it */
2186 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2187 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2188 	{ } /* end */
2189 };
2190 
2191 static struct hda_channel_mode alc880_fivestack_modes[2] = {
2192 	{ 6, alc880_fivestack_ch6_init },
2193 	{ 8, alc880_fivestack_ch8_init },
2194 };
2195 
2196 
2197 /*
2198  * ALC880 6-stack model
2199  *
2200  * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2201  *      Side = 0x05 (0x0f)
2202  * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2203  *   Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2204  */
2205 
2206 static hda_nid_t alc880_6st_dac_nids[4] = {
2207 	/* front, rear, clfe, rear_surr */
2208 	0x02, 0x03, 0x04, 0x05
2209 };
2210 
2211 static struct hda_input_mux alc880_6stack_capture_source = {
2212 	.num_items = 4,
2213 	.items = {
2214 		{ "Mic", 0x0 },
2215 		{ "Front Mic", 0x1 },
2216 		{ "Line", 0x2 },
2217 		{ "CD", 0x4 },
2218 	},
2219 };
2220 
2221 /* fixed 8-channels */
2222 static struct hda_channel_mode alc880_sixstack_modes[1] = {
2223 	{ 8, NULL },
2224 };
2225 
2226 static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2227 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2228 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2229 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2230 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2231 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2232 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2233 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2234 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2235 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2236 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2237 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2238 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2239 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2240 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2241 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2242 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2243 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2244 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2245 	{
2246 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2247 		.name = "Channel Mode",
2248 		.info = alc_ch_mode_info,
2249 		.get = alc_ch_mode_get,
2250 		.put = alc_ch_mode_put,
2251 	},
2252 	{ } /* end */
2253 };
2254 
2255 
2256 /*
2257  * ALC880 W810 model
2258  *
2259  * W810 has rear IO for:
2260  * Front (DAC 02)
2261  * Surround (DAC 03)
2262  * Center/LFE (DAC 04)
2263  * Digital out (06)
2264  *
2265  * The system also has a pair of internal speakers, and a headphone jack.
2266  * These are both connected to Line2 on the codec, hence to DAC 02.
2267  *
2268  * There is a variable resistor to control the speaker or headphone
2269  * volume. This is a hardware-only device without a software API.
2270  *
2271  * Plugging headphones in will disable the internal speakers. This is
2272  * implemented in hardware, not via the driver using jack sense. In
2273  * a similar fashion, plugging into the rear socket marked "front" will
2274  * disable both the speakers and headphones.
2275  *
2276  * For input, there's a microphone jack, and an "audio in" jack.
2277  * These may not do anything useful with this driver yet, because I
2278  * haven't setup any initialization verbs for these yet...
2279  */
2280 
2281 static hda_nid_t alc880_w810_dac_nids[3] = {
2282 	/* front, rear/surround, clfe */
2283 	0x02, 0x03, 0x04
2284 };
2285 
2286 /* fixed 6 channels */
2287 static struct hda_channel_mode alc880_w810_modes[1] = {
2288 	{ 6, NULL }
2289 };
2290 
2291 /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2292 static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2293 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2294 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2295 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2296 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2297 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2298 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2299 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2300 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2301 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2302 	{ } /* end */
2303 };
2304 
2305 
2306 /*
2307  * Z710V model
2308  *
2309  * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
2310  * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2311  *                 Line = 0x1a
2312  */
2313 
2314 static hda_nid_t alc880_z71v_dac_nids[1] = {
2315 	0x02
2316 };
2317 #define ALC880_Z71V_HP_DAC	0x03
2318 
2319 /* fixed 2 channels */
2320 static struct hda_channel_mode alc880_2_jack_modes[1] = {
2321 	{ 2, NULL }
2322 };
2323 
2324 static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2325 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2326 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2327 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2328 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
2329 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2330 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2331 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2332 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2333 	{ } /* end */
2334 };
2335 
2336 
2337 /*
2338  * ALC880 F1734 model
2339  *
2340  * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2341  * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2342  */
2343 
2344 static hda_nid_t alc880_f1734_dac_nids[1] = {
2345 	0x03
2346 };
2347 #define ALC880_F1734_HP_DAC	0x02
2348 
2349 static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2350 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2351 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2352 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2353 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2354 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2355 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2356 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2357 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2358 	{ } /* end */
2359 };
2360 
2361 static struct hda_input_mux alc880_f1734_capture_source = {
2362 	.num_items = 2,
2363 	.items = {
2364 		{ "Mic", 0x1 },
2365 		{ "CD", 0x4 },
2366 	},
2367 };
2368 
2369 
2370 /*
2371  * ALC880 ASUS model
2372  *
2373  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2374  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2375  *  Mic = 0x18, Line = 0x1a
2376  */
2377 
2378 #define alc880_asus_dac_nids	alc880_w810_dac_nids	/* identical with w810 */
2379 #define alc880_asus_modes	alc880_threestack_modes	/* 2/6 channel mode */
2380 
2381 static struct snd_kcontrol_new alc880_asus_mixer[] = {
2382 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2383 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2384 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2385 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2386 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2387 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2388 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2389 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2390 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2391 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2392 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2393 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2394 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2395 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2396 	{
2397 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2398 		.name = "Channel Mode",
2399 		.info = alc_ch_mode_info,
2400 		.get = alc_ch_mode_get,
2401 		.put = alc_ch_mode_put,
2402 	},
2403 	{ } /* end */
2404 };
2405 
2406 /*
2407  * ALC880 ASUS W1V model
2408  *
2409  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2410  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2411  *  Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2412  */
2413 
2414 /* additional mixers to alc880_asus_mixer */
2415 static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2416 	HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2417 	HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2418 	{ } /* end */
2419 };
2420 
2421 /* TCL S700 */
2422 static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2423 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2424 	HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2425 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2426 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2427 	HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2428 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2429 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2430 	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2431 	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
2432 	{ } /* end */
2433 };
2434 
2435 /* Uniwill */
2436 static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2437 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2438 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2439 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2440 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2441 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2442 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2443 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2444 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2445 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2446 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2447 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2448 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2449 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2450 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2451 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2452 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2453 	{
2454 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2455 		.name = "Channel Mode",
2456 		.info = alc_ch_mode_info,
2457 		.get = alc_ch_mode_get,
2458 		.put = alc_ch_mode_put,
2459 	},
2460 	{ } /* end */
2461 };
2462 
2463 static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2464 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2465 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2466 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2467 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2468 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2469 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2470 	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2471 	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2472 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2473 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2474 	{ } /* end */
2475 };
2476 
2477 static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2478 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2479 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2480 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2481 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2482 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2483 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2484 	{ } /* end */
2485 };
2486 
2487 /*
2488  * virtual master controls
2489  */
2490 
2491 /*
2492  * slave controls for virtual master
2493  */
2494 static const char *alc_slave_vols[] = {
2495 	"Front Playback Volume",
2496 	"Surround Playback Volume",
2497 	"Center Playback Volume",
2498 	"LFE Playback Volume",
2499 	"Side Playback Volume",
2500 	"Headphone Playback Volume",
2501 	"Speaker Playback Volume",
2502 	"Mono Playback Volume",
2503 	"Line-Out Playback Volume",
2504 	"PCM Playback Volume",
2505 	NULL,
2506 };
2507 
2508 static const char *alc_slave_sws[] = {
2509 	"Front Playback Switch",
2510 	"Surround Playback Switch",
2511 	"Center Playback Switch",
2512 	"LFE Playback Switch",
2513 	"Side Playback Switch",
2514 	"Headphone Playback Switch",
2515 	"Speaker Playback Switch",
2516 	"Mono Playback Switch",
2517 	"IEC958 Playback Switch",
2518 	"Line-Out Playback Switch",
2519 	"PCM Playback Switch",
2520 	NULL,
2521 };
2522 
2523 /*
2524  * build control elements
2525  */
2526 
2527 #define NID_MAPPING		(-1)
2528 
2529 #define SUBDEV_SPEAKER_		(0 << 6)
2530 #define SUBDEV_HP_		(1 << 6)
2531 #define SUBDEV_LINE_		(2 << 6)
2532 #define SUBDEV_SPEAKER(x)	(SUBDEV_SPEAKER_ | ((x) & 0x3f))
2533 #define SUBDEV_HP(x)		(SUBDEV_HP_ | ((x) & 0x3f))
2534 #define SUBDEV_LINE(x)		(SUBDEV_LINE_ | ((x) & 0x3f))
2535 
2536 static void alc_free_kctls(struct hda_codec *codec);
2537 
2538 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2539 /* additional beep mixers; the actual parameters are overwritten at build */
2540 static struct snd_kcontrol_new alc_beep_mixer[] = {
2541 	HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2542 	HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
2543 	{ } /* end */
2544 };
2545 #endif
2546 
2547 static int alc_build_controls(struct hda_codec *codec)
2548 {
2549 	struct alc_spec *spec = codec->spec;
2550 	struct snd_kcontrol *kctl;
2551 	struct snd_kcontrol_new *knew;
2552 	int i, j, err;
2553 	unsigned int u;
2554 	hda_nid_t nid;
2555 
2556 	for (i = 0; i < spec->num_mixers; i++) {
2557 		err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2558 		if (err < 0)
2559 			return err;
2560 	}
2561 	if (spec->cap_mixer) {
2562 		err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2563 		if (err < 0)
2564 			return err;
2565 	}
2566 	if (spec->multiout.dig_out_nid) {
2567 		err = snd_hda_create_spdif_out_ctls(codec,
2568 						    spec->multiout.dig_out_nid);
2569 		if (err < 0)
2570 			return err;
2571 		if (!spec->no_analog) {
2572 			err = snd_hda_create_spdif_share_sw(codec,
2573 							    &spec->multiout);
2574 			if (err < 0)
2575 				return err;
2576 			spec->multiout.share_spdif = 1;
2577 		}
2578 	}
2579 	if (spec->dig_in_nid) {
2580 		err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2581 		if (err < 0)
2582 			return err;
2583 	}
2584 
2585 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2586 	/* create beep controls if needed */
2587 	if (spec->beep_amp) {
2588 		struct snd_kcontrol_new *knew;
2589 		for (knew = alc_beep_mixer; knew->name; knew++) {
2590 			struct snd_kcontrol *kctl;
2591 			kctl = snd_ctl_new1(knew, codec);
2592 			if (!kctl)
2593 				return -ENOMEM;
2594 			kctl->private_value = spec->beep_amp;
2595 			err = snd_hda_ctl_add(codec, 0, kctl);
2596 			if (err < 0)
2597 				return err;
2598 		}
2599 	}
2600 #endif
2601 
2602 	/* if we have no master control, let's create it */
2603 	if (!spec->no_analog &&
2604 	    !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
2605 		unsigned int vmaster_tlv[4];
2606 		snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
2607 					HDA_OUTPUT, vmaster_tlv);
2608 		err = snd_hda_add_vmaster(codec, "Master Playback Volume",
2609 					  vmaster_tlv, alc_slave_vols);
2610 		if (err < 0)
2611 			return err;
2612 	}
2613 	if (!spec->no_analog &&
2614 	    !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2615 		err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2616 					  NULL, alc_slave_sws);
2617 		if (err < 0)
2618 			return err;
2619 	}
2620 
2621 	/* assign Capture Source enums to NID */
2622 	kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
2623 	if (!kctl)
2624 		kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
2625 	for (i = 0; kctl && i < kctl->count; i++) {
2626 		hda_nid_t *nids = spec->capsrc_nids;
2627 		if (!nids)
2628 			nids = spec->adc_nids;
2629 		err = snd_hda_add_nid(codec, kctl, i, nids[i]);
2630 		if (err < 0)
2631 			return err;
2632 	}
2633 	if (spec->cap_mixer) {
2634 		const char *kname = kctl ? kctl->id.name : NULL;
2635 		for (knew = spec->cap_mixer; knew->name; knew++) {
2636 			if (kname && strcmp(knew->name, kname) == 0)
2637 				continue;
2638 			kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2639 			for (i = 0; kctl && i < kctl->count; i++) {
2640 				err = snd_hda_add_nid(codec, kctl, i,
2641 						      spec->adc_nids[i]);
2642 				if (err < 0)
2643 					return err;
2644 			}
2645 		}
2646 	}
2647 
2648 	/* other nid->control mapping */
2649 	for (i = 0; i < spec->num_mixers; i++) {
2650 		for (knew = spec->mixers[i]; knew->name; knew++) {
2651 			if (knew->iface != NID_MAPPING)
2652 				continue;
2653 			kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2654 			if (kctl == NULL)
2655 				continue;
2656 			u = knew->subdevice;
2657 			for (j = 0; j < 4; j++, u >>= 8) {
2658 				nid = u & 0x3f;
2659 				if (nid == 0)
2660 					continue;
2661 				switch (u & 0xc0) {
2662 				case SUBDEV_SPEAKER_:
2663 					nid = spec->autocfg.speaker_pins[nid];
2664 					break;
2665 				case SUBDEV_LINE_:
2666 					nid = spec->autocfg.line_out_pins[nid];
2667 					break;
2668 				case SUBDEV_HP_:
2669 					nid = spec->autocfg.hp_pins[nid];
2670 					break;
2671 				default:
2672 					continue;
2673 				}
2674 				err = snd_hda_add_nid(codec, kctl, 0, nid);
2675 				if (err < 0)
2676 					return err;
2677 			}
2678 			u = knew->private_value;
2679 			for (j = 0; j < 4; j++, u >>= 8) {
2680 				nid = u & 0xff;
2681 				if (nid == 0)
2682 					continue;
2683 				err = snd_hda_add_nid(codec, kctl, 0, nid);
2684 				if (err < 0)
2685 					return err;
2686 			}
2687 		}
2688 	}
2689 
2690 	alc_free_kctls(codec); /* no longer needed */
2691 
2692 	return 0;
2693 }
2694 
2695 
2696 /*
2697  * initialize the codec volumes, etc
2698  */
2699 
2700 /*
2701  * generic initialization of ADC, input mixers and output mixers
2702  */
2703 static struct hda_verb alc880_volume_init_verbs[] = {
2704 	/*
2705 	 * Unmute ADC0-2 and set the default input to mic-in
2706 	 */
2707 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2708 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2709 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
2710 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2711 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
2712 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2713 
2714 	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2715 	 * mixer widget
2716 	 * Note: PASD motherboards uses the Line In 2 as the input for front
2717 	 * panel mic (mic 2)
2718 	 */
2719 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
2720 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2721 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2722 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2723 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2724 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2725 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2726 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2727 
2728 	/*
2729 	 * Set up output mixers (0x0c - 0x0f)
2730 	 */
2731 	/* set vol=0 to output mixers */
2732 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2733 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2734 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2735 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2736 	/* set up input amps for analog loopback */
2737 	/* Amp Indices: DAC = 0, mixer = 1 */
2738 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2739 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2740 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2741 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2742 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2743 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2744 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2745 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2746 
2747 	{ }
2748 };
2749 
2750 /*
2751  * 3-stack pin configuration:
2752  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2753  */
2754 static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2755 	/*
2756 	 * preset connection lists of input pins
2757 	 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2758 	 */
2759 	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2760 	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2761 	{0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2762 
2763 	/*
2764 	 * Set pin mode and muting
2765 	 */
2766 	/* set front pin widgets 0x14 for output */
2767 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2768 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2769 	/* Mic1 (rear panel) pin widget for input and vref at 80% */
2770 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2771 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2772 	/* Mic2 (as headphone out) for HP output */
2773 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2774 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2775 	/* Line In pin widget for input */
2776 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2777 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2778 	/* Line2 (as front mic) pin widget for input and vref at 80% */
2779 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2780 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2781 	/* CD pin widget for input */
2782 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2783 
2784 	{ }
2785 };
2786 
2787 /*
2788  * 5-stack pin configuration:
2789  * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2790  * line-in/side = 0x1a, f-mic = 0x1b
2791  */
2792 static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2793 	/*
2794 	 * preset connection lists of input pins
2795 	 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2796 	 */
2797 	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2798 	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
2799 
2800 	/*
2801 	 * Set pin mode and muting
2802 	 */
2803 	/* set pin widgets 0x14-0x17 for output */
2804 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2805 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2806 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2807 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2808 	/* unmute pins for output (no gain on this amp) */
2809 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2810 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2811 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2812 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2813 
2814 	/* Mic1 (rear panel) pin widget for input and vref at 80% */
2815 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2816 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2817 	/* Mic2 (as headphone out) for HP output */
2818 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2819 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2820 	/* Line In pin widget for input */
2821 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2822 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2823 	/* Line2 (as front mic) pin widget for input and vref at 80% */
2824 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2825 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2826 	/* CD pin widget for input */
2827 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2828 
2829 	{ }
2830 };
2831 
2832 /*
2833  * W810 pin configuration:
2834  * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2835  */
2836 static struct hda_verb alc880_pin_w810_init_verbs[] = {
2837 	/* hphone/speaker input selector: front DAC */
2838 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
2839 
2840 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2841 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2842 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2843 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2844 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2845 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2846 
2847 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2848 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2849 
2850 	{ }
2851 };
2852 
2853 /*
2854  * Z71V pin configuration:
2855  * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2856  */
2857 static struct hda_verb alc880_pin_z71v_init_verbs[] = {
2858 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2859 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2860 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2861 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2862 
2863 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2864 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2865 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2866 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2867 
2868 	{ }
2869 };
2870 
2871 /*
2872  * 6-stack pin configuration:
2873  * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2874  * f-mic = 0x19, line = 0x1a, HP = 0x1b
2875  */
2876 static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2877 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2878 
2879 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2880 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2881 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2882 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2883 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2884 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2885 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2886 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2887 
2888 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2889 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2890 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2891 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2892 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2893 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2894 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2895 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2896 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2897 
2898 	{ }
2899 };
2900 
2901 /*
2902  * Uniwill pin configuration:
2903  * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
2904  * line = 0x1a
2905  */
2906 static struct hda_verb alc880_uniwill_init_verbs[] = {
2907 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2908 
2909 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2910 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2911 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2912 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2913 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2914 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2915 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2916 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2917 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2918 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2919 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2920 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2921 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2922 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2923 
2924 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2925 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2926 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2927 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2928 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2929 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2930 	/* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
2931 	/* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
2932 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2933 
2934 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2935 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
2936 
2937 	{ }
2938 };
2939 
2940 /*
2941 * Uniwill P53
2942 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
2943  */
2944 static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
2945 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2946 
2947 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2948 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2949 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2950 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2951 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2952 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2953 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2954 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2955 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2956 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2957 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2958 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2959 
2960 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2961 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2962 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2963 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2964 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2965 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2966 
2967 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2968 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
2969 
2970 	{ }
2971 };
2972 
2973 static struct hda_verb alc880_beep_init_verbs[] = {
2974 	{ 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
2975 	{ }
2976 };
2977 
2978 /* auto-toggle front mic */
2979 static void alc880_uniwill_mic_automute(struct hda_codec *codec)
2980 {
2981  	unsigned int present;
2982 	unsigned char bits;
2983 
2984 	present = snd_hda_jack_detect(codec, 0x18);
2985 	bits = present ? HDA_AMP_MUTE : 0;
2986 	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
2987 }
2988 
2989 static void alc880_uniwill_setup(struct hda_codec *codec)
2990 {
2991 	struct alc_spec *spec = codec->spec;
2992 
2993 	spec->autocfg.hp_pins[0] = 0x14;
2994 	spec->autocfg.speaker_pins[0] = 0x15;
2995 	spec->autocfg.speaker_pins[0] = 0x16;
2996 }
2997 
2998 static void alc880_uniwill_init_hook(struct hda_codec *codec)
2999 {
3000 	alc_automute_amp(codec);
3001 	alc880_uniwill_mic_automute(codec);
3002 }
3003 
3004 static void alc880_uniwill_unsol_event(struct hda_codec *codec,
3005 				       unsigned int res)
3006 {
3007 	/* Looks like the unsol event is incompatible with the standard
3008 	 * definition.  4bit tag is placed at 28 bit!
3009 	 */
3010 	switch (res >> 28) {
3011 	case ALC880_MIC_EVENT:
3012 		alc880_uniwill_mic_automute(codec);
3013 		break;
3014 	default:
3015 		alc_automute_amp_unsol_event(codec, res);
3016 		break;
3017 	}
3018 }
3019 
3020 static void alc880_uniwill_p53_setup(struct hda_codec *codec)
3021 {
3022 	struct alc_spec *spec = codec->spec;
3023 
3024 	spec->autocfg.hp_pins[0] = 0x14;
3025 	spec->autocfg.speaker_pins[0] = 0x15;
3026 }
3027 
3028 static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
3029 {
3030 	unsigned int present;
3031 
3032 	present = snd_hda_codec_read(codec, 0x21, 0,
3033 				     AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
3034 	present &= HDA_AMP_VOLMASK;
3035 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
3036 				 HDA_AMP_VOLMASK, present);
3037 	snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
3038 				 HDA_AMP_VOLMASK, present);
3039 }
3040 
3041 static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
3042 					   unsigned int res)
3043 {
3044 	/* Looks like the unsol event is incompatible with the standard
3045 	 * definition.  4bit tag is placed at 28 bit!
3046 	 */
3047 	if ((res >> 28) == ALC880_DCVOL_EVENT)
3048 		alc880_uniwill_p53_dcvol_automute(codec);
3049 	else
3050 		alc_automute_amp_unsol_event(codec, res);
3051 }
3052 
3053 /*
3054  * F1734 pin configuration:
3055  * HP = 0x14, speaker-out = 0x15, mic = 0x18
3056  */
3057 static struct hda_verb alc880_pin_f1734_init_verbs[] = {
3058 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
3059 	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3060 	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3061 	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3062 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3063 
3064 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3065 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3066 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3067 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3068 
3069 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3070 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3071 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
3072 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3073 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3074 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3075 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3076 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3077 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3078 
3079 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
3080 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
3081 
3082 	{ }
3083 };
3084 
3085 /*
3086  * ASUS pin configuration:
3087  * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
3088  */
3089 static struct hda_verb alc880_pin_asus_init_verbs[] = {
3090 	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3091 	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3092 	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3093 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3094 
3095 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3096 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3097 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3098 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3099 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3100 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3101 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3102 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3103 
3104 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3105 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3106 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3107 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3108 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3109 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3110 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3111 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3112 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3113 
3114 	{ }
3115 };
3116 
3117 /* Enable GPIO mask and set output */
3118 #define alc880_gpio1_init_verbs	alc_gpio1_init_verbs
3119 #define alc880_gpio2_init_verbs	alc_gpio2_init_verbs
3120 #define alc880_gpio3_init_verbs	alc_gpio3_init_verbs
3121 
3122 /* Clevo m520g init */
3123 static struct hda_verb alc880_pin_clevo_init_verbs[] = {
3124 	/* headphone output */
3125 	{0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3126 	/* line-out */
3127 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3128 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3129 	/* Line-in */
3130 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3131 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3132 	/* CD */
3133 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3134 	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3135 	/* Mic1 (rear panel) */
3136 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3137 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3138 	/* Mic2 (front panel) */
3139 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3140 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3141 	/* headphone */
3142 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3143 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3144         /* change to EAPD mode */
3145 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3146 	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3147 
3148 	{ }
3149 };
3150 
3151 static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
3152 	/* change to EAPD mode */
3153 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3154 	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3155 
3156 	/* Headphone output */
3157 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3158 	/* Front output*/
3159 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3160 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
3161 
3162 	/* Line In pin widget for input */
3163 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3164 	/* CD pin widget for input */
3165 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3166 	/* Mic1 (rear panel) pin widget for input and vref at 80% */
3167 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3168 
3169 	/* change to EAPD mode */
3170 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3171 	{0x20, AC_VERB_SET_PROC_COEF,  0x3070},
3172 
3173 	{ }
3174 };
3175 
3176 /*
3177  * LG m1 express dual
3178  *
3179  * Pin assignment:
3180  *   Rear Line-In/Out (blue): 0x14
3181  *   Build-in Mic-In: 0x15
3182  *   Speaker-out: 0x17
3183  *   HP-Out (green): 0x1b
3184  *   Mic-In/Out (red): 0x19
3185  *   SPDIF-Out: 0x1e
3186  */
3187 
3188 /* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3189 static hda_nid_t alc880_lg_dac_nids[3] = {
3190 	0x05, 0x02, 0x03
3191 };
3192 
3193 /* seems analog CD is not working */
3194 static struct hda_input_mux alc880_lg_capture_source = {
3195 	.num_items = 3,
3196 	.items = {
3197 		{ "Mic", 0x1 },
3198 		{ "Line", 0x5 },
3199 		{ "Internal Mic", 0x6 },
3200 	},
3201 };
3202 
3203 /* 2,4,6 channel modes */
3204 static struct hda_verb alc880_lg_ch2_init[] = {
3205 	/* set line-in and mic-in to input */
3206 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3207 	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3208 	{ }
3209 };
3210 
3211 static struct hda_verb alc880_lg_ch4_init[] = {
3212 	/* set line-in to out and mic-in to input */
3213 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3214 	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3215 	{ }
3216 };
3217 
3218 static struct hda_verb alc880_lg_ch6_init[] = {
3219 	/* set line-in and mic-in to output */
3220 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3221 	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3222 	{ }
3223 };
3224 
3225 static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3226 	{ 2, alc880_lg_ch2_init },
3227 	{ 4, alc880_lg_ch4_init },
3228 	{ 6, alc880_lg_ch6_init },
3229 };
3230 
3231 static struct snd_kcontrol_new alc880_lg_mixer[] = {
3232 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3233 	HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3234 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3235 	HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3236 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3237 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3238 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3239 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3240 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3241 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3242 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3243 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3244 	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3245 	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3246 	{
3247 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3248 		.name = "Channel Mode",
3249 		.info = alc_ch_mode_info,
3250 		.get = alc_ch_mode_get,
3251 		.put = alc_ch_mode_put,
3252 	},
3253 	{ } /* end */
3254 };
3255 
3256 static struct hda_verb alc880_lg_init_verbs[] = {
3257 	/* set capture source to mic-in */
3258 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3259 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3260 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3261 	/* mute all amp mixer inputs */
3262 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
3263 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3264 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3265 	/* line-in to input */
3266 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3267 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3268 	/* built-in mic */
3269 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3270 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3271 	/* speaker-out */
3272 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3273 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3274 	/* mic-in to input */
3275 	{0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3276 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3277 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3278 	/* HP-out */
3279 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3280 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3281 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3282 	/* jack sense */
3283 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3284 	{ }
3285 };
3286 
3287 /* toggle speaker-output according to the hp-jack state */
3288 static void alc880_lg_setup(struct hda_codec *codec)
3289 {
3290 	struct alc_spec *spec = codec->spec;
3291 
3292 	spec->autocfg.hp_pins[0] = 0x1b;
3293 	spec->autocfg.speaker_pins[0] = 0x17;
3294 }
3295 
3296 /*
3297  * LG LW20
3298  *
3299  * Pin assignment:
3300  *   Speaker-out: 0x14
3301  *   Mic-In: 0x18
3302  *   Built-in Mic-In: 0x19
3303  *   Line-In: 0x1b
3304  *   HP-Out: 0x1a
3305  *   SPDIF-Out: 0x1e
3306  */
3307 
3308 static struct hda_input_mux alc880_lg_lw_capture_source = {
3309 	.num_items = 3,
3310 	.items = {
3311 		{ "Mic", 0x0 },
3312 		{ "Internal Mic", 0x1 },
3313 		{ "Line In", 0x2 },
3314 	},
3315 };
3316 
3317 #define alc880_lg_lw_modes alc880_threestack_modes
3318 
3319 static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3320 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3321 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3322 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3323 	HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3324 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3325 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3326 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3327 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3328 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3329 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
3330 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3331 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3332 	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3333 	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
3334 	{
3335 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3336 		.name = "Channel Mode",
3337 		.info = alc_ch_mode_info,
3338 		.get = alc_ch_mode_get,
3339 		.put = alc_ch_mode_put,
3340 	},
3341 	{ } /* end */
3342 };
3343 
3344 static struct hda_verb alc880_lg_lw_init_verbs[] = {
3345 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3346 	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3347 	{0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3348 
3349 	/* set capture source to mic-in */
3350 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3351 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3352 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3353 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3354 	/* speaker-out */
3355 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3356 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3357 	/* HP-out */
3358 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3359 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3360 	/* mic-in to input */
3361 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3362 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3363 	/* built-in mic */
3364 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3365 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3366 	/* jack sense */
3367 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3368 	{ }
3369 };
3370 
3371 /* toggle speaker-output according to the hp-jack state */
3372 static void alc880_lg_lw_setup(struct hda_codec *codec)
3373 {
3374 	struct alc_spec *spec = codec->spec;
3375 
3376 	spec->autocfg.hp_pins[0] = 0x1b;
3377 	spec->autocfg.speaker_pins[0] = 0x14;
3378 }
3379 
3380 static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3381 	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3382 	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3383 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3384 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3385 	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3386 	HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3387 	{ } /* end */
3388 };
3389 
3390 static struct hda_input_mux alc880_medion_rim_capture_source = {
3391 	.num_items = 2,
3392 	.items = {
3393 		{ "Mic", 0x0 },
3394 		{ "Internal Mic", 0x1 },
3395 	},
3396 };
3397 
3398 static struct hda_verb alc880_medion_rim_init_verbs[] = {
3399 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3400 
3401 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3402 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3403 
3404 	/* Mic1 (rear panel) pin widget for input and vref at 80% */
3405 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3406 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3407 	/* Mic2 (as headphone out) for HP output */
3408 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3409 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3410 	/* Internal Speaker */
3411 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3412 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3413 
3414 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3415 	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3416 
3417 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3418 	{ }
3419 };
3420 
3421 /* toggle speaker-output according to the hp-jack state */
3422 static void alc880_medion_rim_automute(struct hda_codec *codec)
3423 {
3424 	struct alc_spec *spec = codec->spec;
3425 	alc_automute_amp(codec);
3426 	/* toggle EAPD */
3427 	if (spec->jack_present)
3428 		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3429 	else
3430 		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3431 }
3432 
3433 static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3434 					  unsigned int res)
3435 {
3436 	/* Looks like the unsol event is incompatible with the standard
3437 	 * definition.  4bit tag is placed at 28 bit!
3438 	 */
3439 	if ((res >> 28) == ALC880_HP_EVENT)
3440 		alc880_medion_rim_automute(codec);
3441 }
3442 
3443 static void alc880_medion_rim_setup(struct hda_codec *codec)
3444 {
3445 	struct alc_spec *spec = codec->spec;
3446 
3447 	spec->autocfg.hp_pins[0] = 0x14;
3448 	spec->autocfg.speaker_pins[0] = 0x1b;
3449 }
3450 
3451 #ifdef CONFIG_SND_HDA_POWER_SAVE
3452 static struct hda_amp_list alc880_loopbacks[] = {
3453 	{ 0x0b, HDA_INPUT, 0 },
3454 	{ 0x0b, HDA_INPUT, 1 },
3455 	{ 0x0b, HDA_INPUT, 2 },
3456 	{ 0x0b, HDA_INPUT, 3 },
3457 	{ 0x0b, HDA_INPUT, 4 },
3458 	{ } /* end */
3459 };
3460 
3461 static struct hda_amp_list alc880_lg_loopbacks[] = {
3462 	{ 0x0b, HDA_INPUT, 1 },
3463 	{ 0x0b, HDA_INPUT, 6 },
3464 	{ 0x0b, HDA_INPUT, 7 },
3465 	{ } /* end */
3466 };
3467 #endif
3468 
3469 /*
3470  * Common callbacks
3471  */
3472 
3473 static int alc_init(struct hda_codec *codec)
3474 {
3475 	struct alc_spec *spec = codec->spec;
3476 	unsigned int i;
3477 
3478 	alc_fix_pll(codec);
3479 	alc_auto_init_amp(codec, spec->init_amp);
3480 
3481 	for (i = 0; i < spec->num_init_verbs; i++)
3482 		snd_hda_sequence_write(codec, spec->init_verbs[i]);
3483 
3484 	if (spec->init_hook)
3485 		spec->init_hook(codec);
3486 
3487 #ifdef CONFIG_SND_HDA_POWER_SAVE
3488 	if (codec->patch_ops.check_power_status)
3489 		codec->patch_ops.check_power_status(codec, 0x01);
3490 #endif
3491 	return 0;
3492 }
3493 
3494 static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3495 {
3496 	struct alc_spec *spec = codec->spec;
3497 
3498 	if (spec->unsol_event)
3499 		spec->unsol_event(codec, res);
3500 }
3501 
3502 #ifdef CONFIG_SND_HDA_POWER_SAVE
3503 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3504 {
3505 	struct alc_spec *spec = codec->spec;
3506 	return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3507 }
3508 #endif
3509 
3510 /*
3511  * Analog playback callbacks
3512  */
3513 static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3514 				    struct hda_codec *codec,
3515 				    struct snd_pcm_substream *substream)
3516 {
3517 	struct alc_spec *spec = codec->spec;
3518 	return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3519 					     hinfo);
3520 }
3521 
3522 static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3523 				       struct hda_codec *codec,
3524 				       unsigned int stream_tag,
3525 				       unsigned int format,
3526 				       struct snd_pcm_substream *substream)
3527 {
3528 	struct alc_spec *spec = codec->spec;
3529 	return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3530 						stream_tag, format, substream);
3531 }
3532 
3533 static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3534 				       struct hda_codec *codec,
3535 				       struct snd_pcm_substream *substream)
3536 {
3537 	struct alc_spec *spec = codec->spec;
3538 	return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3539 }
3540 
3541 /*
3542  * Digital out
3543  */
3544 static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3545 					struct hda_codec *codec,
3546 					struct snd_pcm_substream *substream)
3547 {
3548 	struct alc_spec *spec = codec->spec;
3549 	return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3550 }
3551 
3552 static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3553 					   struct hda_codec *codec,
3554 					   unsigned int stream_tag,
3555 					   unsigned int format,
3556 					   struct snd_pcm_substream *substream)
3557 {
3558 	struct alc_spec *spec = codec->spec;
3559 	return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3560 					     stream_tag, format, substream);
3561 }
3562 
3563 static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3564 					   struct hda_codec *codec,
3565 					   struct snd_pcm_substream *substream)
3566 {
3567 	struct alc_spec *spec = codec->spec;
3568 	return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3569 }
3570 
3571 static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3572 					 struct hda_codec *codec,
3573 					 struct snd_pcm_substream *substream)
3574 {
3575 	struct alc_spec *spec = codec->spec;
3576 	return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3577 }
3578 
3579 /*
3580  * Analog capture
3581  */
3582 static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3583 				      struct hda_codec *codec,
3584 				      unsigned int stream_tag,
3585 				      unsigned int format,
3586 				      struct snd_pcm_substream *substream)
3587 {
3588 	struct alc_spec *spec = codec->spec;
3589 
3590 	snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3591 				   stream_tag, 0, format);
3592 	return 0;
3593 }
3594 
3595 static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3596 				      struct hda_codec *codec,
3597 				      struct snd_pcm_substream *substream)
3598 {
3599 	struct alc_spec *spec = codec->spec;
3600 
3601 	snd_hda_codec_cleanup_stream(codec,
3602 				     spec->adc_nids[substream->number + 1]);
3603 	return 0;
3604 }
3605 
3606 
3607 /*
3608  */
3609 static struct hda_pcm_stream alc880_pcm_analog_playback = {
3610 	.substreams = 1,
3611 	.channels_min = 2,
3612 	.channels_max = 8,
3613 	/* NID is set in alc_build_pcms */
3614 	.ops = {
3615 		.open = alc880_playback_pcm_open,
3616 		.prepare = alc880_playback_pcm_prepare,
3617 		.cleanup = alc880_playback_pcm_cleanup
3618 	},
3619 };
3620 
3621 static struct hda_pcm_stream alc880_pcm_analog_capture = {
3622 	.substreams = 1,
3623 	.channels_min = 2,
3624 	.channels_max = 2,
3625 	/* NID is set in alc_build_pcms */
3626 };
3627 
3628 static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3629 	.substreams = 1,
3630 	.channels_min = 2,
3631 	.channels_max = 2,
3632 	/* NID is set in alc_build_pcms */
3633 };
3634 
3635 static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3636 	.substreams = 2, /* can be overridden */
3637 	.channels_min = 2,
3638 	.channels_max = 2,
3639 	/* NID is set in alc_build_pcms */
3640 	.ops = {
3641 		.prepare = alc880_alt_capture_pcm_prepare,
3642 		.cleanup = alc880_alt_capture_pcm_cleanup
3643 	},
3644 };
3645 
3646 static struct hda_pcm_stream alc880_pcm_digital_playback = {
3647 	.substreams = 1,
3648 	.channels_min = 2,
3649 	.channels_max = 2,
3650 	/* NID is set in alc_build_pcms */
3651 	.ops = {
3652 		.open = alc880_dig_playback_pcm_open,
3653 		.close = alc880_dig_playback_pcm_close,
3654 		.prepare = alc880_dig_playback_pcm_prepare,
3655 		.cleanup = alc880_dig_playback_pcm_cleanup
3656 	},
3657 };
3658 
3659 static struct hda_pcm_stream alc880_pcm_digital_capture = {
3660 	.substreams = 1,
3661 	.channels_min = 2,
3662 	.channels_max = 2,
3663 	/* NID is set in alc_build_pcms */
3664 };
3665 
3666 /* Used by alc_build_pcms to flag that a PCM has no playback stream */
3667 static struct hda_pcm_stream alc_pcm_null_stream = {
3668 	.substreams = 0,
3669 	.channels_min = 0,
3670 	.channels_max = 0,
3671 };
3672 
3673 static int alc_build_pcms(struct hda_codec *codec)
3674 {
3675 	struct alc_spec *spec = codec->spec;
3676 	struct hda_pcm *info = spec->pcm_rec;
3677 	int i;
3678 
3679 	codec->num_pcms = 1;
3680 	codec->pcm_info = info;
3681 
3682 	if (spec->no_analog)
3683 		goto skip_analog;
3684 
3685 	snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3686 		 "%s Analog", codec->chip_name);
3687 	info->name = spec->stream_name_analog;
3688 
3689 	if (spec->stream_analog_playback) {
3690 		if (snd_BUG_ON(!spec->multiout.dac_nids))
3691 			return -EINVAL;
3692 		info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3693 		info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3694 	}
3695 	if (spec->stream_analog_capture) {
3696 		if (snd_BUG_ON(!spec->adc_nids))
3697 			return -EINVAL;
3698 		info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3699 		info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3700 	}
3701 
3702 	if (spec->channel_mode) {
3703 		info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3704 		for (i = 0; i < spec->num_channel_mode; i++) {
3705 			if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3706 				info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3707 			}
3708 		}
3709 	}
3710 
3711  skip_analog:
3712 	/* SPDIF for stream index #1 */
3713 	if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3714 		snprintf(spec->stream_name_digital,
3715 			 sizeof(spec->stream_name_digital),
3716 			 "%s Digital", codec->chip_name);
3717 		codec->num_pcms = 2;
3718 	        codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3719 		info = spec->pcm_rec + 1;
3720 		info->name = spec->stream_name_digital;
3721 		if (spec->dig_out_type)
3722 			info->pcm_type = spec->dig_out_type;
3723 		else
3724 			info->pcm_type = HDA_PCM_TYPE_SPDIF;
3725 		if (spec->multiout.dig_out_nid &&
3726 		    spec->stream_digital_playback) {
3727 			info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3728 			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3729 		}
3730 		if (spec->dig_in_nid &&
3731 		    spec->stream_digital_capture) {
3732 			info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3733 			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3734 		}
3735 		/* FIXME: do we need this for all Realtek codec models? */
3736 		codec->spdif_status_reset = 1;
3737 	}
3738 
3739 	if (spec->no_analog)
3740 		return 0;
3741 
3742 	/* If the use of more than one ADC is requested for the current
3743 	 * model, configure a second analog capture-only PCM.
3744 	 */
3745 	/* Additional Analaog capture for index #2 */
3746 	if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3747 	    (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
3748 		codec->num_pcms = 3;
3749 		info = spec->pcm_rec + 2;
3750 		info->name = spec->stream_name_analog;
3751 		if (spec->alt_dac_nid) {
3752 			info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3753 				*spec->stream_analog_alt_playback;
3754 			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3755 				spec->alt_dac_nid;
3756 		} else {
3757 			info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3758 				alc_pcm_null_stream;
3759 			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3760 		}
3761 		if (spec->num_adc_nids > 1) {
3762 			info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3763 				*spec->stream_analog_alt_capture;
3764 			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3765 				spec->adc_nids[1];
3766 			info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3767 				spec->num_adc_nids - 1;
3768 		} else {
3769 			info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3770 				alc_pcm_null_stream;
3771 			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3772 		}
3773 	}
3774 
3775 	return 0;
3776 }
3777 
3778 static inline void alc_shutup(struct hda_codec *codec)
3779 {
3780 	snd_hda_shutup_pins(codec);
3781 }
3782 
3783 static void alc_free_kctls(struct hda_codec *codec)
3784 {
3785 	struct alc_spec *spec = codec->spec;
3786 
3787 	if (spec->kctls.list) {
3788 		struct snd_kcontrol_new *kctl = spec->kctls.list;
3789 		int i;
3790 		for (i = 0; i < spec->kctls.used; i++)
3791 			kfree(kctl[i].name);
3792 	}
3793 	snd_array_free(&spec->kctls);
3794 }
3795 
3796 static void alc_free(struct hda_codec *codec)
3797 {
3798 	struct alc_spec *spec = codec->spec;
3799 
3800 	if (!spec)
3801 		return;
3802 
3803 	alc_shutup(codec);
3804 	alc_free_kctls(codec);
3805 	kfree(spec);
3806 	snd_hda_detach_beep_device(codec);
3807 }
3808 
3809 #ifdef CONFIG_SND_HDA_POWER_SAVE
3810 static void alc_power_eapd(struct hda_codec *codec)
3811 {
3812 	/* We currently only handle front, HP */
3813 	switch (codec->vendor_id) {
3814 	case 0x10ec0260:
3815 		set_eapd(codec, 0x0f, 0);
3816 		set_eapd(codec, 0x10, 0);
3817 		break;
3818 	case 0x10ec0262:
3819 	case 0x10ec0267:
3820 	case 0x10ec0268:
3821 	case 0x10ec0269:
3822 	case 0x10ec0270:
3823 	case 0x10ec0272:
3824 	case 0x10ec0660:
3825 	case 0x10ec0662:
3826 	case 0x10ec0663:
3827 	case 0x10ec0862:
3828 	case 0x10ec0889:
3829 		set_eapd(codec, 0x14, 0);
3830 		set_eapd(codec, 0x15, 0);
3831 		break;
3832 	}
3833 }
3834 
3835 static int alc_suspend(struct hda_codec *codec, pm_message_t state)
3836 {
3837 	struct alc_spec *spec = codec->spec;
3838 	alc_shutup(codec);
3839 	if (spec && spec->power_hook)
3840 		spec->power_hook(codec);
3841 	return 0;
3842 }
3843 #endif
3844 
3845 #ifdef SND_HDA_NEEDS_RESUME
3846 static int alc_resume(struct hda_codec *codec)
3847 {
3848 	codec->patch_ops.init(codec);
3849 	snd_hda_codec_resume_amp(codec);
3850 	snd_hda_codec_resume_cache(codec);
3851 #ifdef CONFIG_SND_HDA_POWER_SAVE
3852 	if (codec->patch_ops.check_power_status)
3853 		codec->patch_ops.check_power_status(codec, 0x01);
3854 #endif
3855 	return 0;
3856 }
3857 #endif
3858 
3859 /*
3860  */
3861 static struct hda_codec_ops alc_patch_ops = {
3862 	.build_controls = alc_build_controls,
3863 	.build_pcms = alc_build_pcms,
3864 	.init = alc_init,
3865 	.free = alc_free,
3866 	.unsol_event = alc_unsol_event,
3867 #ifdef SND_HDA_NEEDS_RESUME
3868 	.resume = alc_resume,
3869 #endif
3870 #ifdef CONFIG_SND_HDA_POWER_SAVE
3871 	.suspend = alc_suspend,
3872 	.check_power_status = alc_check_power_status,
3873 #endif
3874 	.reboot_notify = alc_shutup,
3875 };
3876 
3877 /* replace the codec chip_name with the given string */
3878 static int alc_codec_rename(struct hda_codec *codec, const char *name)
3879 {
3880 	kfree(codec->chip_name);
3881 	codec->chip_name = kstrdup(name, GFP_KERNEL);
3882 	if (!codec->chip_name) {
3883 		alc_free(codec);
3884 		return -ENOMEM;
3885 	}
3886 	return 0;
3887 }
3888 
3889 /*
3890  * Test configuration for debugging
3891  *
3892  * Almost all inputs/outputs are enabled.  I/O pins can be configured via
3893  * enum controls.
3894  */
3895 #ifdef CONFIG_SND_DEBUG
3896 static hda_nid_t alc880_test_dac_nids[4] = {
3897 	0x02, 0x03, 0x04, 0x05
3898 };
3899 
3900 static struct hda_input_mux alc880_test_capture_source = {
3901 	.num_items = 7,
3902 	.items = {
3903 		{ "In-1", 0x0 },
3904 		{ "In-2", 0x1 },
3905 		{ "In-3", 0x2 },
3906 		{ "In-4", 0x3 },
3907 		{ "CD", 0x4 },
3908 		{ "Front", 0x5 },
3909 		{ "Surround", 0x6 },
3910 	},
3911 };
3912 
3913 static struct hda_channel_mode alc880_test_modes[4] = {
3914 	{ 2, NULL },
3915 	{ 4, NULL },
3916 	{ 6, NULL },
3917 	{ 8, NULL },
3918 };
3919 
3920 static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
3921 				 struct snd_ctl_elem_info *uinfo)
3922 {
3923 	static char *texts[] = {
3924 		"N/A", "Line Out", "HP Out",
3925 		"In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
3926 	};
3927 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3928 	uinfo->count = 1;
3929 	uinfo->value.enumerated.items = 8;
3930 	if (uinfo->value.enumerated.item >= 8)
3931 		uinfo->value.enumerated.item = 7;
3932 	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3933 	return 0;
3934 }
3935 
3936 static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
3937 				struct snd_ctl_elem_value *ucontrol)
3938 {
3939 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3940 	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3941 	unsigned int pin_ctl, item = 0;
3942 
3943 	pin_ctl = snd_hda_codec_read(codec, nid, 0,
3944 				     AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3945 	if (pin_ctl & AC_PINCTL_OUT_EN) {
3946 		if (pin_ctl & AC_PINCTL_HP_EN)
3947 			item = 2;
3948 		else
3949 			item = 1;
3950 	} else if (pin_ctl & AC_PINCTL_IN_EN) {
3951 		switch (pin_ctl & AC_PINCTL_VREFEN) {
3952 		case AC_PINCTL_VREF_HIZ: item = 3; break;
3953 		case AC_PINCTL_VREF_50:  item = 4; break;
3954 		case AC_PINCTL_VREF_GRD: item = 5; break;
3955 		case AC_PINCTL_VREF_80:  item = 6; break;
3956 		case AC_PINCTL_VREF_100: item = 7; break;
3957 		}
3958 	}
3959 	ucontrol->value.enumerated.item[0] = item;
3960 	return 0;
3961 }
3962 
3963 static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
3964 				struct snd_ctl_elem_value *ucontrol)
3965 {
3966 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3967 	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3968 	static unsigned int ctls[] = {
3969 		0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
3970 		AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
3971 		AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
3972 		AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
3973 		AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
3974 		AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
3975 	};
3976 	unsigned int old_ctl, new_ctl;
3977 
3978 	old_ctl = snd_hda_codec_read(codec, nid, 0,
3979 				     AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3980 	new_ctl = ctls[ucontrol->value.enumerated.item[0]];
3981 	if (old_ctl != new_ctl) {
3982 		int val;
3983 		snd_hda_codec_write_cache(codec, nid, 0,
3984 					  AC_VERB_SET_PIN_WIDGET_CONTROL,
3985 					  new_ctl);
3986 		val = ucontrol->value.enumerated.item[0] >= 3 ?
3987 			HDA_AMP_MUTE : 0;
3988 		snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3989 					 HDA_AMP_MUTE, val);
3990 		return 1;
3991 	}
3992 	return 0;
3993 }
3994 
3995 static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
3996 				 struct snd_ctl_elem_info *uinfo)
3997 {
3998 	static char *texts[] = {
3999 		"Front", "Surround", "CLFE", "Side"
4000 	};
4001 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4002 	uinfo->count = 1;
4003 	uinfo->value.enumerated.items = 4;
4004 	if (uinfo->value.enumerated.item >= 4)
4005 		uinfo->value.enumerated.item = 3;
4006 	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
4007 	return 0;
4008 }
4009 
4010 static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
4011 				struct snd_ctl_elem_value *ucontrol)
4012 {
4013 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4014 	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4015 	unsigned int sel;
4016 
4017 	sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
4018 	ucontrol->value.enumerated.item[0] = sel & 3;
4019 	return 0;
4020 }
4021 
4022 static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
4023 				struct snd_ctl_elem_value *ucontrol)
4024 {
4025 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4026 	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4027 	unsigned int sel;
4028 
4029 	sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
4030 	if (ucontrol->value.enumerated.item[0] != sel) {
4031 		sel = ucontrol->value.enumerated.item[0] & 3;
4032 		snd_hda_codec_write_cache(codec, nid, 0,
4033 					  AC_VERB_SET_CONNECT_SEL, sel);
4034 		return 1;
4035 	}
4036 	return 0;
4037 }
4038 
4039 #define PIN_CTL_TEST(xname,nid) {			\
4040 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	\
4041 			.name = xname,		       \
4042 			.subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4043 			.info = alc_test_pin_ctl_info, \
4044 			.get = alc_test_pin_ctl_get,   \
4045 			.put = alc_test_pin_ctl_put,   \
4046 			.private_value = nid	       \
4047 			}
4048 
4049 #define PIN_SRC_TEST(xname,nid) {			\
4050 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	\
4051 			.name = xname,		       \
4052 			.subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4053 			.info = alc_test_pin_src_info, \
4054 			.get = alc_test_pin_src_get,   \
4055 			.put = alc_test_pin_src_put,   \
4056 			.private_value = nid	       \
4057 			}
4058 
4059 static struct snd_kcontrol_new alc880_test_mixer[] = {
4060 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
4061 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
4062 	HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
4063 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
4064 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
4065 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
4066 	HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
4067 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
4068 	PIN_CTL_TEST("Front Pin Mode", 0x14),
4069 	PIN_CTL_TEST("Surround Pin Mode", 0x15),
4070 	PIN_CTL_TEST("CLFE Pin Mode", 0x16),
4071 	PIN_CTL_TEST("Side Pin Mode", 0x17),
4072 	PIN_CTL_TEST("In-1 Pin Mode", 0x18),
4073 	PIN_CTL_TEST("In-2 Pin Mode", 0x19),
4074 	PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
4075 	PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
4076 	PIN_SRC_TEST("In-1 Pin Source", 0x18),
4077 	PIN_SRC_TEST("In-2 Pin Source", 0x19),
4078 	PIN_SRC_TEST("In-3 Pin Source", 0x1a),
4079 	PIN_SRC_TEST("In-4 Pin Source", 0x1b),
4080 	HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
4081 	HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
4082 	HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
4083 	HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
4084 	HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
4085 	HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
4086 	HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
4087 	HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
4088 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
4089 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
4090 	{
4091 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4092 		.name = "Channel Mode",
4093 		.info = alc_ch_mode_info,
4094 		.get = alc_ch_mode_get,
4095 		.put = alc_ch_mode_put,
4096 	},
4097 	{ } /* end */
4098 };
4099 
4100 static struct hda_verb alc880_test_init_verbs[] = {
4101 	/* Unmute inputs of 0x0c - 0x0f */
4102 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4103 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4104 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4105 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4106 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4107 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4108 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4109 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4110 	/* Vol output for 0x0c-0x0f */
4111 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4112 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4113 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4114 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4115 	/* Set output pins 0x14-0x17 */
4116 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4117 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4118 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4119 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4120 	/* Unmute output pins 0x14-0x17 */
4121 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4122 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4123 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4124 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4125 	/* Set input pins 0x18-0x1c */
4126 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4127 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4128 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4129 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4130 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4131 	/* Mute input pins 0x18-0x1b */
4132 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4133 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4134 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4135 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4136 	/* ADC set up */
4137 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4138 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
4139 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4140 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
4141 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4142 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
4143 	/* Analog input/passthru */
4144 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4145 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4146 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4147 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4148 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4149 	{ }
4150 };
4151 #endif
4152 
4153 /*
4154  */
4155 
4156 static const char *alc880_models[ALC880_MODEL_LAST] = {
4157 	[ALC880_3ST]		= "3stack",
4158 	[ALC880_TCL_S700]	= "tcl",
4159 	[ALC880_3ST_DIG]	= "3stack-digout",
4160 	[ALC880_CLEVO]		= "clevo",
4161 	[ALC880_5ST]		= "5stack",
4162 	[ALC880_5ST_DIG]	= "5stack-digout",
4163 	[ALC880_W810]		= "w810",
4164 	[ALC880_Z71V]		= "z71v",
4165 	[ALC880_6ST]		= "6stack",
4166 	[ALC880_6ST_DIG]	= "6stack-digout",
4167 	[ALC880_ASUS]		= "asus",
4168 	[ALC880_ASUS_W1V]	= "asus-w1v",
4169 	[ALC880_ASUS_DIG]	= "asus-dig",
4170 	[ALC880_ASUS_DIG2]	= "asus-dig2",
4171 	[ALC880_UNIWILL_DIG]	= "uniwill",
4172 	[ALC880_UNIWILL_P53]	= "uniwill-p53",
4173 	[ALC880_FUJITSU]	= "fujitsu",
4174 	[ALC880_F1734]		= "F1734",
4175 	[ALC880_LG]		= "lg",
4176 	[ALC880_LG_LW]		= "lg-lw",
4177 	[ALC880_MEDION_RIM]	= "medion",
4178 #ifdef CONFIG_SND_DEBUG
4179 	[ALC880_TEST]		= "test",
4180 #endif
4181 	[ALC880_AUTO]		= "auto",
4182 };
4183 
4184 static struct snd_pci_quirk alc880_cfg_tbl[] = {
4185 	SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
4186 	SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
4187 	SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
4188 	SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
4189 	SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
4190 	SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
4191 	SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
4192 	SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
4193 	SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
4194 	SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
4195 	SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
4196 	SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
4197 	SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
4198 	SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
4199 	SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
4200 	SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
4201 	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
4202 	SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
4203 	/* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
4204 	SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
4205 	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
4206 	SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
4207 	SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
4208 	SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
4209 	SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
4210 	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
4211 	SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
4212 	SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
4213 	SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
4214 	SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
4215 	SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
4216 	SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
4217 	SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
4218 	SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
4219 	SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
4220 	SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
4221 	SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
4222 	SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
4223 	SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
4224 	SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
4225 	SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
4226 	SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
4227 	SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
4228 	SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
4229 	SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
4230 	SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
4231 	SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
4232 	SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
4233 	SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
4234 	SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_F1734),
4235 	SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
4236 	SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
4237 	SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
4238 	SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
4239 	SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
4240 	SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
4241 	SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
4242 	SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
4243 	SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
4244 	SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
4245 	SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
4246 	SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
4247 	SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
4248 	SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
4249 	SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
4250 	SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
4251 	SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
4252 	SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
4253 	/* default Intel */
4254 	SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
4255 	SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
4256 	SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
4257 	{}
4258 };
4259 
4260 /*
4261  * ALC880 codec presets
4262  */
4263 static struct alc_config_preset alc880_presets[] = {
4264 	[ALC880_3ST] = {
4265 		.mixers = { alc880_three_stack_mixer },
4266 		.init_verbs = { alc880_volume_init_verbs,
4267 				alc880_pin_3stack_init_verbs },
4268 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4269 		.dac_nids = alc880_dac_nids,
4270 		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4271 		.channel_mode = alc880_threestack_modes,
4272 		.need_dac_fix = 1,
4273 		.input_mux = &alc880_capture_source,
4274 	},
4275 	[ALC880_3ST_DIG] = {
4276 		.mixers = { alc880_three_stack_mixer },
4277 		.init_verbs = { alc880_volume_init_verbs,
4278 				alc880_pin_3stack_init_verbs },
4279 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4280 		.dac_nids = alc880_dac_nids,
4281 		.dig_out_nid = ALC880_DIGOUT_NID,
4282 		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4283 		.channel_mode = alc880_threestack_modes,
4284 		.need_dac_fix = 1,
4285 		.input_mux = &alc880_capture_source,
4286 	},
4287 	[ALC880_TCL_S700] = {
4288 		.mixers = { alc880_tcl_s700_mixer },
4289 		.init_verbs = { alc880_volume_init_verbs,
4290 				alc880_pin_tcl_S700_init_verbs,
4291 				alc880_gpio2_init_verbs },
4292 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4293 		.dac_nids = alc880_dac_nids,
4294 		.adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4295 		.num_adc_nids = 1, /* single ADC */
4296 		.hp_nid = 0x03,
4297 		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4298 		.channel_mode = alc880_2_jack_modes,
4299 		.input_mux = &alc880_capture_source,
4300 	},
4301 	[ALC880_5ST] = {
4302 		.mixers = { alc880_three_stack_mixer,
4303 			    alc880_five_stack_mixer},
4304 		.init_verbs = { alc880_volume_init_verbs,
4305 				alc880_pin_5stack_init_verbs },
4306 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4307 		.dac_nids = alc880_dac_nids,
4308 		.num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4309 		.channel_mode = alc880_fivestack_modes,
4310 		.input_mux = &alc880_capture_source,
4311 	},
4312 	[ALC880_5ST_DIG] = {
4313 		.mixers = { alc880_three_stack_mixer,
4314 			    alc880_five_stack_mixer },
4315 		.init_verbs = { alc880_volume_init_verbs,
4316 				alc880_pin_5stack_init_verbs },
4317 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4318 		.dac_nids = alc880_dac_nids,
4319 		.dig_out_nid = ALC880_DIGOUT_NID,
4320 		.num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4321 		.channel_mode = alc880_fivestack_modes,
4322 		.input_mux = &alc880_capture_source,
4323 	},
4324 	[ALC880_6ST] = {
4325 		.mixers = { alc880_six_stack_mixer },
4326 		.init_verbs = { alc880_volume_init_verbs,
4327 				alc880_pin_6stack_init_verbs },
4328 		.num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4329 		.dac_nids = alc880_6st_dac_nids,
4330 		.num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4331 		.channel_mode = alc880_sixstack_modes,
4332 		.input_mux = &alc880_6stack_capture_source,
4333 	},
4334 	[ALC880_6ST_DIG] = {
4335 		.mixers = { alc880_six_stack_mixer },
4336 		.init_verbs = { alc880_volume_init_verbs,
4337 				alc880_pin_6stack_init_verbs },
4338 		.num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4339 		.dac_nids = alc880_6st_dac_nids,
4340 		.dig_out_nid = ALC880_DIGOUT_NID,
4341 		.num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4342 		.channel_mode = alc880_sixstack_modes,
4343 		.input_mux = &alc880_6stack_capture_source,
4344 	},
4345 	[ALC880_W810] = {
4346 		.mixers = { alc880_w810_base_mixer },
4347 		.init_verbs = { alc880_volume_init_verbs,
4348 				alc880_pin_w810_init_verbs,
4349 				alc880_gpio2_init_verbs },
4350 		.num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4351 		.dac_nids = alc880_w810_dac_nids,
4352 		.dig_out_nid = ALC880_DIGOUT_NID,
4353 		.num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4354 		.channel_mode = alc880_w810_modes,
4355 		.input_mux = &alc880_capture_source,
4356 	},
4357 	[ALC880_Z71V] = {
4358 		.mixers = { alc880_z71v_mixer },
4359 		.init_verbs = { alc880_volume_init_verbs,
4360 				alc880_pin_z71v_init_verbs },
4361 		.num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4362 		.dac_nids = alc880_z71v_dac_nids,
4363 		.dig_out_nid = ALC880_DIGOUT_NID,
4364 		.hp_nid = 0x03,
4365 		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4366 		.channel_mode = alc880_2_jack_modes,
4367 		.input_mux = &alc880_capture_source,
4368 	},
4369 	[ALC880_F1734] = {
4370 		.mixers = { alc880_f1734_mixer },
4371 		.init_verbs = { alc880_volume_init_verbs,
4372 				alc880_pin_f1734_init_verbs },
4373 		.num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4374 		.dac_nids = alc880_f1734_dac_nids,
4375 		.hp_nid = 0x02,
4376 		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4377 		.channel_mode = alc880_2_jack_modes,
4378 		.input_mux = &alc880_f1734_capture_source,
4379 		.unsol_event = alc880_uniwill_p53_unsol_event,
4380 		.setup = alc880_uniwill_p53_setup,
4381 		.init_hook = alc_automute_amp,
4382 	},
4383 	[ALC880_ASUS] = {
4384 		.mixers = { alc880_asus_mixer },
4385 		.init_verbs = { alc880_volume_init_verbs,
4386 				alc880_pin_asus_init_verbs,
4387 				alc880_gpio1_init_verbs },
4388 		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4389 		.dac_nids = alc880_asus_dac_nids,
4390 		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4391 		.channel_mode = alc880_asus_modes,
4392 		.need_dac_fix = 1,
4393 		.input_mux = &alc880_capture_source,
4394 	},
4395 	[ALC880_ASUS_DIG] = {
4396 		.mixers = { alc880_asus_mixer },
4397 		.init_verbs = { alc880_volume_init_verbs,
4398 				alc880_pin_asus_init_verbs,
4399 				alc880_gpio1_init_verbs },
4400 		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4401 		.dac_nids = alc880_asus_dac_nids,
4402 		.dig_out_nid = ALC880_DIGOUT_NID,
4403 		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4404 		.channel_mode = alc880_asus_modes,
4405 		.need_dac_fix = 1,
4406 		.input_mux = &alc880_capture_source,
4407 	},
4408 	[ALC880_ASUS_DIG2] = {
4409 		.mixers = { alc880_asus_mixer },
4410 		.init_verbs = { alc880_volume_init_verbs,
4411 				alc880_pin_asus_init_verbs,
4412 				alc880_gpio2_init_verbs }, /* use GPIO2 */
4413 		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4414 		.dac_nids = alc880_asus_dac_nids,
4415 		.dig_out_nid = ALC880_DIGOUT_NID,
4416 		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4417 		.channel_mode = alc880_asus_modes,
4418 		.need_dac_fix = 1,
4419 		.input_mux = &alc880_capture_source,
4420 	},
4421 	[ALC880_ASUS_W1V] = {
4422 		.mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
4423 		.init_verbs = { alc880_volume_init_verbs,
4424 				alc880_pin_asus_init_verbs,
4425 				alc880_gpio1_init_verbs },
4426 		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4427 		.dac_nids = alc880_asus_dac_nids,
4428 		.dig_out_nid = ALC880_DIGOUT_NID,
4429 		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4430 		.channel_mode = alc880_asus_modes,
4431 		.need_dac_fix = 1,
4432 		.input_mux = &alc880_capture_source,
4433 	},
4434 	[ALC880_UNIWILL_DIG] = {
4435 		.mixers = { alc880_asus_mixer },
4436 		.init_verbs = { alc880_volume_init_verbs,
4437 				alc880_pin_asus_init_verbs },
4438 		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4439 		.dac_nids = alc880_asus_dac_nids,
4440 		.dig_out_nid = ALC880_DIGOUT_NID,
4441 		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4442 		.channel_mode = alc880_asus_modes,
4443 		.need_dac_fix = 1,
4444 		.input_mux = &alc880_capture_source,
4445 	},
4446 	[ALC880_UNIWILL] = {
4447 		.mixers = { alc880_uniwill_mixer },
4448 		.init_verbs = { alc880_volume_init_verbs,
4449 				alc880_uniwill_init_verbs },
4450 		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4451 		.dac_nids = alc880_asus_dac_nids,
4452 		.dig_out_nid = ALC880_DIGOUT_NID,
4453 		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4454 		.channel_mode = alc880_threestack_modes,
4455 		.need_dac_fix = 1,
4456 		.input_mux = &alc880_capture_source,
4457 		.unsol_event = alc880_uniwill_unsol_event,
4458 		.setup = alc880_uniwill_setup,
4459 		.init_hook = alc880_uniwill_init_hook,
4460 	},
4461 	[ALC880_UNIWILL_P53] = {
4462 		.mixers = { alc880_uniwill_p53_mixer },
4463 		.init_verbs = { alc880_volume_init_verbs,
4464 				alc880_uniwill_p53_init_verbs },
4465 		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4466 		.dac_nids = alc880_asus_dac_nids,
4467 		.num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4468 		.channel_mode = alc880_threestack_modes,
4469 		.input_mux = &alc880_capture_source,
4470 		.unsol_event = alc880_uniwill_p53_unsol_event,
4471 		.setup = alc880_uniwill_p53_setup,
4472 		.init_hook = alc_automute_amp,
4473 	},
4474 	[ALC880_FUJITSU] = {
4475 		.mixers = { alc880_fujitsu_mixer },
4476 		.init_verbs = { alc880_volume_init_verbs,
4477 				alc880_uniwill_p53_init_verbs,
4478 	       			alc880_beep_init_verbs },
4479 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4480 		.dac_nids = alc880_dac_nids,
4481 		.dig_out_nid = ALC880_DIGOUT_NID,
4482 		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4483 		.channel_mode = alc880_2_jack_modes,
4484 		.input_mux = &alc880_capture_source,
4485 		.unsol_event = alc880_uniwill_p53_unsol_event,
4486 		.setup = alc880_uniwill_p53_setup,
4487 		.init_hook = alc_automute_amp,
4488 	},
4489 	[ALC880_CLEVO] = {
4490 		.mixers = { alc880_three_stack_mixer },
4491 		.init_verbs = { alc880_volume_init_verbs,
4492 				alc880_pin_clevo_init_verbs },
4493 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4494 		.dac_nids = alc880_dac_nids,
4495 		.hp_nid = 0x03,
4496 		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4497 		.channel_mode = alc880_threestack_modes,
4498 		.need_dac_fix = 1,
4499 		.input_mux = &alc880_capture_source,
4500 	},
4501 	[ALC880_LG] = {
4502 		.mixers = { alc880_lg_mixer },
4503 		.init_verbs = { alc880_volume_init_verbs,
4504 				alc880_lg_init_verbs },
4505 		.num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4506 		.dac_nids = alc880_lg_dac_nids,
4507 		.dig_out_nid = ALC880_DIGOUT_NID,
4508 		.num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4509 		.channel_mode = alc880_lg_ch_modes,
4510 		.need_dac_fix = 1,
4511 		.input_mux = &alc880_lg_capture_source,
4512 		.unsol_event = alc_automute_amp_unsol_event,
4513 		.setup = alc880_lg_setup,
4514 		.init_hook = alc_automute_amp,
4515 #ifdef CONFIG_SND_HDA_POWER_SAVE
4516 		.loopbacks = alc880_lg_loopbacks,
4517 #endif
4518 	},
4519 	[ALC880_LG_LW] = {
4520 		.mixers = { alc880_lg_lw_mixer },
4521 		.init_verbs = { alc880_volume_init_verbs,
4522 				alc880_lg_lw_init_verbs },
4523 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4524 		.dac_nids = alc880_dac_nids,
4525 		.dig_out_nid = ALC880_DIGOUT_NID,
4526 		.num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4527 		.channel_mode = alc880_lg_lw_modes,
4528 		.input_mux = &alc880_lg_lw_capture_source,
4529 		.unsol_event = alc_automute_amp_unsol_event,
4530 		.setup = alc880_lg_lw_setup,
4531 		.init_hook = alc_automute_amp,
4532 	},
4533 	[ALC880_MEDION_RIM] = {
4534 		.mixers = { alc880_medion_rim_mixer },
4535 		.init_verbs = { alc880_volume_init_verbs,
4536 				alc880_medion_rim_init_verbs,
4537 				alc_gpio2_init_verbs },
4538 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4539 		.dac_nids = alc880_dac_nids,
4540 		.dig_out_nid = ALC880_DIGOUT_NID,
4541 		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4542 		.channel_mode = alc880_2_jack_modes,
4543 		.input_mux = &alc880_medion_rim_capture_source,
4544 		.unsol_event = alc880_medion_rim_unsol_event,
4545 		.setup = alc880_medion_rim_setup,
4546 		.init_hook = alc880_medion_rim_automute,
4547 	},
4548 #ifdef CONFIG_SND_DEBUG
4549 	[ALC880_TEST] = {
4550 		.mixers = { alc880_test_mixer },
4551 		.init_verbs = { alc880_test_init_verbs },
4552 		.num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4553 		.dac_nids = alc880_test_dac_nids,
4554 		.dig_out_nid = ALC880_DIGOUT_NID,
4555 		.num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4556 		.channel_mode = alc880_test_modes,
4557 		.input_mux = &alc880_test_capture_source,
4558 	},
4559 #endif
4560 };
4561 
4562 /*
4563  * Automatic parse of I/O pins from the BIOS configuration
4564  */
4565 
4566 enum {
4567 	ALC_CTL_WIDGET_VOL,
4568 	ALC_CTL_WIDGET_MUTE,
4569 	ALC_CTL_BIND_MUTE,
4570 };
4571 static struct snd_kcontrol_new alc880_control_templates[] = {
4572 	HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4573 	HDA_CODEC_MUTE(NULL, 0, 0, 0),
4574 	HDA_BIND_MUTE(NULL, 0, 0, 0),
4575 };
4576 
4577 /* add dynamic controls */
4578 static int add_control(struct alc_spec *spec, int type, const char *name,
4579 		       unsigned long val)
4580 {
4581 	struct snd_kcontrol_new *knew;
4582 
4583 	snd_array_init(&spec->kctls, sizeof(*knew), 32);
4584 	knew = snd_array_new(&spec->kctls);
4585 	if (!knew)
4586 		return -ENOMEM;
4587 	*knew = alc880_control_templates[type];
4588 	knew->name = kstrdup(name, GFP_KERNEL);
4589 	if (!knew->name)
4590 		return -ENOMEM;
4591 	if (get_amp_nid_(val))
4592 		knew->subdevice = HDA_SUBDEV_AMP_FLAG;
4593 	knew->private_value = val;
4594 	return 0;
4595 }
4596 
4597 static int add_control_with_pfx(struct alc_spec *spec, int type,
4598 				const char *pfx, const char *dir,
4599 				const char *sfx, unsigned long val)
4600 {
4601 	char name[32];
4602 	snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
4603 	return add_control(spec, type, name, val);
4604 }
4605 
4606 #define add_pb_vol_ctrl(spec, type, pfx, val) \
4607 	add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val)
4608 #define add_pb_sw_ctrl(spec, type, pfx, val) \
4609 	add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val)
4610 
4611 #define alc880_is_fixed_pin(nid)	((nid) >= 0x14 && (nid) <= 0x17)
4612 #define alc880_fixed_pin_idx(nid)	((nid) - 0x14)
4613 #define alc880_is_multi_pin(nid)	((nid) >= 0x18)
4614 #define alc880_multi_pin_idx(nid)	((nid) - 0x18)
4615 #define alc880_idx_to_dac(nid)		((nid) + 0x02)
4616 #define alc880_dac_to_idx(nid)		((nid) - 0x02)
4617 #define alc880_idx_to_mixer(nid)	((nid) + 0x0c)
4618 #define alc880_idx_to_selector(nid)	((nid) + 0x10)
4619 #define ALC880_PIN_CD_NID		0x1c
4620 
4621 /* fill in the dac_nids table from the parsed pin configuration */
4622 static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4623 				     const struct auto_pin_cfg *cfg)
4624 {
4625 	hda_nid_t nid;
4626 	int assigned[4];
4627 	int i, j;
4628 
4629 	memset(assigned, 0, sizeof(assigned));
4630 	spec->multiout.dac_nids = spec->private_dac_nids;
4631 
4632 	/* check the pins hardwired to audio widget */
4633 	for (i = 0; i < cfg->line_outs; i++) {
4634 		nid = cfg->line_out_pins[i];
4635 		if (alc880_is_fixed_pin(nid)) {
4636 			int idx = alc880_fixed_pin_idx(nid);
4637 			spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
4638 			assigned[idx] = 1;
4639 		}
4640 	}
4641 	/* left pins can be connect to any audio widget */
4642 	for (i = 0; i < cfg->line_outs; i++) {
4643 		nid = cfg->line_out_pins[i];
4644 		if (alc880_is_fixed_pin(nid))
4645 			continue;
4646 		/* search for an empty channel */
4647 		for (j = 0; j < cfg->line_outs; j++) {
4648 			if (!assigned[j]) {
4649 				spec->multiout.dac_nids[i] =
4650 					alc880_idx_to_dac(j);
4651 				assigned[j] = 1;
4652 				break;
4653 			}
4654 		}
4655 	}
4656 	spec->multiout.num_dacs = cfg->line_outs;
4657 	return 0;
4658 }
4659 
4660 /* add playback controls from the parsed DAC table */
4661 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4662 					     const struct auto_pin_cfg *cfg)
4663 {
4664 	static const char *chname[4] = {
4665 		"Front", "Surround", NULL /*CLFE*/, "Side"
4666 	};
4667 	hda_nid_t nid;
4668 	int i, err;
4669 
4670 	for (i = 0; i < cfg->line_outs; i++) {
4671 		if (!spec->multiout.dac_nids[i])
4672 			continue;
4673 		nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4674 		if (i == 2) {
4675 			/* Center/LFE */
4676 			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4677 					      "Center",
4678 					  HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4679 							      HDA_OUTPUT));
4680 			if (err < 0)
4681 				return err;
4682 			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4683 					      "LFE",
4684 					  HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4685 							      HDA_OUTPUT));
4686 			if (err < 0)
4687 				return err;
4688 			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4689 					     "Center",
4690 					  HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4691 							      HDA_INPUT));
4692 			if (err < 0)
4693 				return err;
4694 			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4695 					     "LFE",
4696 					  HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4697 							      HDA_INPUT));
4698 			if (err < 0)
4699 				return err;
4700 		} else {
4701 			const char *pfx;
4702 			if (cfg->line_outs == 1 &&
4703 			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4704 				pfx = "Speaker";
4705 			else
4706 				pfx = chname[i];
4707 			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4708 					  HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4709 							      HDA_OUTPUT));
4710 			if (err < 0)
4711 				return err;
4712 			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4713 					  HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4714 							      HDA_INPUT));
4715 			if (err < 0)
4716 				return err;
4717 		}
4718 	}
4719 	return 0;
4720 }
4721 
4722 /* add playback controls for speaker and HP outputs */
4723 static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4724 					const char *pfx)
4725 {
4726 	hda_nid_t nid;
4727 	int err;
4728 
4729 	if (!pin)
4730 		return 0;
4731 
4732 	if (alc880_is_fixed_pin(pin)) {
4733 		nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
4734 		/* specify the DAC as the extra output */
4735 		if (!spec->multiout.hp_nid)
4736 			spec->multiout.hp_nid = nid;
4737 		else
4738 			spec->multiout.extra_out_nid[0] = nid;
4739 		/* control HP volume/switch on the output mixer amp */
4740 		nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
4741 		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4742 				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4743 		if (err < 0)
4744 			return err;
4745 		err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4746 				  HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4747 		if (err < 0)
4748 			return err;
4749 	} else if (alc880_is_multi_pin(pin)) {
4750 		/* set manual connection */
4751 		/* we have only a switch on HP-out PIN */
4752 		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
4753 				  HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4754 		if (err < 0)
4755 			return err;
4756 	}
4757 	return 0;
4758 }
4759 
4760 /* create input playback/capture controls for the given pin */
4761 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4762 			    const char *ctlname,
4763 			    int idx, hda_nid_t mix_nid)
4764 {
4765 	int err;
4766 
4767 	err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
4768 			  HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4769 	if (err < 0)
4770 		return err;
4771 	err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
4772 			  HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4773 	if (err < 0)
4774 		return err;
4775 	return 0;
4776 }
4777 
4778 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4779 {
4780 	unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4781 	return (pincap & AC_PINCAP_IN) != 0;
4782 }
4783 
4784 /* create playback/capture controls for input pins */
4785 static int alc_auto_create_input_ctls(struct hda_codec *codec,
4786 				      const struct auto_pin_cfg *cfg,
4787 				      hda_nid_t mixer,
4788 				      hda_nid_t cap1, hda_nid_t cap2)
4789 {
4790 	struct alc_spec *spec = codec->spec;
4791 	struct hda_input_mux *imux = &spec->private_imux[0];
4792 	int i, err, idx;
4793 
4794 	for (i = 0; i < AUTO_PIN_LAST; i++) {
4795 		hda_nid_t pin;
4796 
4797 		pin = cfg->input_pins[i];
4798 		if (!alc_is_input_pin(codec, pin))
4799 			continue;
4800 
4801 		if (mixer) {
4802 			idx = get_connection_index(codec, mixer, pin);
4803 			if (idx >= 0) {
4804 				err = new_analog_input(spec, pin,
4805 						       auto_pin_cfg_labels[i],
4806 						       idx, mixer);
4807 				if (err < 0)
4808 					return err;
4809 			}
4810 		}
4811 
4812 		if (!cap1)
4813 			continue;
4814 		idx = get_connection_index(codec, cap1, pin);
4815 		if (idx < 0 && cap2)
4816 			idx = get_connection_index(codec, cap2, pin);
4817 		if (idx >= 0) {
4818 			imux->items[imux->num_items].label =
4819 				auto_pin_cfg_labels[i];
4820 			imux->items[imux->num_items].index = idx;
4821 			imux->num_items++;
4822 		}
4823 	}
4824 	return 0;
4825 }
4826 
4827 static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4828 						const struct auto_pin_cfg *cfg)
4829 {
4830 	return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4831 }
4832 
4833 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4834 			       unsigned int pin_type)
4835 {
4836 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4837 			    pin_type);
4838 	/* unmute pin */
4839 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4840 			    AMP_OUT_UNMUTE);
4841 }
4842 
4843 static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4844 					      hda_nid_t nid, int pin_type,
4845 					      int dac_idx)
4846 {
4847 	alc_set_pin_output(codec, nid, pin_type);
4848 	/* need the manual connection? */
4849 	if (alc880_is_multi_pin(nid)) {
4850 		struct alc_spec *spec = codec->spec;
4851 		int idx = alc880_multi_pin_idx(nid);
4852 		snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4853 				    AC_VERB_SET_CONNECT_SEL,
4854 				    alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
4855 	}
4856 }
4857 
4858 static int get_pin_type(int line_out_type)
4859 {
4860 	if (line_out_type == AUTO_PIN_HP_OUT)
4861 		return PIN_HP;
4862 	else
4863 		return PIN_OUT;
4864 }
4865 
4866 static void alc880_auto_init_multi_out(struct hda_codec *codec)
4867 {
4868 	struct alc_spec *spec = codec->spec;
4869 	int i;
4870 
4871 	for (i = 0; i < spec->autocfg.line_outs; i++) {
4872 		hda_nid_t nid = spec->autocfg.line_out_pins[i];
4873 		int pin_type = get_pin_type(spec->autocfg.line_out_type);
4874 		alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
4875 	}
4876 }
4877 
4878 static void alc880_auto_init_extra_out(struct hda_codec *codec)
4879 {
4880 	struct alc_spec *spec = codec->spec;
4881 	hda_nid_t pin;
4882 
4883 	pin = spec->autocfg.speaker_pins[0];
4884 	if (pin) /* connect to front */
4885 		alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
4886 	pin = spec->autocfg.hp_pins[0];
4887 	if (pin) /* connect to front */
4888 		alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
4889 }
4890 
4891 static void alc880_auto_init_analog_input(struct hda_codec *codec)
4892 {
4893 	struct alc_spec *spec = codec->spec;
4894 	int i;
4895 
4896 	for (i = 0; i < AUTO_PIN_LAST; i++) {
4897 		hda_nid_t nid = spec->autocfg.input_pins[i];
4898 		if (alc_is_input_pin(codec, nid)) {
4899 			alc_set_input_pin(codec, nid, i);
4900 			if (nid != ALC880_PIN_CD_NID &&
4901 			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
4902 				snd_hda_codec_write(codec, nid, 0,
4903 						    AC_VERB_SET_AMP_GAIN_MUTE,
4904 						    AMP_OUT_MUTE);
4905 		}
4906 	}
4907 }
4908 
4909 static void alc880_auto_init_input_src(struct hda_codec *codec)
4910 {
4911 	struct alc_spec *spec = codec->spec;
4912 	int c;
4913 
4914 	for (c = 0; c < spec->num_adc_nids; c++) {
4915 		unsigned int mux_idx;
4916 		const struct hda_input_mux *imux;
4917 		mux_idx = c >= spec->num_mux_defs ? 0 : c;
4918 		imux = &spec->input_mux[mux_idx];
4919 		if (!imux->num_items && mux_idx > 0)
4920 			imux = &spec->input_mux[0];
4921 		if (imux)
4922 			snd_hda_codec_write(codec, spec->adc_nids[c], 0,
4923 					    AC_VERB_SET_CONNECT_SEL,
4924 					    imux->items[0].index);
4925 	}
4926 }
4927 
4928 /* parse the BIOS configuration and set up the alc_spec */
4929 /* return 1 if successful, 0 if the proper config is not found,
4930  * or a negative error code
4931  */
4932 static int alc880_parse_auto_config(struct hda_codec *codec)
4933 {
4934 	struct alc_spec *spec = codec->spec;
4935 	int i, err;
4936 	static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
4937 
4938 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4939 					   alc880_ignore);
4940 	if (err < 0)
4941 		return err;
4942 	if (!spec->autocfg.line_outs)
4943 		return 0; /* can't find valid BIOS pin config */
4944 
4945 	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
4946 	if (err < 0)
4947 		return err;
4948 	err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
4949 	if (err < 0)
4950 		return err;
4951 	err = alc880_auto_create_extra_out(spec,
4952 					   spec->autocfg.speaker_pins[0],
4953 					   "Speaker");
4954 	if (err < 0)
4955 		return err;
4956 	err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
4957 					   "Headphone");
4958 	if (err < 0)
4959 		return err;
4960 	err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
4961 	if (err < 0)
4962 		return err;
4963 
4964 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4965 
4966 	/* check multiple SPDIF-out (for recent codecs) */
4967 	for (i = 0; i < spec->autocfg.dig_outs; i++) {
4968 		hda_nid_t dig_nid;
4969 		err = snd_hda_get_connections(codec,
4970 					      spec->autocfg.dig_out_pins[i],
4971 					      &dig_nid, 1);
4972 		if (err < 0)
4973 			continue;
4974 		if (!i)
4975 			spec->multiout.dig_out_nid = dig_nid;
4976 		else {
4977 			spec->multiout.slave_dig_outs = spec->slave_dig_outs;
4978 			if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
4979 				break;
4980 			spec->slave_dig_outs[i - 1] = dig_nid;
4981 		}
4982 	}
4983 	if (spec->autocfg.dig_in_pin)
4984 		spec->dig_in_nid = ALC880_DIGIN_NID;
4985 
4986 	if (spec->kctls.list)
4987 		add_mixer(spec, spec->kctls.list);
4988 
4989 	add_verb(spec, alc880_volume_init_verbs);
4990 
4991 	spec->num_mux_defs = 1;
4992 	spec->input_mux = &spec->private_imux[0];
4993 
4994 	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4995 
4996 	return 1;
4997 }
4998 
4999 /* additional initialization for auto-configuration model */
5000 static void alc880_auto_init(struct hda_codec *codec)
5001 {
5002 	struct alc_spec *spec = codec->spec;
5003 	alc880_auto_init_multi_out(codec);
5004 	alc880_auto_init_extra_out(codec);
5005 	alc880_auto_init_analog_input(codec);
5006 	alc880_auto_init_input_src(codec);
5007 	if (spec->unsol_event)
5008 		alc_inithook(codec);
5009 }
5010 
5011 /* check the ADC/MUX contains all input pins; some ADC/MUX contains only
5012  * one of two digital mic pins, e.g. on ALC272
5013  */
5014 static void fixup_automic_adc(struct hda_codec *codec)
5015 {
5016 	struct alc_spec *spec = codec->spec;
5017 	int i;
5018 
5019 	for (i = 0; i < spec->num_adc_nids; i++) {
5020 		hda_nid_t cap = spec->capsrc_nids ?
5021 			spec->capsrc_nids[i] : spec->adc_nids[i];
5022 		int iidx, eidx;
5023 
5024 		iidx = get_connection_index(codec, cap, spec->int_mic.pin);
5025 		if (iidx < 0)
5026 			continue;
5027 		eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
5028 		if (eidx < 0)
5029 			continue;
5030 		spec->int_mic.mux_idx = iidx;
5031 		spec->ext_mic.mux_idx = eidx;
5032 		if (spec->capsrc_nids)
5033 			spec->capsrc_nids += i;
5034 		spec->adc_nids += i;
5035 		spec->num_adc_nids = 1;
5036 		return;
5037 	}
5038 	snd_printd(KERN_INFO "hda_codec: %s: "
5039 		   "No ADC/MUX containing both 0x%x and 0x%x pins\n",
5040 		   codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
5041 	spec->auto_mic = 0; /* disable auto-mic to be sure */
5042 }
5043 
5044 /* choose the ADC/MUX containing the input pin and initialize the setup */
5045 static void fixup_single_adc(struct hda_codec *codec)
5046 {
5047 	struct alc_spec *spec = codec->spec;
5048 	hda_nid_t pin = 0;
5049 	int i;
5050 
5051 	/* search for the input pin; there must be only one */
5052 	for (i = 0; i < AUTO_PIN_LAST; i++) {
5053 		if (spec->autocfg.input_pins[i]) {
5054 			pin = spec->autocfg.input_pins[i];
5055 			break;
5056 		}
5057 	}
5058 	if (!pin)
5059 		return;
5060 
5061 	/* set the default connection to that pin */
5062 	for (i = 0; i < spec->num_adc_nids; i++) {
5063 		hda_nid_t cap = spec->capsrc_nids ?
5064 			spec->capsrc_nids[i] : spec->adc_nids[i];
5065 		int idx;
5066 
5067 		idx = get_connection_index(codec, cap, pin);
5068 		if (idx < 0)
5069 			continue;
5070 		/* use only this ADC */
5071 		if (spec->capsrc_nids)
5072 			spec->capsrc_nids += i;
5073 		spec->adc_nids += i;
5074 		spec->num_adc_nids = 1;
5075 		/* select or unmute this route */
5076 		if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
5077 			snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
5078 						 HDA_AMP_MUTE, 0);
5079 		} else {
5080 			snd_hda_codec_write_cache(codec, cap, 0,
5081 					  AC_VERB_SET_CONNECT_SEL, idx);
5082 		}
5083 		return;
5084 	}
5085 }
5086 
5087 static void set_capture_mixer(struct hda_codec *codec)
5088 {
5089 	struct alc_spec *spec = codec->spec;
5090 	static struct snd_kcontrol_new *caps[2][3] = {
5091 		{ alc_capture_mixer_nosrc1,
5092 		  alc_capture_mixer_nosrc2,
5093 		  alc_capture_mixer_nosrc3 },
5094 		{ alc_capture_mixer1,
5095 		  alc_capture_mixer2,
5096 		  alc_capture_mixer3 },
5097 	};
5098 	if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
5099 		int mux = 0;
5100 		if (spec->auto_mic)
5101 			fixup_automic_adc(codec);
5102 		else if (spec->input_mux) {
5103 			if (spec->input_mux->num_items > 1)
5104 				mux = 1;
5105 			else if (spec->input_mux->num_items == 1)
5106 				fixup_single_adc(codec);
5107 		}
5108 		spec->cap_mixer = caps[mux][spec->num_adc_nids - 1];
5109 	}
5110 }
5111 
5112 /* fill adc_nids (and capsrc_nids) containing all active input pins */
5113 static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids,
5114 				 int num_nids)
5115 {
5116 	struct alc_spec *spec = codec->spec;
5117 	int n;
5118 	hda_nid_t fallback_adc = 0, fallback_cap = 0;
5119 
5120 	for (n = 0; n < num_nids; n++) {
5121 		hda_nid_t adc, cap;
5122 		hda_nid_t conn[HDA_MAX_NUM_INPUTS];
5123 		int nconns, i, j;
5124 
5125 		adc = nids[n];
5126 		if (get_wcaps_type(get_wcaps(codec, adc)) != AC_WID_AUD_IN)
5127 			continue;
5128 		cap = adc;
5129 		nconns = snd_hda_get_connections(codec, cap, conn,
5130 						 ARRAY_SIZE(conn));
5131 		if (nconns == 1) {
5132 			cap = conn[0];
5133 			nconns = snd_hda_get_connections(codec, cap, conn,
5134 							 ARRAY_SIZE(conn));
5135 		}
5136 		if (nconns <= 0)
5137 			continue;
5138 		if (!fallback_adc) {
5139 			fallback_adc = adc;
5140 			fallback_cap = cap;
5141 		}
5142 		for (i = 0; i < AUTO_PIN_LAST; i++) {
5143 			hda_nid_t nid = spec->autocfg.input_pins[i];
5144 			if (!nid)
5145 				continue;
5146 			for (j = 0; j < nconns; j++) {
5147 				if (conn[j] == nid)
5148 					break;
5149 			}
5150 			if (j >= nconns)
5151 				break;
5152 		}
5153 		if (i >= AUTO_PIN_LAST) {
5154 			int num_adcs = spec->num_adc_nids;
5155 			spec->private_adc_nids[num_adcs] = adc;
5156 			spec->private_capsrc_nids[num_adcs] = cap;
5157 			spec->num_adc_nids++;
5158 			spec->adc_nids = spec->private_adc_nids;
5159 			if (adc != cap)
5160 				spec->capsrc_nids = spec->private_capsrc_nids;
5161 		}
5162 	}
5163 	if (!spec->num_adc_nids) {
5164 		printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
5165 		       " using fallback 0x%x\n",
5166 		       codec->chip_name, fallback_adc);
5167 		spec->private_adc_nids[0] = fallback_adc;
5168 		spec->adc_nids = spec->private_adc_nids;
5169 		if (fallback_adc != fallback_cap) {
5170 			spec->private_capsrc_nids[0] = fallback_cap;
5171 			spec->capsrc_nids = spec->private_adc_nids;
5172 		}
5173 	}
5174 }
5175 
5176 #ifdef CONFIG_SND_HDA_INPUT_BEEP
5177 #define set_beep_amp(spec, nid, idx, dir) \
5178 	((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
5179 #else
5180 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
5181 #endif
5182 
5183 /*
5184  * OK, here we have finally the patch for ALC880
5185  */
5186 
5187 static int patch_alc880(struct hda_codec *codec)
5188 {
5189 	struct alc_spec *spec;
5190 	int board_config;
5191 	int err;
5192 
5193 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5194 	if (spec == NULL)
5195 		return -ENOMEM;
5196 
5197 	codec->spec = spec;
5198 
5199 	board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
5200 						  alc880_models,
5201 						  alc880_cfg_tbl);
5202 	if (board_config < 0) {
5203 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5204 		       codec->chip_name);
5205 		board_config = ALC880_AUTO;
5206 	}
5207 
5208 	if (board_config == ALC880_AUTO) {
5209 		/* automatic parse from the BIOS config */
5210 		err = alc880_parse_auto_config(codec);
5211 		if (err < 0) {
5212 			alc_free(codec);
5213 			return err;
5214 		} else if (!err) {
5215 			printk(KERN_INFO
5216 			       "hda_codec: Cannot set up configuration "
5217 			       "from BIOS.  Using 3-stack mode...\n");
5218 			board_config = ALC880_3ST;
5219 		}
5220 	}
5221 
5222 	err = snd_hda_attach_beep_device(codec, 0x1);
5223 	if (err < 0) {
5224 		alc_free(codec);
5225 		return err;
5226 	}
5227 
5228 	if (board_config != ALC880_AUTO)
5229 		setup_preset(codec, &alc880_presets[board_config]);
5230 
5231 	spec->stream_analog_playback = &alc880_pcm_analog_playback;
5232 	spec->stream_analog_capture = &alc880_pcm_analog_capture;
5233 	spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
5234 
5235 	spec->stream_digital_playback = &alc880_pcm_digital_playback;
5236 	spec->stream_digital_capture = &alc880_pcm_digital_capture;
5237 
5238 	if (!spec->adc_nids && spec->input_mux) {
5239 		/* check whether NID 0x07 is valid */
5240 		unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
5241 		/* get type */
5242 		wcap = get_wcaps_type(wcap);
5243 		if (wcap != AC_WID_AUD_IN) {
5244 			spec->adc_nids = alc880_adc_nids_alt;
5245 			spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
5246 		} else {
5247 			spec->adc_nids = alc880_adc_nids;
5248 			spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
5249 		}
5250 	}
5251 	set_capture_mixer(codec);
5252 	set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
5253 
5254 	spec->vmaster_nid = 0x0c;
5255 
5256 	codec->patch_ops = alc_patch_ops;
5257 	if (board_config == ALC880_AUTO)
5258 		spec->init_hook = alc880_auto_init;
5259 #ifdef CONFIG_SND_HDA_POWER_SAVE
5260 	if (!spec->loopback.amplist)
5261 		spec->loopback.amplist = alc880_loopbacks;
5262 #endif
5263 
5264 	return 0;
5265 }
5266 
5267 
5268 /*
5269  * ALC260 support
5270  */
5271 
5272 static hda_nid_t alc260_dac_nids[1] = {
5273 	/* front */
5274 	0x02,
5275 };
5276 
5277 static hda_nid_t alc260_adc_nids[1] = {
5278 	/* ADC0 */
5279 	0x04,
5280 };
5281 
5282 static hda_nid_t alc260_adc_nids_alt[1] = {
5283 	/* ADC1 */
5284 	0x05,
5285 };
5286 
5287 /* NIDs used when simultaneous access to both ADCs makes sense.  Note that
5288  * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
5289  */
5290 static hda_nid_t alc260_dual_adc_nids[2] = {
5291 	/* ADC0, ADC1 */
5292 	0x04, 0x05
5293 };
5294 
5295 #define ALC260_DIGOUT_NID	0x03
5296 #define ALC260_DIGIN_NID	0x06
5297 
5298 static struct hda_input_mux alc260_capture_source = {
5299 	.num_items = 4,
5300 	.items = {
5301 		{ "Mic", 0x0 },
5302 		{ "Front Mic", 0x1 },
5303 		{ "Line", 0x2 },
5304 		{ "CD", 0x4 },
5305 	},
5306 };
5307 
5308 /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
5309  * headphone jack and the internal CD lines since these are the only pins at
5310  * which audio can appear.  For flexibility, also allow the option of
5311  * recording the mixer output on the second ADC (ADC0 doesn't have a
5312  * connection to the mixer output).
5313  */
5314 static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5315 	{
5316 		.num_items = 3,
5317 		.items = {
5318 			{ "Mic/Line", 0x0 },
5319 			{ "CD", 0x4 },
5320 			{ "Headphone", 0x2 },
5321 		},
5322 	},
5323 	{
5324 		.num_items = 4,
5325 		.items = {
5326 			{ "Mic/Line", 0x0 },
5327 			{ "CD", 0x4 },
5328 			{ "Headphone", 0x2 },
5329 			{ "Mixer", 0x5 },
5330 		},
5331 	},
5332 
5333 };
5334 
5335 /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5336  * the Fujitsu S702x, but jacks are marked differently.
5337  */
5338 static struct hda_input_mux alc260_acer_capture_sources[2] = {
5339 	{
5340 		.num_items = 4,
5341 		.items = {
5342 			{ "Mic", 0x0 },
5343 			{ "Line", 0x2 },
5344 			{ "CD", 0x4 },
5345 			{ "Headphone", 0x5 },
5346 		},
5347 	},
5348 	{
5349 		.num_items = 5,
5350 		.items = {
5351 			{ "Mic", 0x0 },
5352 			{ "Line", 0x2 },
5353 			{ "CD", 0x4 },
5354 			{ "Headphone", 0x6 },
5355 			{ "Mixer", 0x5 },
5356 		},
5357 	},
5358 };
5359 
5360 /* Maxdata Favorit 100XS */
5361 static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5362 	{
5363 		.num_items = 2,
5364 		.items = {
5365 			{ "Line/Mic", 0x0 },
5366 			{ "CD", 0x4 },
5367 		},
5368 	},
5369 	{
5370 		.num_items = 3,
5371 		.items = {
5372 			{ "Line/Mic", 0x0 },
5373 			{ "CD", 0x4 },
5374 			{ "Mixer", 0x5 },
5375 		},
5376 	},
5377 };
5378 
5379 /*
5380  * This is just place-holder, so there's something for alc_build_pcms to look
5381  * at when it calculates the maximum number of channels. ALC260 has no mixer
5382  * element which allows changing the channel mode, so the verb list is
5383  * never used.
5384  */
5385 static struct hda_channel_mode alc260_modes[1] = {
5386 	{ 2, NULL },
5387 };
5388 
5389 
5390 /* Mixer combinations
5391  *
5392  * basic: base_output + input + pc_beep + capture
5393  * HP: base_output + input + capture_alt
5394  * HP_3013: hp_3013 + input + capture
5395  * fujitsu: fujitsu + capture
5396  * acer: acer + capture
5397  */
5398 
5399 static struct snd_kcontrol_new alc260_base_output_mixer[] = {
5400 	HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5401 	HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5402 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5403 	HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5404 	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5405 	HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5406 	{ } /* end */
5407 };
5408 
5409 static struct snd_kcontrol_new alc260_input_mixer[] = {
5410 	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5411 	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5412 	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5413 	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5414 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5415 	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5416 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5417 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
5418 	{ } /* end */
5419 };
5420 
5421 /* update HP, line and mono out pins according to the master switch */
5422 static void alc260_hp_master_update(struct hda_codec *codec,
5423 				    hda_nid_t hp, hda_nid_t line,
5424 				    hda_nid_t mono)
5425 {
5426 	struct alc_spec *spec = codec->spec;
5427 	unsigned int val = spec->master_sw ? PIN_HP : 0;
5428 	/* change HP and line-out pins */
5429 	snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5430 			    val);
5431 	snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5432 			    val);
5433 	/* mono (speaker) depending on the HP jack sense */
5434 	val = (val && !spec->jack_present) ? PIN_OUT : 0;
5435 	snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5436 			    val);
5437 }
5438 
5439 static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5440 				   struct snd_ctl_elem_value *ucontrol)
5441 {
5442 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5443 	struct alc_spec *spec = codec->spec;
5444 	*ucontrol->value.integer.value = spec->master_sw;
5445 	return 0;
5446 }
5447 
5448 static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5449 				   struct snd_ctl_elem_value *ucontrol)
5450 {
5451 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5452 	struct alc_spec *spec = codec->spec;
5453 	int val = !!*ucontrol->value.integer.value;
5454 	hda_nid_t hp, line, mono;
5455 
5456 	if (val == spec->master_sw)
5457 		return 0;
5458 	spec->master_sw = val;
5459 	hp = (kcontrol->private_value >> 16) & 0xff;
5460 	line = (kcontrol->private_value >> 8) & 0xff;
5461 	mono = kcontrol->private_value & 0xff;
5462 	alc260_hp_master_update(codec, hp, line, mono);
5463 	return 1;
5464 }
5465 
5466 static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5467 	{
5468 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5469 		.name = "Master Playback Switch",
5470 		.subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5471 		.info = snd_ctl_boolean_mono_info,
5472 		.get = alc260_hp_master_sw_get,
5473 		.put = alc260_hp_master_sw_put,
5474 		.private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5475 	},
5476 	HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5477 	HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5478 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5479 	HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5480 	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5481 			      HDA_OUTPUT),
5482 	HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5483 	{ } /* end */
5484 };
5485 
5486 static struct hda_verb alc260_hp_unsol_verbs[] = {
5487 	{0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5488 	{},
5489 };
5490 
5491 static void alc260_hp_automute(struct hda_codec *codec)
5492 {
5493 	struct alc_spec *spec = codec->spec;
5494 
5495 	spec->jack_present = snd_hda_jack_detect(codec, 0x10);
5496 	alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5497 }
5498 
5499 static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5500 {
5501 	if ((res >> 26) == ALC880_HP_EVENT)
5502 		alc260_hp_automute(codec);
5503 }
5504 
5505 static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5506 	{
5507 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5508 		.name = "Master Playback Switch",
5509 		.subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5510 		.info = snd_ctl_boolean_mono_info,
5511 		.get = alc260_hp_master_sw_get,
5512 		.put = alc260_hp_master_sw_put,
5513 		.private_value = (0x15 << 16) | (0x10 << 8) | 0x11
5514 	},
5515 	HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5516 	HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5517 	HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5518 	HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5519 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5520 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
5521 	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5522 	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
5523 	{ } /* end */
5524 };
5525 
5526 static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5527 	.ops = &snd_hda_bind_vol,
5528 	.values = {
5529 		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5530 		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5531 		HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5532 		0
5533 	},
5534 };
5535 
5536 static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5537 	.ops = &snd_hda_bind_sw,
5538 	.values = {
5539 		HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5540 		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5541 		0
5542 	},
5543 };
5544 
5545 static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5546 	HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5547 	HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5548 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5549 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5550 	{ } /* end */
5551 };
5552 
5553 static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5554 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5555 	{},
5556 };
5557 
5558 static void alc260_hp_3013_automute(struct hda_codec *codec)
5559 {
5560 	struct alc_spec *spec = codec->spec;
5561 
5562 	spec->jack_present = snd_hda_jack_detect(codec, 0x15);
5563 	alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
5564 }
5565 
5566 static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5567 				       unsigned int res)
5568 {
5569 	if ((res >> 26) == ALC880_HP_EVENT)
5570 		alc260_hp_3013_automute(codec);
5571 }
5572 
5573 static void alc260_hp_3012_automute(struct hda_codec *codec)
5574 {
5575 	unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
5576 
5577 	snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5578 			    bits);
5579 	snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5580 			    bits);
5581 	snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5582 			    bits);
5583 }
5584 
5585 static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5586 				       unsigned int res)
5587 {
5588 	if ((res >> 26) == ALC880_HP_EVENT)
5589 		alc260_hp_3012_automute(codec);
5590 }
5591 
5592 /* Fujitsu S702x series laptops.  ALC260 pin usage: Mic/Line jack = 0x12,
5593  * HP jack = 0x14, CD audio =  0x16, internal speaker = 0x10.
5594  */
5595 static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
5596 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5597 	HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
5598 	ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5599 	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5600 	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5601 	HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5602 	HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
5603 	ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
5604 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5605 	HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
5606 	{ } /* end */
5607 };
5608 
5609 /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks.  Note that current
5610  * versions of the ALC260 don't act on requests to enable mic bias from NID
5611  * 0x0f (used to drive the headphone jack in these laptops).  The ALC260
5612  * datasheet doesn't mention this restriction.  At this stage it's not clear
5613  * whether this behaviour is intentional or is a hardware bug in chip
5614  * revisions available in early 2006.  Therefore for now allow the
5615  * "Headphone Jack Mode" control to span all choices, but if it turns out
5616  * that the lack of mic bias for this NID is intentional we could change the
5617  * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5618  *
5619  * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5620  * don't appear to make the mic bias available from the "line" jack, even
5621  * though the NID used for this jack (0x14) can supply it.  The theory is
5622  * that perhaps Acer have included blocking capacitors between the ALC260
5623  * and the output jack.  If this turns out to be the case for all such
5624  * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5625  * to ALC_PIN_DIR_INOUT_NOMICBIAS.
5626  *
5627  * The C20x Tablet series have a mono internal speaker which is controlled
5628  * via the chip's Mono sum widget and pin complex, so include the necessary
5629  * controls for such models.  On models without a "mono speaker" the control
5630  * won't do anything.
5631  */
5632 static struct snd_kcontrol_new alc260_acer_mixer[] = {
5633 	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5634 	HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5635 	ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5636 	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5637 			      HDA_OUTPUT),
5638 	HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
5639 			   HDA_INPUT),
5640 	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5641 	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5642 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5643 	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5644 	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5645 	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5646 	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5647 	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5648 	{ } /* end */
5649 };
5650 
5651 /* Maxdata Favorit 100XS: one output and one input (0x12) jack
5652  */
5653 static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5654 	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5655 	HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5656 	ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5657 	HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5658 	HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5659 	ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5660 	{ } /* end */
5661 };
5662 
5663 /* Packard bell V7900  ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5664  * Line In jack = 0x14, CD audio =  0x16, pc beep = 0x17.
5665  */
5666 static struct snd_kcontrol_new alc260_will_mixer[] = {
5667 	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5668 	HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5669 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5670 	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5671 	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5672 	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5673 	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5674 	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5675 	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5676 	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5677 	{ } /* end */
5678 };
5679 
5680 /* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5681  * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5682  */
5683 static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5684 	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5685 	HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5686 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5687 	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5688 	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5689 	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5690 	HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5691 	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5692 	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5693 	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5694 	{ } /* end */
5695 };
5696 
5697 /*
5698  * initialization verbs
5699  */
5700 static struct hda_verb alc260_init_verbs[] = {
5701 	/* Line In pin widget for input */
5702 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5703 	/* CD pin widget for input */
5704 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5705 	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5706 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5707 	/* Mic2 (front panel) pin widget for input and vref at 80% */
5708 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5709 	/* LINE-2 is used for line-out in rear */
5710 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5711 	/* select line-out */
5712 	{0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
5713 	/* LINE-OUT pin */
5714 	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5715 	/* enable HP */
5716 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5717 	/* enable Mono */
5718 	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5719 	/* mute capture amp left and right */
5720 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5721 	/* set connection select to line in (default select for this ADC) */
5722 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5723 	/* mute capture amp left and right */
5724 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5725 	/* set connection select to line in (default select for this ADC) */
5726 	{0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
5727 	/* set vol=0 Line-Out mixer amp left and right */
5728 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5729 	/* unmute pin widget amp left and right (no gain on this amp) */
5730 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5731 	/* set vol=0 HP mixer amp left and right */
5732 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5733 	/* unmute pin widget amp left and right (no gain on this amp) */
5734 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5735 	/* set vol=0 Mono mixer amp left and right */
5736 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5737 	/* unmute pin widget amp left and right (no gain on this amp) */
5738 	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5739 	/* unmute LINE-2 out pin */
5740 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5741 	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5742 	 * Line In 2 = 0x03
5743 	 */
5744 	/* mute analog inputs */
5745 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5746 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5747 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5748 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5749 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5750 	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5751 	/* mute Front out path */
5752 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5753 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5754 	/* mute Headphone out path */
5755 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5756 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5757 	/* mute Mono out path */
5758 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5759 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5760 	{ }
5761 };
5762 
5763 #if 0 /* should be identical with alc260_init_verbs? */
5764 static struct hda_verb alc260_hp_init_verbs[] = {
5765 	/* Headphone and output */
5766 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5767 	/* mono output */
5768 	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5769 	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5770 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5771 	/* Mic2 (front panel) pin widget for input and vref at 80% */
5772 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5773 	/* Line In pin widget for input */
5774 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5775 	/* Line-2 pin widget for output */
5776 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5777 	/* CD pin widget for input */
5778 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5779 	/* unmute amp left and right */
5780 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5781 	/* set connection select to line in (default select for this ADC) */
5782 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5783 	/* unmute Line-Out mixer amp left and right (volume = 0) */
5784 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5785 	/* mute pin widget amp left and right (no gain on this amp) */
5786 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5787 	/* unmute HP mixer amp left and right (volume = 0) */
5788 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5789 	/* mute pin widget amp left and right (no gain on this amp) */
5790 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5791 	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5792 	 * Line In 2 = 0x03
5793 	 */
5794 	/* mute analog inputs */
5795 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5796 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5797 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5798 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5799 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5800 	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5801 	/* Unmute Front out path */
5802 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5803 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5804 	/* Unmute Headphone out path */
5805 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5806 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5807 	/* Unmute Mono out path */
5808 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5809 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5810 	{ }
5811 };
5812 #endif
5813 
5814 static struct hda_verb alc260_hp_3013_init_verbs[] = {
5815 	/* Line out and output */
5816 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5817 	/* mono output */
5818 	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5819 	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5820 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5821 	/* Mic2 (front panel) pin widget for input and vref at 80% */
5822 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5823 	/* Line In pin widget for input */
5824 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5825 	/* Headphone pin widget for output */
5826 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5827 	/* CD pin widget for input */
5828 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5829 	/* unmute amp left and right */
5830 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5831 	/* set connection select to line in (default select for this ADC) */
5832 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5833 	/* unmute Line-Out mixer amp left and right (volume = 0) */
5834 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5835 	/* mute pin widget amp left and right (no gain on this amp) */
5836 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5837 	/* unmute HP mixer amp left and right (volume = 0) */
5838 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5839 	/* mute pin widget amp left and right (no gain on this amp) */
5840 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5841 	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5842 	 * Line In 2 = 0x03
5843 	 */
5844 	/* mute analog inputs */
5845 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5846 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5847 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5848 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5849 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5850 	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5851 	/* Unmute Front out path */
5852 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5853 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5854 	/* Unmute Headphone out path */
5855 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5856 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5857 	/* Unmute Mono out path */
5858 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5859 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5860 	{ }
5861 };
5862 
5863 /* Initialisation sequence for ALC260 as configured in Fujitsu S702x
5864  * laptops.  ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
5865  * audio = 0x16, internal speaker = 0x10.
5866  */
5867 static struct hda_verb alc260_fujitsu_init_verbs[] = {
5868 	/* Disable all GPIOs */
5869 	{0x01, AC_VERB_SET_GPIO_MASK, 0},
5870 	/* Internal speaker is connected to headphone pin */
5871 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5872 	/* Headphone/Line-out jack connects to Line1 pin; make it an output */
5873 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5874 	/* Mic/Line-in jack is connected to mic1 pin, so make it an input */
5875 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5876 	/* Ensure all other unused pins are disabled and muted. */
5877 	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5878 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5879 	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5880 	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5881 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5882 	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5883 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5884 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5885 
5886 	/* Disable digital (SPDIF) pins */
5887 	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5888 	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5889 
5890 	/* Ensure Line1 pin widget takes its input from the OUT1 sum bus
5891 	 * when acting as an output.
5892 	 */
5893 	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5894 
5895 	/* Start with output sum widgets muted and their output gains at min */
5896 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5897 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5898 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5899 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5900 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5901 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5902 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5903 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5904 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5905 
5906 	/* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
5907 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5908 	/* Unmute Line1 pin widget output buffer since it starts as an output.
5909 	 * If the pin mode is changed by the user the pin mode control will
5910 	 * take care of enabling the pin's input/output buffers as needed.
5911 	 * Therefore there's no need to enable the input buffer at this
5912 	 * stage.
5913 	 */
5914 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5915 	/* Unmute input buffer of pin widget used for Line-in (no equiv
5916 	 * mixer ctrl)
5917 	 */
5918 	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5919 
5920 	/* Mute capture amp left and right */
5921 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5922 	/* Set ADC connection select to match default mixer setting - line
5923 	 * in (on mic1 pin)
5924 	 */
5925 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5926 
5927 	/* Do the same for the second ADC: mute capture input amp and
5928 	 * set ADC connection to line in (on mic1 pin)
5929 	 */
5930 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5931 	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5932 
5933 	/* Mute all inputs to mixer widget (even unconnected ones) */
5934 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5935 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5936 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5937 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5938 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5939 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5940 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5941 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5942 
5943 	{ }
5944 };
5945 
5946 /* Initialisation sequence for ALC260 as configured in Acer TravelMate and
5947  * similar laptops (adapted from Fujitsu init verbs).
5948  */
5949 static struct hda_verb alc260_acer_init_verbs[] = {
5950 	/* On TravelMate laptops, GPIO 0 enables the internal speaker and
5951 	 * the headphone jack.  Turn this on and rely on the standard mute
5952 	 * methods whenever the user wants to turn these outputs off.
5953 	 */
5954 	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5955 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5956 	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5957 	/* Internal speaker/Headphone jack is connected to Line-out pin */
5958 	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5959 	/* Internal microphone/Mic jack is connected to Mic1 pin */
5960 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5961 	/* Line In jack is connected to Line1 pin */
5962 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5963 	/* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
5964 	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5965 	/* Ensure all other unused pins are disabled and muted. */
5966 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5967 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5968 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5969 	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5970 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5971 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5972 	/* Disable digital (SPDIF) pins */
5973 	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5974 	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5975 
5976 	/* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5977 	 * bus when acting as outputs.
5978 	 */
5979 	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5980 	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5981 
5982 	/* Start with output sum widgets muted and their output gains at min */
5983 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5984 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5985 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5986 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5987 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5988 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5989 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5990 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5991 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5992 
5993 	/* Unmute Line-out pin widget amp left and right
5994 	 * (no equiv mixer ctrl)
5995 	 */
5996 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5997 	/* Unmute mono pin widget amp output (no equiv mixer ctrl) */
5998 	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5999 	/* Unmute Mic1 and Line1 pin widget input buffers since they start as
6000 	 * inputs. If the pin mode is changed by the user the pin mode control
6001 	 * will take care of enabling the pin's input/output buffers as needed.
6002 	 * Therefore there's no need to enable the input buffer at this
6003 	 * stage.
6004 	 */
6005 	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6006 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6007 
6008 	/* Mute capture amp left and right */
6009 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6010 	/* Set ADC connection select to match default mixer setting - mic
6011 	 * (on mic1 pin)
6012 	 */
6013 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6014 
6015 	/* Do similar with the second ADC: mute capture input amp and
6016 	 * set ADC connection to mic to match ALSA's default state.
6017 	 */
6018 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6019 	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6020 
6021 	/* Mute all inputs to mixer widget (even unconnected ones) */
6022 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6023 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6024 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6025 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6026 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6027 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6028 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6029 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6030 
6031 	{ }
6032 };
6033 
6034 /* Initialisation sequence for Maxdata Favorit 100XS
6035  * (adapted from Acer init verbs).
6036  */
6037 static struct hda_verb alc260_favorit100_init_verbs[] = {
6038 	/* GPIO 0 enables the output jack.
6039 	 * Turn this on and rely on the standard mute
6040 	 * methods whenever the user wants to turn these outputs off.
6041 	 */
6042 	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6043 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6044 	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
6045 	/* Line/Mic input jack is connected to Mic1 pin */
6046 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
6047 	/* Ensure all other unused pins are disabled and muted. */
6048 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6049 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6050 	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6051 	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6052 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6053 	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6054 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6055 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6056 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6057 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6058 	/* Disable digital (SPDIF) pins */
6059 	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6060 	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6061 
6062 	/* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
6063 	 * bus when acting as outputs.
6064 	 */
6065 	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6066 	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6067 
6068 	/* Start with output sum widgets muted and their output gains at min */
6069 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6070 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6071 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6072 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6073 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6074 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6075 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6076 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6077 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6078 
6079 	/* Unmute Line-out pin widget amp left and right
6080 	 * (no equiv mixer ctrl)
6081 	 */
6082 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6083 	/* Unmute Mic1 and Line1 pin widget input buffers since they start as
6084 	 * inputs. If the pin mode is changed by the user the pin mode control
6085 	 * will take care of enabling the pin's input/output buffers as needed.
6086 	 * Therefore there's no need to enable the input buffer at this
6087 	 * stage.
6088 	 */
6089 	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6090 
6091 	/* Mute capture amp left and right */
6092 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6093 	/* Set ADC connection select to match default mixer setting - mic
6094 	 * (on mic1 pin)
6095 	 */
6096 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6097 
6098 	/* Do similar with the second ADC: mute capture input amp and
6099 	 * set ADC connection to mic to match ALSA's default state.
6100 	 */
6101 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6102 	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6103 
6104 	/* Mute all inputs to mixer widget (even unconnected ones) */
6105 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6106 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6107 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6108 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6109 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6110 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6111 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6112 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6113 
6114 	{ }
6115 };
6116 
6117 static struct hda_verb alc260_will_verbs[] = {
6118 	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6119 	{0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
6120 	{0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
6121 	{0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6122 	{0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6123 	{0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
6124 	{}
6125 };
6126 
6127 static struct hda_verb alc260_replacer_672v_verbs[] = {
6128 	{0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6129 	{0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6130 	{0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
6131 
6132 	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6133 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6134 	{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6135 
6136 	{0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6137 	{}
6138 };
6139 
6140 /* toggle speaker-output according to the hp-jack state */
6141 static void alc260_replacer_672v_automute(struct hda_codec *codec)
6142 {
6143         unsigned int present;
6144 
6145 	/* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
6146 	present = snd_hda_jack_detect(codec, 0x0f);
6147 	if (present) {
6148 		snd_hda_codec_write_cache(codec, 0x01, 0,
6149 					  AC_VERB_SET_GPIO_DATA, 1);
6150 		snd_hda_codec_write_cache(codec, 0x0f, 0,
6151 					  AC_VERB_SET_PIN_WIDGET_CONTROL,
6152 					  PIN_HP);
6153 	} else {
6154 		snd_hda_codec_write_cache(codec, 0x01, 0,
6155 					  AC_VERB_SET_GPIO_DATA, 0);
6156 		snd_hda_codec_write_cache(codec, 0x0f, 0,
6157 					  AC_VERB_SET_PIN_WIDGET_CONTROL,
6158 					  PIN_OUT);
6159 	}
6160 }
6161 
6162 static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
6163                                        unsigned int res)
6164 {
6165         if ((res >> 26) == ALC880_HP_EVENT)
6166                 alc260_replacer_672v_automute(codec);
6167 }
6168 
6169 static struct hda_verb alc260_hp_dc7600_verbs[] = {
6170 	{0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
6171 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6172 	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6173 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6174 	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6175 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6176 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
6177 	{0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6178 	{0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6179 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6180 	{}
6181 };
6182 
6183 /* Test configuration for debugging, modelled after the ALC880 test
6184  * configuration.
6185  */
6186 #ifdef CONFIG_SND_DEBUG
6187 static hda_nid_t alc260_test_dac_nids[1] = {
6188 	0x02,
6189 };
6190 static hda_nid_t alc260_test_adc_nids[2] = {
6191 	0x04, 0x05,
6192 };
6193 /* For testing the ALC260, each input MUX needs its own definition since
6194  * the signal assignments are different.  This assumes that the first ADC
6195  * is NID 0x04.
6196  */
6197 static struct hda_input_mux alc260_test_capture_sources[2] = {
6198 	{
6199 		.num_items = 7,
6200 		.items = {
6201 			{ "MIC1 pin", 0x0 },
6202 			{ "MIC2 pin", 0x1 },
6203 			{ "LINE1 pin", 0x2 },
6204 			{ "LINE2 pin", 0x3 },
6205 			{ "CD pin", 0x4 },
6206 			{ "LINE-OUT pin", 0x5 },
6207 			{ "HP-OUT pin", 0x6 },
6208 		},
6209         },
6210 	{
6211 		.num_items = 8,
6212 		.items = {
6213 			{ "MIC1 pin", 0x0 },
6214 			{ "MIC2 pin", 0x1 },
6215 			{ "LINE1 pin", 0x2 },
6216 			{ "LINE2 pin", 0x3 },
6217 			{ "CD pin", 0x4 },
6218 			{ "Mixer", 0x5 },
6219 			{ "LINE-OUT pin", 0x6 },
6220 			{ "HP-OUT pin", 0x7 },
6221 		},
6222         },
6223 };
6224 static struct snd_kcontrol_new alc260_test_mixer[] = {
6225 	/* Output driver widgets */
6226 	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
6227 	HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
6228 	HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6229 	HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
6230 	HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6231 	HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
6232 
6233 	/* Modes for retasking pin widgets
6234 	 * Note: the ALC260 doesn't seem to act on requests to enable mic
6235          * bias from NIDs 0x0f and 0x10.  The ALC260 datasheet doesn't
6236          * mention this restriction.  At this stage it's not clear whether
6237          * this behaviour is intentional or is a hardware bug in chip
6238          * revisions available at least up until early 2006.  Therefore for
6239          * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
6240          * choices, but if it turns out that the lack of mic bias for these
6241          * NIDs is intentional we could change their modes from
6242          * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
6243 	 */
6244 	ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
6245 	ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
6246 	ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
6247 	ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
6248 	ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
6249 	ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
6250 
6251 	/* Loopback mixer controls */
6252 	HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
6253 	HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
6254 	HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
6255 	HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
6256 	HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
6257 	HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
6258 	HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
6259 	HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
6260 	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6261 	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
6262 	HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
6263 	HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
6264 	HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
6265 	HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
6266 
6267 	/* Controls for GPIO pins, assuming they are configured as outputs */
6268 	ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
6269 	ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
6270 	ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
6271 	ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
6272 
6273 	/* Switches to allow the digital IO pins to be enabled.  The datasheet
6274 	 * is ambigious as to which NID is which; testing on laptops which
6275 	 * make this output available should provide clarification.
6276 	 */
6277 	ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
6278 	ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
6279 
6280 	/* A switch allowing EAPD to be enabled.  Some laptops seem to use
6281 	 * this output to turn on an external amplifier.
6282 	 */
6283 	ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
6284 	ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
6285 
6286 	{ } /* end */
6287 };
6288 static struct hda_verb alc260_test_init_verbs[] = {
6289 	/* Enable all GPIOs as outputs with an initial value of 0 */
6290 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
6291 	{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6292 	{0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
6293 
6294 	/* Enable retasking pins as output, initially without power amp */
6295 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6296 	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6297 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6298 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6299 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6300 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6301 
6302 	/* Disable digital (SPDIF) pins initially, but users can enable
6303 	 * them via a mixer switch.  In the case of SPDIF-out, this initverb
6304 	 * payload also sets the generation to 0, output to be in "consumer"
6305 	 * PCM format, copyright asserted, no pre-emphasis and no validity
6306 	 * control.
6307 	 */
6308 	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6309 	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6310 
6311 	/* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
6312 	 * OUT1 sum bus when acting as an output.
6313 	 */
6314 	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6315 	{0x0c, AC_VERB_SET_CONNECT_SEL, 0},
6316 	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6317 	{0x0e, AC_VERB_SET_CONNECT_SEL, 0},
6318 
6319 	/* Start with output sum widgets muted and their output gains at min */
6320 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6321 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6322 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6323 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6324 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6325 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6326 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6327 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6328 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6329 
6330 	/* Unmute retasking pin widget output buffers since the default
6331 	 * state appears to be output.  As the pin mode is changed by the
6332 	 * user the pin mode control will take care of enabling the pin's
6333 	 * input/output buffers as needed.
6334 	 */
6335 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6336 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6337 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6338 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6339 	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6340 	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6341 	/* Also unmute the mono-out pin widget */
6342 	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6343 
6344 	/* Mute capture amp left and right */
6345 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6346 	/* Set ADC connection select to match default mixer setting (mic1
6347 	 * pin)
6348 	 */
6349 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6350 
6351 	/* Do the same for the second ADC: mute capture input amp and
6352 	 * set ADC connection to mic1 pin
6353 	 */
6354 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6355 	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6356 
6357 	/* Mute all inputs to mixer widget (even unconnected ones) */
6358 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6359 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6360 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6361 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6362 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6363 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6364 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6365 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6366 
6367 	{ }
6368 };
6369 #endif
6370 
6371 #define alc260_pcm_analog_playback	alc880_pcm_analog_alt_playback
6372 #define alc260_pcm_analog_capture	alc880_pcm_analog_capture
6373 
6374 #define alc260_pcm_digital_playback	alc880_pcm_digital_playback
6375 #define alc260_pcm_digital_capture	alc880_pcm_digital_capture
6376 
6377 /*
6378  * for BIOS auto-configuration
6379  */
6380 
6381 static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
6382 					const char *pfx, int *vol_bits)
6383 {
6384 	hda_nid_t nid_vol;
6385 	unsigned long vol_val, sw_val;
6386 	int err;
6387 
6388 	if (nid >= 0x0f && nid < 0x11) {
6389 		nid_vol = nid - 0x7;
6390 		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6391 		sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6392 	} else if (nid == 0x11) {
6393 		nid_vol = nid - 0x7;
6394 		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6395 		sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6396 	} else if (nid >= 0x12 && nid <= 0x15) {
6397 		nid_vol = 0x08;
6398 		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6399 		sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6400 	} else
6401 		return 0; /* N/A */
6402 
6403 	if (!(*vol_bits & (1 << nid_vol))) {
6404 		/* first control for the volume widget */
6405 		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
6406 		if (err < 0)
6407 			return err;
6408 		*vol_bits |= (1 << nid_vol);
6409 	}
6410 	err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
6411 	if (err < 0)
6412 		return err;
6413 	return 1;
6414 }
6415 
6416 /* add playback controls from the parsed DAC table */
6417 static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6418 					     const struct auto_pin_cfg *cfg)
6419 {
6420 	hda_nid_t nid;
6421 	int err;
6422 	int vols = 0;
6423 
6424 	spec->multiout.num_dacs = 1;
6425 	spec->multiout.dac_nids = spec->private_dac_nids;
6426 	spec->multiout.dac_nids[0] = 0x02;
6427 
6428 	nid = cfg->line_out_pins[0];
6429 	if (nid) {
6430 		const char *pfx;
6431 		if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6432 			pfx = "Master";
6433 		else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6434 			pfx = "Speaker";
6435 		else
6436 			pfx = "Front";
6437 		err = alc260_add_playback_controls(spec, nid, pfx, &vols);
6438 		if (err < 0)
6439 			return err;
6440 	}
6441 
6442 	nid = cfg->speaker_pins[0];
6443 	if (nid) {
6444 		err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
6445 		if (err < 0)
6446 			return err;
6447 	}
6448 
6449 	nid = cfg->hp_pins[0];
6450 	if (nid) {
6451 		err = alc260_add_playback_controls(spec, nid, "Headphone",
6452 						   &vols);
6453 		if (err < 0)
6454 			return err;
6455 	}
6456 	return 0;
6457 }
6458 
6459 /* create playback/capture controls for input pins */
6460 static int alc260_auto_create_input_ctls(struct hda_codec *codec,
6461 						const struct auto_pin_cfg *cfg)
6462 {
6463 	return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
6464 }
6465 
6466 static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6467 					      hda_nid_t nid, int pin_type,
6468 					      int sel_idx)
6469 {
6470 	alc_set_pin_output(codec, nid, pin_type);
6471 	/* need the manual connection? */
6472 	if (nid >= 0x12) {
6473 		int idx = nid - 0x12;
6474 		snd_hda_codec_write(codec, idx + 0x0b, 0,
6475 				    AC_VERB_SET_CONNECT_SEL, sel_idx);
6476 	}
6477 }
6478 
6479 static void alc260_auto_init_multi_out(struct hda_codec *codec)
6480 {
6481 	struct alc_spec *spec = codec->spec;
6482 	hda_nid_t nid;
6483 
6484 	nid = spec->autocfg.line_out_pins[0];
6485 	if (nid) {
6486 		int pin_type = get_pin_type(spec->autocfg.line_out_type);
6487 		alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6488 	}
6489 
6490 	nid = spec->autocfg.speaker_pins[0];
6491 	if (nid)
6492 		alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6493 
6494 	nid = spec->autocfg.hp_pins[0];
6495 	if (nid)
6496 		alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
6497 }
6498 
6499 #define ALC260_PIN_CD_NID		0x16
6500 static void alc260_auto_init_analog_input(struct hda_codec *codec)
6501 {
6502 	struct alc_spec *spec = codec->spec;
6503 	int i;
6504 
6505 	for (i = 0; i < AUTO_PIN_LAST; i++) {
6506 		hda_nid_t nid = spec->autocfg.input_pins[i];
6507 		if (nid >= 0x12) {
6508 			alc_set_input_pin(codec, nid, i);
6509 			if (nid != ALC260_PIN_CD_NID &&
6510 			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
6511 				snd_hda_codec_write(codec, nid, 0,
6512 						    AC_VERB_SET_AMP_GAIN_MUTE,
6513 						    AMP_OUT_MUTE);
6514 		}
6515 	}
6516 }
6517 
6518 #define alc260_auto_init_input_src	alc880_auto_init_input_src
6519 
6520 /*
6521  * generic initialization of ADC, input mixers and output mixers
6522  */
6523 static struct hda_verb alc260_volume_init_verbs[] = {
6524 	/*
6525 	 * Unmute ADC0-1 and set the default input to mic-in
6526 	 */
6527 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6528 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6529 	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6530 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6531 
6532 	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6533 	 * mixer widget
6534 	 * Note: PASD motherboards uses the Line In 2 as the input for
6535 	 * front panel mic (mic 2)
6536 	 */
6537 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
6538 	/* mute analog inputs */
6539 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6540 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6541 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6542 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6543 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6544 
6545 	/*
6546 	 * Set up output mixers (0x08 - 0x0a)
6547 	 */
6548 	/* set vol=0 to output mixers */
6549 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6550 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6551 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6552 	/* set up input amps for analog loopback */
6553 	/* Amp Indices: DAC = 0, mixer = 1 */
6554 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6555 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6556 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6557 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6558 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6559 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6560 
6561 	{ }
6562 };
6563 
6564 static int alc260_parse_auto_config(struct hda_codec *codec)
6565 {
6566 	struct alc_spec *spec = codec->spec;
6567 	int err;
6568 	static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6569 
6570 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6571 					   alc260_ignore);
6572 	if (err < 0)
6573 		return err;
6574 	err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6575 	if (err < 0)
6576 		return err;
6577 	if (!spec->kctls.list)
6578 		return 0; /* can't find valid BIOS pin config */
6579 	err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
6580 	if (err < 0)
6581 		return err;
6582 
6583 	spec->multiout.max_channels = 2;
6584 
6585 	if (spec->autocfg.dig_outs)
6586 		spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
6587 	if (spec->kctls.list)
6588 		add_mixer(spec, spec->kctls.list);
6589 
6590 	add_verb(spec, alc260_volume_init_verbs);
6591 
6592 	spec->num_mux_defs = 1;
6593 	spec->input_mux = &spec->private_imux[0];
6594 
6595 	alc_ssid_check(codec, 0x10, 0x15, 0x0f, 0);
6596 
6597 	return 1;
6598 }
6599 
6600 /* additional initialization for auto-configuration model */
6601 static void alc260_auto_init(struct hda_codec *codec)
6602 {
6603 	struct alc_spec *spec = codec->spec;
6604 	alc260_auto_init_multi_out(codec);
6605 	alc260_auto_init_analog_input(codec);
6606 	alc260_auto_init_input_src(codec);
6607 	if (spec->unsol_event)
6608 		alc_inithook(codec);
6609 }
6610 
6611 #ifdef CONFIG_SND_HDA_POWER_SAVE
6612 static struct hda_amp_list alc260_loopbacks[] = {
6613 	{ 0x07, HDA_INPUT, 0 },
6614 	{ 0x07, HDA_INPUT, 1 },
6615 	{ 0x07, HDA_INPUT, 2 },
6616 	{ 0x07, HDA_INPUT, 3 },
6617 	{ 0x07, HDA_INPUT, 4 },
6618 	{ } /* end */
6619 };
6620 #endif
6621 
6622 /*
6623  * ALC260 configurations
6624  */
6625 static const char *alc260_models[ALC260_MODEL_LAST] = {
6626 	[ALC260_BASIC]		= "basic",
6627 	[ALC260_HP]		= "hp",
6628 	[ALC260_HP_3013]	= "hp-3013",
6629 	[ALC260_HP_DC7600]	= "hp-dc7600",
6630 	[ALC260_FUJITSU_S702X]	= "fujitsu",
6631 	[ALC260_ACER]		= "acer",
6632 	[ALC260_WILL]		= "will",
6633 	[ALC260_REPLACER_672V]	= "replacer",
6634 	[ALC260_FAVORIT100]	= "favorit100",
6635 #ifdef CONFIG_SND_DEBUG
6636 	[ALC260_TEST]		= "test",
6637 #endif
6638 	[ALC260_AUTO]		= "auto",
6639 };
6640 
6641 static struct snd_pci_quirk alc260_cfg_tbl[] = {
6642 	SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
6643 	SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
6644 	SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
6645 	SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
6646 	SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
6647 	SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
6648 	SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
6649 	SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
6650 	SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
6651 	SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6652 	SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6653 	SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6654 	SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6655 	SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6656 	SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6657 	SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6658 	SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6659 	SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
6660 	SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
6661 	SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
6662 	{}
6663 };
6664 
6665 static struct alc_config_preset alc260_presets[] = {
6666 	[ALC260_BASIC] = {
6667 		.mixers = { alc260_base_output_mixer,
6668 			    alc260_input_mixer },
6669 		.init_verbs = { alc260_init_verbs },
6670 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6671 		.dac_nids = alc260_dac_nids,
6672 		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6673 		.adc_nids = alc260_dual_adc_nids,
6674 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6675 		.channel_mode = alc260_modes,
6676 		.input_mux = &alc260_capture_source,
6677 	},
6678 	[ALC260_HP] = {
6679 		.mixers = { alc260_hp_output_mixer,
6680 			    alc260_input_mixer },
6681 		.init_verbs = { alc260_init_verbs,
6682 				alc260_hp_unsol_verbs },
6683 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6684 		.dac_nids = alc260_dac_nids,
6685 		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6686 		.adc_nids = alc260_adc_nids_alt,
6687 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6688 		.channel_mode = alc260_modes,
6689 		.input_mux = &alc260_capture_source,
6690 		.unsol_event = alc260_hp_unsol_event,
6691 		.init_hook = alc260_hp_automute,
6692 	},
6693 	[ALC260_HP_DC7600] = {
6694 		.mixers = { alc260_hp_dc7600_mixer,
6695 			    alc260_input_mixer },
6696 		.init_verbs = { alc260_init_verbs,
6697 				alc260_hp_dc7600_verbs },
6698 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6699 		.dac_nids = alc260_dac_nids,
6700 		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6701 		.adc_nids = alc260_adc_nids_alt,
6702 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6703 		.channel_mode = alc260_modes,
6704 		.input_mux = &alc260_capture_source,
6705 		.unsol_event = alc260_hp_3012_unsol_event,
6706 		.init_hook = alc260_hp_3012_automute,
6707 	},
6708 	[ALC260_HP_3013] = {
6709 		.mixers = { alc260_hp_3013_mixer,
6710 			    alc260_input_mixer },
6711 		.init_verbs = { alc260_hp_3013_init_verbs,
6712 				alc260_hp_3013_unsol_verbs },
6713 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6714 		.dac_nids = alc260_dac_nids,
6715 		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6716 		.adc_nids = alc260_adc_nids_alt,
6717 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6718 		.channel_mode = alc260_modes,
6719 		.input_mux = &alc260_capture_source,
6720 		.unsol_event = alc260_hp_3013_unsol_event,
6721 		.init_hook = alc260_hp_3013_automute,
6722 	},
6723 	[ALC260_FUJITSU_S702X] = {
6724 		.mixers = { alc260_fujitsu_mixer },
6725 		.init_verbs = { alc260_fujitsu_init_verbs },
6726 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6727 		.dac_nids = alc260_dac_nids,
6728 		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6729 		.adc_nids = alc260_dual_adc_nids,
6730 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6731 		.channel_mode = alc260_modes,
6732 		.num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6733 		.input_mux = alc260_fujitsu_capture_sources,
6734 	},
6735 	[ALC260_ACER] = {
6736 		.mixers = { alc260_acer_mixer },
6737 		.init_verbs = { alc260_acer_init_verbs },
6738 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6739 		.dac_nids = alc260_dac_nids,
6740 		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6741 		.adc_nids = alc260_dual_adc_nids,
6742 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6743 		.channel_mode = alc260_modes,
6744 		.num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6745 		.input_mux = alc260_acer_capture_sources,
6746 	},
6747 	[ALC260_FAVORIT100] = {
6748 		.mixers = { alc260_favorit100_mixer },
6749 		.init_verbs = { alc260_favorit100_init_verbs },
6750 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6751 		.dac_nids = alc260_dac_nids,
6752 		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6753 		.adc_nids = alc260_dual_adc_nids,
6754 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6755 		.channel_mode = alc260_modes,
6756 		.num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6757 		.input_mux = alc260_favorit100_capture_sources,
6758 	},
6759 	[ALC260_WILL] = {
6760 		.mixers = { alc260_will_mixer },
6761 		.init_verbs = { alc260_init_verbs, alc260_will_verbs },
6762 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6763 		.dac_nids = alc260_dac_nids,
6764 		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6765 		.adc_nids = alc260_adc_nids,
6766 		.dig_out_nid = ALC260_DIGOUT_NID,
6767 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6768 		.channel_mode = alc260_modes,
6769 		.input_mux = &alc260_capture_source,
6770 	},
6771 	[ALC260_REPLACER_672V] = {
6772 		.mixers = { alc260_replacer_672v_mixer },
6773 		.init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6774 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6775 		.dac_nids = alc260_dac_nids,
6776 		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6777 		.adc_nids = alc260_adc_nids,
6778 		.dig_out_nid = ALC260_DIGOUT_NID,
6779 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6780 		.channel_mode = alc260_modes,
6781 		.input_mux = &alc260_capture_source,
6782 		.unsol_event = alc260_replacer_672v_unsol_event,
6783 		.init_hook = alc260_replacer_672v_automute,
6784 	},
6785 #ifdef CONFIG_SND_DEBUG
6786 	[ALC260_TEST] = {
6787 		.mixers = { alc260_test_mixer },
6788 		.init_verbs = { alc260_test_init_verbs },
6789 		.num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6790 		.dac_nids = alc260_test_dac_nids,
6791 		.num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6792 		.adc_nids = alc260_test_adc_nids,
6793 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6794 		.channel_mode = alc260_modes,
6795 		.num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6796 		.input_mux = alc260_test_capture_sources,
6797 	},
6798 #endif
6799 };
6800 
6801 static int patch_alc260(struct hda_codec *codec)
6802 {
6803 	struct alc_spec *spec;
6804 	int err, board_config;
6805 
6806 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6807 	if (spec == NULL)
6808 		return -ENOMEM;
6809 
6810 	codec->spec = spec;
6811 
6812 	board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
6813 						  alc260_models,
6814 						  alc260_cfg_tbl);
6815 	if (board_config < 0) {
6816 		snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6817 			   codec->chip_name);
6818 		board_config = ALC260_AUTO;
6819 	}
6820 
6821 	if (board_config == ALC260_AUTO) {
6822 		/* automatic parse from the BIOS config */
6823 		err = alc260_parse_auto_config(codec);
6824 		if (err < 0) {
6825 			alc_free(codec);
6826 			return err;
6827 		} else if (!err) {
6828 			printk(KERN_INFO
6829 			       "hda_codec: Cannot set up configuration "
6830 			       "from BIOS.  Using base mode...\n");
6831 			board_config = ALC260_BASIC;
6832 		}
6833 	}
6834 
6835 	err = snd_hda_attach_beep_device(codec, 0x1);
6836 	if (err < 0) {
6837 		alc_free(codec);
6838 		return err;
6839 	}
6840 
6841 	if (board_config != ALC260_AUTO)
6842 		setup_preset(codec, &alc260_presets[board_config]);
6843 
6844 	spec->stream_analog_playback = &alc260_pcm_analog_playback;
6845 	spec->stream_analog_capture = &alc260_pcm_analog_capture;
6846 
6847 	spec->stream_digital_playback = &alc260_pcm_digital_playback;
6848 	spec->stream_digital_capture = &alc260_pcm_digital_capture;
6849 
6850 	if (!spec->adc_nids && spec->input_mux) {
6851 		/* check whether NID 0x04 is valid */
6852 		unsigned int wcap = get_wcaps(codec, 0x04);
6853 		wcap = get_wcaps_type(wcap);
6854 		/* get type */
6855 		if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
6856 			spec->adc_nids = alc260_adc_nids_alt;
6857 			spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
6858 		} else {
6859 			spec->adc_nids = alc260_adc_nids;
6860 			spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
6861 		}
6862 	}
6863 	set_capture_mixer(codec);
6864 	set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
6865 
6866 	spec->vmaster_nid = 0x08;
6867 
6868 	codec->patch_ops = alc_patch_ops;
6869 	if (board_config == ALC260_AUTO)
6870 		spec->init_hook = alc260_auto_init;
6871 #ifdef CONFIG_SND_HDA_POWER_SAVE
6872 	if (!spec->loopback.amplist)
6873 		spec->loopback.amplist = alc260_loopbacks;
6874 #endif
6875 
6876 	return 0;
6877 }
6878 
6879 
6880 /*
6881  * ALC882/883/885/888/889 support
6882  *
6883  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
6884  * configuration.  Each pin widget can choose any input DACs and a mixer.
6885  * Each ADC is connected from a mixer of all inputs.  This makes possible
6886  * 6-channel independent captures.
6887  *
6888  * In addition, an independent DAC for the multi-playback (not used in this
6889  * driver yet).
6890  */
6891 #define ALC882_DIGOUT_NID	0x06
6892 #define ALC882_DIGIN_NID	0x0a
6893 #define ALC883_DIGOUT_NID	ALC882_DIGOUT_NID
6894 #define ALC883_DIGIN_NID	ALC882_DIGIN_NID
6895 #define ALC1200_DIGOUT_NID	0x10
6896 
6897 
6898 static struct hda_channel_mode alc882_ch_modes[1] = {
6899 	{ 8, NULL }
6900 };
6901 
6902 /* DACs */
6903 static hda_nid_t alc882_dac_nids[4] = {
6904 	/* front, rear, clfe, rear_surr */
6905 	0x02, 0x03, 0x04, 0x05
6906 };
6907 #define alc883_dac_nids		alc882_dac_nids
6908 
6909 /* ADCs */
6910 #define alc882_adc_nids		alc880_adc_nids
6911 #define alc882_adc_nids_alt	alc880_adc_nids_alt
6912 #define alc883_adc_nids		alc882_adc_nids_alt
6913 static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
6914 static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
6915 #define alc889_adc_nids		alc880_adc_nids
6916 
6917 static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
6918 static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
6919 #define alc883_capsrc_nids	alc882_capsrc_nids_alt
6920 static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
6921 #define alc889_capsrc_nids	alc882_capsrc_nids
6922 
6923 /* input MUX */
6924 /* FIXME: should be a matrix-type input source selection */
6925 
6926 static struct hda_input_mux alc882_capture_source = {
6927 	.num_items = 4,
6928 	.items = {
6929 		{ "Mic", 0x0 },
6930 		{ "Front Mic", 0x1 },
6931 		{ "Line", 0x2 },
6932 		{ "CD", 0x4 },
6933 	},
6934 };
6935 
6936 #define alc883_capture_source	alc882_capture_source
6937 
6938 static struct hda_input_mux alc889_capture_source = {
6939 	.num_items = 3,
6940 	.items = {
6941 		{ "Front Mic", 0x0 },
6942 		{ "Mic", 0x3 },
6943 		{ "Line", 0x2 },
6944 	},
6945 };
6946 
6947 static struct hda_input_mux mb5_capture_source = {
6948 	.num_items = 3,
6949 	.items = {
6950 		{ "Mic", 0x1 },
6951 		{ "Line", 0x2 },
6952 		{ "CD", 0x4 },
6953 	},
6954 };
6955 
6956 static struct hda_input_mux macmini3_capture_source = {
6957 	.num_items = 2,
6958 	.items = {
6959 		{ "Line", 0x2 },
6960 		{ "CD", 0x4 },
6961 	},
6962 };
6963 
6964 static struct hda_input_mux alc883_3stack_6ch_intel = {
6965 	.num_items = 4,
6966 	.items = {
6967 		{ "Mic", 0x1 },
6968 		{ "Front Mic", 0x0 },
6969 		{ "Line", 0x2 },
6970 		{ "CD", 0x4 },
6971 	},
6972 };
6973 
6974 static struct hda_input_mux alc883_lenovo_101e_capture_source = {
6975 	.num_items = 2,
6976 	.items = {
6977 		{ "Mic", 0x1 },
6978 		{ "Line", 0x2 },
6979 	},
6980 };
6981 
6982 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
6983 	.num_items = 4,
6984 	.items = {
6985 		{ "Mic", 0x0 },
6986 		{ "iMic", 0x1 },
6987 		{ "Line", 0x2 },
6988 		{ "CD", 0x4 },
6989 	},
6990 };
6991 
6992 static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
6993 	.num_items = 2,
6994 	.items = {
6995 		{ "Mic", 0x0 },
6996 		{ "Int Mic", 0x1 },
6997 	},
6998 };
6999 
7000 static struct hda_input_mux alc883_lenovo_sky_capture_source = {
7001 	.num_items = 3,
7002 	.items = {
7003 		{ "Mic", 0x0 },
7004 		{ "Front Mic", 0x1 },
7005 		{ "Line", 0x4 },
7006 	},
7007 };
7008 
7009 static struct hda_input_mux alc883_asus_eee1601_capture_source = {
7010 	.num_items = 2,
7011 	.items = {
7012 		{ "Mic", 0x0 },
7013 		{ "Line", 0x2 },
7014 	},
7015 };
7016 
7017 static struct hda_input_mux alc889A_mb31_capture_source = {
7018 	.num_items = 2,
7019 	.items = {
7020 		{ "Mic", 0x0 },
7021 		/* Front Mic (0x01) unused */
7022 		{ "Line", 0x2 },
7023 		/* Line 2 (0x03) unused */
7024 		/* CD (0x04) unused? */
7025 	},
7026 };
7027 
7028 static struct hda_input_mux alc889A_imac91_capture_source = {
7029 	.num_items = 2,
7030 	.items = {
7031 		{ "Mic", 0x01 },
7032 		{ "Line", 0x2 }, /* Not sure! */
7033 	},
7034 };
7035 
7036 /*
7037  * 2ch mode
7038  */
7039 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
7040 	{ 2, NULL }
7041 };
7042 
7043 /*
7044  * 2ch mode
7045  */
7046 static struct hda_verb alc882_3ST_ch2_init[] = {
7047 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7048 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7049 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7050 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7051 	{ } /* end */
7052 };
7053 
7054 /*
7055  * 4ch mode
7056  */
7057 static struct hda_verb alc882_3ST_ch4_init[] = {
7058 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7059 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7060 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7061 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7062 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7063 	{ } /* end */
7064 };
7065 
7066 /*
7067  * 6ch mode
7068  */
7069 static struct hda_verb alc882_3ST_ch6_init[] = {
7070 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7071 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7072 	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7073 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7074 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7075 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7076 	{ } /* end */
7077 };
7078 
7079 static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
7080 	{ 2, alc882_3ST_ch2_init },
7081 	{ 4, alc882_3ST_ch4_init },
7082 	{ 6, alc882_3ST_ch6_init },
7083 };
7084 
7085 #define alc883_3ST_6ch_modes	alc882_3ST_6ch_modes
7086 
7087 /*
7088  * 2ch mode
7089  */
7090 static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
7091 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
7092 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7093 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7094 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7095 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7096 	{ } /* end */
7097 };
7098 
7099 /*
7100  * 4ch mode
7101  */
7102 static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
7103 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7104 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7105 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7106 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7107 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7108 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7109 	{ } /* end */
7110 };
7111 
7112 /*
7113  * 6ch mode
7114  */
7115 static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
7116 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7117 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7118 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7119 	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7120 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7121 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7122 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7123 	{ } /* end */
7124 };
7125 
7126 static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
7127 	{ 2, alc883_3ST_ch2_clevo_init },
7128 	{ 4, alc883_3ST_ch4_clevo_init },
7129 	{ 6, alc883_3ST_ch6_clevo_init },
7130 };
7131 
7132 
7133 /*
7134  * 6ch mode
7135  */
7136 static struct hda_verb alc882_sixstack_ch6_init[] = {
7137 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7138 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7139 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7140 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7141 	{ } /* end */
7142 };
7143 
7144 /*
7145  * 8ch mode
7146  */
7147 static struct hda_verb alc882_sixstack_ch8_init[] = {
7148 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7149 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7150 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7151 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7152 	{ } /* end */
7153 };
7154 
7155 static struct hda_channel_mode alc882_sixstack_modes[2] = {
7156 	{ 6, alc882_sixstack_ch6_init },
7157 	{ 8, alc882_sixstack_ch8_init },
7158 };
7159 
7160 
7161 /* Macbook Air 2,1 */
7162 
7163 static struct hda_channel_mode alc885_mba21_ch_modes[1] = {
7164       { 2, NULL },
7165 };
7166 
7167 /*
7168  * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
7169  */
7170 
7171 /*
7172  * 2ch mode
7173  */
7174 static struct hda_verb alc885_mbp_ch2_init[] = {
7175 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7176 	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7177 	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7178 	{ } /* end */
7179 };
7180 
7181 /*
7182  * 4ch mode
7183  */
7184 static struct hda_verb alc885_mbp_ch4_init[] = {
7185 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7186 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7187 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7188 	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7189 	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7190 	{ } /* end */
7191 };
7192 
7193 static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
7194 	{ 2, alc885_mbp_ch2_init },
7195 	{ 4, alc885_mbp_ch4_init },
7196 };
7197 
7198 /*
7199  * 2ch
7200  * Speakers/Woofer/HP = Front
7201  * LineIn = Input
7202  */
7203 static struct hda_verb alc885_mb5_ch2_init[] = {
7204 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7205 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7206 	{ } /* end */
7207 };
7208 
7209 /*
7210  * 6ch mode
7211  * Speakers/HP = Front
7212  * Woofer = LFE
7213  * LineIn = Surround
7214  */
7215 static struct hda_verb alc885_mb5_ch6_init[] = {
7216 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7217 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7218 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7219 	{ } /* end */
7220 };
7221 
7222 static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
7223 	{ 2, alc885_mb5_ch2_init },
7224 	{ 6, alc885_mb5_ch6_init },
7225 };
7226 
7227 #define alc885_macmini3_6ch_modes	alc885_mb5_6ch_modes
7228 
7229 /*
7230  * 2ch mode
7231  */
7232 static struct hda_verb alc883_4ST_ch2_init[] = {
7233 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7234 	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7235 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7236 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7237 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7238 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7239 	{ } /* end */
7240 };
7241 
7242 /*
7243  * 4ch mode
7244  */
7245 static struct hda_verb alc883_4ST_ch4_init[] = {
7246 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7247 	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7248 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7249 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7250 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7251 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7252 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7253 	{ } /* end */
7254 };
7255 
7256 /*
7257  * 6ch mode
7258  */
7259 static struct hda_verb alc883_4ST_ch6_init[] = {
7260 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7261 	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7262 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7263 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7264 	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7265 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7266 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7267 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7268 	{ } /* end */
7269 };
7270 
7271 /*
7272  * 8ch mode
7273  */
7274 static struct hda_verb alc883_4ST_ch8_init[] = {
7275 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7276 	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7277 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7278 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7279 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7280 	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7281 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7282 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7283 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7284 	{ } /* end */
7285 };
7286 
7287 static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
7288 	{ 2, alc883_4ST_ch2_init },
7289 	{ 4, alc883_4ST_ch4_init },
7290 	{ 6, alc883_4ST_ch6_init },
7291 	{ 8, alc883_4ST_ch8_init },
7292 };
7293 
7294 
7295 /*
7296  * 2ch mode
7297  */
7298 static struct hda_verb alc883_3ST_ch2_intel_init[] = {
7299 	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7300 	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7301 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7302 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7303 	{ } /* end */
7304 };
7305 
7306 /*
7307  * 4ch mode
7308  */
7309 static struct hda_verb alc883_3ST_ch4_intel_init[] = {
7310 	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7311 	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7312 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7313 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7314 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7315 	{ } /* end */
7316 };
7317 
7318 /*
7319  * 6ch mode
7320  */
7321 static struct hda_verb alc883_3ST_ch6_intel_init[] = {
7322 	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7323 	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7324 	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
7325 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7326 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7327 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7328 	{ } /* end */
7329 };
7330 
7331 static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7332 	{ 2, alc883_3ST_ch2_intel_init },
7333 	{ 4, alc883_3ST_ch4_intel_init },
7334 	{ 6, alc883_3ST_ch6_intel_init },
7335 };
7336 
7337 /*
7338  * 2ch mode
7339  */
7340 static struct hda_verb alc889_ch2_intel_init[] = {
7341 	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7342 	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
7343 	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
7344 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
7345 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7346 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7347 	{ } /* end */
7348 };
7349 
7350 /*
7351  * 6ch mode
7352  */
7353 static struct hda_verb alc889_ch6_intel_init[] = {
7354 	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7355 	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7356 	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7357 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7358 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7359 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7360 	{ } /* end */
7361 };
7362 
7363 /*
7364  * 8ch mode
7365  */
7366 static struct hda_verb alc889_ch8_intel_init[] = {
7367 	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7368 	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7369 	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7370 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7371 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
7372 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7373 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7374 	{ } /* end */
7375 };
7376 
7377 static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7378 	{ 2, alc889_ch2_intel_init },
7379 	{ 6, alc889_ch6_intel_init },
7380 	{ 8, alc889_ch8_intel_init },
7381 };
7382 
7383 /*
7384  * 6ch mode
7385  */
7386 static struct hda_verb alc883_sixstack_ch6_init[] = {
7387 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7388 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7389 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7390 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7391 	{ } /* end */
7392 };
7393 
7394 /*
7395  * 8ch mode
7396  */
7397 static struct hda_verb alc883_sixstack_ch8_init[] = {
7398 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7399 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7400 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7401 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7402 	{ } /* end */
7403 };
7404 
7405 static struct hda_channel_mode alc883_sixstack_modes[2] = {
7406 	{ 6, alc883_sixstack_ch6_init },
7407 	{ 8, alc883_sixstack_ch8_init },
7408 };
7409 
7410 
7411 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7412  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7413  */
7414 static struct snd_kcontrol_new alc882_base_mixer[] = {
7415 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7416 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7417 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7418 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7419 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7420 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7421 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7422 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7423 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7424 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7425 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7426 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7427 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7428 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7429 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7430 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7431 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7432 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7433 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7434 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7435 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7436 	{ } /* end */
7437 };
7438 
7439 /* Macbook Air 2,1 same control for HP and internal Speaker */
7440 
7441 static struct snd_kcontrol_new alc885_mba21_mixer[] = {
7442       HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7443       HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
7444      { }
7445 };
7446 
7447 
7448 static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7449 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7450 	HDA_BIND_MUTE   ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7451 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7452 	HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7453 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7454 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7455 	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7456 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7457 	HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7458 	HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
7459 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7460 	{ } /* end */
7461 };
7462 
7463 static struct snd_kcontrol_new alc885_mb5_mixer[] = {
7464 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7465 	HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7466 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7467 	HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7468 	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7469 	HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7470 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7471 	HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7472 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7473 	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7474 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7475 	HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7476 	HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7477 	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7478 	{ } /* end */
7479 };
7480 
7481 static struct snd_kcontrol_new alc885_macmini3_mixer[] = {
7482 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7483 	HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7484 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7485 	HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7486 	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7487 	HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7488 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7489 	HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7490 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7491 	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
7492 	HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7493 	{ } /* end */
7494 };
7495 
7496 static struct snd_kcontrol_new alc885_imac91_mixer[] = {
7497 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7498 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7499 	{ } /* end */
7500 };
7501 
7502 
7503 static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7504 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7505 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7506 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7507 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7508 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7509 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7510 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7511 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7512 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7513 	{ } /* end */
7514 };
7515 
7516 static struct snd_kcontrol_new alc882_targa_mixer[] = {
7517 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7518 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7519 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7520 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7521 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7522 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7523 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7524 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7525 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7526 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7527 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7528 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7529 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7530 	{ } /* end */
7531 };
7532 
7533 /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7534  *                 Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7535  */
7536 static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7537 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7538 	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7539 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7540 	HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7541 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7542 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7543 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7544 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7545 	HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7546 	HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7547 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7548 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7549 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7550 	{ } /* end */
7551 };
7552 
7553 static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7554 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7555 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7556 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7557 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7558 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7559 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7560 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7561 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7562 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7563 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7564 	{ } /* end */
7565 };
7566 
7567 static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7568 	{
7569 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7570 		.name = "Channel Mode",
7571 		.info = alc_ch_mode_info,
7572 		.get = alc_ch_mode_get,
7573 		.put = alc_ch_mode_put,
7574 	},
7575 	{ } /* end */
7576 };
7577 
7578 static struct hda_verb alc882_base_init_verbs[] = {
7579 	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7580 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7581 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7582 	/* Rear mixer */
7583 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7584 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7585 	/* CLFE mixer */
7586 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7587 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7588 	/* Side mixer */
7589 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7590 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7591 
7592 	/* Front Pin: output 0 (0x0c) */
7593 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7594 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7595 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7596 	/* Rear Pin: output 1 (0x0d) */
7597 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7598 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7599 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7600 	/* CLFE Pin: output 2 (0x0e) */
7601 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7602 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7603 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7604 	/* Side Pin: output 3 (0x0f) */
7605 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7606 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7607 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7608 	/* Mic (rear) pin: input vref at 80% */
7609 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7610 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7611 	/* Front Mic pin: input vref at 80% */
7612 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7613 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7614 	/* Line In pin: input */
7615 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7616 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7617 	/* Line-2 In: Headphone output (output 0 - 0x0c) */
7618 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7619 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7620 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
7621 	/* CD pin widget for input */
7622 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7623 
7624 	/* FIXME: use matrix-type input source selection */
7625 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7626 	/* Input mixer2 */
7627 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7628 	/* Input mixer3 */
7629 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7630 	/* ADC2: mute amp left and right */
7631 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7632 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7633 	/* ADC3: mute amp left and right */
7634 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7635 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7636 
7637 	{ }
7638 };
7639 
7640 static struct hda_verb alc882_adc1_init_verbs[] = {
7641 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7642 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7643 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7644 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7645 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7646 	/* ADC1: mute amp left and right */
7647 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7648 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7649 	{ }
7650 };
7651 
7652 static struct hda_verb alc882_eapd_verbs[] = {
7653 	/* change to EAPD mode */
7654 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7655 	{0x20, AC_VERB_SET_PROC_COEF, 0x3060},
7656 	{ }
7657 };
7658 
7659 static struct hda_verb alc889_eapd_verbs[] = {
7660 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7661 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7662 	{ }
7663 };
7664 
7665 static struct hda_verb alc_hp15_unsol_verbs[] = {
7666 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7667 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7668 	{}
7669 };
7670 
7671 static struct hda_verb alc885_init_verbs[] = {
7672 	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7673 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7674 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7675 	/* Rear mixer */
7676 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7677 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7678 	/* CLFE mixer */
7679 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7680 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7681 	/* Side mixer */
7682 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7683 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7684 
7685 	/* Front HP Pin: output 0 (0x0c) */
7686 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7687 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7688 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7689 	/* Front Pin: output 0 (0x0c) */
7690 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7691 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7692 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7693 	/* Rear Pin: output 1 (0x0d) */
7694 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7695 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7696 	{0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7697 	/* CLFE Pin: output 2 (0x0e) */
7698 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7699 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7700 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7701 	/* Side Pin: output 3 (0x0f) */
7702 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7703 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7704 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7705 	/* Mic (rear) pin: input vref at 80% */
7706 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7707 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7708 	/* Front Mic pin: input vref at 80% */
7709 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7710 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7711 	/* Line In pin: input */
7712 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7713 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7714 
7715 	/* Mixer elements: 0x18, , 0x1a, 0x1b */
7716 	/* Input mixer1 */
7717 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7718 	/* Input mixer2 */
7719 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7720 	/* Input mixer3 */
7721 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7722 	/* ADC2: mute amp left and right */
7723 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7724 	/* ADC3: mute amp left and right */
7725 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7726 
7727 	{ }
7728 };
7729 
7730 static struct hda_verb alc885_init_input_verbs[] = {
7731 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7732 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7733 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7734 	{ }
7735 };
7736 
7737 
7738 /* Unmute Selector 24h and set the default input to front mic */
7739 static struct hda_verb alc889_init_input_verbs[] = {
7740 	{0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7741 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7742 	{ }
7743 };
7744 
7745 
7746 #define alc883_init_verbs	alc882_base_init_verbs
7747 
7748 /* Mac Pro test */
7749 static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7750 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7751 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7752 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7753 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7754 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
7755 	/* FIXME: this looks suspicious...
7756 	HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
7757 	HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
7758 	*/
7759 	{ } /* end */
7760 };
7761 
7762 static struct hda_verb alc882_macpro_init_verbs[] = {
7763 	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7764 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7765 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7766 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7767 	/* Front Pin: output 0 (0x0c) */
7768 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7769 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7770 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7771 	/* Front Mic pin: input vref at 80% */
7772 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7773 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7774 	/* Speaker:  output */
7775 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7776 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7777 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7778 	/* Headphone output (output 0 - 0x0c) */
7779 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7780 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7781 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7782 
7783 	/* FIXME: use matrix-type input source selection */
7784 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7785 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7786 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7787 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7788 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7789 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7790 	/* Input mixer2 */
7791 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7792 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7793 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7794 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7795 	/* Input mixer3 */
7796 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7797 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7798 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7799 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7800 	/* ADC1: mute amp left and right */
7801 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7802 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7803 	/* ADC2: mute amp left and right */
7804 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7805 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7806 	/* ADC3: mute amp left and right */
7807 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7808 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7809 
7810 	{ }
7811 };
7812 
7813 /* Macbook 5,1 */
7814 static struct hda_verb alc885_mb5_init_verbs[] = {
7815 	/* DACs */
7816 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7817 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7818 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7819 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7820 	/* Front mixer */
7821 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7822 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7823 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7824 	/* Surround mixer */
7825 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7826 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7827 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7828 	/* LFE mixer */
7829 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7830 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7831 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7832 	/* HP mixer */
7833 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7834 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7835 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7836 	/* Front Pin (0x0c) */
7837 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7838 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7839 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7840 	/* LFE Pin (0x0e) */
7841 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7842 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7843 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7844 	/* HP Pin (0x0f) */
7845 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7846 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7847 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7848 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7849 	/* Front Mic pin: input vref at 80% */
7850 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7851 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7852 	/* Line In pin */
7853 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7854 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7855 
7856 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7857 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7858 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7859 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7860 	{ }
7861 };
7862 
7863 /* Macmini 3,1 */
7864 static struct hda_verb alc885_macmini3_init_verbs[] = {
7865 	/* DACs */
7866 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7867 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7868 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7869 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7870 	/* Front mixer */
7871 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7872 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7873 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7874 	/* Surround mixer */
7875 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7876 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7877 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7878 	/* LFE mixer */
7879 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7880 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7881 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7882 	/* HP mixer */
7883 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7884 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7885 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7886 	/* Front Pin (0x0c) */
7887 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7888 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7889 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7890 	/* LFE Pin (0x0e) */
7891 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7892 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7893 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7894 	/* HP Pin (0x0f) */
7895 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7896 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7897 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7898 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7899 	/* Line In pin */
7900 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7901 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7902 
7903 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7904 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7905 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7906 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7907 	{ }
7908 };
7909 
7910 
7911 static struct hda_verb alc885_mba21_init_verbs[] = {
7912 	/*Internal and HP Speaker Mixer*/
7913 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7914 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7915 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7916 	/*Internal Speaker Pin (0x0c)*/
7917 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
7918 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7919 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7920 	/* HP Pin: output 0 (0x0e) */
7921 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7922 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7923 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7924 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
7925 	/* Line in (is hp when jack connected)*/
7926 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
7927 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7928 
7929 	{ }
7930  };
7931 
7932 
7933 /* Macbook Pro rev3 */
7934 static struct hda_verb alc885_mbp3_init_verbs[] = {
7935 	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7936 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7937 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7938 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7939 	/* Rear mixer */
7940 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7941 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7942 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7943 	/* HP mixer */
7944 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7945 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7946 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7947 	/* Front Pin: output 0 (0x0c) */
7948 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7949 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7950 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7951 	/* HP Pin: output 0 (0x0e) */
7952 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7953 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7954 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
7955 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7956 	/* Mic (rear) pin: input vref at 80% */
7957 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7958 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7959 	/* Front Mic pin: input vref at 80% */
7960 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7961 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7962 	/* Line In pin: use output 1 when in LineOut mode */
7963 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7964 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7965 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7966 
7967 	/* FIXME: use matrix-type input source selection */
7968 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7969 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7970 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7971 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7972 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7973 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7974 	/* Input mixer2 */
7975 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7976 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7977 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7978 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7979 	/* Input mixer3 */
7980 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7981 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7982 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7983 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7984 	/* ADC1: mute amp left and right */
7985 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7986 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7987 	/* ADC2: mute amp left and right */
7988 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7989 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7990 	/* ADC3: mute amp left and right */
7991 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7992 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7993 
7994 	{ }
7995 };
7996 
7997 /* iMac 9,1 */
7998 static struct hda_verb alc885_imac91_init_verbs[] = {
7999 	/* Internal Speaker Pin (0x0c) */
8000 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8001 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8002 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8003 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8004 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8005 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8006 	/* HP Pin: Rear */
8007 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8008 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8009 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8010 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
8011 	/* Line in Rear */
8012 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
8013 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8014 	/* Front Mic pin: input vref at 80% */
8015 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8016 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8017 	/* Rear mixer */
8018 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8019 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8020 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8021 	/* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
8022 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8023 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8024 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8025 	/* 0x24 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8026 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8027 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8028 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8029 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8030 	/* 0x23 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8031 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8032 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8033 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8034 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8035 	/* 0x22 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8036 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8037 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8038 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8039 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8040 	/* 0x07 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8041 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8042 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8043 	/* 0x08 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8044 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8045 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8046 	/* 0x09 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8047 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8048 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8049 	{ }
8050 };
8051 
8052 /* iMac 24 mixer. */
8053 static struct snd_kcontrol_new alc885_imac24_mixer[] = {
8054 	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8055 	HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
8056 	{ } /* end */
8057 };
8058 
8059 /* iMac 24 init verbs. */
8060 static struct hda_verb alc885_imac24_init_verbs[] = {
8061 	/* Internal speakers: output 0 (0x0c) */
8062 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8063 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8064 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8065 	/* Internal speakers: output 0 (0x0c) */
8066 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8067 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8068 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8069 	/* Headphone: output 0 (0x0c) */
8070 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8071 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8072 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8073 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8074 	/* Front Mic: input vref at 80% */
8075 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8076 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8077 	{ }
8078 };
8079 
8080 /* Toggle speaker-output according to the hp-jack state */
8081 static void alc885_imac24_setup(struct hda_codec *codec)
8082 {
8083 	struct alc_spec *spec = codec->spec;
8084 
8085 	spec->autocfg.hp_pins[0] = 0x14;
8086 	spec->autocfg.speaker_pins[0] = 0x18;
8087 	spec->autocfg.speaker_pins[1] = 0x1a;
8088 }
8089 
8090 #define alc885_mb5_setup	alc885_imac24_setup
8091 #define alc885_macmini3_setup	alc885_imac24_setup
8092 
8093 /* Macbook Air 2,1 */
8094 static void alc885_mba21_setup(struct hda_codec *codec)
8095 {
8096        struct alc_spec *spec = codec->spec;
8097 
8098        spec->autocfg.hp_pins[0] = 0x14;
8099        spec->autocfg.speaker_pins[0] = 0x18;
8100 }
8101 
8102 
8103 
8104 static void alc885_mbp3_setup(struct hda_codec *codec)
8105 {
8106 	struct alc_spec *spec = codec->spec;
8107 
8108 	spec->autocfg.hp_pins[0] = 0x15;
8109 	spec->autocfg.speaker_pins[0] = 0x14;
8110 }
8111 
8112 static void alc885_imac91_setup(struct hda_codec *codec)
8113 {
8114 	struct alc_spec *spec = codec->spec;
8115 
8116 	spec->autocfg.hp_pins[0] = 0x14;
8117 	spec->autocfg.speaker_pins[0] = 0x18;
8118 	spec->autocfg.speaker_pins[1] = 0x1a;
8119 }
8120 
8121 static struct hda_verb alc882_targa_verbs[] = {
8122 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8123 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8124 
8125 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8126 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8127 
8128 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8129 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8130 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8131 
8132 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8133 	{ } /* end */
8134 };
8135 
8136 /* toggle speaker-output according to the hp-jack state */
8137 static void alc882_targa_automute(struct hda_codec *codec)
8138 {
8139 	struct alc_spec *spec = codec->spec;
8140 	alc_automute_amp(codec);
8141 	snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
8142 				  spec->jack_present ? 1 : 3);
8143 }
8144 
8145 static void alc882_targa_setup(struct hda_codec *codec)
8146 {
8147 	struct alc_spec *spec = codec->spec;
8148 
8149 	spec->autocfg.hp_pins[0] = 0x14;
8150 	spec->autocfg.speaker_pins[0] = 0x1b;
8151 }
8152 
8153 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
8154 {
8155 	if ((res >> 26) == ALC880_HP_EVENT)
8156 		alc882_targa_automute(codec);
8157 }
8158 
8159 static struct hda_verb alc882_asus_a7j_verbs[] = {
8160 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8161 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8162 
8163 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8164 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8165 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8166 
8167 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8168 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8169 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8170 
8171 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8172 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8173 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8174 	{ } /* end */
8175 };
8176 
8177 static struct hda_verb alc882_asus_a7m_verbs[] = {
8178 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8179 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8180 
8181 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8182 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8183 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8184 
8185 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8186 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8187 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8188 
8189 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8190 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8191 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8192  	{ } /* end */
8193 };
8194 
8195 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
8196 {
8197 	unsigned int gpiostate, gpiomask, gpiodir;
8198 
8199 	gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
8200 				       AC_VERB_GET_GPIO_DATA, 0);
8201 
8202 	if (!muted)
8203 		gpiostate |= (1 << pin);
8204 	else
8205 		gpiostate &= ~(1 << pin);
8206 
8207 	gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
8208 				      AC_VERB_GET_GPIO_MASK, 0);
8209 	gpiomask |= (1 << pin);
8210 
8211 	gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
8212 				     AC_VERB_GET_GPIO_DIRECTION, 0);
8213 	gpiodir |= (1 << pin);
8214 
8215 
8216 	snd_hda_codec_write(codec, codec->afg, 0,
8217 			    AC_VERB_SET_GPIO_MASK, gpiomask);
8218 	snd_hda_codec_write(codec, codec->afg, 0,
8219 			    AC_VERB_SET_GPIO_DIRECTION, gpiodir);
8220 
8221 	msleep(1);
8222 
8223 	snd_hda_codec_write(codec, codec->afg, 0,
8224 			    AC_VERB_SET_GPIO_DATA, gpiostate);
8225 }
8226 
8227 /* set up GPIO at initialization */
8228 static void alc885_macpro_init_hook(struct hda_codec *codec)
8229 {
8230 	alc882_gpio_mute(codec, 0, 0);
8231 	alc882_gpio_mute(codec, 1, 0);
8232 }
8233 
8234 /* set up GPIO and update auto-muting at initialization */
8235 static void alc885_imac24_init_hook(struct hda_codec *codec)
8236 {
8237 	alc885_macpro_init_hook(codec);
8238 	alc_automute_amp(codec);
8239 }
8240 
8241 /*
8242  * generic initialization of ADC, input mixers and output mixers
8243  */
8244 static struct hda_verb alc883_auto_init_verbs[] = {
8245 	/*
8246 	 * Unmute ADC0-2 and set the default input to mic-in
8247 	 */
8248 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8249 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8250 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8251 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8252 
8253 	/*
8254 	 * Set up output mixers (0x0c - 0x0f)
8255 	 */
8256 	/* set vol=0 to output mixers */
8257 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8258 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8259 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8260 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8261 	/* set up input amps for analog loopback */
8262 	/* Amp Indices: DAC = 0, mixer = 1 */
8263 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8264 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8265 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8266 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8267 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8268 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8269 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8270 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8271 	{0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8272 	{0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8273 
8274 	/* FIXME: use matrix-type input source selection */
8275 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8276 	/* Input mixer2 */
8277 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8278 	/* Input mixer3 */
8279 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8280 	{ }
8281 };
8282 
8283 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
8284 static struct hda_verb alc889A_mb31_ch2_init[] = {
8285 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8286 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8287 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8288 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8289 	{ } /* end */
8290 };
8291 
8292 /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
8293 static struct hda_verb alc889A_mb31_ch4_init[] = {
8294 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8295 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8296 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8297 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8298 	{ } /* end */
8299 };
8300 
8301 /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
8302 static struct hda_verb alc889A_mb31_ch5_init[] = {
8303 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as rear */
8304 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8305 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8306 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8307 	{ } /* end */
8308 };
8309 
8310 /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
8311 static struct hda_verb alc889A_mb31_ch6_init[] = {
8312 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as front */
8313 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Subwoofer off */
8314 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8315 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8316 	{ } /* end */
8317 };
8318 
8319 static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
8320 	{ 2, alc889A_mb31_ch2_init },
8321 	{ 4, alc889A_mb31_ch4_init },
8322 	{ 5, alc889A_mb31_ch5_init },
8323 	{ 6, alc889A_mb31_ch6_init },
8324 };
8325 
8326 static struct hda_verb alc883_medion_eapd_verbs[] = {
8327         /* eanable EAPD on medion laptop */
8328 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8329 	{0x20, AC_VERB_SET_PROC_COEF, 0x3070},
8330 	{ }
8331 };
8332 
8333 #define alc883_base_mixer	alc882_base_mixer
8334 
8335 static struct snd_kcontrol_new alc883_mitac_mixer[] = {
8336 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8337 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8338 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8339 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8340 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8341 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8342 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8343 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8344 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8345 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8346 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8347 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8348 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8349 	{ } /* end */
8350 };
8351 
8352 static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
8353 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8354 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8355 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8356 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8357 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8358 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8359 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8360 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8361 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8362 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8363 	{ } /* end */
8364 };
8365 
8366 static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8367 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8368 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8369 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8370 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8371 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8372 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8373 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8374 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8375 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8376 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8377 	{ } /* end */
8378 };
8379 
8380 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8381 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8382 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8383 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8384 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8385 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8386 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8387 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8388 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8389 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8390 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8391 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8392 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8393 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8394 	{ } /* end */
8395 };
8396 
8397 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8398 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8399 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8400 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8401 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8402 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8403 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8404 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8405 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8406 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8407 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8408 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8409 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8410 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8411 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8412 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8413 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8414 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8415 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8416 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8417 	{ } /* end */
8418 };
8419 
8420 static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8421 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8422 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8423 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8424 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8425 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8426 			      HDA_OUTPUT),
8427 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8428 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8429 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8430 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8431 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8432 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8433 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8434 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8435 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8436 	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8437 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8438 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8439 	HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8440 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8441 	{ } /* end */
8442 };
8443 
8444 static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8445 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8446 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8447 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8448 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8449 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8450 			      HDA_OUTPUT),
8451 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8452 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8453 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8454 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8455 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
8456 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8457 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8458 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8459 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
8460 	HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
8461 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
8462 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8463 	HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8464 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8465 	{ } /* end */
8466 };
8467 
8468 static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
8469 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8470 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8471 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8472 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8473 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8474 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8475 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8476 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8477 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8478 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8479 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8480 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8481 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8482 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8483 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8484 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8485 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8486 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8487 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8488 	{ } /* end */
8489 };
8490 
8491 static struct snd_kcontrol_new alc883_targa_mixer[] = {
8492 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8493 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8494 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8495 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8496 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8497 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8498 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8499 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8500 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8501 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8502 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8503 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8504 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8505 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8506 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8507 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8508 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8509 	{ } /* end */
8510 };
8511 
8512 static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
8513 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8514 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8515 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8516 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8517 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8518 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8519 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8520 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8521 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8522 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8523 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8524 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8525 	{ } /* end */
8526 };
8527 
8528 static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
8529 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8530 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8531 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8532 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8533 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8534 	{ } /* end */
8535 };
8536 
8537 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
8538 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8539 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8540 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8541 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8542 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8543 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8544 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8545 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8546 	{ } /* end */
8547 };
8548 
8549 static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
8550 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8551 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
8552 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8553 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8554 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8555 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8556 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8557 	HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8558 	HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8559 	{ } /* end */
8560 };
8561 
8562 static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8563 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8564 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8565 	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8566 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8567 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8568 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8569 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8570 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8571 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8572 	{ } /* end */
8573 };
8574 
8575 static struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = {
8576 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8577 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8578 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8579 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT),
8580 	HDA_CODEC_VOLUME("Line Playback Volume", 0x08, 0x0, HDA_INPUT),
8581 	HDA_CODEC_MUTE("Line Playback Switch", 0x08, 0x0, HDA_INPUT),
8582 	{ } /* end */
8583 };
8584 
8585 static struct hda_verb alc883_medion_wim2160_verbs[] = {
8586 	/* Unmute front mixer */
8587 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8588 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8589 
8590 	/* Set speaker pin to front mixer */
8591 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8592 
8593 	/* Init headphone pin */
8594 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8595 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8596 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8597 	{0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8598 
8599 	{ } /* end */
8600 };
8601 
8602 /* toggle speaker-output according to the hp-jack state */
8603 static void alc883_medion_wim2160_setup(struct hda_codec *codec)
8604 {
8605 	struct alc_spec *spec = codec->spec;
8606 
8607 	spec->autocfg.hp_pins[0] = 0x1a;
8608 	spec->autocfg.speaker_pins[0] = 0x15;
8609 }
8610 
8611 static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
8612 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8613 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8614 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8615 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8616 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8617 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8618 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8619 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8620 	{ } /* end */
8621 };
8622 
8623 static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8624 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8625 	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8626 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8627 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8628 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8629 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8630 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8631 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8632 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8633 	{ } /* end */
8634 };
8635 
8636 static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8637 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8638 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8639 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8640 	HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8641 	HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8642 						0x0d, 1, 0x0, HDA_OUTPUT),
8643 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8644 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8645 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8646 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8647 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8648 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8649 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8650 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8651 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8652 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8653 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8654 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8655 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8656 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8657 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8658 	{ } /* end */
8659 };
8660 
8661 static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8662 	/* Output mixers */
8663 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8664 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8665 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8666 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8667 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8668 		HDA_OUTPUT),
8669 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8670 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8671 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8672 	/* Output switches */
8673 	HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8674 	HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8675 	HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8676 	/* Boost mixers */
8677 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8678 	HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8679 	/* Input mixers */
8680 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8681 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8682 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8683 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8684 	{ } /* end */
8685 };
8686 
8687 static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8688 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8689 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8690 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8691 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8692 	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8693 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8694 	{ } /* end */
8695 };
8696 
8697 static struct hda_bind_ctls alc883_bind_cap_vol = {
8698 	.ops = &snd_hda_bind_vol,
8699 	.values = {
8700 		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8701 		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8702 		0
8703 	},
8704 };
8705 
8706 static struct hda_bind_ctls alc883_bind_cap_switch = {
8707 	.ops = &snd_hda_bind_sw,
8708 	.values = {
8709 		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8710 		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8711 		0
8712 	},
8713 };
8714 
8715 static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8716 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8717 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8718 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8719 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8720 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8721 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8722 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8723 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8724 	{ } /* end */
8725 };
8726 
8727 static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8728 	HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8729 	HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8730 	{
8731 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8732 		/* .name = "Capture Source", */
8733 		.name = "Input Source",
8734 		.count = 1,
8735 		.info = alc_mux_enum_info,
8736 		.get = alc_mux_enum_get,
8737 		.put = alc_mux_enum_put,
8738 	},
8739 	{ } /* end */
8740 };
8741 
8742 static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8743 	{
8744 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8745 		.name = "Channel Mode",
8746 		.info = alc_ch_mode_info,
8747 		.get = alc_ch_mode_get,
8748 		.put = alc_ch_mode_put,
8749 	},
8750 	{ } /* end */
8751 };
8752 
8753 /* toggle speaker-output according to the hp-jack state */
8754 static void alc883_mitac_setup(struct hda_codec *codec)
8755 {
8756 	struct alc_spec *spec = codec->spec;
8757 
8758 	spec->autocfg.hp_pins[0] = 0x15;
8759 	spec->autocfg.speaker_pins[0] = 0x14;
8760 	spec->autocfg.speaker_pins[1] = 0x17;
8761 }
8762 
8763 /* auto-toggle front mic */
8764 /*
8765 static void alc883_mitac_mic_automute(struct hda_codec *codec)
8766 {
8767 	unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0;
8768 
8769 	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8770 }
8771 */
8772 
8773 static struct hda_verb alc883_mitac_verbs[] = {
8774 	/* HP */
8775 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8776 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8777 	/* Subwoofer */
8778 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8779 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8780 
8781 	/* enable unsolicited event */
8782 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8783 	/* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8784 
8785 	{ } /* end */
8786 };
8787 
8788 static struct hda_verb alc883_clevo_m540r_verbs[] = {
8789 	/* HP */
8790 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8791 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8792 	/* Int speaker */
8793 	/*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8794 
8795 	/* enable unsolicited event */
8796 	/*
8797 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8798 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8799 	*/
8800 
8801 	{ } /* end */
8802 };
8803 
8804 static struct hda_verb alc883_clevo_m720_verbs[] = {
8805 	/* HP */
8806 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8807 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8808 	/* Int speaker */
8809 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
8810 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8811 
8812 	/* enable unsolicited event */
8813 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8814 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8815 
8816 	{ } /* end */
8817 };
8818 
8819 static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
8820 	/* HP */
8821 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8822 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8823 	/* Subwoofer */
8824 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8825 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8826 
8827 	/* enable unsolicited event */
8828 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8829 
8830 	{ } /* end */
8831 };
8832 
8833 static struct hda_verb alc883_targa_verbs[] = {
8834 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8835 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8836 
8837 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8838 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8839 
8840 /* Connect Line-Out side jack (SPDIF) to Side */
8841 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8842 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8843 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8844 /* Connect Mic jack to CLFE */
8845 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8846 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8847 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
8848 /* Connect Line-in jack to Surround */
8849 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8850 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8851 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8852 /* Connect HP out jack to Front */
8853 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8854 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8855 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8856 
8857 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8858 
8859 	{ } /* end */
8860 };
8861 
8862 static struct hda_verb alc883_lenovo_101e_verbs[] = {
8863 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8864 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
8865         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
8866 	{ } /* end */
8867 };
8868 
8869 static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
8870         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8871 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8872         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8873         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8874 	{ } /* end */
8875 };
8876 
8877 static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
8878 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8879 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8880 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8881 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
8882 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT    | AC_USRSP_EN},
8883 	{ } /* end */
8884 };
8885 
8886 static struct hda_verb alc883_haier_w66_verbs[] = {
8887 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8888 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8889 
8890 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8891 
8892 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8893 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8894 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8895 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8896 	{ } /* end */
8897 };
8898 
8899 static struct hda_verb alc888_lenovo_sky_verbs[] = {
8900 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8901 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8902 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8903 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8904 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8905 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8906 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8907 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8908 	{ } /* end */
8909 };
8910 
8911 static struct hda_verb alc888_6st_dell_verbs[] = {
8912 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8913 	{ }
8914 };
8915 
8916 static struct hda_verb alc883_vaiott_verbs[] = {
8917 	/* HP */
8918 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8919 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8920 
8921 	/* enable unsolicited event */
8922 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8923 
8924 	{ } /* end */
8925 };
8926 
8927 static void alc888_3st_hp_setup(struct hda_codec *codec)
8928 {
8929 	struct alc_spec *spec = codec->spec;
8930 
8931 	spec->autocfg.hp_pins[0] = 0x1b;
8932 	spec->autocfg.speaker_pins[0] = 0x14;
8933 	spec->autocfg.speaker_pins[1] = 0x16;
8934 	spec->autocfg.speaker_pins[2] = 0x18;
8935 }
8936 
8937 static struct hda_verb alc888_3st_hp_verbs[] = {
8938 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Front: output 0 (0x0c) */
8939 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Rear : output 1 (0x0d) */
8940 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},	/* CLFE : output 2 (0x0e) */
8941 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8942 	{ } /* end */
8943 };
8944 
8945 /*
8946  * 2ch mode
8947  */
8948 static struct hda_verb alc888_3st_hp_2ch_init[] = {
8949 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8950 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8951 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
8952 	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8953 	{ } /* end */
8954 };
8955 
8956 /*
8957  * 4ch mode
8958  */
8959 static struct hda_verb alc888_3st_hp_4ch_init[] = {
8960 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8961 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8962 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8963 	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8964 	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8965 	{ } /* end */
8966 };
8967 
8968 /*
8969  * 6ch mode
8970  */
8971 static struct hda_verb alc888_3st_hp_6ch_init[] = {
8972 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8973 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8974 	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
8975 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8976 	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8977 	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8978 	{ } /* end */
8979 };
8980 
8981 static struct hda_channel_mode alc888_3st_hp_modes[3] = {
8982 	{ 2, alc888_3st_hp_2ch_init },
8983 	{ 4, alc888_3st_hp_4ch_init },
8984 	{ 6, alc888_3st_hp_6ch_init },
8985 };
8986 
8987 /* toggle front-jack and RCA according to the hp-jack state */
8988 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
8989 {
8990  	unsigned int present = snd_hda_jack_detect(codec, 0x1b);
8991 
8992 	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8993 				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8994 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8995 				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8996 }
8997 
8998 /* toggle RCA according to the front-jack state */
8999 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
9000 {
9001  	unsigned int present = snd_hda_jack_detect(codec, 0x14);
9002 
9003 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9004 				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9005 }
9006 
9007 static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
9008 					     unsigned int res)
9009 {
9010 	if ((res >> 26) == ALC880_HP_EVENT)
9011 		alc888_lenovo_ms7195_front_automute(codec);
9012 	if ((res >> 26) == ALC880_FRONT_EVENT)
9013 		alc888_lenovo_ms7195_rca_automute(codec);
9014 }
9015 
9016 static struct hda_verb alc883_medion_md2_verbs[] = {
9017 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9018 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9019 
9020 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9021 
9022 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9023 	{ } /* end */
9024 };
9025 
9026 /* toggle speaker-output according to the hp-jack state */
9027 static void alc883_medion_md2_setup(struct hda_codec *codec)
9028 {
9029 	struct alc_spec *spec = codec->spec;
9030 
9031 	spec->autocfg.hp_pins[0] = 0x14;
9032 	spec->autocfg.speaker_pins[0] = 0x15;
9033 }
9034 
9035 /* toggle speaker-output according to the hp-jack state */
9036 #define alc883_targa_init_hook		alc882_targa_init_hook
9037 #define alc883_targa_unsol_event	alc882_targa_unsol_event
9038 
9039 static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
9040 {
9041 	unsigned int present;
9042 
9043 	present = snd_hda_jack_detect(codec, 0x18);
9044 	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
9045 				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9046 }
9047 
9048 static void alc883_clevo_m720_setup(struct hda_codec *codec)
9049 {
9050 	struct alc_spec *spec = codec->spec;
9051 
9052 	spec->autocfg.hp_pins[0] = 0x15;
9053 	spec->autocfg.speaker_pins[0] = 0x14;
9054 }
9055 
9056 static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
9057 {
9058 	alc_automute_amp(codec);
9059 	alc883_clevo_m720_mic_automute(codec);
9060 }
9061 
9062 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
9063 					   unsigned int res)
9064 {
9065 	switch (res >> 26) {
9066 	case ALC880_MIC_EVENT:
9067 		alc883_clevo_m720_mic_automute(codec);
9068 		break;
9069 	default:
9070 		alc_automute_amp_unsol_event(codec, res);
9071 		break;
9072 	}
9073 }
9074 
9075 /* toggle speaker-output according to the hp-jack state */
9076 static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
9077 {
9078 	struct alc_spec *spec = codec->spec;
9079 
9080 	spec->autocfg.hp_pins[0] = 0x14;
9081 	spec->autocfg.speaker_pins[0] = 0x15;
9082 }
9083 
9084 static void alc883_haier_w66_setup(struct hda_codec *codec)
9085 {
9086 	struct alc_spec *spec = codec->spec;
9087 
9088 	spec->autocfg.hp_pins[0] = 0x1b;
9089 	spec->autocfg.speaker_pins[0] = 0x14;
9090 }
9091 
9092 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
9093 {
9094 	int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
9095 
9096 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9097 				 HDA_AMP_MUTE, bits);
9098 }
9099 
9100 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
9101 {
9102 	int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
9103 
9104 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9105 				 HDA_AMP_MUTE, bits);
9106 	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9107 				 HDA_AMP_MUTE, bits);
9108 }
9109 
9110 static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
9111 					   unsigned int res)
9112 {
9113 	if ((res >> 26) == ALC880_HP_EVENT)
9114 		alc883_lenovo_101e_all_automute(codec);
9115 	if ((res >> 26) == ALC880_FRONT_EVENT)
9116 		alc883_lenovo_101e_ispeaker_automute(codec);
9117 }
9118 
9119 /* toggle speaker-output according to the hp-jack state */
9120 static void alc883_acer_aspire_setup(struct hda_codec *codec)
9121 {
9122 	struct alc_spec *spec = codec->spec;
9123 
9124 	spec->autocfg.hp_pins[0] = 0x14;
9125 	spec->autocfg.speaker_pins[0] = 0x15;
9126 	spec->autocfg.speaker_pins[1] = 0x16;
9127 }
9128 
9129 static struct hda_verb alc883_acer_eapd_verbs[] = {
9130 	/* HP Pin: output 0 (0x0c) */
9131 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9132 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9133 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
9134 	/* Front Pin: output 0 (0x0c) */
9135 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9136 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9137 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9138 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
9139         /* eanable EAPD on medion laptop */
9140 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
9141 	{0x20, AC_VERB_SET_PROC_COEF, 0x3050},
9142 	/* enable unsolicited event */
9143 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9144 	{ }
9145 };
9146 
9147 static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
9148 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9149 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
9150 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9151 	{ } /* end */
9152 };
9153 
9154 static void alc888_6st_dell_setup(struct hda_codec *codec)
9155 {
9156 	struct alc_spec *spec = codec->spec;
9157 
9158 	spec->autocfg.hp_pins[0] = 0x1b;
9159 	spec->autocfg.speaker_pins[0] = 0x14;
9160 	spec->autocfg.speaker_pins[1] = 0x15;
9161 	spec->autocfg.speaker_pins[2] = 0x16;
9162 	spec->autocfg.speaker_pins[3] = 0x17;
9163 }
9164 
9165 static void alc888_lenovo_sky_setup(struct hda_codec *codec)
9166 {
9167 	struct alc_spec *spec = codec->spec;
9168 
9169 	spec->autocfg.hp_pins[0] = 0x1b;
9170 	spec->autocfg.speaker_pins[0] = 0x14;
9171 	spec->autocfg.speaker_pins[1] = 0x15;
9172 	spec->autocfg.speaker_pins[2] = 0x16;
9173 	spec->autocfg.speaker_pins[3] = 0x17;
9174 	spec->autocfg.speaker_pins[4] = 0x1a;
9175 }
9176 
9177 static void alc883_vaiott_setup(struct hda_codec *codec)
9178 {
9179 	struct alc_spec *spec = codec->spec;
9180 
9181 	spec->autocfg.hp_pins[0] = 0x15;
9182 	spec->autocfg.speaker_pins[0] = 0x14;
9183 	spec->autocfg.speaker_pins[1] = 0x17;
9184 }
9185 
9186 static struct hda_verb alc888_asus_m90v_verbs[] = {
9187 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9188 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9189 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9190 	/* enable unsolicited event */
9191 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9192 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9193 	{ } /* end */
9194 };
9195 
9196 static void alc883_mode2_setup(struct hda_codec *codec)
9197 {
9198 	struct alc_spec *spec = codec->spec;
9199 
9200 	spec->autocfg.hp_pins[0] = 0x1b;
9201 	spec->autocfg.speaker_pins[0] = 0x14;
9202 	spec->autocfg.speaker_pins[1] = 0x15;
9203 	spec->autocfg.speaker_pins[2] = 0x16;
9204 	spec->ext_mic.pin = 0x18;
9205 	spec->int_mic.pin = 0x19;
9206 	spec->ext_mic.mux_idx = 0;
9207 	spec->int_mic.mux_idx = 1;
9208 	spec->auto_mic = 1;
9209 }
9210 
9211 static struct hda_verb alc888_asus_eee1601_verbs[] = {
9212 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9213 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9214 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9215 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9216 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
9217 	{0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
9218 	{0x20, AC_VERB_SET_PROC_COEF,  0x0838},
9219 	/* enable unsolicited event */
9220 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9221 	{ } /* end */
9222 };
9223 
9224 static void alc883_eee1601_inithook(struct hda_codec *codec)
9225 {
9226 	struct alc_spec *spec = codec->spec;
9227 
9228 	spec->autocfg.hp_pins[0] = 0x14;
9229 	spec->autocfg.speaker_pins[0] = 0x1b;
9230 	alc_automute_pin(codec);
9231 }
9232 
9233 static struct hda_verb alc889A_mb31_verbs[] = {
9234 	/* Init rear pin (used as headphone output) */
9235 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},    /* Apple Headphones */
9236 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},           /* Connect to front */
9237 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9238 	/* Init line pin (used as output in 4ch and 6ch mode) */
9239 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},           /* Connect to CLFE */
9240 	/* Init line 2 pin (used as headphone out by default) */
9241 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},  /* Use as input */
9242 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
9243 	{ } /* end */
9244 };
9245 
9246 /* Mute speakers according to the headphone jack state */
9247 static void alc889A_mb31_automute(struct hda_codec *codec)
9248 {
9249 	unsigned int present;
9250 
9251 	/* Mute only in 2ch or 4ch mode */
9252 	if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
9253 	    == 0x00) {
9254 		present = snd_hda_jack_detect(codec, 0x15);
9255 		snd_hda_codec_amp_stereo(codec, 0x14,  HDA_OUTPUT, 0,
9256 			HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9257 		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
9258 			HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9259 	}
9260 }
9261 
9262 static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
9263 {
9264 	if ((res >> 26) == ALC880_HP_EVENT)
9265 		alc889A_mb31_automute(codec);
9266 }
9267 
9268 
9269 #ifdef CONFIG_SND_HDA_POWER_SAVE
9270 #define alc882_loopbacks	alc880_loopbacks
9271 #endif
9272 
9273 /* pcm configuration: identical with ALC880 */
9274 #define alc882_pcm_analog_playback	alc880_pcm_analog_playback
9275 #define alc882_pcm_analog_capture	alc880_pcm_analog_capture
9276 #define alc882_pcm_digital_playback	alc880_pcm_digital_playback
9277 #define alc882_pcm_digital_capture	alc880_pcm_digital_capture
9278 
9279 static hda_nid_t alc883_slave_dig_outs[] = {
9280 	ALC1200_DIGOUT_NID, 0,
9281 };
9282 
9283 static hda_nid_t alc1200_slave_dig_outs[] = {
9284 	ALC883_DIGOUT_NID, 0,
9285 };
9286 
9287 /*
9288  * configuration and preset
9289  */
9290 static const char *alc882_models[ALC882_MODEL_LAST] = {
9291 	[ALC882_3ST_DIG]	= "3stack-dig",
9292 	[ALC882_6ST_DIG]	= "6stack-dig",
9293 	[ALC882_ARIMA]		= "arima",
9294 	[ALC882_W2JC]		= "w2jc",
9295 	[ALC882_TARGA]		= "targa",
9296 	[ALC882_ASUS_A7J]	= "asus-a7j",
9297 	[ALC882_ASUS_A7M]	= "asus-a7m",
9298 	[ALC885_MACPRO]		= "macpro",
9299 	[ALC885_MB5]		= "mb5",
9300 	[ALC885_MACMINI3]	= "macmini3",
9301 	[ALC885_MBA21]		= "mba21",
9302 	[ALC885_MBP3]		= "mbp3",
9303 	[ALC885_IMAC24]		= "imac24",
9304 	[ALC885_IMAC91]		= "imac91",
9305 	[ALC883_3ST_2ch_DIG]	= "3stack-2ch-dig",
9306 	[ALC883_3ST_6ch_DIG]	= "3stack-6ch-dig",
9307 	[ALC883_3ST_6ch]	= "3stack-6ch",
9308 	[ALC883_6ST_DIG]	= "alc883-6stack-dig",
9309 	[ALC883_TARGA_DIG]	= "targa-dig",
9310 	[ALC883_TARGA_2ch_DIG]	= "targa-2ch-dig",
9311 	[ALC883_TARGA_8ch_DIG]	= "targa-8ch-dig",
9312 	[ALC883_ACER]		= "acer",
9313 	[ALC883_ACER_ASPIRE]	= "acer-aspire",
9314 	[ALC888_ACER_ASPIRE_4930G]	= "acer-aspire-4930g",
9315 	[ALC888_ACER_ASPIRE_6530G]	= "acer-aspire-6530g",
9316 	[ALC888_ACER_ASPIRE_8930G]	= "acer-aspire-8930g",
9317 	[ALC888_ACER_ASPIRE_7730G]	= "acer-aspire-7730g",
9318 	[ALC883_MEDION]		= "medion",
9319 	[ALC883_MEDION_MD2]	= "medion-md2",
9320 	[ALC883_MEDION_WIM2160]	= "medion-wim2160",
9321 	[ALC883_LAPTOP_EAPD]	= "laptop-eapd",
9322 	[ALC883_LENOVO_101E_2ch] = "lenovo-101e",
9323 	[ALC883_LENOVO_NB0763]	= "lenovo-nb0763",
9324 	[ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
9325 	[ALC888_LENOVO_SKY] = "lenovo-sky",
9326 	[ALC883_HAIER_W66] 	= "haier-w66",
9327 	[ALC888_3ST_HP]		= "3stack-hp",
9328 	[ALC888_6ST_DELL]	= "6stack-dell",
9329 	[ALC883_MITAC]		= "mitac",
9330 	[ALC883_CLEVO_M540R]	= "clevo-m540r",
9331 	[ALC883_CLEVO_M720]	= "clevo-m720",
9332 	[ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
9333 	[ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
9334 	[ALC883_3ST_6ch_INTEL]	= "3stack-6ch-intel",
9335 	[ALC889A_INTEL]		= "intel-alc889a",
9336 	[ALC889_INTEL]		= "intel-x58",
9337 	[ALC1200_ASUS_P5Q]	= "asus-p5q",
9338 	[ALC889A_MB31]		= "mb31",
9339 	[ALC883_SONY_VAIO_TT]	= "sony-vaio-tt",
9340 	[ALC882_AUTO]		= "auto",
9341 };
9342 
9343 static struct snd_pci_quirk alc882_cfg_tbl[] = {
9344 	SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
9345 
9346 	SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
9347 	SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
9348 	SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
9349 	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
9350 	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
9351 	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
9352 	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
9353 		ALC888_ACER_ASPIRE_4930G),
9354 	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
9355 		ALC888_ACER_ASPIRE_4930G),
9356 	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
9357 		ALC888_ACER_ASPIRE_8930G),
9358 	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
9359 		ALC888_ACER_ASPIRE_8930G),
9360 	SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
9361 	SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
9362 	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
9363 		ALC888_ACER_ASPIRE_6530G),
9364 	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
9365 		ALC888_ACER_ASPIRE_6530G),
9366 	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
9367 		ALC888_ACER_ASPIRE_7730G),
9368 	/* default Acer -- disabled as it causes more problems.
9369 	 *    model=auto should work fine now
9370 	 */
9371 	/* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
9372 
9373 	SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
9374 
9375 	SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
9376 	SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
9377 	SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
9378 	SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
9379 	SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
9380 	SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
9381 
9382 	SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
9383 	SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
9384 	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
9385 	SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
9386 	SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
9387 	SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
9388 	SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
9389 	SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
9390 	SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
9391 	SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
9392 	SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
9393 
9394 	SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
9395 	SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
9396 	SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
9397 	SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
9398 	SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
9399 	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
9400 	SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
9401 	SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
9402 	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
9403 
9404 	SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
9405 	SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
9406 	SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
9407 	SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */
9408 	SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
9409 	SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
9410 	SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
9411 	SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
9412 	SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
9413 	SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
9414 	SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
9415 	SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
9416 	SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
9417 	SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
9418 	SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
9419 	SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
9420 	SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
9421 	SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
9422 	SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG),
9423 	SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
9424 	SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
9425 	SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
9426 	SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
9427 	SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
9428 	SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
9429 	SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
9430 	SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
9431 	SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
9432 	SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG),
9433 	SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
9434 	SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
9435 
9436 	SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
9437 	SND_PCI_QUIRK(0x1558, 0x0571, "Clevo laptop M570U", ALC883_3ST_6ch_DIG),
9438 	SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
9439 	SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
9440 	SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
9441 	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
9442 	SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
9443 	/* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
9444 	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
9445 	SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
9446 		      ALC883_FUJITSU_PI2515),
9447 	SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
9448 		ALC888_FUJITSU_XA3530),
9449 	SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
9450 	SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9451 	SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9452 	SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9453 	SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
9454 	SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
9455 	SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
9456 	SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
9457 	SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
9458 
9459 	SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
9460 	SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
9461 	SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
9462 	SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
9463 	SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
9464 	SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
9465 	SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG),
9466 
9467 	{}
9468 };
9469 
9470 /* codec SSID table for Intel Mac */
9471 static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9472 	SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9473 	SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9474 	SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
9475 	SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
9476 	SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
9477 	SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
9478 	SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
9479 	SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31),
9480 	SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_ASUS_A7M),
9481 	SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3),
9482 	SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21),
9483 	SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
9484 	SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
9485 	SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
9486 	SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
9487 	SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
9488 	/* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
9489 	 * so apparently no perfect solution yet
9490 	 */
9491 	SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
9492 	SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
9493 	SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
9494 	{} /* terminator */
9495 };
9496 
9497 static struct alc_config_preset alc882_presets[] = {
9498 	[ALC882_3ST_DIG] = {
9499 		.mixers = { alc882_base_mixer },
9500 		.init_verbs = { alc882_base_init_verbs,
9501 				alc882_adc1_init_verbs },
9502 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9503 		.dac_nids = alc882_dac_nids,
9504 		.dig_out_nid = ALC882_DIGOUT_NID,
9505 		.dig_in_nid = ALC882_DIGIN_NID,
9506 		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9507 		.channel_mode = alc882_ch_modes,
9508 		.need_dac_fix = 1,
9509 		.input_mux = &alc882_capture_source,
9510 	},
9511 	[ALC882_6ST_DIG] = {
9512 		.mixers = { alc882_base_mixer, alc882_chmode_mixer },
9513 		.init_verbs = { alc882_base_init_verbs,
9514 				alc882_adc1_init_verbs },
9515 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9516 		.dac_nids = alc882_dac_nids,
9517 		.dig_out_nid = ALC882_DIGOUT_NID,
9518 		.dig_in_nid = ALC882_DIGIN_NID,
9519 		.num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9520 		.channel_mode = alc882_sixstack_modes,
9521 		.input_mux = &alc882_capture_source,
9522 	},
9523 	[ALC882_ARIMA] = {
9524 		.mixers = { alc882_base_mixer, alc882_chmode_mixer },
9525 		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9526 				alc882_eapd_verbs },
9527 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9528 		.dac_nids = alc882_dac_nids,
9529 		.num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9530 		.channel_mode = alc882_sixstack_modes,
9531 		.input_mux = &alc882_capture_source,
9532 	},
9533 	[ALC882_W2JC] = {
9534 		.mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
9535 		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9536 				alc882_eapd_verbs, alc880_gpio1_init_verbs },
9537 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9538 		.dac_nids = alc882_dac_nids,
9539 		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9540 		.channel_mode = alc880_threestack_modes,
9541 		.need_dac_fix = 1,
9542 		.input_mux = &alc882_capture_source,
9543 		.dig_out_nid = ALC882_DIGOUT_NID,
9544 	},
9545 	   [ALC885_MBA21] = {
9546 			.mixers = { alc885_mba21_mixer },
9547 			.init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
9548 			.num_dacs = 2,
9549 			.dac_nids = alc882_dac_nids,
9550 			.channel_mode = alc885_mba21_ch_modes,
9551 			.num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9552 			.input_mux = &alc882_capture_source,
9553 			.unsol_event = alc_automute_amp_unsol_event,
9554 			.setup = alc885_mba21_setup,
9555 			.init_hook = alc_automute_amp,
9556        },
9557 	[ALC885_MBP3] = {
9558 		.mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
9559 		.init_verbs = { alc885_mbp3_init_verbs,
9560 				alc880_gpio1_init_verbs },
9561 		.num_dacs = 2,
9562 		.dac_nids = alc882_dac_nids,
9563 		.hp_nid = 0x04,
9564 		.channel_mode = alc885_mbp_4ch_modes,
9565 		.num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9566 		.input_mux = &alc882_capture_source,
9567 		.dig_out_nid = ALC882_DIGOUT_NID,
9568 		.dig_in_nid = ALC882_DIGIN_NID,
9569 		.unsol_event = alc_automute_amp_unsol_event,
9570 		.setup = alc885_mbp3_setup,
9571 		.init_hook = alc_automute_amp,
9572 	},
9573 	[ALC885_MB5] = {
9574 		.mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
9575 		.init_verbs = { alc885_mb5_init_verbs,
9576 				alc880_gpio1_init_verbs },
9577 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9578 		.dac_nids = alc882_dac_nids,
9579 		.channel_mode = alc885_mb5_6ch_modes,
9580 		.num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
9581 		.input_mux = &mb5_capture_source,
9582 		.dig_out_nid = ALC882_DIGOUT_NID,
9583 		.dig_in_nid = ALC882_DIGIN_NID,
9584 		.unsol_event = alc_automute_amp_unsol_event,
9585 		.setup = alc885_mb5_setup,
9586 		.init_hook = alc_automute_amp,
9587 	},
9588 	[ALC885_MACMINI3] = {
9589 		.mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
9590 		.init_verbs = { alc885_macmini3_init_verbs,
9591 				alc880_gpio1_init_verbs },
9592 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9593 		.dac_nids = alc882_dac_nids,
9594 		.channel_mode = alc885_macmini3_6ch_modes,
9595 		.num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
9596 		.input_mux = &macmini3_capture_source,
9597 		.dig_out_nid = ALC882_DIGOUT_NID,
9598 		.dig_in_nid = ALC882_DIGIN_NID,
9599 		.unsol_event = alc_automute_amp_unsol_event,
9600 		.setup = alc885_macmini3_setup,
9601 		.init_hook = alc_automute_amp,
9602 	},
9603 	[ALC885_MACPRO] = {
9604 		.mixers = { alc882_macpro_mixer },
9605 		.init_verbs = { alc882_macpro_init_verbs },
9606 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9607 		.dac_nids = alc882_dac_nids,
9608 		.dig_out_nid = ALC882_DIGOUT_NID,
9609 		.dig_in_nid = ALC882_DIGIN_NID,
9610 		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9611 		.channel_mode = alc882_ch_modes,
9612 		.input_mux = &alc882_capture_source,
9613 		.init_hook = alc885_macpro_init_hook,
9614 	},
9615 	[ALC885_IMAC24] = {
9616 		.mixers = { alc885_imac24_mixer },
9617 		.init_verbs = { alc885_imac24_init_verbs },
9618 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9619 		.dac_nids = alc882_dac_nids,
9620 		.dig_out_nid = ALC882_DIGOUT_NID,
9621 		.dig_in_nid = ALC882_DIGIN_NID,
9622 		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9623 		.channel_mode = alc882_ch_modes,
9624 		.input_mux = &alc882_capture_source,
9625 		.unsol_event = alc_automute_amp_unsol_event,
9626 		.setup = alc885_imac24_setup,
9627 		.init_hook = alc885_imac24_init_hook,
9628 	},
9629 	[ALC885_IMAC91] = {
9630 		.mixers = {alc885_imac91_mixer},
9631 		.init_verbs = { alc885_imac91_init_verbs,
9632 				alc880_gpio1_init_verbs },
9633 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9634 		.dac_nids = alc882_dac_nids,
9635 		.channel_mode = alc885_mba21_ch_modes,
9636 		.num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9637 		.input_mux = &alc889A_imac91_capture_source,
9638 		.dig_out_nid = ALC882_DIGOUT_NID,
9639 		.dig_in_nid = ALC882_DIGIN_NID,
9640 		.unsol_event = alc_automute_amp_unsol_event,
9641 		.setup = alc885_imac91_setup,
9642 		.init_hook = alc_automute_amp,
9643 	},
9644 	[ALC882_TARGA] = {
9645 		.mixers = { alc882_targa_mixer, alc882_chmode_mixer },
9646 		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9647 				alc880_gpio3_init_verbs, alc882_targa_verbs},
9648 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9649 		.dac_nids = alc882_dac_nids,
9650 		.dig_out_nid = ALC882_DIGOUT_NID,
9651 		.num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9652 		.adc_nids = alc882_adc_nids,
9653 		.capsrc_nids = alc882_capsrc_nids,
9654 		.num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9655 		.channel_mode = alc882_3ST_6ch_modes,
9656 		.need_dac_fix = 1,
9657 		.input_mux = &alc882_capture_source,
9658 		.unsol_event = alc882_targa_unsol_event,
9659 		.setup = alc882_targa_setup,
9660 		.init_hook = alc882_targa_automute,
9661 	},
9662 	[ALC882_ASUS_A7J] = {
9663 		.mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
9664 		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9665 				alc882_asus_a7j_verbs},
9666 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9667 		.dac_nids = alc882_dac_nids,
9668 		.dig_out_nid = ALC882_DIGOUT_NID,
9669 		.num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9670 		.adc_nids = alc882_adc_nids,
9671 		.capsrc_nids = alc882_capsrc_nids,
9672 		.num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9673 		.channel_mode = alc882_3ST_6ch_modes,
9674 		.need_dac_fix = 1,
9675 		.input_mux = &alc882_capture_source,
9676 	},
9677 	[ALC882_ASUS_A7M] = {
9678 		.mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
9679 		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9680 				alc882_eapd_verbs, alc880_gpio1_init_verbs,
9681 				alc882_asus_a7m_verbs },
9682 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9683 		.dac_nids = alc882_dac_nids,
9684 		.dig_out_nid = ALC882_DIGOUT_NID,
9685 		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9686 		.channel_mode = alc880_threestack_modes,
9687 		.need_dac_fix = 1,
9688 		.input_mux = &alc882_capture_source,
9689 	},
9690 	[ALC883_3ST_2ch_DIG] = {
9691 		.mixers = { alc883_3ST_2ch_mixer },
9692 		.init_verbs = { alc883_init_verbs },
9693 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9694 		.dac_nids = alc883_dac_nids,
9695 		.dig_out_nid = ALC883_DIGOUT_NID,
9696 		.dig_in_nid = ALC883_DIGIN_NID,
9697 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9698 		.channel_mode = alc883_3ST_2ch_modes,
9699 		.input_mux = &alc883_capture_source,
9700 	},
9701 	[ALC883_3ST_6ch_DIG] = {
9702 		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9703 		.init_verbs = { alc883_init_verbs },
9704 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9705 		.dac_nids = alc883_dac_nids,
9706 		.dig_out_nid = ALC883_DIGOUT_NID,
9707 		.dig_in_nid = ALC883_DIGIN_NID,
9708 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9709 		.channel_mode = alc883_3ST_6ch_modes,
9710 		.need_dac_fix = 1,
9711 		.input_mux = &alc883_capture_source,
9712 	},
9713 	[ALC883_3ST_6ch] = {
9714 		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9715 		.init_verbs = { alc883_init_verbs },
9716 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9717 		.dac_nids = alc883_dac_nids,
9718 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9719 		.channel_mode = alc883_3ST_6ch_modes,
9720 		.need_dac_fix = 1,
9721 		.input_mux = &alc883_capture_source,
9722 	},
9723 	[ALC883_3ST_6ch_INTEL] = {
9724 		.mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9725 		.init_verbs = { alc883_init_verbs },
9726 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9727 		.dac_nids = alc883_dac_nids,
9728 		.dig_out_nid = ALC883_DIGOUT_NID,
9729 		.dig_in_nid = ALC883_DIGIN_NID,
9730 		.slave_dig_outs = alc883_slave_dig_outs,
9731 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9732 		.channel_mode = alc883_3ST_6ch_intel_modes,
9733 		.need_dac_fix = 1,
9734 		.input_mux = &alc883_3stack_6ch_intel,
9735 	},
9736 	[ALC889A_INTEL] = {
9737 		.mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9738 		.init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9739 				alc_hp15_unsol_verbs },
9740 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9741 		.dac_nids = alc883_dac_nids,
9742 		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9743 		.adc_nids = alc889_adc_nids,
9744 		.dig_out_nid = ALC883_DIGOUT_NID,
9745 		.dig_in_nid = ALC883_DIGIN_NID,
9746 		.slave_dig_outs = alc883_slave_dig_outs,
9747 		.num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9748 		.channel_mode = alc889_8ch_intel_modes,
9749 		.capsrc_nids = alc889_capsrc_nids,
9750 		.input_mux = &alc889_capture_source,
9751 		.setup = alc889_automute_setup,
9752 		.init_hook = alc_automute_amp,
9753 		.unsol_event = alc_automute_amp_unsol_event,
9754 		.need_dac_fix = 1,
9755 	},
9756 	[ALC889_INTEL] = {
9757 		.mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9758 		.init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
9759 				alc889_eapd_verbs, alc_hp15_unsol_verbs},
9760 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9761 		.dac_nids = alc883_dac_nids,
9762 		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9763 		.adc_nids = alc889_adc_nids,
9764 		.dig_out_nid = ALC883_DIGOUT_NID,
9765 		.dig_in_nid = ALC883_DIGIN_NID,
9766 		.slave_dig_outs = alc883_slave_dig_outs,
9767 		.num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9768 		.channel_mode = alc889_8ch_intel_modes,
9769 		.capsrc_nids = alc889_capsrc_nids,
9770 		.input_mux = &alc889_capture_source,
9771 		.setup = alc889_automute_setup,
9772 		.init_hook = alc889_intel_init_hook,
9773 		.unsol_event = alc_automute_amp_unsol_event,
9774 		.need_dac_fix = 1,
9775 	},
9776 	[ALC883_6ST_DIG] = {
9777 		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
9778 		.init_verbs = { alc883_init_verbs },
9779 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9780 		.dac_nids = alc883_dac_nids,
9781 		.dig_out_nid = ALC883_DIGOUT_NID,
9782 		.dig_in_nid = ALC883_DIGIN_NID,
9783 		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9784 		.channel_mode = alc883_sixstack_modes,
9785 		.input_mux = &alc883_capture_source,
9786 	},
9787 	[ALC883_TARGA_DIG] = {
9788 		.mixers = { alc883_targa_mixer, alc883_chmode_mixer },
9789 		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9790 				alc883_targa_verbs},
9791 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9792 		.dac_nids = alc883_dac_nids,
9793 		.dig_out_nid = ALC883_DIGOUT_NID,
9794 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9795 		.channel_mode = alc883_3ST_6ch_modes,
9796 		.need_dac_fix = 1,
9797 		.input_mux = &alc883_capture_source,
9798 		.unsol_event = alc883_targa_unsol_event,
9799 		.setup = alc882_targa_setup,
9800 		.init_hook = alc882_targa_automute,
9801 	},
9802 	[ALC883_TARGA_2ch_DIG] = {
9803 		.mixers = { alc883_targa_2ch_mixer},
9804 		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9805 				alc883_targa_verbs},
9806 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9807 		.dac_nids = alc883_dac_nids,
9808 		.adc_nids = alc883_adc_nids_alt,
9809 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9810 		.capsrc_nids = alc883_capsrc_nids,
9811 		.dig_out_nid = ALC883_DIGOUT_NID,
9812 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9813 		.channel_mode = alc883_3ST_2ch_modes,
9814 		.input_mux = &alc883_capture_source,
9815 		.unsol_event = alc883_targa_unsol_event,
9816 		.setup = alc882_targa_setup,
9817 		.init_hook = alc882_targa_automute,
9818 	},
9819 	[ALC883_TARGA_8ch_DIG] = {
9820 		.mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
9821 			    alc883_chmode_mixer },
9822 		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9823 				alc883_targa_verbs },
9824 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9825 		.dac_nids = alc883_dac_nids,
9826 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9827 		.adc_nids = alc883_adc_nids_rev,
9828 		.capsrc_nids = alc883_capsrc_nids_rev,
9829 		.dig_out_nid = ALC883_DIGOUT_NID,
9830 		.dig_in_nid = ALC883_DIGIN_NID,
9831 		.num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
9832 		.channel_mode = alc883_4ST_8ch_modes,
9833 		.need_dac_fix = 1,
9834 		.input_mux = &alc883_capture_source,
9835 		.unsol_event = alc883_targa_unsol_event,
9836 		.setup = alc882_targa_setup,
9837 		.init_hook = alc882_targa_automute,
9838 	},
9839 	[ALC883_ACER] = {
9840 		.mixers = { alc883_base_mixer },
9841 		/* On TravelMate laptops, GPIO 0 enables the internal speaker
9842 		 * and the headphone jack.  Turn this on and rely on the
9843 		 * standard mute methods whenever the user wants to turn
9844 		 * these outputs off.
9845 		 */
9846 		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
9847 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9848 		.dac_nids = alc883_dac_nids,
9849 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9850 		.channel_mode = alc883_3ST_2ch_modes,
9851 		.input_mux = &alc883_capture_source,
9852 	},
9853 	[ALC883_ACER_ASPIRE] = {
9854 		.mixers = { alc883_acer_aspire_mixer },
9855 		.init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
9856 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9857 		.dac_nids = alc883_dac_nids,
9858 		.dig_out_nid = ALC883_DIGOUT_NID,
9859 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9860 		.channel_mode = alc883_3ST_2ch_modes,
9861 		.input_mux = &alc883_capture_source,
9862 		.unsol_event = alc_automute_amp_unsol_event,
9863 		.setup = alc883_acer_aspire_setup,
9864 		.init_hook = alc_automute_amp,
9865 	},
9866 	[ALC888_ACER_ASPIRE_4930G] = {
9867 		.mixers = { alc888_base_mixer,
9868 				alc883_chmode_mixer },
9869 		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9870 				alc888_acer_aspire_4930g_verbs },
9871 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9872 		.dac_nids = alc883_dac_nids,
9873 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9874 		.adc_nids = alc883_adc_nids_rev,
9875 		.capsrc_nids = alc883_capsrc_nids_rev,
9876 		.dig_out_nid = ALC883_DIGOUT_NID,
9877 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9878 		.channel_mode = alc883_3ST_6ch_modes,
9879 		.need_dac_fix = 1,
9880 		.const_channel_count = 6,
9881 		.num_mux_defs =
9882 			ARRAY_SIZE(alc888_2_capture_sources),
9883 		.input_mux = alc888_2_capture_sources,
9884 		.unsol_event = alc_automute_amp_unsol_event,
9885 		.setup = alc888_acer_aspire_4930g_setup,
9886 		.init_hook = alc_automute_amp,
9887 	},
9888 	[ALC888_ACER_ASPIRE_6530G] = {
9889 		.mixers = { alc888_acer_aspire_6530_mixer },
9890 		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9891 				alc888_acer_aspire_6530g_verbs },
9892 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9893 		.dac_nids = alc883_dac_nids,
9894 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9895 		.adc_nids = alc883_adc_nids_rev,
9896 		.capsrc_nids = alc883_capsrc_nids_rev,
9897 		.dig_out_nid = ALC883_DIGOUT_NID,
9898 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9899 		.channel_mode = alc883_3ST_2ch_modes,
9900 		.num_mux_defs =
9901 			ARRAY_SIZE(alc888_2_capture_sources),
9902 		.input_mux = alc888_acer_aspire_6530_sources,
9903 		.unsol_event = alc_automute_amp_unsol_event,
9904 		.setup = alc888_acer_aspire_6530g_setup,
9905 		.init_hook = alc_automute_amp,
9906 	},
9907 	[ALC888_ACER_ASPIRE_8930G] = {
9908 		.mixers = { alc889_acer_aspire_8930g_mixer,
9909 				alc883_chmode_mixer },
9910 		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9911 				alc889_acer_aspire_8930g_verbs,
9912 				alc889_eapd_verbs},
9913 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9914 		.dac_nids = alc883_dac_nids,
9915 		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9916 		.adc_nids = alc889_adc_nids,
9917 		.capsrc_nids = alc889_capsrc_nids,
9918 		.dig_out_nid = ALC883_DIGOUT_NID,
9919 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9920 		.channel_mode = alc883_3ST_6ch_modes,
9921 		.need_dac_fix = 1,
9922 		.const_channel_count = 6,
9923 		.num_mux_defs =
9924 			ARRAY_SIZE(alc889_capture_sources),
9925 		.input_mux = alc889_capture_sources,
9926 		.unsol_event = alc_automute_amp_unsol_event,
9927 		.setup = alc889_acer_aspire_8930g_setup,
9928 		.init_hook = alc_automute_amp,
9929 #ifdef CONFIG_SND_HDA_POWER_SAVE
9930 		.power_hook = alc_power_eapd,
9931 #endif
9932 	},
9933 	[ALC888_ACER_ASPIRE_7730G] = {
9934 		.mixers = { alc883_3ST_6ch_mixer,
9935 				alc883_chmode_mixer },
9936 		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9937 				alc888_acer_aspire_7730G_verbs },
9938 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9939 		.dac_nids = alc883_dac_nids,
9940 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9941 		.adc_nids = alc883_adc_nids_rev,
9942 		.capsrc_nids = alc883_capsrc_nids_rev,
9943 		.dig_out_nid = ALC883_DIGOUT_NID,
9944 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9945 		.channel_mode = alc883_3ST_6ch_modes,
9946 		.need_dac_fix = 1,
9947 		.const_channel_count = 6,
9948 		.input_mux = &alc883_capture_source,
9949 		.unsol_event = alc_automute_amp_unsol_event,
9950 		.setup = alc888_acer_aspire_6530g_setup,
9951 		.init_hook = alc_automute_amp,
9952 	},
9953 	[ALC883_MEDION] = {
9954 		.mixers = { alc883_fivestack_mixer,
9955 			    alc883_chmode_mixer },
9956 		.init_verbs = { alc883_init_verbs,
9957 				alc883_medion_eapd_verbs },
9958 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9959 		.dac_nids = alc883_dac_nids,
9960 		.adc_nids = alc883_adc_nids_alt,
9961 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9962 		.capsrc_nids = alc883_capsrc_nids,
9963 		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9964 		.channel_mode = alc883_sixstack_modes,
9965 		.input_mux = &alc883_capture_source,
9966 	},
9967 	[ALC883_MEDION_MD2] = {
9968 		.mixers = { alc883_medion_md2_mixer},
9969 		.init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
9970 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9971 		.dac_nids = alc883_dac_nids,
9972 		.dig_out_nid = ALC883_DIGOUT_NID,
9973 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9974 		.channel_mode = alc883_3ST_2ch_modes,
9975 		.input_mux = &alc883_capture_source,
9976 		.unsol_event = alc_automute_amp_unsol_event,
9977 		.setup = alc883_medion_md2_setup,
9978 		.init_hook = alc_automute_amp,
9979 	},
9980 	[ALC883_MEDION_WIM2160] = {
9981 		.mixers = { alc883_medion_wim2160_mixer },
9982 		.init_verbs = { alc883_init_verbs, alc883_medion_wim2160_verbs },
9983 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9984 		.dac_nids = alc883_dac_nids,
9985 		.dig_out_nid = ALC883_DIGOUT_NID,
9986 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
9987 		.adc_nids = alc883_adc_nids,
9988 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9989 		.channel_mode = alc883_3ST_2ch_modes,
9990 		.input_mux = &alc883_capture_source,
9991 		.unsol_event = alc_automute_amp_unsol_event,
9992 		.setup = alc883_medion_wim2160_setup,
9993 		.init_hook = alc_automute_amp,
9994 	},
9995 	[ALC883_LAPTOP_EAPD] = {
9996 		.mixers = { alc883_base_mixer },
9997 		.init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
9998 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9999 		.dac_nids = alc883_dac_nids,
10000 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10001 		.channel_mode = alc883_3ST_2ch_modes,
10002 		.input_mux = &alc883_capture_source,
10003 	},
10004 	[ALC883_CLEVO_M540R] = {
10005 		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10006 		.init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
10007 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10008 		.dac_nids = alc883_dac_nids,
10009 		.dig_out_nid = ALC883_DIGOUT_NID,
10010 		.dig_in_nid = ALC883_DIGIN_NID,
10011 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
10012 		.channel_mode = alc883_3ST_6ch_clevo_modes,
10013 		.need_dac_fix = 1,
10014 		.input_mux = &alc883_capture_source,
10015 		/* This machine has the hardware HP auto-muting, thus
10016 		 * we need no software mute via unsol event
10017 		 */
10018 	},
10019 	[ALC883_CLEVO_M720] = {
10020 		.mixers = { alc883_clevo_m720_mixer },
10021 		.init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
10022 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10023 		.dac_nids = alc883_dac_nids,
10024 		.dig_out_nid = ALC883_DIGOUT_NID,
10025 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10026 		.channel_mode = alc883_3ST_2ch_modes,
10027 		.input_mux = &alc883_capture_source,
10028 		.unsol_event = alc883_clevo_m720_unsol_event,
10029 		.setup = alc883_clevo_m720_setup,
10030 		.init_hook = alc883_clevo_m720_init_hook,
10031 	},
10032 	[ALC883_LENOVO_101E_2ch] = {
10033 		.mixers = { alc883_lenovo_101e_2ch_mixer},
10034 		.init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
10035 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10036 		.dac_nids = alc883_dac_nids,
10037 		.adc_nids = alc883_adc_nids_alt,
10038 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
10039 		.capsrc_nids = alc883_capsrc_nids,
10040 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10041 		.channel_mode = alc883_3ST_2ch_modes,
10042 		.input_mux = &alc883_lenovo_101e_capture_source,
10043 		.unsol_event = alc883_lenovo_101e_unsol_event,
10044 		.init_hook = alc883_lenovo_101e_all_automute,
10045 	},
10046 	[ALC883_LENOVO_NB0763] = {
10047 		.mixers = { alc883_lenovo_nb0763_mixer },
10048 		.init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
10049 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10050 		.dac_nids = alc883_dac_nids,
10051 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10052 		.channel_mode = alc883_3ST_2ch_modes,
10053 		.need_dac_fix = 1,
10054 		.input_mux = &alc883_lenovo_nb0763_capture_source,
10055 		.unsol_event = alc_automute_amp_unsol_event,
10056 		.setup = alc883_medion_md2_setup,
10057 		.init_hook = alc_automute_amp,
10058 	},
10059 	[ALC888_LENOVO_MS7195_DIG] = {
10060 		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10061 		.init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
10062 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10063 		.dac_nids = alc883_dac_nids,
10064 		.dig_out_nid = ALC883_DIGOUT_NID,
10065 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10066 		.channel_mode = alc883_3ST_6ch_modes,
10067 		.need_dac_fix = 1,
10068 		.input_mux = &alc883_capture_source,
10069 		.unsol_event = alc883_lenovo_ms7195_unsol_event,
10070 		.init_hook = alc888_lenovo_ms7195_front_automute,
10071 	},
10072 	[ALC883_HAIER_W66] = {
10073 		.mixers = { alc883_targa_2ch_mixer},
10074 		.init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
10075 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10076 		.dac_nids = alc883_dac_nids,
10077 		.dig_out_nid = ALC883_DIGOUT_NID,
10078 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10079 		.channel_mode = alc883_3ST_2ch_modes,
10080 		.input_mux = &alc883_capture_source,
10081 		.unsol_event = alc_automute_amp_unsol_event,
10082 		.setup = alc883_haier_w66_setup,
10083 		.init_hook = alc_automute_amp,
10084 	},
10085 	[ALC888_3ST_HP] = {
10086 		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10087 		.init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
10088 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10089 		.dac_nids = alc883_dac_nids,
10090 		.num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
10091 		.channel_mode = alc888_3st_hp_modes,
10092 		.need_dac_fix = 1,
10093 		.input_mux = &alc883_capture_source,
10094 		.unsol_event = alc_automute_amp_unsol_event,
10095 		.setup = alc888_3st_hp_setup,
10096 		.init_hook = alc_automute_amp,
10097 	},
10098 	[ALC888_6ST_DELL] = {
10099 		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
10100 		.init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
10101 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10102 		.dac_nids = alc883_dac_nids,
10103 		.dig_out_nid = ALC883_DIGOUT_NID,
10104 		.dig_in_nid = ALC883_DIGIN_NID,
10105 		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10106 		.channel_mode = alc883_sixstack_modes,
10107 		.input_mux = &alc883_capture_source,
10108 		.unsol_event = alc_automute_amp_unsol_event,
10109 		.setup = alc888_6st_dell_setup,
10110 		.init_hook = alc_automute_amp,
10111 	},
10112 	[ALC883_MITAC] = {
10113 		.mixers = { alc883_mitac_mixer },
10114 		.init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
10115 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10116 		.dac_nids = alc883_dac_nids,
10117 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10118 		.channel_mode = alc883_3ST_2ch_modes,
10119 		.input_mux = &alc883_capture_source,
10120 		.unsol_event = alc_automute_amp_unsol_event,
10121 		.setup = alc883_mitac_setup,
10122 		.init_hook = alc_automute_amp,
10123 	},
10124 	[ALC883_FUJITSU_PI2515] = {
10125 		.mixers = { alc883_2ch_fujitsu_pi2515_mixer },
10126 		.init_verbs = { alc883_init_verbs,
10127 				alc883_2ch_fujitsu_pi2515_verbs},
10128 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10129 		.dac_nids = alc883_dac_nids,
10130 		.dig_out_nid = ALC883_DIGOUT_NID,
10131 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10132 		.channel_mode = alc883_3ST_2ch_modes,
10133 		.input_mux = &alc883_fujitsu_pi2515_capture_source,
10134 		.unsol_event = alc_automute_amp_unsol_event,
10135 		.setup = alc883_2ch_fujitsu_pi2515_setup,
10136 		.init_hook = alc_automute_amp,
10137 	},
10138 	[ALC888_FUJITSU_XA3530] = {
10139 		.mixers = { alc888_base_mixer, alc883_chmode_mixer },
10140 		.init_verbs = { alc883_init_verbs,
10141 			alc888_fujitsu_xa3530_verbs },
10142 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10143 		.dac_nids = alc883_dac_nids,
10144 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10145 		.adc_nids = alc883_adc_nids_rev,
10146 		.capsrc_nids = alc883_capsrc_nids_rev,
10147 		.dig_out_nid = ALC883_DIGOUT_NID,
10148 		.num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
10149 		.channel_mode = alc888_4ST_8ch_intel_modes,
10150 		.num_mux_defs =
10151 			ARRAY_SIZE(alc888_2_capture_sources),
10152 		.input_mux = alc888_2_capture_sources,
10153 		.unsol_event = alc_automute_amp_unsol_event,
10154 		.setup = alc888_fujitsu_xa3530_setup,
10155 		.init_hook = alc_automute_amp,
10156 	},
10157 	[ALC888_LENOVO_SKY] = {
10158 		.mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
10159 		.init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
10160 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10161 		.dac_nids = alc883_dac_nids,
10162 		.dig_out_nid = ALC883_DIGOUT_NID,
10163 		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10164 		.channel_mode = alc883_sixstack_modes,
10165 		.need_dac_fix = 1,
10166 		.input_mux = &alc883_lenovo_sky_capture_source,
10167 		.unsol_event = alc_automute_amp_unsol_event,
10168 		.setup = alc888_lenovo_sky_setup,
10169 		.init_hook = alc_automute_amp,
10170 	},
10171 	[ALC888_ASUS_M90V] = {
10172 		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10173 		.init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
10174 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10175 		.dac_nids = alc883_dac_nids,
10176 		.dig_out_nid = ALC883_DIGOUT_NID,
10177 		.dig_in_nid = ALC883_DIGIN_NID,
10178 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10179 		.channel_mode = alc883_3ST_6ch_modes,
10180 		.need_dac_fix = 1,
10181 		.input_mux = &alc883_fujitsu_pi2515_capture_source,
10182 		.unsol_event = alc_sku_unsol_event,
10183 		.setup = alc883_mode2_setup,
10184 		.init_hook = alc_inithook,
10185 	},
10186 	[ALC888_ASUS_EEE1601] = {
10187 		.mixers = { alc883_asus_eee1601_mixer },
10188 		.cap_mixer = alc883_asus_eee1601_cap_mixer,
10189 		.init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
10190 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10191 		.dac_nids = alc883_dac_nids,
10192 		.dig_out_nid = ALC883_DIGOUT_NID,
10193 		.dig_in_nid = ALC883_DIGIN_NID,
10194 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10195 		.channel_mode = alc883_3ST_2ch_modes,
10196 		.need_dac_fix = 1,
10197 		.input_mux = &alc883_asus_eee1601_capture_source,
10198 		.unsol_event = alc_sku_unsol_event,
10199 		.init_hook = alc883_eee1601_inithook,
10200 	},
10201 	[ALC1200_ASUS_P5Q] = {
10202 		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
10203 		.init_verbs = { alc883_init_verbs },
10204 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10205 		.dac_nids = alc883_dac_nids,
10206 		.dig_out_nid = ALC1200_DIGOUT_NID,
10207 		.dig_in_nid = ALC883_DIGIN_NID,
10208 		.slave_dig_outs = alc1200_slave_dig_outs,
10209 		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10210 		.channel_mode = alc883_sixstack_modes,
10211 		.input_mux = &alc883_capture_source,
10212 	},
10213 	[ALC889A_MB31] = {
10214 		.mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
10215 		.init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
10216 			alc880_gpio1_init_verbs },
10217 		.adc_nids = alc883_adc_nids,
10218 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
10219 		.capsrc_nids = alc883_capsrc_nids,
10220 		.dac_nids = alc883_dac_nids,
10221 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10222 		.channel_mode = alc889A_mb31_6ch_modes,
10223 		.num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
10224 		.input_mux = &alc889A_mb31_capture_source,
10225 		.dig_out_nid = ALC883_DIGOUT_NID,
10226 		.unsol_event = alc889A_mb31_unsol_event,
10227 		.init_hook = alc889A_mb31_automute,
10228 	},
10229 	[ALC883_SONY_VAIO_TT] = {
10230 		.mixers = { alc883_vaiott_mixer },
10231 		.init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
10232 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10233 		.dac_nids = alc883_dac_nids,
10234 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10235 		.channel_mode = alc883_3ST_2ch_modes,
10236 		.input_mux = &alc883_capture_source,
10237 		.unsol_event = alc_automute_amp_unsol_event,
10238 		.setup = alc883_vaiott_setup,
10239 		.init_hook = alc_automute_amp,
10240 	},
10241 };
10242 
10243 
10244 /*
10245  * Pin config fixes
10246  */
10247 enum {
10248 	PINFIX_ABIT_AW9D_MAX
10249 };
10250 
10251 static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
10252 	{ 0x15, 0x01080104 }, /* side */
10253 	{ 0x16, 0x01011012 }, /* rear */
10254 	{ 0x17, 0x01016011 }, /* clfe */
10255 	{ }
10256 };
10257 
10258 static const struct alc_fixup alc882_fixups[] = {
10259 	[PINFIX_ABIT_AW9D_MAX] = {
10260 		.pins = alc882_abit_aw9d_pinfix
10261 	},
10262 };
10263 
10264 static struct snd_pci_quirk alc882_fixup_tbl[] = {
10265 	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
10266 	{}
10267 };
10268 
10269 /*
10270  * BIOS auto configuration
10271  */
10272 static int alc882_auto_create_input_ctls(struct hda_codec *codec,
10273 						const struct auto_pin_cfg *cfg)
10274 {
10275 	return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
10276 }
10277 
10278 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
10279 					      hda_nid_t nid, int pin_type,
10280 					      hda_nid_t dac)
10281 {
10282 	int idx;
10283 
10284 	/* set as output */
10285 	alc_set_pin_output(codec, nid, pin_type);
10286 
10287 	if (dac == 0x25)
10288 		idx = 4;
10289 	else if (dac >= 0x02 && dac <= 0x05)
10290 		idx = dac - 2;
10291 	else
10292 		return;
10293 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
10294 }
10295 
10296 static void alc882_auto_init_multi_out(struct hda_codec *codec)
10297 {
10298 	struct alc_spec *spec = codec->spec;
10299 	int i;
10300 
10301 	for (i = 0; i <= HDA_SIDE; i++) {
10302 		hda_nid_t nid = spec->autocfg.line_out_pins[i];
10303 		int pin_type = get_pin_type(spec->autocfg.line_out_type);
10304 		if (nid)
10305 			alc882_auto_set_output_and_unmute(codec, nid, pin_type,
10306 					spec->multiout.dac_nids[i]);
10307 	}
10308 }
10309 
10310 static void alc882_auto_init_hp_out(struct hda_codec *codec)
10311 {
10312 	struct alc_spec *spec = codec->spec;
10313 	hda_nid_t pin, dac;
10314 
10315 	pin = spec->autocfg.hp_pins[0];
10316 	if (pin) {
10317 		dac = spec->multiout.hp_nid;
10318 		if (!dac)
10319 			dac = spec->multiout.dac_nids[0]; /* to front */
10320 		alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, dac);
10321 	}
10322 	pin = spec->autocfg.speaker_pins[0];
10323 	if (pin) {
10324 		dac = spec->multiout.extra_out_nid[0];
10325 		if (!dac)
10326 			dac = spec->multiout.dac_nids[0]; /* to front */
10327 		alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, dac);
10328 	}
10329 }
10330 
10331 static void alc882_auto_init_analog_input(struct hda_codec *codec)
10332 {
10333 	struct alc_spec *spec = codec->spec;
10334 	int i;
10335 
10336 	for (i = 0; i < AUTO_PIN_LAST; i++) {
10337 		hda_nid_t nid = spec->autocfg.input_pins[i];
10338 		if (!nid)
10339 			continue;
10340 		alc_set_input_pin(codec, nid, i);
10341 		if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
10342 			snd_hda_codec_write(codec, nid, 0,
10343 					    AC_VERB_SET_AMP_GAIN_MUTE,
10344 					    AMP_OUT_MUTE);
10345 	}
10346 }
10347 
10348 static void alc882_auto_init_input_src(struct hda_codec *codec)
10349 {
10350 	struct alc_spec *spec = codec->spec;
10351 	int c;
10352 
10353 	for (c = 0; c < spec->num_adc_nids; c++) {
10354 		hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
10355 		hda_nid_t nid = spec->capsrc_nids[c];
10356 		unsigned int mux_idx;
10357 		const struct hda_input_mux *imux;
10358 		int conns, mute, idx, item;
10359 
10360 		conns = snd_hda_get_connections(codec, nid, conn_list,
10361 						ARRAY_SIZE(conn_list));
10362 		if (conns < 0)
10363 			continue;
10364 		mux_idx = c >= spec->num_mux_defs ? 0 : c;
10365 		imux = &spec->input_mux[mux_idx];
10366 		if (!imux->num_items && mux_idx > 0)
10367 			imux = &spec->input_mux[0];
10368 		for (idx = 0; idx < conns; idx++) {
10369 			/* if the current connection is the selected one,
10370 			 * unmute it as default - otherwise mute it
10371 			 */
10372 			mute = AMP_IN_MUTE(idx);
10373 			for (item = 0; item < imux->num_items; item++) {
10374 				if (imux->items[item].index == idx) {
10375 					if (spec->cur_mux[c] == item)
10376 						mute = AMP_IN_UNMUTE(idx);
10377 					break;
10378 				}
10379 			}
10380 			/* check if we have a selector or mixer
10381 			 * we could check for the widget type instead, but
10382 			 * just check for Amp-In presence (in case of mixer
10383 			 * without amp-in there is something wrong, this
10384 			 * function shouldn't be used or capsrc nid is wrong)
10385 			 */
10386 			if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
10387 				snd_hda_codec_write(codec, nid, 0,
10388 						    AC_VERB_SET_AMP_GAIN_MUTE,
10389 						    mute);
10390 			else if (mute != AMP_IN_MUTE(idx))
10391 				snd_hda_codec_write(codec, nid, 0,
10392 						    AC_VERB_SET_CONNECT_SEL,
10393 						    idx);
10394 		}
10395 	}
10396 }
10397 
10398 /* add mic boosts if needed */
10399 static int alc_auto_add_mic_boost(struct hda_codec *codec)
10400 {
10401 	struct alc_spec *spec = codec->spec;
10402 	int err;
10403 	hda_nid_t nid;
10404 
10405 	nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
10406 	if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10407 		err = add_control(spec, ALC_CTL_WIDGET_VOL,
10408 				  "Mic Boost",
10409 				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10410 		if (err < 0)
10411 			return err;
10412 	}
10413 	nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
10414 	if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10415 		err = add_control(spec, ALC_CTL_WIDGET_VOL,
10416 				  "Front Mic Boost",
10417 				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10418 		if (err < 0)
10419 			return err;
10420 	}
10421 	return 0;
10422 }
10423 
10424 /* almost identical with ALC880 parser... */
10425 static int alc882_parse_auto_config(struct hda_codec *codec)
10426 {
10427 	struct alc_spec *spec = codec->spec;
10428 	static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
10429 	int i, err;
10430 
10431 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
10432 					   alc882_ignore);
10433 	if (err < 0)
10434 		return err;
10435 	if (!spec->autocfg.line_outs)
10436 		return 0; /* can't find valid BIOS pin config */
10437 
10438 	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
10439 	if (err < 0)
10440 		return err;
10441 	err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
10442 	if (err < 0)
10443 		return err;
10444 	err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
10445 					   "Headphone");
10446 	if (err < 0)
10447 		return err;
10448 	err = alc880_auto_create_extra_out(spec,
10449 					   spec->autocfg.speaker_pins[0],
10450 					   "Speaker");
10451 	if (err < 0)
10452 		return err;
10453 	err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
10454 	if (err < 0)
10455 		return err;
10456 
10457 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
10458 
10459 	/* check multiple SPDIF-out (for recent codecs) */
10460 	for (i = 0; i < spec->autocfg.dig_outs; i++) {
10461 		hda_nid_t dig_nid;
10462 		err = snd_hda_get_connections(codec,
10463 					      spec->autocfg.dig_out_pins[i],
10464 					      &dig_nid, 1);
10465 		if (err < 0)
10466 			continue;
10467 		if (!i)
10468 			spec->multiout.dig_out_nid = dig_nid;
10469 		else {
10470 			spec->multiout.slave_dig_outs = spec->slave_dig_outs;
10471 			if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
10472 				break;
10473 			spec->slave_dig_outs[i - 1] = dig_nid;
10474 		}
10475 	}
10476 	if (spec->autocfg.dig_in_pin)
10477 		spec->dig_in_nid = ALC880_DIGIN_NID;
10478 
10479 	if (spec->kctls.list)
10480 		add_mixer(spec, spec->kctls.list);
10481 
10482 	add_verb(spec, alc883_auto_init_verbs);
10483 	/* if ADC 0x07 is available, initialize it, too */
10484 	if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
10485 		add_verb(spec, alc882_adc1_init_verbs);
10486 
10487 	spec->num_mux_defs = 1;
10488 	spec->input_mux = &spec->private_imux[0];
10489 
10490 	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
10491 
10492 	err = alc_auto_add_mic_boost(codec);
10493 	if (err < 0)
10494 		return err;
10495 
10496 	return 1; /* config found */
10497 }
10498 
10499 /* additional initialization for auto-configuration model */
10500 static void alc882_auto_init(struct hda_codec *codec)
10501 {
10502 	struct alc_spec *spec = codec->spec;
10503 	alc882_auto_init_multi_out(codec);
10504 	alc882_auto_init_hp_out(codec);
10505 	alc882_auto_init_analog_input(codec);
10506 	alc882_auto_init_input_src(codec);
10507 	if (spec->unsol_event)
10508 		alc_inithook(codec);
10509 }
10510 
10511 static int patch_alc882(struct hda_codec *codec)
10512 {
10513 	struct alc_spec *spec;
10514 	int err, board_config;
10515 
10516 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
10517 	if (spec == NULL)
10518 		return -ENOMEM;
10519 
10520 	codec->spec = spec;
10521 
10522 	alc_auto_parse_customize_define(codec);
10523 
10524 	switch (codec->vendor_id) {
10525 	case 0x10ec0882:
10526 	case 0x10ec0885:
10527 		break;
10528 	default:
10529 		/* ALC883 and variants */
10530 		alc_fix_pll_init(codec, 0x20, 0x0a, 10);
10531 		break;
10532 	}
10533 
10534 	board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
10535 						  alc882_models,
10536 						  alc882_cfg_tbl);
10537 
10538 	if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
10539 		board_config = snd_hda_check_board_codec_sid_config(codec,
10540 			ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
10541 
10542 	if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
10543 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
10544 		       codec->chip_name);
10545 		board_config = ALC882_AUTO;
10546 	}
10547 
10548 	if (board_config == ALC882_AUTO)
10549 		alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 1);
10550 
10551 	if (board_config == ALC882_AUTO) {
10552 		/* automatic parse from the BIOS config */
10553 		err = alc882_parse_auto_config(codec);
10554 		if (err < 0) {
10555 			alc_free(codec);
10556 			return err;
10557 		} else if (!err) {
10558 			printk(KERN_INFO
10559 			       "hda_codec: Cannot set up configuration "
10560 			       "from BIOS.  Using base mode...\n");
10561 			board_config = ALC882_3ST_DIG;
10562 		}
10563 	}
10564 
10565 	err = snd_hda_attach_beep_device(codec, 0x1);
10566 	if (err < 0) {
10567 		alc_free(codec);
10568 		return err;
10569 	}
10570 
10571 	if (board_config != ALC882_AUTO)
10572 		setup_preset(codec, &alc882_presets[board_config]);
10573 
10574 	spec->stream_analog_playback = &alc882_pcm_analog_playback;
10575 	spec->stream_analog_capture = &alc882_pcm_analog_capture;
10576 	/* FIXME: setup DAC5 */
10577 	/*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
10578 	spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
10579 
10580 	spec->stream_digital_playback = &alc882_pcm_digital_playback;
10581 	spec->stream_digital_capture = &alc882_pcm_digital_capture;
10582 
10583 	if (!spec->adc_nids && spec->input_mux) {
10584 		int i, j;
10585 		spec->num_adc_nids = 0;
10586 		for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
10587 			const struct hda_input_mux *imux = spec->input_mux;
10588 			hda_nid_t cap;
10589 			hda_nid_t items[16];
10590 			hda_nid_t nid = alc882_adc_nids[i];
10591 			unsigned int wcap = get_wcaps(codec, nid);
10592 			/* get type */
10593 			wcap = get_wcaps_type(wcap);
10594 			if (wcap != AC_WID_AUD_IN)
10595 				continue;
10596 			spec->private_adc_nids[spec->num_adc_nids] = nid;
10597 			err = snd_hda_get_connections(codec, nid, &cap, 1);
10598 			if (err < 0)
10599 				continue;
10600 			err = snd_hda_get_connections(codec, cap, items,
10601 						      ARRAY_SIZE(items));
10602 			if (err < 0)
10603 				continue;
10604 			for (j = 0; j < imux->num_items; j++)
10605 				if (imux->items[j].index >= err)
10606 					break;
10607 			if (j < imux->num_items)
10608 				continue;
10609 			spec->private_capsrc_nids[spec->num_adc_nids] = cap;
10610 			spec->num_adc_nids++;
10611 		}
10612 		spec->adc_nids = spec->private_adc_nids;
10613 		spec->capsrc_nids = spec->private_capsrc_nids;
10614 	}
10615 
10616 	set_capture_mixer(codec);
10617 
10618 	if (spec->cdefine.enable_pcbeep)
10619 		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10620 
10621 	if (board_config == ALC882_AUTO)
10622 		alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 0);
10623 
10624 	spec->vmaster_nid = 0x0c;
10625 
10626 	codec->patch_ops = alc_patch_ops;
10627 	if (board_config == ALC882_AUTO)
10628 		spec->init_hook = alc882_auto_init;
10629 #ifdef CONFIG_SND_HDA_POWER_SAVE
10630 	if (!spec->loopback.amplist)
10631 		spec->loopback.amplist = alc882_loopbacks;
10632 #endif
10633 
10634 	return 0;
10635 }
10636 
10637 
10638 /*
10639  * ALC262 support
10640  */
10641 
10642 #define ALC262_DIGOUT_NID	ALC880_DIGOUT_NID
10643 #define ALC262_DIGIN_NID	ALC880_DIGIN_NID
10644 
10645 #define alc262_dac_nids		alc260_dac_nids
10646 #define alc262_adc_nids		alc882_adc_nids
10647 #define alc262_adc_nids_alt	alc882_adc_nids_alt
10648 #define alc262_capsrc_nids	alc882_capsrc_nids
10649 #define alc262_capsrc_nids_alt	alc882_capsrc_nids_alt
10650 
10651 #define alc262_modes		alc260_modes
10652 #define alc262_capture_source	alc882_capture_source
10653 
10654 static hda_nid_t alc262_dmic_adc_nids[1] = {
10655 	/* ADC0 */
10656 	0x09
10657 };
10658 
10659 static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
10660 
10661 static struct snd_kcontrol_new alc262_base_mixer[] = {
10662 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10663 	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10664 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10665 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10666 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10667 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10668 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10669 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10670 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10671 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10672 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10673 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10674 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
10675 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10676 	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
10677 	HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
10678 	{ } /* end */
10679 };
10680 
10681 /* update HP, line and mono-out pins according to the master switch */
10682 static void alc262_hp_master_update(struct hda_codec *codec)
10683 {
10684 	struct alc_spec *spec = codec->spec;
10685 	int val = spec->master_sw;
10686 
10687 	/* HP & line-out */
10688 	snd_hda_codec_write_cache(codec, 0x1b, 0,
10689 				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10690 				  val ? PIN_HP : 0);
10691 	snd_hda_codec_write_cache(codec, 0x15, 0,
10692 				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10693 				  val ? PIN_HP : 0);
10694 	/* mono (speaker) depending on the HP jack sense */
10695 	val = val && !spec->jack_present;
10696 	snd_hda_codec_write_cache(codec, 0x16, 0,
10697 				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10698 				  val ? PIN_OUT : 0);
10699 }
10700 
10701 static void alc262_hp_bpc_automute(struct hda_codec *codec)
10702 {
10703 	struct alc_spec *spec = codec->spec;
10704 
10705 	spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
10706 	alc262_hp_master_update(codec);
10707 }
10708 
10709 static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10710 {
10711 	if ((res >> 26) != ALC880_HP_EVENT)
10712 		return;
10713 	alc262_hp_bpc_automute(codec);
10714 }
10715 
10716 static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10717 {
10718 	struct alc_spec *spec = codec->spec;
10719 
10720 	spec->jack_present = snd_hda_jack_detect(codec, 0x15);
10721 	alc262_hp_master_update(codec);
10722 }
10723 
10724 static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10725 					   unsigned int res)
10726 {
10727 	if ((res >> 26) != ALC880_HP_EVENT)
10728 		return;
10729 	alc262_hp_wildwest_automute(codec);
10730 }
10731 
10732 #define alc262_hp_master_sw_get		alc260_hp_master_sw_get
10733 
10734 static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10735 				   struct snd_ctl_elem_value *ucontrol)
10736 {
10737 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10738 	struct alc_spec *spec = codec->spec;
10739 	int val = !!*ucontrol->value.integer.value;
10740 
10741 	if (val == spec->master_sw)
10742 		return 0;
10743 	spec->master_sw = val;
10744 	alc262_hp_master_update(codec);
10745 	return 1;
10746 }
10747 
10748 #define ALC262_HP_MASTER_SWITCH					\
10749 	{							\
10750 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		\
10751 		.name = "Master Playback Switch",		\
10752 		.info = snd_ctl_boolean_mono_info,		\
10753 		.get = alc262_hp_master_sw_get,			\
10754 		.put = alc262_hp_master_sw_put,			\
10755 	}, \
10756 	{							\
10757 		.iface = NID_MAPPING,				\
10758 		.name = "Master Playback Switch",		\
10759 		.private_value = 0x15 | (0x16 << 8) | (0x1b << 16),	\
10760 	}
10761 
10762 
10763 static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
10764 	ALC262_HP_MASTER_SWITCH,
10765 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10766 	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10767 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10768 	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10769 			      HDA_OUTPUT),
10770 	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10771 			    HDA_OUTPUT),
10772 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10773 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10774 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10775 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10776 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10777 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10778 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10779 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10780 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10781 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10782 	HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10783 	HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10784 	{ } /* end */
10785 };
10786 
10787 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
10788 	ALC262_HP_MASTER_SWITCH,
10789 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10790 	HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10791 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10792 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10793 	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10794 			      HDA_OUTPUT),
10795 	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10796 			    HDA_OUTPUT),
10797 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10798 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
10799 	HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
10800 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10801 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10802 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10803 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10804 	{ } /* end */
10805 };
10806 
10807 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
10808 	HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10809 	HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10810 	HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
10811 	{ } /* end */
10812 };
10813 
10814 /* mute/unmute internal speaker according to the hp jack and mute state */
10815 static void alc262_hp_t5735_setup(struct hda_codec *codec)
10816 {
10817 	struct alc_spec *spec = codec->spec;
10818 
10819 	spec->autocfg.hp_pins[0] = 0x15;
10820 	spec->autocfg.speaker_pins[0] = 0x14;
10821 }
10822 
10823 static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
10824 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10825 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10826 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10827 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10828 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10829 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10830 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10831 	{ } /* end */
10832 };
10833 
10834 static struct hda_verb alc262_hp_t5735_verbs[] = {
10835 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10836 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10837 
10838 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
10839 	{ }
10840 };
10841 
10842 static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
10843 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10844 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10845 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
10846 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
10847 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10848 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10849 	{ } /* end */
10850 };
10851 
10852 static struct hda_verb alc262_hp_rp5700_verbs[] = {
10853 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10854 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10855 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10856 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10857 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10858 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10859 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10860 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10861 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10862 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10863 	{}
10864 };
10865 
10866 static struct hda_input_mux alc262_hp_rp5700_capture_source = {
10867 	.num_items = 1,
10868 	.items = {
10869 		{ "Line", 0x1 },
10870 	},
10871 };
10872 
10873 /* bind hp and internal speaker mute (with plug check) as master switch */
10874 static void alc262_hippo_master_update(struct hda_codec *codec)
10875 {
10876 	struct alc_spec *spec = codec->spec;
10877 	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10878 	hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
10879 	hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
10880 	unsigned int mute;
10881 
10882 	/* HP */
10883 	mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
10884 	snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
10885 				 HDA_AMP_MUTE, mute);
10886 	/* mute internal speaker per jack sense */
10887 	if (spec->jack_present)
10888 		mute = HDA_AMP_MUTE;
10889 	if (line_nid)
10890 		snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
10891 					 HDA_AMP_MUTE, mute);
10892 	if (speaker_nid && speaker_nid != line_nid)
10893 		snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
10894 					 HDA_AMP_MUTE, mute);
10895 }
10896 
10897 #define alc262_hippo_master_sw_get	alc262_hp_master_sw_get
10898 
10899 static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
10900 				      struct snd_ctl_elem_value *ucontrol)
10901 {
10902 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10903 	struct alc_spec *spec = codec->spec;
10904 	int val = !!*ucontrol->value.integer.value;
10905 
10906 	if (val == spec->master_sw)
10907 		return 0;
10908 	spec->master_sw = val;
10909 	alc262_hippo_master_update(codec);
10910 	return 1;
10911 }
10912 
10913 #define ALC262_HIPPO_MASTER_SWITCH				\
10914 	{							\
10915 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		\
10916 		.name = "Master Playback Switch",		\
10917 		.info = snd_ctl_boolean_mono_info,		\
10918 		.get = alc262_hippo_master_sw_get,		\
10919 		.put = alc262_hippo_master_sw_put,		\
10920 	},							\
10921 	{							\
10922 		.iface = NID_MAPPING,				\
10923 		.name = "Master Playback Switch",		\
10924 		.subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
10925 			     (SUBDEV_SPEAKER(0) << 16), \
10926 	}
10927 
10928 static struct snd_kcontrol_new alc262_hippo_mixer[] = {
10929 	ALC262_HIPPO_MASTER_SWITCH,
10930 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10931 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10932 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10933 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10934 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10935 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10936 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10937 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10938 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10939 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10940 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10941 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10942 	{ } /* end */
10943 };
10944 
10945 static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
10946 	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10947 	ALC262_HIPPO_MASTER_SWITCH,
10948 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10949 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10950 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10951 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10952 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10953 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10954 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10955 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10956 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10957 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10958 	{ } /* end */
10959 };
10960 
10961 /* mute/unmute internal speaker according to the hp jack and mute state */
10962 static void alc262_hippo_automute(struct hda_codec *codec)
10963 {
10964 	struct alc_spec *spec = codec->spec;
10965 	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10966 
10967 	spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
10968 	alc262_hippo_master_update(codec);
10969 }
10970 
10971 static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
10972 {
10973 	if ((res >> 26) != ALC880_HP_EVENT)
10974 		return;
10975 	alc262_hippo_automute(codec);
10976 }
10977 
10978 static void alc262_hippo_setup(struct hda_codec *codec)
10979 {
10980 	struct alc_spec *spec = codec->spec;
10981 
10982 	spec->autocfg.hp_pins[0] = 0x15;
10983 	spec->autocfg.speaker_pins[0] = 0x14;
10984 }
10985 
10986 static void alc262_hippo1_setup(struct hda_codec *codec)
10987 {
10988 	struct alc_spec *spec = codec->spec;
10989 
10990 	spec->autocfg.hp_pins[0] = 0x1b;
10991 	spec->autocfg.speaker_pins[0] = 0x14;
10992 }
10993 
10994 
10995 static struct snd_kcontrol_new alc262_sony_mixer[] = {
10996 	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10997 	ALC262_HIPPO_MASTER_SWITCH,
10998 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10999 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11000 	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11001 	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11002 	{ } /* end */
11003 };
11004 
11005 static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
11006 	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11007 	ALC262_HIPPO_MASTER_SWITCH,
11008 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11009 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11010 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11011 	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11012 	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11013 	{ } /* end */
11014 };
11015 
11016 static struct snd_kcontrol_new alc262_tyan_mixer[] = {
11017 	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11018 	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11019 	HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
11020 	HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
11021 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11022 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11023 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11024 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11025 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11026 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11027 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11028 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11029 	{ } /* end */
11030 };
11031 
11032 static struct hda_verb alc262_tyan_verbs[] = {
11033 	/* Headphone automute */
11034 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11035 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11036 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11037 
11038 	/* P11 AUX_IN, white 4-pin connector */
11039 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11040 	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
11041 	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
11042 	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
11043 
11044 	{}
11045 };
11046 
11047 /* unsolicited event for HP jack sensing */
11048 static void alc262_tyan_setup(struct hda_codec *codec)
11049 {
11050 	struct alc_spec *spec = codec->spec;
11051 
11052 	spec->autocfg.hp_pins[0] = 0x1b;
11053 	spec->autocfg.speaker_pins[0] = 0x15;
11054 }
11055 
11056 
11057 #define alc262_capture_mixer		alc882_capture_mixer
11058 #define alc262_capture_alt_mixer	alc882_capture_alt_mixer
11059 
11060 /*
11061  * generic initialization of ADC, input mixers and output mixers
11062  */
11063 static struct hda_verb alc262_init_verbs[] = {
11064 	/*
11065 	 * Unmute ADC0-2 and set the default input to mic-in
11066 	 */
11067 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11068 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11069 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11070 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11071 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11072 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11073 
11074 	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11075 	 * mixer widget
11076 	 * Note: PASD motherboards uses the Line In 2 as the input for
11077 	 * front panel mic (mic 2)
11078 	 */
11079 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11080 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11081 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11082 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11083 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11084 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11085 
11086 	/*
11087 	 * Set up output mixers (0x0c - 0x0e)
11088 	 */
11089 	/* set vol=0 to output mixers */
11090 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11091 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11092 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11093 	/* set up input amps for analog loopback */
11094 	/* Amp Indices: DAC = 0, mixer = 1 */
11095 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11096 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11097 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11098 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11099 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11100 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11101 
11102 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11103 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11104 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11105 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11106 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11107 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11108 
11109 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11110 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11111 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11112 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11113 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11114 
11115 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11116 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11117 
11118 	/* FIXME: use matrix-type input source selection */
11119 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11120 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11121 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11122 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11123 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11124 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11125 	/* Input mixer2 */
11126 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11127 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11128 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11129 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11130 	/* Input mixer3 */
11131 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11132 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11133 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11134 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11135 
11136 	{ }
11137 };
11138 
11139 static struct hda_verb alc262_eapd_verbs[] = {
11140 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
11141 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
11142 	{ }
11143 };
11144 
11145 static struct hda_verb alc262_hippo1_unsol_verbs[] = {
11146 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11147 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11148 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11149 
11150 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11151 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11152 	{}
11153 };
11154 
11155 static struct hda_verb alc262_sony_unsol_verbs[] = {
11156 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11157 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11158 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},	// Front Mic
11159 
11160 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11161 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11162 	{}
11163 };
11164 
11165 static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
11166 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11167 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11168 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11169 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11170 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11171 	{ } /* end */
11172 };
11173 
11174 static struct hda_verb alc262_toshiba_s06_verbs[] = {
11175 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11176 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11177 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11178 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11179 	{0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
11180 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11181 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
11182 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11183 	{}
11184 };
11185 
11186 static void alc262_toshiba_s06_setup(struct hda_codec *codec)
11187 {
11188 	struct alc_spec *spec = codec->spec;
11189 
11190 	spec->autocfg.hp_pins[0] = 0x15;
11191 	spec->autocfg.speaker_pins[0] = 0x14;
11192 	spec->ext_mic.pin = 0x18;
11193 	spec->ext_mic.mux_idx = 0;
11194 	spec->int_mic.pin = 0x12;
11195 	spec->int_mic.mux_idx = 9;
11196 	spec->auto_mic = 1;
11197 }
11198 
11199 /*
11200  * nec model
11201  *  0x15 = headphone
11202  *  0x16 = internal speaker
11203  *  0x18 = external mic
11204  */
11205 
11206 static struct snd_kcontrol_new alc262_nec_mixer[] = {
11207 	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
11208 	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
11209 
11210 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11211 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11212 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11213 
11214 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11215 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11216 	{ } /* end */
11217 };
11218 
11219 static struct hda_verb alc262_nec_verbs[] = {
11220 	/* Unmute Speaker */
11221 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11222 
11223 	/* Headphone */
11224 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11225 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11226 
11227 	/* External mic to headphone */
11228 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11229 	/* External mic to speaker */
11230 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11231 	{}
11232 };
11233 
11234 /*
11235  * fujitsu model
11236  *  0x14 = headphone/spdif-out, 0x15 = internal speaker,
11237  *  0x1b = port replicator headphone out
11238  */
11239 
11240 #define ALC_HP_EVENT	0x37
11241 
11242 static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
11243 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11244 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11245 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11246 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11247 	{}
11248 };
11249 
11250 static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
11251 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11252 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11253 	{}
11254 };
11255 
11256 static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
11257 	/* Front Mic pin: input vref at 50% */
11258 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
11259 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11260 	{}
11261 };
11262 
11263 static struct hda_input_mux alc262_fujitsu_capture_source = {
11264 	.num_items = 3,
11265 	.items = {
11266 		{ "Mic", 0x0 },
11267 		{ "Int Mic", 0x1 },
11268 		{ "CD", 0x4 },
11269 	},
11270 };
11271 
11272 static struct hda_input_mux alc262_HP_capture_source = {
11273 	.num_items = 5,
11274 	.items = {
11275 		{ "Mic", 0x0 },
11276 		{ "Front Mic", 0x1 },
11277 		{ "Line", 0x2 },
11278 		{ "CD", 0x4 },
11279 		{ "AUX IN", 0x6 },
11280 	},
11281 };
11282 
11283 static struct hda_input_mux alc262_HP_D7000_capture_source = {
11284 	.num_items = 4,
11285 	.items = {
11286 		{ "Mic", 0x0 },
11287 		{ "Front Mic", 0x2 },
11288 		{ "Line", 0x1 },
11289 		{ "CD", 0x4 },
11290 	},
11291 };
11292 
11293 /* mute/unmute internal speaker according to the hp jacks and mute state */
11294 static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
11295 {
11296 	struct alc_spec *spec = codec->spec;
11297 	unsigned int mute;
11298 
11299 	if (force || !spec->sense_updated) {
11300 		spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
11301 				     snd_hda_jack_detect(codec, 0x1b);
11302 		spec->sense_updated = 1;
11303 	}
11304 	/* unmute internal speaker only if both HPs are unplugged and
11305 	 * master switch is on
11306 	 */
11307 	if (spec->jack_present)
11308 		mute = HDA_AMP_MUTE;
11309 	else
11310 		mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
11311 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11312 				 HDA_AMP_MUTE, mute);
11313 }
11314 
11315 /* unsolicited event for HP jack sensing */
11316 static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
11317 				       unsigned int res)
11318 {
11319 	if ((res >> 26) != ALC_HP_EVENT)
11320 		return;
11321 	alc262_fujitsu_automute(codec, 1);
11322 }
11323 
11324 static void alc262_fujitsu_init_hook(struct hda_codec *codec)
11325 {
11326 	alc262_fujitsu_automute(codec, 1);
11327 }
11328 
11329 /* bind volumes of both NID 0x0c and 0x0d */
11330 static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
11331 	.ops = &snd_hda_bind_vol,
11332 	.values = {
11333 		HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
11334 		HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
11335 		0
11336 	},
11337 };
11338 
11339 /* mute/unmute internal speaker according to the hp jack and mute state */
11340 static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
11341 {
11342 	struct alc_spec *spec = codec->spec;
11343 	unsigned int mute;
11344 
11345 	if (force || !spec->sense_updated) {
11346 		spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
11347 		spec->sense_updated = 1;
11348 	}
11349 	if (spec->jack_present) {
11350 		/* mute internal speaker */
11351 		snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11352 					 HDA_AMP_MUTE, HDA_AMP_MUTE);
11353 		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11354 					 HDA_AMP_MUTE, HDA_AMP_MUTE);
11355 	} else {
11356 		/* unmute internal speaker if necessary */
11357 		mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
11358 		snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11359 					 HDA_AMP_MUTE, mute);
11360 		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11361 					 HDA_AMP_MUTE, mute);
11362 	}
11363 }
11364 
11365 /* unsolicited event for HP jack sensing */
11366 static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
11367 				       unsigned int res)
11368 {
11369 	if ((res >> 26) != ALC_HP_EVENT)
11370 		return;
11371 	alc262_lenovo_3000_automute(codec, 1);
11372 }
11373 
11374 static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
11375 				  int dir, int idx, long *valp)
11376 {
11377 	int i, change = 0;
11378 
11379 	for (i = 0; i < 2; i++, valp++)
11380 		change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
11381 						   HDA_AMP_MUTE,
11382 						   *valp ? 0 : HDA_AMP_MUTE);
11383 	return change;
11384 }
11385 
11386 /* bind hp and internal speaker mute (with plug check) */
11387 static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
11388 					 struct snd_ctl_elem_value *ucontrol)
11389 {
11390 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11391 	long *valp = ucontrol->value.integer.value;
11392 	int change;
11393 
11394 	change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11395 	change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11396 	if (change)
11397 		alc262_fujitsu_automute(codec, 0);
11398 	return change;
11399 }
11400 
11401 static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
11402 	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11403 	{
11404 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11405 		.name = "Master Playback Switch",
11406 		.subdevice = HDA_SUBDEV_AMP_FLAG,
11407 		.info = snd_hda_mixer_amp_switch_info,
11408 		.get = snd_hda_mixer_amp_switch_get,
11409 		.put = alc262_fujitsu_master_sw_put,
11410 		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11411 	},
11412 	{
11413 		.iface = NID_MAPPING,
11414 		.name = "Master Playback Switch",
11415 		.private_value = 0x1b,
11416 	},
11417 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11418 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11419 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11420 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11421 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11422 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11423 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11424 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11425 	{ } /* end */
11426 };
11427 
11428 /* bind hp and internal speaker mute (with plug check) */
11429 static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
11430 					 struct snd_ctl_elem_value *ucontrol)
11431 {
11432 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11433 	long *valp = ucontrol->value.integer.value;
11434 	int change;
11435 
11436 	change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11437 	if (change)
11438 		alc262_lenovo_3000_automute(codec, 0);
11439 	return change;
11440 }
11441 
11442 static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
11443 	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11444 	{
11445 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11446 		.name = "Master Playback Switch",
11447 		.subdevice = HDA_SUBDEV_AMP_FLAG,
11448 		.info = snd_hda_mixer_amp_switch_info,
11449 		.get = snd_hda_mixer_amp_switch_get,
11450 		.put = alc262_lenovo_3000_master_sw_put,
11451 		.private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
11452 	},
11453 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11454 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11455 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11456 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11457 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11458 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11459 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11460 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11461 	{ } /* end */
11462 };
11463 
11464 static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11465 	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11466 	ALC262_HIPPO_MASTER_SWITCH,
11467 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11468 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11469 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11470 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11471 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11472 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11473 	{ } /* end */
11474 };
11475 
11476 /* additional init verbs for Benq laptops */
11477 static struct hda_verb alc262_EAPD_verbs[] = {
11478 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11479 	{0x20, AC_VERB_SET_PROC_COEF,  0x3070},
11480 	{}
11481 };
11482 
11483 static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11484 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11485 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11486 
11487 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11488 	{0x20, AC_VERB_SET_PROC_COEF,  0x3050},
11489 	{}
11490 };
11491 
11492 /* Samsung Q1 Ultra Vista model setup */
11493 static struct snd_kcontrol_new alc262_ultra_mixer[] = {
11494 	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11495 	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11496 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11497 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11498 	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
11499 	HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
11500 	{ } /* end */
11501 };
11502 
11503 static struct hda_verb alc262_ultra_verbs[] = {
11504 	/* output mixer */
11505 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11506 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11507 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11508 	/* speaker */
11509 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11510 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11511 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11512 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11513 	/* HP */
11514 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11515 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11516 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11517 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11518 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11519 	/* internal mic */
11520 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11521 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11522 	/* ADC, choose mic */
11523 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11524 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11525 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11526 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11527 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11528 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11529 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11530 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11531 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11532 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
11533 	{}
11534 };
11535 
11536 /* mute/unmute internal speaker according to the hp jack and mute state */
11537 static void alc262_ultra_automute(struct hda_codec *codec)
11538 {
11539 	struct alc_spec *spec = codec->spec;
11540 	unsigned int mute;
11541 
11542 	mute = 0;
11543 	/* auto-mute only when HP is used as HP */
11544 	if (!spec->cur_mux[0]) {
11545 		spec->jack_present = snd_hda_jack_detect(codec, 0x15);
11546 		if (spec->jack_present)
11547 			mute = HDA_AMP_MUTE;
11548 	}
11549 	/* mute/unmute internal speaker */
11550 	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11551 				 HDA_AMP_MUTE, mute);
11552 	/* mute/unmute HP */
11553 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11554 				 HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
11555 }
11556 
11557 /* unsolicited event for HP jack sensing */
11558 static void alc262_ultra_unsol_event(struct hda_codec *codec,
11559 				       unsigned int res)
11560 {
11561 	if ((res >> 26) != ALC880_HP_EVENT)
11562 		return;
11563 	alc262_ultra_automute(codec);
11564 }
11565 
11566 static struct hda_input_mux alc262_ultra_capture_source = {
11567 	.num_items = 2,
11568 	.items = {
11569 		{ "Mic", 0x1 },
11570 		{ "Headphone", 0x7 },
11571 	},
11572 };
11573 
11574 static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
11575 				     struct snd_ctl_elem_value *ucontrol)
11576 {
11577 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11578 	struct alc_spec *spec = codec->spec;
11579 	int ret;
11580 
11581 	ret = alc_mux_enum_put(kcontrol, ucontrol);
11582 	if (!ret)
11583 		return 0;
11584 	/* reprogram the HP pin as mic or HP according to the input source */
11585 	snd_hda_codec_write_cache(codec, 0x15, 0,
11586 				  AC_VERB_SET_PIN_WIDGET_CONTROL,
11587 				  spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
11588 	alc262_ultra_automute(codec); /* mute/unmute HP */
11589 	return ret;
11590 }
11591 
11592 static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
11593 	HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
11594 	HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
11595 	{
11596 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11597 		.name = "Capture Source",
11598 		.info = alc_mux_enum_info,
11599 		.get = alc_mux_enum_get,
11600 		.put = alc262_ultra_mux_enum_put,
11601 	},
11602 	{
11603 		.iface = NID_MAPPING,
11604 		.name = "Capture Source",
11605 		.private_value = 0x15,
11606 	},
11607 	{ } /* end */
11608 };
11609 
11610 /* We use two mixers depending on the output pin; 0x16 is a mono output
11611  * and thus it's bound with a different mixer.
11612  * This function returns which mixer amp should be used.
11613  */
11614 static int alc262_check_volbit(hda_nid_t nid)
11615 {
11616 	if (!nid)
11617 		return 0;
11618 	else if (nid == 0x16)
11619 		return 2;
11620 	else
11621 		return 1;
11622 }
11623 
11624 static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
11625 				  const char *pfx, int *vbits)
11626 {
11627 	unsigned long val;
11628 	int vbit;
11629 
11630 	vbit = alc262_check_volbit(nid);
11631 	if (!vbit)
11632 		return 0;
11633 	if (*vbits & vbit) /* a volume control for this mixer already there */
11634 		return 0;
11635 	*vbits |= vbit;
11636 	if (vbit == 2)
11637 		val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
11638 	else
11639 		val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
11640 	return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val);
11641 }
11642 
11643 static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
11644 				 const char *pfx)
11645 {
11646 	unsigned long val;
11647 
11648 	if (!nid)
11649 		return 0;
11650 	if (nid == 0x16)
11651 		val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
11652 	else
11653 		val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
11654 	return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val);
11655 }
11656 
11657 /* add playback controls from the parsed DAC table */
11658 static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
11659 					     const struct auto_pin_cfg *cfg)
11660 {
11661 	const char *pfx;
11662 	int vbits;
11663 	int err;
11664 
11665 	spec->multiout.num_dacs = 1;	/* only use one dac */
11666 	spec->multiout.dac_nids = spec->private_dac_nids;
11667 	spec->multiout.dac_nids[0] = 2;
11668 
11669 	if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
11670 		pfx = "Master";
11671 	else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11672 		pfx = "Speaker";
11673 	else
11674 		pfx = "Front";
11675 	err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
11676 	if (err < 0)
11677 		return err;
11678 	err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
11679 	if (err < 0)
11680 		return err;
11681 	err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
11682 	if (err < 0)
11683 		return err;
11684 
11685 	vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
11686 		alc262_check_volbit(cfg->speaker_pins[0]) |
11687 		alc262_check_volbit(cfg->hp_pins[0]);
11688 	if (vbits == 1 || vbits == 2)
11689 		pfx = "Master"; /* only one mixer is used */
11690 	else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11691 		pfx = "Speaker";
11692 	else
11693 		pfx = "Front";
11694 	vbits = 0;
11695 	err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
11696 	if (err < 0)
11697 		return err;
11698 	err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
11699 				     &vbits);
11700 	if (err < 0)
11701 		return err;
11702 	err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
11703 				     &vbits);
11704 	if (err < 0)
11705 		return err;
11706 	return 0;
11707 }
11708 
11709 #define alc262_auto_create_input_ctls \
11710 	alc882_auto_create_input_ctls
11711 
11712 /*
11713  * generic initialization of ADC, input mixers and output mixers
11714  */
11715 static struct hda_verb alc262_volume_init_verbs[] = {
11716 	/*
11717 	 * Unmute ADC0-2 and set the default input to mic-in
11718 	 */
11719 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11720 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11721 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11722 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11723 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11724 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11725 
11726 	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11727 	 * mixer widget
11728 	 * Note: PASD motherboards uses the Line In 2 as the input for
11729 	 * front panel mic (mic 2)
11730 	 */
11731 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11732 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11733 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11734 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11735 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11736 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11737 
11738 	/*
11739 	 * Set up output mixers (0x0c - 0x0f)
11740 	 */
11741 	/* set vol=0 to output mixers */
11742 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11743 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11744 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11745 
11746 	/* set up input amps for analog loopback */
11747 	/* Amp Indices: DAC = 0, mixer = 1 */
11748 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11749 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11750 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11751 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11752 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11753 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11754 
11755 	/* FIXME: use matrix-type input source selection */
11756 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11757 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11758 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11759 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11760 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11761 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11762 	/* Input mixer2 */
11763 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11764 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11765 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11766 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11767 	/* Input mixer3 */
11768 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11769 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11770 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11771 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11772 
11773 	{ }
11774 };
11775 
11776 static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11777 	/*
11778 	 * Unmute ADC0-2 and set the default input to mic-in
11779 	 */
11780 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11781 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11782 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11783 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11784 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11785 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11786 
11787 	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11788 	 * mixer widget
11789 	 * Note: PASD motherboards uses the Line In 2 as the input for
11790 	 * front panel mic (mic 2)
11791 	 */
11792 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11793 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11794 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11795 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11796 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11797 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11798 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11799         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11800 
11801 	/*
11802 	 * Set up output mixers (0x0c - 0x0e)
11803 	 */
11804 	/* set vol=0 to output mixers */
11805 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11806 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11807 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11808 
11809 	/* set up input amps for analog loopback */
11810 	/* Amp Indices: DAC = 0, mixer = 1 */
11811 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11812 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11813 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11814 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11815 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11816 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11817 
11818 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11819 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11820 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11821 
11822 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11823 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11824 
11825 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11826 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11827 
11828 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11829 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11830         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11831 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11832 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11833 
11834 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11835 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11836         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11837 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11838 	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11839 	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11840 
11841 
11842 	/* FIXME: use matrix-type input source selection */
11843 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
11844 	/* Input mixer1: only unmute Mic */
11845 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11846 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11847 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11848 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11849 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11850 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11851 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11852 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11853 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11854 	/* Input mixer2 */
11855 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11856 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11857 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11858 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11859 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11860 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11861 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11862 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11863 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11864 	/* Input mixer3 */
11865 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11866 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11867 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11868 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11869 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11870 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11871 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11872 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11873 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11874 
11875 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11876 
11877 	{ }
11878 };
11879 
11880 static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
11881 	/*
11882 	 * Unmute ADC0-2 and set the default input to mic-in
11883 	 */
11884 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11885 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11886 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11887 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11888 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11889 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11890 
11891 	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11892 	 * mixer widget
11893 	 * Note: PASD motherboards uses the Line In 2 as the input for front
11894 	 * panel mic (mic 2)
11895 	 */
11896 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11897 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11898 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11899 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11900 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11901 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11902 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11903 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11904 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11905 	/*
11906 	 * Set up output mixers (0x0c - 0x0e)
11907 	 */
11908 	/* set vol=0 to output mixers */
11909 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11910 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11911 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11912 
11913 	/* set up input amps for analog loopback */
11914 	/* Amp Indices: DAC = 0, mixer = 1 */
11915 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11916 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11917 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11918 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11919 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11920 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11921 
11922 
11923 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* HP */
11924 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Mono */
11925 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* rear MIC */
11926 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* Line in */
11927 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* Front MIC */
11928 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Line out */
11929 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* CD in */
11930 
11931 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11932 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11933 
11934 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11935 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11936 
11937 	/* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
11938 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11939 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11940 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
11941 	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11942 	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11943 
11944 	/* FIXME: use matrix-type input source selection */
11945 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11946 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11947 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
11948 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
11949 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
11950 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
11951 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
11952         /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))},  */
11953 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
11954 	/* Input mixer2 */
11955 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11956 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11957 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11958 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11959 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11960         /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11961 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11962 	/* Input mixer3 */
11963 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11964 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11965 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11966 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11967 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11968         /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11969 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11970 
11971 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11972 
11973 	{ }
11974 };
11975 
11976 static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
11977 
11978 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Front Speaker */
11979 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11980 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
11981 
11982 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* MIC jack */
11983 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* Front MIC */
11984 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11985 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11986 
11987 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* HP  jack */
11988 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11989 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11990 	{}
11991 };
11992 
11993 
11994 #ifdef CONFIG_SND_HDA_POWER_SAVE
11995 #define alc262_loopbacks	alc880_loopbacks
11996 #endif
11997 
11998 /* pcm configuration: identical with ALC880 */
11999 #define alc262_pcm_analog_playback	alc880_pcm_analog_playback
12000 #define alc262_pcm_analog_capture	alc880_pcm_analog_capture
12001 #define alc262_pcm_digital_playback	alc880_pcm_digital_playback
12002 #define alc262_pcm_digital_capture	alc880_pcm_digital_capture
12003 
12004 /*
12005  * BIOS auto configuration
12006  */
12007 static int alc262_parse_auto_config(struct hda_codec *codec)
12008 {
12009 	struct alc_spec *spec = codec->spec;
12010 	int err;
12011 	static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
12012 
12013 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12014 					   alc262_ignore);
12015 	if (err < 0)
12016 		return err;
12017 	if (!spec->autocfg.line_outs) {
12018 		if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
12019 			spec->multiout.max_channels = 2;
12020 			spec->no_analog = 1;
12021 			goto dig_only;
12022 		}
12023 		return 0; /* can't find valid BIOS pin config */
12024 	}
12025 	err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
12026 	if (err < 0)
12027 		return err;
12028 	err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
12029 	if (err < 0)
12030 		return err;
12031 
12032 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
12033 
12034  dig_only:
12035 	if (spec->autocfg.dig_outs) {
12036 		spec->multiout.dig_out_nid = ALC262_DIGOUT_NID;
12037 		spec->dig_out_type = spec->autocfg.dig_out_type[0];
12038 	}
12039 	if (spec->autocfg.dig_in_pin)
12040 		spec->dig_in_nid = ALC262_DIGIN_NID;
12041 
12042 	if (spec->kctls.list)
12043 		add_mixer(spec, spec->kctls.list);
12044 
12045 	add_verb(spec, alc262_volume_init_verbs);
12046 	spec->num_mux_defs = 1;
12047 	spec->input_mux = &spec->private_imux[0];
12048 
12049 	err = alc_auto_add_mic_boost(codec);
12050 	if (err < 0)
12051 		return err;
12052 
12053 	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
12054 
12055 	return 1;
12056 }
12057 
12058 #define alc262_auto_init_multi_out	alc882_auto_init_multi_out
12059 #define alc262_auto_init_hp_out		alc882_auto_init_hp_out
12060 #define alc262_auto_init_analog_input	alc882_auto_init_analog_input
12061 #define alc262_auto_init_input_src	alc882_auto_init_input_src
12062 
12063 
12064 /* init callback for auto-configuration model -- overriding the default init */
12065 static void alc262_auto_init(struct hda_codec *codec)
12066 {
12067 	struct alc_spec *spec = codec->spec;
12068 	alc262_auto_init_multi_out(codec);
12069 	alc262_auto_init_hp_out(codec);
12070 	alc262_auto_init_analog_input(codec);
12071 	alc262_auto_init_input_src(codec);
12072 	if (spec->unsol_event)
12073 		alc_inithook(codec);
12074 }
12075 
12076 /*
12077  * configuration and preset
12078  */
12079 static const char *alc262_models[ALC262_MODEL_LAST] = {
12080 	[ALC262_BASIC]		= "basic",
12081 	[ALC262_HIPPO]		= "hippo",
12082 	[ALC262_HIPPO_1]	= "hippo_1",
12083 	[ALC262_FUJITSU]	= "fujitsu",
12084 	[ALC262_HP_BPC]		= "hp-bpc",
12085 	[ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
12086 	[ALC262_HP_TC_T5735]	= "hp-tc-t5735",
12087 	[ALC262_HP_RP5700]	= "hp-rp5700",
12088 	[ALC262_BENQ_ED8]	= "benq",
12089 	[ALC262_BENQ_T31]	= "benq-t31",
12090 	[ALC262_SONY_ASSAMD]	= "sony-assamd",
12091 	[ALC262_TOSHIBA_S06]	= "toshiba-s06",
12092 	[ALC262_TOSHIBA_RX1]	= "toshiba-rx1",
12093 	[ALC262_ULTRA]		= "ultra",
12094 	[ALC262_LENOVO_3000]	= "lenovo-3000",
12095 	[ALC262_NEC]		= "nec",
12096 	[ALC262_TYAN]		= "tyan",
12097 	[ALC262_AUTO]		= "auto",
12098 };
12099 
12100 static struct snd_pci_quirk alc262_cfg_tbl[] = {
12101 	SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
12102 	SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
12103 	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
12104 			   ALC262_HP_BPC),
12105 	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
12106 			   ALC262_HP_BPC),
12107 	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
12108 			   ALC262_HP_BPC),
12109 	SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
12110 	SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
12111 	SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
12112 	SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
12113 	SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
12114 	SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
12115 	SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
12116 	SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
12117 	SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
12118 	SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
12119 	SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
12120 	SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
12121 		      ALC262_HP_TC_T5735),
12122 	SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
12123 	SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
12124 	SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
12125 	SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
12126 	SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
12127 	SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
12128 	SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
12129 	SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
12130 #if 0 /* disable the quirk since model=auto works better in recent versions */
12131 	SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
12132 			   ALC262_SONY_ASSAMD),
12133 #endif
12134 	SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
12135 		      ALC262_TOSHIBA_RX1),
12136 	SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
12137 	SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
12138 	SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
12139 	SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
12140 	SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
12141 			   ALC262_ULTRA),
12142 	SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
12143 	SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
12144 	SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
12145 	SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
12146 	SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
12147 	{}
12148 };
12149 
12150 static struct alc_config_preset alc262_presets[] = {
12151 	[ALC262_BASIC] = {
12152 		.mixers = { alc262_base_mixer },
12153 		.init_verbs = { alc262_init_verbs },
12154 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12155 		.dac_nids = alc262_dac_nids,
12156 		.hp_nid = 0x03,
12157 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12158 		.channel_mode = alc262_modes,
12159 		.input_mux = &alc262_capture_source,
12160 	},
12161 	[ALC262_HIPPO] = {
12162 		.mixers = { alc262_hippo_mixer },
12163 		.init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
12164 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12165 		.dac_nids = alc262_dac_nids,
12166 		.hp_nid = 0x03,
12167 		.dig_out_nid = ALC262_DIGOUT_NID,
12168 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12169 		.channel_mode = alc262_modes,
12170 		.input_mux = &alc262_capture_source,
12171 		.unsol_event = alc262_hippo_unsol_event,
12172 		.setup = alc262_hippo_setup,
12173 		.init_hook = alc262_hippo_automute,
12174 	},
12175 	[ALC262_HIPPO_1] = {
12176 		.mixers = { alc262_hippo1_mixer },
12177 		.init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
12178 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12179 		.dac_nids = alc262_dac_nids,
12180 		.hp_nid = 0x02,
12181 		.dig_out_nid = ALC262_DIGOUT_NID,
12182 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12183 		.channel_mode = alc262_modes,
12184 		.input_mux = &alc262_capture_source,
12185 		.unsol_event = alc262_hippo_unsol_event,
12186 		.setup = alc262_hippo1_setup,
12187 		.init_hook = alc262_hippo_automute,
12188 	},
12189 	[ALC262_FUJITSU] = {
12190 		.mixers = { alc262_fujitsu_mixer },
12191 		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12192 				alc262_fujitsu_unsol_verbs },
12193 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12194 		.dac_nids = alc262_dac_nids,
12195 		.hp_nid = 0x03,
12196 		.dig_out_nid = ALC262_DIGOUT_NID,
12197 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12198 		.channel_mode = alc262_modes,
12199 		.input_mux = &alc262_fujitsu_capture_source,
12200 		.unsol_event = alc262_fujitsu_unsol_event,
12201 		.init_hook = alc262_fujitsu_init_hook,
12202 	},
12203 	[ALC262_HP_BPC] = {
12204 		.mixers = { alc262_HP_BPC_mixer },
12205 		.init_verbs = { alc262_HP_BPC_init_verbs },
12206 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12207 		.dac_nids = alc262_dac_nids,
12208 		.hp_nid = 0x03,
12209 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12210 		.channel_mode = alc262_modes,
12211 		.input_mux = &alc262_HP_capture_source,
12212 		.unsol_event = alc262_hp_bpc_unsol_event,
12213 		.init_hook = alc262_hp_bpc_automute,
12214 	},
12215 	[ALC262_HP_BPC_D7000_WF] = {
12216 		.mixers = { alc262_HP_BPC_WildWest_mixer },
12217 		.init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12218 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12219 		.dac_nids = alc262_dac_nids,
12220 		.hp_nid = 0x03,
12221 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12222 		.channel_mode = alc262_modes,
12223 		.input_mux = &alc262_HP_D7000_capture_source,
12224 		.unsol_event = alc262_hp_wildwest_unsol_event,
12225 		.init_hook = alc262_hp_wildwest_automute,
12226 	},
12227 	[ALC262_HP_BPC_D7000_WL] = {
12228 		.mixers = { alc262_HP_BPC_WildWest_mixer,
12229 			    alc262_HP_BPC_WildWest_option_mixer },
12230 		.init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12231 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12232 		.dac_nids = alc262_dac_nids,
12233 		.hp_nid = 0x03,
12234 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12235 		.channel_mode = alc262_modes,
12236 		.input_mux = &alc262_HP_D7000_capture_source,
12237 		.unsol_event = alc262_hp_wildwest_unsol_event,
12238 		.init_hook = alc262_hp_wildwest_automute,
12239 	},
12240 	[ALC262_HP_TC_T5735] = {
12241 		.mixers = { alc262_hp_t5735_mixer },
12242 		.init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
12243 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12244 		.dac_nids = alc262_dac_nids,
12245 		.hp_nid = 0x03,
12246 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12247 		.channel_mode = alc262_modes,
12248 		.input_mux = &alc262_capture_source,
12249 		.unsol_event = alc_sku_unsol_event,
12250 		.setup = alc262_hp_t5735_setup,
12251 		.init_hook = alc_inithook,
12252 	},
12253 	[ALC262_HP_RP5700] = {
12254 		.mixers = { alc262_hp_rp5700_mixer },
12255 		.init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
12256 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12257 		.dac_nids = alc262_dac_nids,
12258 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12259 		.channel_mode = alc262_modes,
12260 		.input_mux = &alc262_hp_rp5700_capture_source,
12261         },
12262 	[ALC262_BENQ_ED8] = {
12263 		.mixers = { alc262_base_mixer },
12264 		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
12265 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12266 		.dac_nids = alc262_dac_nids,
12267 		.hp_nid = 0x03,
12268 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12269 		.channel_mode = alc262_modes,
12270 		.input_mux = &alc262_capture_source,
12271 	},
12272 	[ALC262_SONY_ASSAMD] = {
12273 		.mixers = { alc262_sony_mixer },
12274 		.init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
12275 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12276 		.dac_nids = alc262_dac_nids,
12277 		.hp_nid = 0x02,
12278 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12279 		.channel_mode = alc262_modes,
12280 		.input_mux = &alc262_capture_source,
12281 		.unsol_event = alc262_hippo_unsol_event,
12282 		.setup = alc262_hippo_setup,
12283 		.init_hook = alc262_hippo_automute,
12284 	},
12285 	[ALC262_BENQ_T31] = {
12286 		.mixers = { alc262_benq_t31_mixer },
12287 		.init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
12288 				alc_hp15_unsol_verbs },
12289 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12290 		.dac_nids = alc262_dac_nids,
12291 		.hp_nid = 0x03,
12292 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12293 		.channel_mode = alc262_modes,
12294 		.input_mux = &alc262_capture_source,
12295 		.unsol_event = alc262_hippo_unsol_event,
12296 		.setup = alc262_hippo_setup,
12297 		.init_hook = alc262_hippo_automute,
12298 	},
12299 	[ALC262_ULTRA] = {
12300 		.mixers = { alc262_ultra_mixer },
12301 		.cap_mixer = alc262_ultra_capture_mixer,
12302 		.init_verbs = { alc262_ultra_verbs },
12303 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12304 		.dac_nids = alc262_dac_nids,
12305 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12306 		.channel_mode = alc262_modes,
12307 		.input_mux = &alc262_ultra_capture_source,
12308 		.adc_nids = alc262_adc_nids, /* ADC0 */
12309 		.capsrc_nids = alc262_capsrc_nids,
12310 		.num_adc_nids = 1, /* single ADC */
12311 		.unsol_event = alc262_ultra_unsol_event,
12312 		.init_hook = alc262_ultra_automute,
12313 	},
12314 	[ALC262_LENOVO_3000] = {
12315 		.mixers = { alc262_lenovo_3000_mixer },
12316 		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12317 				alc262_lenovo_3000_unsol_verbs,
12318 				alc262_lenovo_3000_init_verbs },
12319 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12320 		.dac_nids = alc262_dac_nids,
12321 		.hp_nid = 0x03,
12322 		.dig_out_nid = ALC262_DIGOUT_NID,
12323 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12324 		.channel_mode = alc262_modes,
12325 		.input_mux = &alc262_fujitsu_capture_source,
12326 		.unsol_event = alc262_lenovo_3000_unsol_event,
12327 	},
12328 	[ALC262_NEC] = {
12329 		.mixers = { alc262_nec_mixer },
12330 		.init_verbs = { alc262_nec_verbs },
12331 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12332 		.dac_nids = alc262_dac_nids,
12333 		.hp_nid = 0x03,
12334 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12335 		.channel_mode = alc262_modes,
12336 		.input_mux = &alc262_capture_source,
12337 	},
12338 	[ALC262_TOSHIBA_S06] = {
12339 		.mixers = { alc262_toshiba_s06_mixer },
12340 		.init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
12341 							alc262_eapd_verbs },
12342 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12343 		.capsrc_nids = alc262_dmic_capsrc_nids,
12344 		.dac_nids = alc262_dac_nids,
12345 		.adc_nids = alc262_dmic_adc_nids, /* ADC0 */
12346 		.num_adc_nids = 1, /* single ADC */
12347 		.dig_out_nid = ALC262_DIGOUT_NID,
12348 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12349 		.channel_mode = alc262_modes,
12350 		.unsol_event = alc_sku_unsol_event,
12351 		.setup = alc262_toshiba_s06_setup,
12352 		.init_hook = alc_inithook,
12353 	},
12354 	[ALC262_TOSHIBA_RX1] = {
12355 		.mixers = { alc262_toshiba_rx1_mixer },
12356 		.init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
12357 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12358 		.dac_nids = alc262_dac_nids,
12359 		.hp_nid = 0x03,
12360 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12361 		.channel_mode = alc262_modes,
12362 		.input_mux = &alc262_capture_source,
12363 		.unsol_event = alc262_hippo_unsol_event,
12364 		.setup = alc262_hippo_setup,
12365 		.init_hook = alc262_hippo_automute,
12366 	},
12367 	[ALC262_TYAN] = {
12368 		.mixers = { alc262_tyan_mixer },
12369 		.init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
12370 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12371 		.dac_nids = alc262_dac_nids,
12372 		.hp_nid = 0x02,
12373 		.dig_out_nid = ALC262_DIGOUT_NID,
12374 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12375 		.channel_mode = alc262_modes,
12376 		.input_mux = &alc262_capture_source,
12377 		.unsol_event = alc_automute_amp_unsol_event,
12378 		.setup = alc262_tyan_setup,
12379 		.init_hook = alc_automute_amp,
12380 	},
12381 };
12382 
12383 static int patch_alc262(struct hda_codec *codec)
12384 {
12385 	struct alc_spec *spec;
12386 	int board_config;
12387 	int err;
12388 
12389 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
12390 	if (spec == NULL)
12391 		return -ENOMEM;
12392 
12393 	codec->spec = spec;
12394 #if 0
12395 	/* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
12396 	 * under-run
12397 	 */
12398 	{
12399 	int tmp;
12400 	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12401 	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
12402 	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12403 	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
12404 	}
12405 #endif
12406 	alc_auto_parse_customize_define(codec);
12407 
12408 	alc_fix_pll_init(codec, 0x20, 0x0a, 10);
12409 
12410 	board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
12411 						  alc262_models,
12412 						  alc262_cfg_tbl);
12413 
12414 	if (board_config < 0) {
12415 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12416 		       codec->chip_name);
12417 		board_config = ALC262_AUTO;
12418 	}
12419 
12420 	if (board_config == ALC262_AUTO) {
12421 		/* automatic parse from the BIOS config */
12422 		err = alc262_parse_auto_config(codec);
12423 		if (err < 0) {
12424 			alc_free(codec);
12425 			return err;
12426 		} else if (!err) {
12427 			printk(KERN_INFO
12428 			       "hda_codec: Cannot set up configuration "
12429 			       "from BIOS.  Using base mode...\n");
12430 			board_config = ALC262_BASIC;
12431 		}
12432 	}
12433 
12434 	if (!spec->no_analog) {
12435 		err = snd_hda_attach_beep_device(codec, 0x1);
12436 		if (err < 0) {
12437 			alc_free(codec);
12438 			return err;
12439 		}
12440 	}
12441 
12442 	if (board_config != ALC262_AUTO)
12443 		setup_preset(codec, &alc262_presets[board_config]);
12444 
12445 	spec->stream_analog_playback = &alc262_pcm_analog_playback;
12446 	spec->stream_analog_capture = &alc262_pcm_analog_capture;
12447 
12448 	spec->stream_digital_playback = &alc262_pcm_digital_playback;
12449 	spec->stream_digital_capture = &alc262_pcm_digital_capture;
12450 
12451 	if (!spec->adc_nids && spec->input_mux) {
12452 		int i;
12453 		/* check whether the digital-mic has to be supported */
12454 		for (i = 0; i < spec->input_mux->num_items; i++) {
12455 			if (spec->input_mux->items[i].index >= 9)
12456 				break;
12457 		}
12458 		if (i < spec->input_mux->num_items) {
12459 			/* use only ADC0 */
12460 			spec->adc_nids = alc262_dmic_adc_nids;
12461 			spec->num_adc_nids = 1;
12462 			spec->capsrc_nids = alc262_dmic_capsrc_nids;
12463 		} else {
12464 			/* all analog inputs */
12465 			/* check whether NID 0x07 is valid */
12466 			unsigned int wcap = get_wcaps(codec, 0x07);
12467 
12468 			/* get type */
12469 			wcap = get_wcaps_type(wcap);
12470 			if (wcap != AC_WID_AUD_IN) {
12471 				spec->adc_nids = alc262_adc_nids_alt;
12472 				spec->num_adc_nids =
12473 					ARRAY_SIZE(alc262_adc_nids_alt);
12474 				spec->capsrc_nids = alc262_capsrc_nids_alt;
12475 			} else {
12476 				spec->adc_nids = alc262_adc_nids;
12477 				spec->num_adc_nids =
12478 					ARRAY_SIZE(alc262_adc_nids);
12479 				spec->capsrc_nids = alc262_capsrc_nids;
12480 			}
12481 		}
12482 	}
12483 	if (!spec->cap_mixer && !spec->no_analog)
12484 		set_capture_mixer(codec);
12485 	if (!spec->no_analog && spec->cdefine.enable_pcbeep)
12486 		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12487 
12488 	spec->vmaster_nid = 0x0c;
12489 
12490 	codec->patch_ops = alc_patch_ops;
12491 	if (board_config == ALC262_AUTO)
12492 		spec->init_hook = alc262_auto_init;
12493 #ifdef CONFIG_SND_HDA_POWER_SAVE
12494 	if (!spec->loopback.amplist)
12495 		spec->loopback.amplist = alc262_loopbacks;
12496 #endif
12497 
12498 	return 0;
12499 }
12500 
12501 /*
12502  *  ALC268 channel source setting (2 channel)
12503  */
12504 #define ALC268_DIGOUT_NID	ALC880_DIGOUT_NID
12505 #define alc268_modes		alc260_modes
12506 
12507 static hda_nid_t alc268_dac_nids[2] = {
12508 	/* front, hp */
12509 	0x02, 0x03
12510 };
12511 
12512 static hda_nid_t alc268_adc_nids[2] = {
12513 	/* ADC0-1 */
12514 	0x08, 0x07
12515 };
12516 
12517 static hda_nid_t alc268_adc_nids_alt[1] = {
12518 	/* ADC0 */
12519 	0x08
12520 };
12521 
12522 static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
12523 
12524 static struct snd_kcontrol_new alc268_base_mixer[] = {
12525 	/* output mixer control */
12526 	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12527 	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12528 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12529 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12530 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12531 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12532 	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12533 	{ }
12534 };
12535 
12536 static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
12537 	/* output mixer control */
12538 	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12539 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12540 	ALC262_HIPPO_MASTER_SWITCH,
12541 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12542 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12543 	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12544 	{ }
12545 };
12546 
12547 /* bind Beep switches of both NID 0x0f and 0x10 */
12548 static struct hda_bind_ctls alc268_bind_beep_sw = {
12549 	.ops = &snd_hda_bind_sw,
12550 	.values = {
12551 		HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
12552 		HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
12553 		0
12554 	},
12555 };
12556 
12557 static struct snd_kcontrol_new alc268_beep_mixer[] = {
12558 	HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
12559 	HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
12560 	{ }
12561 };
12562 
12563 static struct hda_verb alc268_eapd_verbs[] = {
12564 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
12565 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
12566 	{ }
12567 };
12568 
12569 /* Toshiba specific */
12570 static struct hda_verb alc268_toshiba_verbs[] = {
12571 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12572 	{ } /* end */
12573 };
12574 
12575 /* Acer specific */
12576 /* bind volumes of both NID 0x02 and 0x03 */
12577 static struct hda_bind_ctls alc268_acer_bind_master_vol = {
12578 	.ops = &snd_hda_bind_vol,
12579 	.values = {
12580 		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
12581 		HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
12582 		0
12583 	},
12584 };
12585 
12586 /* mute/unmute internal speaker according to the hp jack and mute state */
12587 static void alc268_acer_automute(struct hda_codec *codec, int force)
12588 {
12589 	struct alc_spec *spec = codec->spec;
12590 	unsigned int mute;
12591 
12592 	if (force || !spec->sense_updated) {
12593 		spec->jack_present = snd_hda_jack_detect(codec, 0x14);
12594 		spec->sense_updated = 1;
12595 	}
12596 	if (spec->jack_present)
12597 		mute = HDA_AMP_MUTE; /* mute internal speaker */
12598 	else /* unmute internal speaker if necessary */
12599 		mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
12600 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
12601 				 HDA_AMP_MUTE, mute);
12602 }
12603 
12604 
12605 /* bind hp and internal speaker mute (with plug check) */
12606 static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
12607 				     struct snd_ctl_elem_value *ucontrol)
12608 {
12609 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
12610 	long *valp = ucontrol->value.integer.value;
12611 	int change;
12612 
12613 	change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
12614 	if (change)
12615 		alc268_acer_automute(codec, 0);
12616 	return change;
12617 }
12618 
12619 static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
12620 	/* output mixer control */
12621 	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12622 	{
12623 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12624 		.name = "Master Playback Switch",
12625 		.subdevice = HDA_SUBDEV_AMP_FLAG,
12626 		.info = snd_hda_mixer_amp_switch_info,
12627 		.get = snd_hda_mixer_amp_switch_get,
12628 		.put = alc268_acer_master_sw_put,
12629 		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12630 	},
12631 	HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
12632 	{ }
12633 };
12634 
12635 static struct snd_kcontrol_new alc268_acer_mixer[] = {
12636 	/* output mixer control */
12637 	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12638 	{
12639 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12640 		.name = "Master Playback Switch",
12641 		.subdevice = HDA_SUBDEV_AMP_FLAG,
12642 		.info = snd_hda_mixer_amp_switch_info,
12643 		.get = snd_hda_mixer_amp_switch_get,
12644 		.put = alc268_acer_master_sw_put,
12645 		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12646 	},
12647 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12648 	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12649 	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12650 	{ }
12651 };
12652 
12653 static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
12654 	/* output mixer control */
12655 	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12656 	{
12657 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12658 		.name = "Master Playback Switch",
12659 		.subdevice = HDA_SUBDEV_AMP_FLAG,
12660 		.info = snd_hda_mixer_amp_switch_info,
12661 		.get = snd_hda_mixer_amp_switch_get,
12662 		.put = alc268_acer_master_sw_put,
12663 		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12664 	},
12665 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12666 	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12667 	{ }
12668 };
12669 
12670 static struct hda_verb alc268_acer_aspire_one_verbs[] = {
12671 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12672 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12673 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12674 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12675 	{0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
12676 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
12677 	{ }
12678 };
12679 
12680 static struct hda_verb alc268_acer_verbs[] = {
12681 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
12682 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12683 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12684 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
12685 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12686 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12687 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12688 	{ }
12689 };
12690 
12691 /* unsolicited event for HP jack sensing */
12692 #define alc268_toshiba_unsol_event	alc262_hippo_unsol_event
12693 #define alc268_toshiba_setup		alc262_hippo_setup
12694 #define alc268_toshiba_automute		alc262_hippo_automute
12695 
12696 static void alc268_acer_unsol_event(struct hda_codec *codec,
12697 				       unsigned int res)
12698 {
12699 	if ((res >> 26) != ALC880_HP_EVENT)
12700 		return;
12701 	alc268_acer_automute(codec, 1);
12702 }
12703 
12704 static void alc268_acer_init_hook(struct hda_codec *codec)
12705 {
12706 	alc268_acer_automute(codec, 1);
12707 }
12708 
12709 /* toggle speaker-output according to the hp-jack state */
12710 static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
12711 {
12712 	unsigned int present;
12713 	unsigned char bits;
12714 
12715 	present = snd_hda_jack_detect(codec, 0x15);
12716 	bits = present ? HDA_AMP_MUTE : 0;
12717 	snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
12718 				 HDA_AMP_MUTE, bits);
12719 	snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
12720 				 HDA_AMP_MUTE, bits);
12721 }
12722 
12723 static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
12724 				    unsigned int res)
12725 {
12726 	switch (res >> 26) {
12727 	case ALC880_HP_EVENT:
12728 		alc268_aspire_one_speaker_automute(codec);
12729 		break;
12730 	case ALC880_MIC_EVENT:
12731 		alc_mic_automute(codec);
12732 		break;
12733 	}
12734 }
12735 
12736 static void alc268_acer_lc_setup(struct hda_codec *codec)
12737 {
12738 	struct alc_spec *spec = codec->spec;
12739 	spec->ext_mic.pin = 0x18;
12740 	spec->ext_mic.mux_idx = 0;
12741 	spec->int_mic.pin = 0x12;
12742 	spec->int_mic.mux_idx = 6;
12743 	spec->auto_mic = 1;
12744 }
12745 
12746 static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12747 {
12748 	alc268_aspire_one_speaker_automute(codec);
12749 	alc_mic_automute(codec);
12750 }
12751 
12752 static struct snd_kcontrol_new alc268_dell_mixer[] = {
12753 	/* output mixer control */
12754 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12755 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12756 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12757 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12758 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12759 	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12760 	{ }
12761 };
12762 
12763 static struct hda_verb alc268_dell_verbs[] = {
12764 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12765 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12766 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12767 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12768 	{ }
12769 };
12770 
12771 /* mute/unmute internal speaker according to the hp jack and mute state */
12772 static void alc268_dell_setup(struct hda_codec *codec)
12773 {
12774 	struct alc_spec *spec = codec->spec;
12775 
12776 	spec->autocfg.hp_pins[0] = 0x15;
12777 	spec->autocfg.speaker_pins[0] = 0x14;
12778 	spec->ext_mic.pin = 0x18;
12779 	spec->ext_mic.mux_idx = 0;
12780 	spec->int_mic.pin = 0x19;
12781 	spec->int_mic.mux_idx = 1;
12782 	spec->auto_mic = 1;
12783 }
12784 
12785 static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12786 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12787 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12788 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12789 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12790 	HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12791 	HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12792 	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12793 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12794 	{ }
12795 };
12796 
12797 static struct hda_verb alc267_quanta_il1_verbs[] = {
12798 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12799 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12800 	{ }
12801 };
12802 
12803 static void alc267_quanta_il1_setup(struct hda_codec *codec)
12804 {
12805 	struct alc_spec *spec = codec->spec;
12806 	spec->autocfg.hp_pins[0] = 0x15;
12807 	spec->autocfg.speaker_pins[0] = 0x14;
12808 	spec->ext_mic.pin = 0x18;
12809 	spec->ext_mic.mux_idx = 0;
12810 	spec->int_mic.pin = 0x19;
12811 	spec->int_mic.mux_idx = 1;
12812 	spec->auto_mic = 1;
12813 }
12814 
12815 /*
12816  * generic initialization of ADC, input mixers and output mixers
12817  */
12818 static struct hda_verb alc268_base_init_verbs[] = {
12819 	/* Unmute DAC0-1 and set vol = 0 */
12820 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12821 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12822 
12823 	/*
12824 	 * Set up output mixers (0x0c - 0x0e)
12825 	 */
12826 	/* set vol=0 to output mixers */
12827 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12828         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
12829 
12830 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12831 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12832 
12833 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12834 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
12835 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12836 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12837 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12838 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12839 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12840 	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12841 
12842 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12843 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12844 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12845 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12846 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12847 
12848 	/* set PCBEEP vol = 0, mute connections */
12849 	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12850 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12851 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12852 
12853 	/* Unmute Selector 23h,24h and set the default input to mic-in */
12854 
12855 	{0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
12856 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12857 	{0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
12858 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12859 
12860 	{ }
12861 };
12862 
12863 /*
12864  * generic initialization of ADC, input mixers and output mixers
12865  */
12866 static struct hda_verb alc268_volume_init_verbs[] = {
12867 	/* set output DAC */
12868 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12869 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12870 
12871 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12872 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12873 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12874 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12875 	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12876 
12877 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12878 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12879 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12880 
12881 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12882 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12883 
12884 	/* set PCBEEP vol = 0, mute connections */
12885 	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12886 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12887 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12888 
12889 	{ }
12890 };
12891 
12892 static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
12893 	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12894 	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12895 	{ } /* end */
12896 };
12897 
12898 static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
12899 	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12900 	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12901 	_DEFINE_CAPSRC(1),
12902 	{ } /* end */
12903 };
12904 
12905 static struct snd_kcontrol_new alc268_capture_mixer[] = {
12906 	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12907 	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12908 	HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
12909 	HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
12910 	_DEFINE_CAPSRC(2),
12911 	{ } /* end */
12912 };
12913 
12914 static struct hda_input_mux alc268_capture_source = {
12915 	.num_items = 4,
12916 	.items = {
12917 		{ "Mic", 0x0 },
12918 		{ "Front Mic", 0x1 },
12919 		{ "Line", 0x2 },
12920 		{ "CD", 0x3 },
12921 	},
12922 };
12923 
12924 static struct hda_input_mux alc268_acer_capture_source = {
12925 	.num_items = 3,
12926 	.items = {
12927 		{ "Mic", 0x0 },
12928 		{ "Internal Mic", 0x1 },
12929 		{ "Line", 0x2 },
12930 	},
12931 };
12932 
12933 static struct hda_input_mux alc268_acer_dmic_capture_source = {
12934 	.num_items = 3,
12935 	.items = {
12936 		{ "Mic", 0x0 },
12937 		{ "Internal Mic", 0x6 },
12938 		{ "Line", 0x2 },
12939 	},
12940 };
12941 
12942 #ifdef CONFIG_SND_DEBUG
12943 static struct snd_kcontrol_new alc268_test_mixer[] = {
12944 	/* Volume widgets */
12945 	HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12946 	HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12947 	HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
12948 	HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
12949 	HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
12950 	HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
12951 	HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
12952 	HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
12953 	HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
12954 	HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
12955 	HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
12956 	HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
12957 	HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
12958 	/* The below appears problematic on some hardwares */
12959 	/*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
12960 	HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12961 	HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
12962 	HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
12963 	HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
12964 
12965 	/* Modes for retasking pin widgets */
12966 	ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
12967 	ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
12968 	ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
12969 	ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
12970 
12971 	/* Controls for GPIO pins, assuming they are configured as outputs */
12972 	ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
12973 	ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
12974 	ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
12975 	ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
12976 
12977 	/* Switches to allow the digital SPDIF output pin to be enabled.
12978 	 * The ALC268 does not have an SPDIF input.
12979 	 */
12980 	ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
12981 
12982 	/* A switch allowing EAPD to be enabled.  Some laptops seem to use
12983 	 * this output to turn on an external amplifier.
12984 	 */
12985 	ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
12986 	ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
12987 
12988 	{ } /* end */
12989 };
12990 #endif
12991 
12992 /* create input playback/capture controls for the given pin */
12993 static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
12994 				    const char *ctlname, int idx)
12995 {
12996 	hda_nid_t dac;
12997 	int err;
12998 
12999 	switch (nid) {
13000 	case 0x14:
13001 	case 0x16:
13002 		dac = 0x02;
13003 		break;
13004 	case 0x15:
13005 	case 0x21: /* ALC269vb has this pin, too */
13006 		dac = 0x03;
13007 		break;
13008 	default:
13009 		return 0;
13010 	}
13011 	if (spec->multiout.dac_nids[0] != dac &&
13012 	    spec->multiout.dac_nids[1] != dac) {
13013 		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
13014 				  HDA_COMPOSE_AMP_VAL(dac, 3, idx,
13015 						      HDA_OUTPUT));
13016 		if (err < 0)
13017 			return err;
13018 		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
13019 	}
13020 
13021 	if (nid != 0x16)
13022 		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
13023 			  HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
13024 	else /* mono */
13025 		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
13026 			  HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
13027 	if (err < 0)
13028 		return err;
13029 	return 0;
13030 }
13031 
13032 /* add playback controls from the parsed DAC table */
13033 static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
13034 					     const struct auto_pin_cfg *cfg)
13035 {
13036 	hda_nid_t nid;
13037 	int err;
13038 
13039 	spec->multiout.dac_nids = spec->private_dac_nids;
13040 
13041 	nid = cfg->line_out_pins[0];
13042 	if (nid) {
13043 		const char *name;
13044 		if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
13045 			name = "Speaker";
13046 		else
13047 			name = "Front";
13048 		err = alc268_new_analog_output(spec, nid, name, 0);
13049 		if (err < 0)
13050 			return err;
13051 	}
13052 
13053 	nid = cfg->speaker_pins[0];
13054 	if (nid == 0x1d) {
13055 		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
13056 				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
13057 		if (err < 0)
13058 			return err;
13059 	} else {
13060 		err = alc268_new_analog_output(spec, nid, "Speaker", 0);
13061 		if (err < 0)
13062 			return err;
13063 	}
13064 	nid = cfg->hp_pins[0];
13065 	if (nid) {
13066 		err = alc268_new_analog_output(spec, nid, "Headphone", 0);
13067 		if (err < 0)
13068 			return err;
13069 	}
13070 
13071 	nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
13072 	if (nid == 0x16) {
13073 		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
13074 				  HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
13075 		if (err < 0)
13076 			return err;
13077 	}
13078 	return 0;
13079 }
13080 
13081 /* create playback/capture controls for input pins */
13082 static int alc268_auto_create_input_ctls(struct hda_codec *codec,
13083 						const struct auto_pin_cfg *cfg)
13084 {
13085 	return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
13086 }
13087 
13088 static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
13089 					      hda_nid_t nid, int pin_type)
13090 {
13091 	int idx;
13092 
13093 	alc_set_pin_output(codec, nid, pin_type);
13094 	if (nid == 0x14 || nid == 0x16)
13095 		idx = 0;
13096 	else
13097 		idx = 1;
13098 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
13099 }
13100 
13101 static void alc268_auto_init_multi_out(struct hda_codec *codec)
13102 {
13103 	struct alc_spec *spec = codec->spec;
13104 	hda_nid_t nid = spec->autocfg.line_out_pins[0];
13105 	if (nid) {
13106 		int pin_type = get_pin_type(spec->autocfg.line_out_type);
13107 		alc268_auto_set_output_and_unmute(codec, nid, pin_type);
13108 	}
13109 }
13110 
13111 static void alc268_auto_init_hp_out(struct hda_codec *codec)
13112 {
13113 	struct alc_spec *spec = codec->spec;
13114 	hda_nid_t pin;
13115 
13116 	pin = spec->autocfg.hp_pins[0];
13117 	if (pin)
13118 		alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
13119 	pin = spec->autocfg.speaker_pins[0];
13120 	if (pin)
13121 		alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
13122 }
13123 
13124 static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
13125 {
13126 	struct alc_spec *spec = codec->spec;
13127 	hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
13128 	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
13129 	hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
13130 	unsigned int	dac_vol1, dac_vol2;
13131 
13132 	if (line_nid == 0x1d || speaker_nid == 0x1d) {
13133 		snd_hda_codec_write(codec, speaker_nid, 0,
13134 				    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
13135 		/* mute mixer inputs from 0x1d */
13136 		snd_hda_codec_write(codec, 0x0f, 0,
13137 				    AC_VERB_SET_AMP_GAIN_MUTE,
13138 				    AMP_IN_UNMUTE(1));
13139 		snd_hda_codec_write(codec, 0x10, 0,
13140 				    AC_VERB_SET_AMP_GAIN_MUTE,
13141 				    AMP_IN_UNMUTE(1));
13142 	} else {
13143 		/* unmute mixer inputs from 0x1d */
13144 		snd_hda_codec_write(codec, 0x0f, 0,
13145 				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13146 		snd_hda_codec_write(codec, 0x10, 0,
13147 				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13148 	}
13149 
13150 	dac_vol1 = dac_vol2 = 0xb000 | 0x40;	/* set max volume  */
13151 	if (line_nid == 0x14)
13152 		dac_vol2 = AMP_OUT_ZERO;
13153 	else if (line_nid == 0x15)
13154 		dac_vol1 = AMP_OUT_ZERO;
13155 	if (hp_nid == 0x14)
13156 		dac_vol2 = AMP_OUT_ZERO;
13157 	else if (hp_nid == 0x15)
13158 		dac_vol1 = AMP_OUT_ZERO;
13159 	if (line_nid != 0x16 || hp_nid != 0x16 ||
13160 	    spec->autocfg.line_out_pins[1] != 0x16 ||
13161 	    spec->autocfg.line_out_pins[2] != 0x16)
13162 		dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
13163 
13164 	snd_hda_codec_write(codec, 0x02, 0,
13165 			    AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
13166 	snd_hda_codec_write(codec, 0x03, 0,
13167 			    AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
13168 }
13169 
13170 /* pcm configuration: identical with ALC880 */
13171 #define alc268_pcm_analog_playback	alc880_pcm_analog_playback
13172 #define alc268_pcm_analog_capture	alc880_pcm_analog_capture
13173 #define alc268_pcm_analog_alt_capture	alc880_pcm_analog_alt_capture
13174 #define alc268_pcm_digital_playback	alc880_pcm_digital_playback
13175 
13176 /*
13177  * BIOS auto configuration
13178  */
13179 static int alc268_parse_auto_config(struct hda_codec *codec)
13180 {
13181 	struct alc_spec *spec = codec->spec;
13182 	int err;
13183 	static hda_nid_t alc268_ignore[] = { 0 };
13184 
13185 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13186 					   alc268_ignore);
13187 	if (err < 0)
13188 		return err;
13189 	if (!spec->autocfg.line_outs) {
13190 		if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
13191 			spec->multiout.max_channels = 2;
13192 			spec->no_analog = 1;
13193 			goto dig_only;
13194 		}
13195 		return 0; /* can't find valid BIOS pin config */
13196 	}
13197 	err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
13198 	if (err < 0)
13199 		return err;
13200 	err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
13201 	if (err < 0)
13202 		return err;
13203 
13204 	spec->multiout.max_channels = 2;
13205 
13206  dig_only:
13207 	/* digital only support output */
13208 	if (spec->autocfg.dig_outs) {
13209 		spec->multiout.dig_out_nid = ALC268_DIGOUT_NID;
13210 		spec->dig_out_type = spec->autocfg.dig_out_type[0];
13211 	}
13212 	if (spec->kctls.list)
13213 		add_mixer(spec, spec->kctls.list);
13214 
13215 	if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
13216 		add_mixer(spec, alc268_beep_mixer);
13217 
13218 	add_verb(spec, alc268_volume_init_verbs);
13219 	spec->num_mux_defs = 2;
13220 	spec->input_mux = &spec->private_imux[0];
13221 
13222 	err = alc_auto_add_mic_boost(codec);
13223 	if (err < 0)
13224 		return err;
13225 
13226 	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
13227 
13228 	return 1;
13229 }
13230 
13231 #define alc268_auto_init_analog_input	alc882_auto_init_analog_input
13232 
13233 /* init callback for auto-configuration model -- overriding the default init */
13234 static void alc268_auto_init(struct hda_codec *codec)
13235 {
13236 	struct alc_spec *spec = codec->spec;
13237 	alc268_auto_init_multi_out(codec);
13238 	alc268_auto_init_hp_out(codec);
13239 	alc268_auto_init_mono_speaker_out(codec);
13240 	alc268_auto_init_analog_input(codec);
13241 	if (spec->unsol_event)
13242 		alc_inithook(codec);
13243 }
13244 
13245 /*
13246  * configuration and preset
13247  */
13248 static const char *alc268_models[ALC268_MODEL_LAST] = {
13249 	[ALC267_QUANTA_IL1]	= "quanta-il1",
13250 	[ALC268_3ST]		= "3stack",
13251 	[ALC268_TOSHIBA]	= "toshiba",
13252 	[ALC268_ACER]		= "acer",
13253 	[ALC268_ACER_DMIC]	= "acer-dmic",
13254 	[ALC268_ACER_ASPIRE_ONE]	= "acer-aspire",
13255 	[ALC268_DELL]		= "dell",
13256 	[ALC268_ZEPTO]		= "zepto",
13257 #ifdef CONFIG_SND_DEBUG
13258 	[ALC268_TEST]		= "test",
13259 #endif
13260 	[ALC268_AUTO]		= "auto",
13261 };
13262 
13263 static struct snd_pci_quirk alc268_cfg_tbl[] = {
13264 	SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
13265 	SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
13266 	SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
13267 	SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
13268 	SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
13269 	SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
13270 						ALC268_ACER_ASPIRE_ONE),
13271 	SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
13272 	SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
13273 			"Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
13274 	/* almost compatible with toshiba but with optional digital outs;
13275 	 * auto-probing seems working fine
13276 	 */
13277 	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
13278 			   ALC268_AUTO),
13279 	SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
13280 	SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
13281 	SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
13282 	SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
13283 	SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
13284 	SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
13285 	{}
13286 };
13287 
13288 /* Toshiba laptops have no unique PCI SSID but only codec SSID */
13289 static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
13290 	SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
13291 	SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
13292 	SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
13293 			   ALC268_TOSHIBA),
13294 	{}
13295 };
13296 
13297 static struct alc_config_preset alc268_presets[] = {
13298 	[ALC267_QUANTA_IL1] = {
13299 		.mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
13300 			    alc268_capture_nosrc_mixer },
13301 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13302 				alc267_quanta_il1_verbs },
13303 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13304 		.dac_nids = alc268_dac_nids,
13305 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13306 		.adc_nids = alc268_adc_nids_alt,
13307 		.hp_nid = 0x03,
13308 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13309 		.channel_mode = alc268_modes,
13310 		.unsol_event = alc_sku_unsol_event,
13311 		.setup = alc267_quanta_il1_setup,
13312 		.init_hook = alc_inithook,
13313 	},
13314 	[ALC268_3ST] = {
13315 		.mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13316 			    alc268_beep_mixer },
13317 		.init_verbs = { alc268_base_init_verbs },
13318 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13319 		.dac_nids = alc268_dac_nids,
13320                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13321                 .adc_nids = alc268_adc_nids_alt,
13322 		.capsrc_nids = alc268_capsrc_nids,
13323 		.hp_nid = 0x03,
13324 		.dig_out_nid = ALC268_DIGOUT_NID,
13325 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13326 		.channel_mode = alc268_modes,
13327 		.input_mux = &alc268_capture_source,
13328 	},
13329 	[ALC268_TOSHIBA] = {
13330 		.mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
13331 			    alc268_beep_mixer },
13332 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13333 				alc268_toshiba_verbs },
13334 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13335 		.dac_nids = alc268_dac_nids,
13336 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13337 		.adc_nids = alc268_adc_nids_alt,
13338 		.capsrc_nids = alc268_capsrc_nids,
13339 		.hp_nid = 0x03,
13340 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13341 		.channel_mode = alc268_modes,
13342 		.input_mux = &alc268_capture_source,
13343 		.unsol_event = alc268_toshiba_unsol_event,
13344 		.setup = alc268_toshiba_setup,
13345 		.init_hook = alc268_toshiba_automute,
13346 	},
13347 	[ALC268_ACER] = {
13348 		.mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
13349 			    alc268_beep_mixer },
13350 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13351 				alc268_acer_verbs },
13352 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13353 		.dac_nids = alc268_dac_nids,
13354 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13355 		.adc_nids = alc268_adc_nids_alt,
13356 		.capsrc_nids = alc268_capsrc_nids,
13357 		.hp_nid = 0x02,
13358 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13359 		.channel_mode = alc268_modes,
13360 		.input_mux = &alc268_acer_capture_source,
13361 		.unsol_event = alc268_acer_unsol_event,
13362 		.init_hook = alc268_acer_init_hook,
13363 	},
13364 	[ALC268_ACER_DMIC] = {
13365 		.mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
13366 			    alc268_beep_mixer },
13367 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13368 				alc268_acer_verbs },
13369 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13370 		.dac_nids = alc268_dac_nids,
13371 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13372 		.adc_nids = alc268_adc_nids_alt,
13373 		.capsrc_nids = alc268_capsrc_nids,
13374 		.hp_nid = 0x02,
13375 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13376 		.channel_mode = alc268_modes,
13377 		.input_mux = &alc268_acer_dmic_capture_source,
13378 		.unsol_event = alc268_acer_unsol_event,
13379 		.init_hook = alc268_acer_init_hook,
13380 	},
13381 	[ALC268_ACER_ASPIRE_ONE] = {
13382 		.mixers = { alc268_acer_aspire_one_mixer,
13383 			    alc268_beep_mixer,
13384 			    alc268_capture_nosrc_mixer },
13385 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13386 				alc268_acer_aspire_one_verbs },
13387 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13388 		.dac_nids = alc268_dac_nids,
13389 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13390 		.adc_nids = alc268_adc_nids_alt,
13391 		.capsrc_nids = alc268_capsrc_nids,
13392 		.hp_nid = 0x03,
13393 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13394 		.channel_mode = alc268_modes,
13395 		.unsol_event = alc268_acer_lc_unsol_event,
13396 		.setup = alc268_acer_lc_setup,
13397 		.init_hook = alc268_acer_lc_init_hook,
13398 	},
13399 	[ALC268_DELL] = {
13400 		.mixers = { alc268_dell_mixer, alc268_beep_mixer,
13401 			    alc268_capture_nosrc_mixer },
13402 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13403 				alc268_dell_verbs },
13404 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13405 		.dac_nids = alc268_dac_nids,
13406 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13407 		.adc_nids = alc268_adc_nids_alt,
13408 		.capsrc_nids = alc268_capsrc_nids,
13409 		.hp_nid = 0x02,
13410 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13411 		.channel_mode = alc268_modes,
13412 		.unsol_event = alc_sku_unsol_event,
13413 		.setup = alc268_dell_setup,
13414 		.init_hook = alc_inithook,
13415 	},
13416 	[ALC268_ZEPTO] = {
13417 		.mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13418 			    alc268_beep_mixer },
13419 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13420 				alc268_toshiba_verbs },
13421 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13422 		.dac_nids = alc268_dac_nids,
13423 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13424 		.adc_nids = alc268_adc_nids_alt,
13425 		.capsrc_nids = alc268_capsrc_nids,
13426 		.hp_nid = 0x03,
13427 		.dig_out_nid = ALC268_DIGOUT_NID,
13428 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13429 		.channel_mode = alc268_modes,
13430 		.input_mux = &alc268_capture_source,
13431 		.setup = alc268_toshiba_setup,
13432 		.init_hook = alc268_toshiba_automute,
13433 	},
13434 #ifdef CONFIG_SND_DEBUG
13435 	[ALC268_TEST] = {
13436 		.mixers = { alc268_test_mixer, alc268_capture_mixer },
13437 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13438 				alc268_volume_init_verbs },
13439 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13440 		.dac_nids = alc268_dac_nids,
13441 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13442 		.adc_nids = alc268_adc_nids_alt,
13443 		.capsrc_nids = alc268_capsrc_nids,
13444 		.hp_nid = 0x03,
13445 		.dig_out_nid = ALC268_DIGOUT_NID,
13446 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13447 		.channel_mode = alc268_modes,
13448 		.input_mux = &alc268_capture_source,
13449 	},
13450 #endif
13451 };
13452 
13453 static int patch_alc268(struct hda_codec *codec)
13454 {
13455 	struct alc_spec *spec;
13456 	int board_config;
13457 	int i, has_beep, err;
13458 
13459 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13460 	if (spec == NULL)
13461 		return -ENOMEM;
13462 
13463 	codec->spec = spec;
13464 
13465 	board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
13466 						  alc268_models,
13467 						  alc268_cfg_tbl);
13468 
13469 	if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
13470 		board_config = snd_hda_check_board_codec_sid_config(codec,
13471 			ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
13472 
13473 	if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
13474 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13475 		       codec->chip_name);
13476 		board_config = ALC268_AUTO;
13477 	}
13478 
13479 	if (board_config == ALC268_AUTO) {
13480 		/* automatic parse from the BIOS config */
13481 		err = alc268_parse_auto_config(codec);
13482 		if (err < 0) {
13483 			alc_free(codec);
13484 			return err;
13485 		} else if (!err) {
13486 			printk(KERN_INFO
13487 			       "hda_codec: Cannot set up configuration "
13488 			       "from BIOS.  Using base mode...\n");
13489 			board_config = ALC268_3ST;
13490 		}
13491 	}
13492 
13493 	if (board_config != ALC268_AUTO)
13494 		setup_preset(codec, &alc268_presets[board_config]);
13495 
13496 	spec->stream_analog_playback = &alc268_pcm_analog_playback;
13497 	spec->stream_analog_capture = &alc268_pcm_analog_capture;
13498 	spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
13499 
13500 	spec->stream_digital_playback = &alc268_pcm_digital_playback;
13501 
13502 	has_beep = 0;
13503 	for (i = 0; i < spec->num_mixers; i++) {
13504 		if (spec->mixers[i] == alc268_beep_mixer) {
13505 			has_beep = 1;
13506 			break;
13507 		}
13508 	}
13509 
13510 	if (has_beep) {
13511 		err = snd_hda_attach_beep_device(codec, 0x1);
13512 		if (err < 0) {
13513 			alc_free(codec);
13514 			return err;
13515 		}
13516 		if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
13517 			/* override the amp caps for beep generator */
13518 			snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
13519 					  (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
13520 					  (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
13521 					  (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
13522 					  (0 << AC_AMPCAP_MUTE_SHIFT));
13523 	}
13524 
13525 	if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
13526 		/* check whether NID 0x07 is valid */
13527 		unsigned int wcap = get_wcaps(codec, 0x07);
13528 		int i;
13529 
13530 		spec->capsrc_nids = alc268_capsrc_nids;
13531 		/* get type */
13532 		wcap = get_wcaps_type(wcap);
13533 		if (spec->auto_mic ||
13534 		    wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
13535 			spec->adc_nids = alc268_adc_nids_alt;
13536 			spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
13537 			if (spec->auto_mic)
13538 				fixup_automic_adc(codec);
13539 			if (spec->auto_mic || spec->input_mux->num_items == 1)
13540 				add_mixer(spec, alc268_capture_nosrc_mixer);
13541 			else
13542 				add_mixer(spec, alc268_capture_alt_mixer);
13543 		} else {
13544 			spec->adc_nids = alc268_adc_nids;
13545 			spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
13546 			add_mixer(spec, alc268_capture_mixer);
13547 		}
13548 		/* set default input source */
13549 		for (i = 0; i < spec->num_adc_nids; i++)
13550 			snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
13551 				0, AC_VERB_SET_CONNECT_SEL,
13552 				i < spec->num_mux_defs ?
13553 				spec->input_mux[i].items[0].index :
13554 				spec->input_mux->items[0].index);
13555 	}
13556 
13557 	spec->vmaster_nid = 0x02;
13558 
13559 	codec->patch_ops = alc_patch_ops;
13560 	if (board_config == ALC268_AUTO)
13561 		spec->init_hook = alc268_auto_init;
13562 
13563 	return 0;
13564 }
13565 
13566 /*
13567  *  ALC269 channel source setting (2 channel)
13568  */
13569 #define ALC269_DIGOUT_NID	ALC880_DIGOUT_NID
13570 
13571 #define alc269_dac_nids		alc260_dac_nids
13572 
13573 static hda_nid_t alc269_adc_nids[1] = {
13574 	/* ADC1 */
13575 	0x08,
13576 };
13577 
13578 static hda_nid_t alc269_capsrc_nids[1] = {
13579 	0x23,
13580 };
13581 
13582 static hda_nid_t alc269vb_adc_nids[1] = {
13583 	/* ADC1 */
13584 	0x09,
13585 };
13586 
13587 static hda_nid_t alc269vb_capsrc_nids[1] = {
13588 	0x22,
13589 };
13590 
13591 static hda_nid_t alc269_adc_candidates[] = {
13592 	0x08, 0x09, 0x07,
13593 };
13594 
13595 #define alc269_modes		alc260_modes
13596 #define alc269_capture_source	alc880_lg_lw_capture_source
13597 
13598 static struct snd_kcontrol_new alc269_base_mixer[] = {
13599 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13600 	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13601 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
13602 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
13603 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13604 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13605 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13606 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13607 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13608 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
13609 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13610 	HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
13611 	{ } /* end */
13612 };
13613 
13614 static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
13615 	/* output mixer control */
13616 	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13617 	{
13618 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13619 		.name = "Master Playback Switch",
13620 		.subdevice = HDA_SUBDEV_AMP_FLAG,
13621 		.info = snd_hda_mixer_amp_switch_info,
13622 		.get = snd_hda_mixer_amp_switch_get,
13623 		.put = alc268_acer_master_sw_put,
13624 		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13625 	},
13626 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13627 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13628 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13629 	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13630 	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13631 	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13632 	{ }
13633 };
13634 
13635 static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
13636 	/* output mixer control */
13637 	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13638 	{
13639 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13640 		.name = "Master Playback Switch",
13641 		.subdevice = HDA_SUBDEV_AMP_FLAG,
13642 		.info = snd_hda_mixer_amp_switch_info,
13643 		.get = snd_hda_mixer_amp_switch_get,
13644 		.put = alc268_acer_master_sw_put,
13645 		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13646 	},
13647 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13648 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13649 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13650 	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13651 	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13652 	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13653 	HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
13654 	HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
13655 	HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
13656 	{ }
13657 };
13658 
13659 static struct snd_kcontrol_new alc269_laptop_mixer[] = {
13660 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13661 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13662 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13663 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13664 	{ } /* end */
13665 };
13666 
13667 static struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
13668 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13669 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13670 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
13671 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13672 	{ } /* end */
13673 };
13674 
13675 /* capture mixer elements */
13676 static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
13677 	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13678 	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13679 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13680 	HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13681 	{ } /* end */
13682 };
13683 
13684 static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
13685 	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13686 	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13687 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13688 	{ } /* end */
13689 };
13690 
13691 static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
13692 	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13693 	HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13694 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13695 	HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13696 	{ } /* end */
13697 };
13698 
13699 static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
13700 	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13701 	HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13702 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13703 	{ } /* end */
13704 };
13705 
13706 /* FSC amilo */
13707 #define alc269_fujitsu_mixer	alc269_laptop_mixer
13708 
13709 static struct hda_verb alc269_quanta_fl1_verbs[] = {
13710 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13711 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13712 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13713 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13714 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13715 	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13716 	{ }
13717 };
13718 
13719 static struct hda_verb alc269_lifebook_verbs[] = {
13720 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13721 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
13722 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13723 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13724 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13725 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13726 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13727 	{0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13728 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13729 	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13730 	{ }
13731 };
13732 
13733 /* toggle speaker-output according to the hp-jack state */
13734 static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
13735 {
13736 	unsigned int present;
13737 	unsigned char bits;
13738 
13739 	present = snd_hda_jack_detect(codec, 0x15);
13740 	bits = present ? HDA_AMP_MUTE : 0;
13741 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13742 				 HDA_AMP_MUTE, bits);
13743 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13744 				 HDA_AMP_MUTE, bits);
13745 
13746 	snd_hda_codec_write(codec, 0x20, 0,
13747 			AC_VERB_SET_COEF_INDEX, 0x0c);
13748 	snd_hda_codec_write(codec, 0x20, 0,
13749 			AC_VERB_SET_PROC_COEF, 0x680);
13750 
13751 	snd_hda_codec_write(codec, 0x20, 0,
13752 			AC_VERB_SET_COEF_INDEX, 0x0c);
13753 	snd_hda_codec_write(codec, 0x20, 0,
13754 			AC_VERB_SET_PROC_COEF, 0x480);
13755 }
13756 
13757 /* toggle speaker-output according to the hp-jacks state */
13758 static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
13759 {
13760 	unsigned int present;
13761 	unsigned char bits;
13762 
13763 	/* Check laptop headphone socket */
13764 	present = snd_hda_jack_detect(codec, 0x15);
13765 
13766 	/* Check port replicator headphone socket */
13767 	present |= snd_hda_jack_detect(codec, 0x1a);
13768 
13769 	bits = present ? HDA_AMP_MUTE : 0;
13770 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13771 				 HDA_AMP_MUTE, bits);
13772 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13773 				 HDA_AMP_MUTE, bits);
13774 
13775 	snd_hda_codec_write(codec, 0x20, 0,
13776 			AC_VERB_SET_COEF_INDEX, 0x0c);
13777 	snd_hda_codec_write(codec, 0x20, 0,
13778 			AC_VERB_SET_PROC_COEF, 0x680);
13779 
13780 	snd_hda_codec_write(codec, 0x20, 0,
13781 			AC_VERB_SET_COEF_INDEX, 0x0c);
13782 	snd_hda_codec_write(codec, 0x20, 0,
13783 			AC_VERB_SET_PROC_COEF, 0x480);
13784 }
13785 
13786 static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13787 {
13788 	unsigned int present_laptop;
13789 	unsigned int present_dock;
13790 
13791 	present_laptop	= snd_hda_jack_detect(codec, 0x18);
13792 	present_dock	= snd_hda_jack_detect(codec, 0x1b);
13793 
13794 	/* Laptop mic port overrides dock mic port, design decision */
13795 	if (present_dock)
13796 		snd_hda_codec_write(codec, 0x23, 0,
13797 				AC_VERB_SET_CONNECT_SEL, 0x3);
13798 	if (present_laptop)
13799 		snd_hda_codec_write(codec, 0x23, 0,
13800 				AC_VERB_SET_CONNECT_SEL, 0x0);
13801 	if (!present_dock && !present_laptop)
13802 		snd_hda_codec_write(codec, 0x23, 0,
13803 				AC_VERB_SET_CONNECT_SEL, 0x1);
13804 }
13805 
13806 static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
13807 				    unsigned int res)
13808 {
13809 	switch (res >> 26) {
13810 	case ALC880_HP_EVENT:
13811 		alc269_quanta_fl1_speaker_automute(codec);
13812 		break;
13813 	case ALC880_MIC_EVENT:
13814 		alc_mic_automute(codec);
13815 		break;
13816 	}
13817 }
13818 
13819 static void alc269_lifebook_unsol_event(struct hda_codec *codec,
13820 					unsigned int res)
13821 {
13822 	if ((res >> 26) == ALC880_HP_EVENT)
13823 		alc269_lifebook_speaker_automute(codec);
13824 	if ((res >> 26) == ALC880_MIC_EVENT)
13825 		alc269_lifebook_mic_autoswitch(codec);
13826 }
13827 
13828 static void alc269_quanta_fl1_setup(struct hda_codec *codec)
13829 {
13830 	struct alc_spec *spec = codec->spec;
13831 	spec->autocfg.hp_pins[0] = 0x15;
13832 	spec->autocfg.speaker_pins[0] = 0x14;
13833 	spec->ext_mic.pin = 0x18;
13834 	spec->ext_mic.mux_idx = 0;
13835 	spec->int_mic.pin = 0x19;
13836 	spec->int_mic.mux_idx = 1;
13837 	spec->auto_mic = 1;
13838 }
13839 
13840 static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
13841 {
13842 	alc269_quanta_fl1_speaker_automute(codec);
13843 	alc_mic_automute(codec);
13844 }
13845 
13846 static void alc269_lifebook_init_hook(struct hda_codec *codec)
13847 {
13848 	alc269_lifebook_speaker_automute(codec);
13849 	alc269_lifebook_mic_autoswitch(codec);
13850 }
13851 
13852 static struct hda_verb alc269_laptop_dmic_init_verbs[] = {
13853 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13854 	{0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
13855 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13856 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13857 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13858 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13859 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13860 	{}
13861 };
13862 
13863 static struct hda_verb alc269_laptop_amic_init_verbs[] = {
13864 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13865 	{0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
13866 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13867 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
13868 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13869 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13870 	{}
13871 };
13872 
13873 static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
13874 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13875 	{0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
13876 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13877 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13878 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13879 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13880 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13881 	{}
13882 };
13883 
13884 static struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
13885 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13886 	{0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
13887 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13888 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13889 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13890 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13891 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13892 	{}
13893 };
13894 
13895 /* toggle speaker-output according to the hp-jack state */
13896 static void alc269_speaker_automute(struct hda_codec *codec)
13897 {
13898 	struct alc_spec *spec = codec->spec;
13899 	unsigned int nid = spec->autocfg.hp_pins[0];
13900 	unsigned int present;
13901 	unsigned char bits;
13902 
13903 	present = snd_hda_jack_detect(codec, nid);
13904 	bits = present ? HDA_AMP_MUTE : 0;
13905 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13906 				 HDA_AMP_MUTE, bits);
13907 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13908 				 HDA_AMP_MUTE, bits);
13909 }
13910 
13911 /* unsolicited event for HP jack sensing */
13912 static void alc269_laptop_unsol_event(struct hda_codec *codec,
13913 				     unsigned int res)
13914 {
13915 	switch (res >> 26) {
13916 	case ALC880_HP_EVENT:
13917 		alc269_speaker_automute(codec);
13918 		break;
13919 	case ALC880_MIC_EVENT:
13920 		alc_mic_automute(codec);
13921 		break;
13922 	}
13923 }
13924 
13925 static void alc269_laptop_amic_setup(struct hda_codec *codec)
13926 {
13927 	struct alc_spec *spec = codec->spec;
13928 	spec->autocfg.hp_pins[0] = 0x15;
13929 	spec->autocfg.speaker_pins[0] = 0x14;
13930 	spec->ext_mic.pin = 0x18;
13931 	spec->ext_mic.mux_idx = 0;
13932 	spec->int_mic.pin = 0x19;
13933 	spec->int_mic.mux_idx = 1;
13934 	spec->auto_mic = 1;
13935 }
13936 
13937 static void alc269_laptop_dmic_setup(struct hda_codec *codec)
13938 {
13939 	struct alc_spec *spec = codec->spec;
13940 	spec->autocfg.hp_pins[0] = 0x15;
13941 	spec->autocfg.speaker_pins[0] = 0x14;
13942 	spec->ext_mic.pin = 0x18;
13943 	spec->ext_mic.mux_idx = 0;
13944 	spec->int_mic.pin = 0x12;
13945 	spec->int_mic.mux_idx = 5;
13946 	spec->auto_mic = 1;
13947 }
13948 
13949 static void alc269vb_laptop_amic_setup(struct hda_codec *codec)
13950 {
13951 	struct alc_spec *spec = codec->spec;
13952 	spec->autocfg.hp_pins[0] = 0x21;
13953 	spec->autocfg.speaker_pins[0] = 0x14;
13954 	spec->ext_mic.pin = 0x18;
13955 	spec->ext_mic.mux_idx = 0;
13956 	spec->int_mic.pin = 0x19;
13957 	spec->int_mic.mux_idx = 1;
13958 	spec->auto_mic = 1;
13959 }
13960 
13961 static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
13962 {
13963 	struct alc_spec *spec = codec->spec;
13964 	spec->autocfg.hp_pins[0] = 0x21;
13965 	spec->autocfg.speaker_pins[0] = 0x14;
13966 	spec->ext_mic.pin = 0x18;
13967 	spec->ext_mic.mux_idx = 0;
13968 	spec->int_mic.pin = 0x12;
13969 	spec->int_mic.mux_idx = 6;
13970 	spec->auto_mic = 1;
13971 }
13972 
13973 static void alc269_laptop_inithook(struct hda_codec *codec)
13974 {
13975 	alc269_speaker_automute(codec);
13976 	alc_mic_automute(codec);
13977 }
13978 
13979 /*
13980  * generic initialization of ADC, input mixers and output mixers
13981  */
13982 static struct hda_verb alc269_init_verbs[] = {
13983 	/*
13984 	 * Unmute ADC0 and set the default input to mic-in
13985 	 */
13986 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13987 
13988 	/*
13989 	 * Set up output mixers (0x02 - 0x03)
13990 	 */
13991 	/* set vol=0 to output mixers */
13992 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13993 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13994 
13995 	/* set up input amps for analog loopback */
13996 	/* Amp Indices: DAC = 0, mixer = 1 */
13997 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13998 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13999 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14000 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14001 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14002 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14003 
14004 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14005 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14006 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14007 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14008 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14009 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14010 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14011 
14012 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14013 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14014 
14015 	/* FIXME: use Mux-type input source selection */
14016 	/* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14017 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14018 	{0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
14019 
14020 	/* set EAPD */
14021 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14022 	{ }
14023 };
14024 
14025 static struct hda_verb alc269vb_init_verbs[] = {
14026 	/*
14027 	 * Unmute ADC0 and set the default input to mic-in
14028 	 */
14029 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14030 
14031 	/*
14032 	 * Set up output mixers (0x02 - 0x03)
14033 	 */
14034 	/* set vol=0 to output mixers */
14035 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14036 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14037 
14038 	/* set up input amps for analog loopback */
14039 	/* Amp Indices: DAC = 0, mixer = 1 */
14040 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14041 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14042 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14043 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14044 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14045 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14046 
14047 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14048 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14049 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14050 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14051 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14052 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14053 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14054 
14055 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14056 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14057 
14058 	/* FIXME: use Mux-type input source selection */
14059 	/* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14060 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14061 	{0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
14062 
14063 	/* set EAPD */
14064 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14065 	{ }
14066 };
14067 
14068 #define alc269_auto_create_multi_out_ctls \
14069 	alc268_auto_create_multi_out_ctls
14070 #define alc269_auto_create_input_ctls \
14071 	alc268_auto_create_input_ctls
14072 
14073 #ifdef CONFIG_SND_HDA_POWER_SAVE
14074 #define alc269_loopbacks	alc880_loopbacks
14075 #endif
14076 
14077 /* pcm configuration: identical with ALC880 */
14078 #define alc269_pcm_analog_playback	alc880_pcm_analog_playback
14079 #define alc269_pcm_analog_capture	alc880_pcm_analog_capture
14080 #define alc269_pcm_digital_playback	alc880_pcm_digital_playback
14081 #define alc269_pcm_digital_capture	alc880_pcm_digital_capture
14082 
14083 static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
14084 	.substreams = 1,
14085 	.channels_min = 2,
14086 	.channels_max = 8,
14087 	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14088 	/* NID is set in alc_build_pcms */
14089 	.ops = {
14090 		.open = alc880_playback_pcm_open,
14091 		.prepare = alc880_playback_pcm_prepare,
14092 		.cleanup = alc880_playback_pcm_cleanup
14093 	},
14094 };
14095 
14096 static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
14097 	.substreams = 1,
14098 	.channels_min = 2,
14099 	.channels_max = 2,
14100 	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14101 	/* NID is set in alc_build_pcms */
14102 };
14103 
14104 #ifdef CONFIG_SND_HDA_POWER_SAVE
14105 static int alc269_mic2_for_mute_led(struct hda_codec *codec)
14106 {
14107 	switch (codec->subsystem_id) {
14108 	case 0x103c1586:
14109 		return 1;
14110 	}
14111 	return 0;
14112 }
14113 
14114 static int alc269_mic2_mute_check_ps(struct hda_codec *codec, hda_nid_t nid)
14115 {
14116 	/* update mute-LED according to the speaker mute state */
14117 	if (nid == 0x01 || nid == 0x14) {
14118 		int pinval;
14119 		if (snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0) &
14120 		    HDA_AMP_MUTE)
14121 			pinval = 0x24;
14122 		else
14123 			pinval = 0x20;
14124 		/* mic2 vref pin is used for mute LED control */
14125 		snd_hda_codec_update_cache(codec, 0x19, 0,
14126 					   AC_VERB_SET_PIN_WIDGET_CONTROL,
14127 					   pinval);
14128 	}
14129 	return alc_check_power_status(codec, nid);
14130 }
14131 #endif /* CONFIG_SND_HDA_POWER_SAVE */
14132 
14133 /*
14134  * BIOS auto configuration
14135  */
14136 static int alc269_parse_auto_config(struct hda_codec *codec)
14137 {
14138 	struct alc_spec *spec = codec->spec;
14139 	int err;
14140 	static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
14141 
14142 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14143 					   alc269_ignore);
14144 	if (err < 0)
14145 		return err;
14146 
14147 	err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
14148 	if (err < 0)
14149 		return err;
14150 	err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
14151 	if (err < 0)
14152 		return err;
14153 
14154 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
14155 
14156 	if (spec->autocfg.dig_outs)
14157 		spec->multiout.dig_out_nid = ALC269_DIGOUT_NID;
14158 
14159 	if (spec->kctls.list)
14160 		add_mixer(spec, spec->kctls.list);
14161 
14162 	if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010) {
14163 		add_verb(spec, alc269vb_init_verbs);
14164 		alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21);
14165 	} else {
14166 		add_verb(spec, alc269_init_verbs);
14167 		alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
14168 	}
14169 
14170 	spec->num_mux_defs = 1;
14171 	spec->input_mux = &spec->private_imux[0];
14172 	fillup_priv_adc_nids(codec, alc269_adc_candidates,
14173 			     sizeof(alc269_adc_candidates));
14174 
14175 	/* set default input source */
14176 	snd_hda_codec_write_cache(codec, spec->capsrc_nids[0],
14177 				  0, AC_VERB_SET_CONNECT_SEL,
14178 				  spec->input_mux->items[0].index);
14179 
14180 	err = alc_auto_add_mic_boost(codec);
14181 	if (err < 0)
14182 		return err;
14183 
14184 	if (!spec->cap_mixer && !spec->no_analog)
14185 		set_capture_mixer(codec);
14186 
14187 	return 1;
14188 }
14189 
14190 #define alc269_auto_init_multi_out	alc268_auto_init_multi_out
14191 #define alc269_auto_init_hp_out		alc268_auto_init_hp_out
14192 #define alc269_auto_init_analog_input	alc882_auto_init_analog_input
14193 
14194 
14195 /* init callback for auto-configuration model -- overriding the default init */
14196 static void alc269_auto_init(struct hda_codec *codec)
14197 {
14198 	struct alc_spec *spec = codec->spec;
14199 	alc269_auto_init_multi_out(codec);
14200 	alc269_auto_init_hp_out(codec);
14201 	alc269_auto_init_analog_input(codec);
14202 	if (spec->unsol_event)
14203 		alc_inithook(codec);
14204 }
14205 
14206 enum {
14207 	ALC269_FIXUP_SONY_VAIO,
14208 };
14209 
14210 static const struct hda_verb alc269_sony_vaio_fixup_verbs[] = {
14211 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
14212 	{}
14213 };
14214 
14215 static const struct alc_fixup alc269_fixups[] = {
14216 	[ALC269_FIXUP_SONY_VAIO] = {
14217 		.verbs = alc269_sony_vaio_fixup_verbs
14218 	},
14219 };
14220 
14221 static struct snd_pci_quirk alc269_fixup_tbl[] = {
14222 	SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
14223 	{}
14224 };
14225 
14226 
14227 /*
14228  * configuration and preset
14229  */
14230 static const char *alc269_models[ALC269_MODEL_LAST] = {
14231 	[ALC269_BASIC]			= "basic",
14232 	[ALC269_QUANTA_FL1]		= "quanta",
14233 	[ALC269_AMIC]			= "laptop-amic",
14234 	[ALC269_DMIC]			= "laptop-dmic",
14235 	[ALC269_FUJITSU]		= "fujitsu",
14236 	[ALC269_LIFEBOOK]		= "lifebook",
14237 	[ALC269_AUTO]			= "auto",
14238 };
14239 
14240 static struct snd_pci_quirk alc269_cfg_tbl[] = {
14241 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
14242 	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
14243 		      ALC269_AMIC),
14244 	SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
14245 	SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
14246 	SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
14247 	SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
14248 	SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
14249 	SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
14250 	SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
14251 	SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
14252 	SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
14253 	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC),
14254 	SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
14255 	SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
14256 	SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
14257 	SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
14258 	SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
14259 	SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
14260 	SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
14261 	SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
14262 	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
14263 	SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
14264 	SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
14265 	SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
14266 	SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
14267 	SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
14268 	SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
14269 	SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
14270 	SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
14271 	SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
14272 	SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
14273 	SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
14274 	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
14275 	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
14276 	SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
14277 	SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
14278 	SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
14279 	SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
14280 	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
14281 		      ALC269_DMIC),
14282 	SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
14283 		      ALC269_DMIC),
14284 	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
14285 	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
14286 	SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),
14287 	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
14288 	SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
14289 	SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
14290 	SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC),
14291 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC),
14292 	SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC),
14293 	SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC),
14294 	{}
14295 };
14296 
14297 static struct alc_config_preset alc269_presets[] = {
14298 	[ALC269_BASIC] = {
14299 		.mixers = { alc269_base_mixer },
14300 		.init_verbs = { alc269_init_verbs },
14301 		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14302 		.dac_nids = alc269_dac_nids,
14303 		.hp_nid = 0x03,
14304 		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14305 		.channel_mode = alc269_modes,
14306 		.input_mux = &alc269_capture_source,
14307 	},
14308 	[ALC269_QUANTA_FL1] = {
14309 		.mixers = { alc269_quanta_fl1_mixer },
14310 		.init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
14311 		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14312 		.dac_nids = alc269_dac_nids,
14313 		.hp_nid = 0x03,
14314 		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14315 		.channel_mode = alc269_modes,
14316 		.input_mux = &alc269_capture_source,
14317 		.unsol_event = alc269_quanta_fl1_unsol_event,
14318 		.setup = alc269_quanta_fl1_setup,
14319 		.init_hook = alc269_quanta_fl1_init_hook,
14320 	},
14321 	[ALC269_AMIC] = {
14322 		.mixers = { alc269_laptop_mixer },
14323 		.cap_mixer = alc269_laptop_analog_capture_mixer,
14324 		.init_verbs = { alc269_init_verbs,
14325 				alc269_laptop_amic_init_verbs },
14326 		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14327 		.dac_nids = alc269_dac_nids,
14328 		.hp_nid = 0x03,
14329 		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14330 		.channel_mode = alc269_modes,
14331 		.unsol_event = alc269_laptop_unsol_event,
14332 		.setup = alc269_laptop_amic_setup,
14333 		.init_hook = alc269_laptop_inithook,
14334 	},
14335 	[ALC269_DMIC] = {
14336 		.mixers = { alc269_laptop_mixer },
14337 		.cap_mixer = alc269_laptop_digital_capture_mixer,
14338 		.init_verbs = { alc269_init_verbs,
14339 				alc269_laptop_dmic_init_verbs },
14340 		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14341 		.dac_nids = alc269_dac_nids,
14342 		.hp_nid = 0x03,
14343 		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14344 		.channel_mode = alc269_modes,
14345 		.unsol_event = alc269_laptop_unsol_event,
14346 		.setup = alc269_laptop_dmic_setup,
14347 		.init_hook = alc269_laptop_inithook,
14348 	},
14349 	[ALC269VB_AMIC] = {
14350 		.mixers = { alc269vb_laptop_mixer },
14351 		.cap_mixer = alc269vb_laptop_analog_capture_mixer,
14352 		.init_verbs = { alc269vb_init_verbs,
14353 				alc269vb_laptop_amic_init_verbs },
14354 		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14355 		.dac_nids = alc269_dac_nids,
14356 		.hp_nid = 0x03,
14357 		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14358 		.channel_mode = alc269_modes,
14359 		.unsol_event = alc269_laptop_unsol_event,
14360 		.setup = alc269vb_laptop_amic_setup,
14361 		.init_hook = alc269_laptop_inithook,
14362 	},
14363 	[ALC269VB_DMIC] = {
14364 		.mixers = { alc269vb_laptop_mixer },
14365 		.cap_mixer = alc269vb_laptop_digital_capture_mixer,
14366 		.init_verbs = { alc269vb_init_verbs,
14367 				alc269vb_laptop_dmic_init_verbs },
14368 		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14369 		.dac_nids = alc269_dac_nids,
14370 		.hp_nid = 0x03,
14371 		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14372 		.channel_mode = alc269_modes,
14373 		.unsol_event = alc269_laptop_unsol_event,
14374 		.setup = alc269vb_laptop_dmic_setup,
14375 		.init_hook = alc269_laptop_inithook,
14376 	},
14377 	[ALC269_FUJITSU] = {
14378 		.mixers = { alc269_fujitsu_mixer },
14379 		.cap_mixer = alc269_laptop_digital_capture_mixer,
14380 		.init_verbs = { alc269_init_verbs,
14381 				alc269_laptop_dmic_init_verbs },
14382 		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14383 		.dac_nids = alc269_dac_nids,
14384 		.hp_nid = 0x03,
14385 		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14386 		.channel_mode = alc269_modes,
14387 		.unsol_event = alc269_laptop_unsol_event,
14388 		.setup = alc269_laptop_dmic_setup,
14389 		.init_hook = alc269_laptop_inithook,
14390 	},
14391 	[ALC269_LIFEBOOK] = {
14392 		.mixers = { alc269_lifebook_mixer },
14393 		.init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
14394 		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14395 		.dac_nids = alc269_dac_nids,
14396 		.hp_nid = 0x03,
14397 		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14398 		.channel_mode = alc269_modes,
14399 		.input_mux = &alc269_capture_source,
14400 		.unsol_event = alc269_lifebook_unsol_event,
14401 		.init_hook = alc269_lifebook_init_hook,
14402 	},
14403 };
14404 
14405 static int patch_alc269(struct hda_codec *codec)
14406 {
14407 	struct alc_spec *spec;
14408 	int board_config;
14409 	int err;
14410 	int is_alc269vb = 0;
14411 
14412 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14413 	if (spec == NULL)
14414 		return -ENOMEM;
14415 
14416 	codec->spec = spec;
14417 
14418 	alc_auto_parse_customize_define(codec);
14419 
14420 	if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){
14421 		if (codec->bus->pci->subsystem_vendor == 0x1025 &&
14422 		    spec->cdefine.platform_type == 1)
14423 			alc_codec_rename(codec, "ALC271X");
14424 		else
14425 			alc_codec_rename(codec, "ALC259");
14426 		is_alc269vb = 1;
14427 	} else
14428 		alc_fix_pll_init(codec, 0x20, 0x04, 15);
14429 
14430 	board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
14431 						  alc269_models,
14432 						  alc269_cfg_tbl);
14433 
14434 	if (board_config < 0) {
14435 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14436 		       codec->chip_name);
14437 		board_config = ALC269_AUTO;
14438 	}
14439 
14440 	if (board_config == ALC269_AUTO)
14441 		alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 1);
14442 
14443 	if (board_config == ALC269_AUTO) {
14444 		/* automatic parse from the BIOS config */
14445 		err = alc269_parse_auto_config(codec);
14446 		if (err < 0) {
14447 			alc_free(codec);
14448 			return err;
14449 		} else if (!err) {
14450 			printk(KERN_INFO
14451 			       "hda_codec: Cannot set up configuration "
14452 			       "from BIOS.  Using base mode...\n");
14453 			board_config = ALC269_BASIC;
14454 		}
14455 	}
14456 
14457 	err = snd_hda_attach_beep_device(codec, 0x1);
14458 	if (err < 0) {
14459 		alc_free(codec);
14460 		return err;
14461 	}
14462 
14463 	if (board_config != ALC269_AUTO)
14464 		setup_preset(codec, &alc269_presets[board_config]);
14465 
14466 	if (board_config == ALC269_QUANTA_FL1) {
14467 		/* Due to a hardware problem on Lenovo Ideadpad, we need to
14468 		 * fix the sample rate of analog I/O to 44.1kHz
14469 		 */
14470 		spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
14471 		spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
14472 	} else {
14473 		spec->stream_analog_playback = &alc269_pcm_analog_playback;
14474 		spec->stream_analog_capture = &alc269_pcm_analog_capture;
14475 	}
14476 	spec->stream_digital_playback = &alc269_pcm_digital_playback;
14477 	spec->stream_digital_capture = &alc269_pcm_digital_capture;
14478 
14479 	if (!spec->adc_nids) { /* wasn't filled automatically? use default */
14480 		if (!is_alc269vb) {
14481 			spec->adc_nids = alc269_adc_nids;
14482 			spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
14483 			spec->capsrc_nids = alc269_capsrc_nids;
14484 		} else {
14485 			spec->adc_nids = alc269vb_adc_nids;
14486 			spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids);
14487 			spec->capsrc_nids = alc269vb_capsrc_nids;
14488 		}
14489 	}
14490 
14491 	if (!spec->cap_mixer)
14492 		set_capture_mixer(codec);
14493 	if (spec->cdefine.enable_pcbeep)
14494 		set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
14495 
14496 	if (board_config == ALC269_AUTO)
14497 		alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 0);
14498 
14499 	spec->vmaster_nid = 0x02;
14500 
14501 	codec->patch_ops = alc_patch_ops;
14502 	if (board_config == ALC269_AUTO)
14503 		spec->init_hook = alc269_auto_init;
14504 #ifdef CONFIG_SND_HDA_POWER_SAVE
14505 	if (!spec->loopback.amplist)
14506 		spec->loopback.amplist = alc269_loopbacks;
14507 	if (alc269_mic2_for_mute_led(codec))
14508 		codec->patch_ops.check_power_status = alc269_mic2_mute_check_ps;
14509 #endif
14510 
14511 	return 0;
14512 }
14513 
14514 /*
14515  *  ALC861 channel source setting (2/6 channel selection for 3-stack)
14516  */
14517 
14518 /*
14519  * set the path ways for 2 channel output
14520  * need to set the codec line out and mic 1 pin widgets to inputs
14521  */
14522 static struct hda_verb alc861_threestack_ch2_init[] = {
14523 	/* set pin widget 1Ah (line in) for input */
14524 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14525 	/* set pin widget 18h (mic1/2) for input, for mic also enable
14526 	 * the vref
14527 	 */
14528 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14529 
14530 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14531 #if 0
14532 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14533 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14534 #endif
14535 	{ } /* end */
14536 };
14537 /*
14538  * 6ch mode
14539  * need to set the codec line out and mic 1 pin widgets to outputs
14540  */
14541 static struct hda_verb alc861_threestack_ch6_init[] = {
14542 	/* set pin widget 1Ah (line in) for output (Back Surround)*/
14543 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14544 	/* set pin widget 18h (mic1) for output (CLFE)*/
14545 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14546 
14547 	{ 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14548 	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14549 
14550 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14551 #if 0
14552 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14553 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14554 #endif
14555 	{ } /* end */
14556 };
14557 
14558 static struct hda_channel_mode alc861_threestack_modes[2] = {
14559 	{ 2, alc861_threestack_ch2_init },
14560 	{ 6, alc861_threestack_ch6_init },
14561 };
14562 /* Set mic1 as input and unmute the mixer */
14563 static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
14564 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14565 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14566 	{ } /* end */
14567 };
14568 /* Set mic1 as output and mute mixer */
14569 static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
14570 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14571 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14572 	{ } /* end */
14573 };
14574 
14575 static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
14576 	{ 2, alc861_uniwill_m31_ch2_init },
14577 	{ 4, alc861_uniwill_m31_ch4_init },
14578 };
14579 
14580 /* Set mic1 and line-in as input and unmute the mixer */
14581 static struct hda_verb alc861_asus_ch2_init[] = {
14582 	/* set pin widget 1Ah (line in) for input */
14583 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14584 	/* set pin widget 18h (mic1/2) for input, for mic also enable
14585 	 * the vref
14586 	 */
14587 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14588 
14589 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14590 #if 0
14591 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14592 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14593 #endif
14594 	{ } /* end */
14595 };
14596 /* Set mic1 nad line-in as output and mute mixer */
14597 static struct hda_verb alc861_asus_ch6_init[] = {
14598 	/* set pin widget 1Ah (line in) for output (Back Surround)*/
14599 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14600 	/* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14601 	/* set pin widget 18h (mic1) for output (CLFE)*/
14602 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14603 	/* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14604 	{ 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14605 	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14606 
14607 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14608 #if 0
14609 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14610 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14611 #endif
14612 	{ } /* end */
14613 };
14614 
14615 static struct hda_channel_mode alc861_asus_modes[2] = {
14616 	{ 2, alc861_asus_ch2_init },
14617 	{ 6, alc861_asus_ch6_init },
14618 };
14619 
14620 /* patch-ALC861 */
14621 
14622 static struct snd_kcontrol_new alc861_base_mixer[] = {
14623         /* output mixer control */
14624 	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14625 	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14626 	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14627 	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14628 	HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14629 
14630         /*Input mixer control */
14631 	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14632 	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14633 	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14634 	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14635 	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14636 	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14637 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14638 	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14639 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14640 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14641 
14642 	{ } /* end */
14643 };
14644 
14645 static struct snd_kcontrol_new alc861_3ST_mixer[] = {
14646         /* output mixer control */
14647 	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14648 	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14649 	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14650 	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14651 	/*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14652 
14653 	/* Input mixer control */
14654 	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14655 	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14656 	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14657 	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14658 	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14659 	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14660 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14661 	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14662 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14663 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14664 
14665 	{
14666 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14667 		.name = "Channel Mode",
14668 		.info = alc_ch_mode_info,
14669 		.get = alc_ch_mode_get,
14670 		.put = alc_ch_mode_put,
14671                 .private_value = ARRAY_SIZE(alc861_threestack_modes),
14672 	},
14673 	{ } /* end */
14674 };
14675 
14676 static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
14677         /* output mixer control */
14678 	HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14679 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14680 	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14681 
14682 	{ } /* end */
14683 };
14684 
14685 static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
14686         /* output mixer control */
14687 	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14688 	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14689 	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14690 	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14691 	/*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14692 
14693 	/* Input mixer control */
14694 	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14695 	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14696 	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14697 	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14698 	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14699 	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14700 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14701 	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14702 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14703 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14704 
14705 	{
14706 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14707 		.name = "Channel Mode",
14708 		.info = alc_ch_mode_info,
14709 		.get = alc_ch_mode_get,
14710 		.put = alc_ch_mode_put,
14711                 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
14712 	},
14713 	{ } /* end */
14714 };
14715 
14716 static struct snd_kcontrol_new alc861_asus_mixer[] = {
14717         /* output mixer control */
14718 	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14719 	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14720 	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14721 	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14722 	HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14723 
14724 	/* Input mixer control */
14725 	HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14726 	HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
14727 	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14728 	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14729 	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14730 	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14731 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14732 	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14733 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14734 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
14735 
14736 	{
14737 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14738 		.name = "Channel Mode",
14739 		.info = alc_ch_mode_info,
14740 		.get = alc_ch_mode_get,
14741 		.put = alc_ch_mode_put,
14742                 .private_value = ARRAY_SIZE(alc861_asus_modes),
14743 	},
14744 	{ }
14745 };
14746 
14747 /* additional mixer */
14748 static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
14749 	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14750 	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14751 	{ }
14752 };
14753 
14754 /*
14755  * generic initialization of ADC, input mixers and output mixers
14756  */
14757 static struct hda_verb alc861_base_init_verbs[] = {
14758 	/*
14759 	 * Unmute ADC0 and set the default input to mic-in
14760 	 */
14761 	/* port-A for surround (rear panel) */
14762 	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14763 	{ 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
14764 	/* port-B for mic-in (rear panel) with vref */
14765 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14766 	/* port-C for line-in (rear panel) */
14767 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14768 	/* port-D for Front */
14769 	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14770 	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14771 	/* port-E for HP out (front panel) */
14772 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14773 	/* route front PCM to HP */
14774 	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14775 	/* port-F for mic-in (front panel) with vref */
14776 	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14777 	/* port-G for CLFE (rear panel) */
14778 	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14779 	{ 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14780 	/* port-H for side (rear panel) */
14781 	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14782 	{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
14783 	/* CD-in */
14784 	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14785 	/* route front mic to ADC1*/
14786 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14787 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14788 
14789 	/* Unmute DAC0~3 & spdif out*/
14790 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14791 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14792 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14793 	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14794 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14795 
14796 	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14797 	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14798         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14799 	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14800         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14801 
14802 	/* Unmute Stereo Mixer 15 */
14803 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14804 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14805 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14806 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14807 
14808 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14809 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14810 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14811 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14812 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14813 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14814 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14815 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14816 	/* hp used DAC 3 (Front) */
14817 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14818         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14819 
14820 	{ }
14821 };
14822 
14823 static struct hda_verb alc861_threestack_init_verbs[] = {
14824 	/*
14825 	 * Unmute ADC0 and set the default input to mic-in
14826 	 */
14827 	/* port-A for surround (rear panel) */
14828 	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14829 	/* port-B for mic-in (rear panel) with vref */
14830 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14831 	/* port-C for line-in (rear panel) */
14832 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14833 	/* port-D for Front */
14834 	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14835 	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14836 	/* port-E for HP out (front panel) */
14837 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14838 	/* route front PCM to HP */
14839 	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14840 	/* port-F for mic-in (front panel) with vref */
14841 	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14842 	/* port-G for CLFE (rear panel) */
14843 	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14844 	/* port-H for side (rear panel) */
14845 	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14846 	/* CD-in */
14847 	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14848 	/* route front mic to ADC1*/
14849 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14850 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14851 	/* Unmute DAC0~3 & spdif out*/
14852 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14853 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14854 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14855 	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14856 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14857 
14858 	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14859 	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14860         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14861 	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14862         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14863 
14864 	/* Unmute Stereo Mixer 15 */
14865 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14866 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14867 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14868 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14869 
14870 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14871 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14872 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14873 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14874 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14875 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14876 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14877 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14878 	/* hp used DAC 3 (Front) */
14879 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14880         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14881 	{ }
14882 };
14883 
14884 static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
14885 	/*
14886 	 * Unmute ADC0 and set the default input to mic-in
14887 	 */
14888 	/* port-A for surround (rear panel) */
14889 	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14890 	/* port-B for mic-in (rear panel) with vref */
14891 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14892 	/* port-C for line-in (rear panel) */
14893 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14894 	/* port-D for Front */
14895 	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14896 	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14897 	/* port-E for HP out (front panel) */
14898 	/* this has to be set to VREF80 */
14899 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14900 	/* route front PCM to HP */
14901 	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14902 	/* port-F for mic-in (front panel) with vref */
14903 	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14904 	/* port-G for CLFE (rear panel) */
14905 	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14906 	/* port-H for side (rear panel) */
14907 	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14908 	/* CD-in */
14909 	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14910 	/* route front mic to ADC1*/
14911 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14912 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14913 	/* Unmute DAC0~3 & spdif out*/
14914 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14915 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14916 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14917 	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14918 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14919 
14920 	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14921 	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14922         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14923 	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14924         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14925 
14926 	/* Unmute Stereo Mixer 15 */
14927 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14928 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14929 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14930 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14931 
14932 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14933 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14934 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14935 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14936 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14937 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14938 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14939 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14940 	/* hp used DAC 3 (Front) */
14941 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14942         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14943 	{ }
14944 };
14945 
14946 static struct hda_verb alc861_asus_init_verbs[] = {
14947 	/*
14948 	 * Unmute ADC0 and set the default input to mic-in
14949 	 */
14950 	/* port-A for surround (rear panel)
14951 	 * according to codec#0 this is the HP jack
14952 	 */
14953 	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
14954 	/* route front PCM to HP */
14955 	{ 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
14956 	/* port-B for mic-in (rear panel) with vref */
14957 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14958 	/* port-C for line-in (rear panel) */
14959 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14960 	/* port-D for Front */
14961 	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14962 	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14963 	/* port-E for HP out (front panel) */
14964 	/* this has to be set to VREF80 */
14965 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14966 	/* route front PCM to HP */
14967 	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14968 	/* port-F for mic-in (front panel) with vref */
14969 	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14970 	/* port-G for CLFE (rear panel) */
14971 	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14972 	/* port-H for side (rear panel) */
14973 	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14974 	/* CD-in */
14975 	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14976 	/* route front mic to ADC1*/
14977 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14978 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14979 	/* Unmute DAC0~3 & spdif out*/
14980 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14981 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14982 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14983 	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14984 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14985 	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14986 	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14987         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14988 	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14989         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14990 
14991 	/* Unmute Stereo Mixer 15 */
14992 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14993 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14994 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14995 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14996 
14997 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14998 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14999 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15000 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15001 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15002 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15003 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15004 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15005 	/* hp used DAC 3 (Front) */
15006 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15007 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15008 	{ }
15009 };
15010 
15011 /* additional init verbs for ASUS laptops */
15012 static struct hda_verb alc861_asus_laptop_init_verbs[] = {
15013 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
15014 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
15015 	{ }
15016 };
15017 
15018 /*
15019  * generic initialization of ADC, input mixers and output mixers
15020  */
15021 static struct hda_verb alc861_auto_init_verbs[] = {
15022 	/*
15023 	 * Unmute ADC0 and set the default input to mic-in
15024 	 */
15025 	/* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
15026 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15027 
15028 	/* Unmute DAC0~3 & spdif out*/
15029 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15030 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15031 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15032 	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15033 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15034 
15035 	/* Unmute Mixer 14 (mic) 1c (Line in)*/
15036 	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15037 	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15038 	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15039 	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15040 
15041 	/* Unmute Stereo Mixer 15 */
15042 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15043 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15044 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15045 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
15046 
15047 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15048 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15049 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15050 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15051 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15052 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15053 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15054 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15055 
15056 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15057 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15058 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15059 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15060 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15061 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15062 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15063 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15064 
15065 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},	/* set Mic 1 */
15066 
15067 	{ }
15068 };
15069 
15070 static struct hda_verb alc861_toshiba_init_verbs[] = {
15071 	{0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15072 
15073 	{ }
15074 };
15075 
15076 /* toggle speaker-output according to the hp-jack state */
15077 static void alc861_toshiba_automute(struct hda_codec *codec)
15078 {
15079 	unsigned int present = snd_hda_jack_detect(codec, 0x0f);
15080 
15081 	snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
15082 				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
15083 	snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
15084 				 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
15085 }
15086 
15087 static void alc861_toshiba_unsol_event(struct hda_codec *codec,
15088 				       unsigned int res)
15089 {
15090 	if ((res >> 26) == ALC880_HP_EVENT)
15091 		alc861_toshiba_automute(codec);
15092 }
15093 
15094 /* pcm configuration: identical with ALC880 */
15095 #define alc861_pcm_analog_playback	alc880_pcm_analog_playback
15096 #define alc861_pcm_analog_capture	alc880_pcm_analog_capture
15097 #define alc861_pcm_digital_playback	alc880_pcm_digital_playback
15098 #define alc861_pcm_digital_capture	alc880_pcm_digital_capture
15099 
15100 
15101 #define ALC861_DIGOUT_NID	0x07
15102 
15103 static struct hda_channel_mode alc861_8ch_modes[1] = {
15104 	{ 8, NULL }
15105 };
15106 
15107 static hda_nid_t alc861_dac_nids[4] = {
15108 	/* front, surround, clfe, side */
15109 	0x03, 0x06, 0x05, 0x04
15110 };
15111 
15112 static hda_nid_t alc660_dac_nids[3] = {
15113 	/* front, clfe, surround */
15114 	0x03, 0x05, 0x06
15115 };
15116 
15117 static hda_nid_t alc861_adc_nids[1] = {
15118 	/* ADC0-2 */
15119 	0x08,
15120 };
15121 
15122 static struct hda_input_mux alc861_capture_source = {
15123 	.num_items = 5,
15124 	.items = {
15125 		{ "Mic", 0x0 },
15126 		{ "Front Mic", 0x3 },
15127 		{ "Line", 0x1 },
15128 		{ "CD", 0x4 },
15129 		{ "Mixer", 0x5 },
15130 	},
15131 };
15132 
15133 static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
15134 {
15135 	struct alc_spec *spec = codec->spec;
15136 	hda_nid_t mix, srcs[5];
15137 	int i, j, num;
15138 
15139 	if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
15140 		return 0;
15141 	num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15142 	if (num < 0)
15143 		return 0;
15144 	for (i = 0; i < num; i++) {
15145 		unsigned int type;
15146 		type = get_wcaps_type(get_wcaps(codec, srcs[i]));
15147 		if (type != AC_WID_AUD_OUT)
15148 			continue;
15149 		for (j = 0; j < spec->multiout.num_dacs; j++)
15150 			if (spec->multiout.dac_nids[j] == srcs[i])
15151 				break;
15152 		if (j >= spec->multiout.num_dacs)
15153 			return srcs[i];
15154 	}
15155 	return 0;
15156 }
15157 
15158 /* fill in the dac_nids table from the parsed pin configuration */
15159 static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
15160 				     const struct auto_pin_cfg *cfg)
15161 {
15162 	struct alc_spec *spec = codec->spec;
15163 	int i;
15164 	hda_nid_t nid, dac;
15165 
15166 	spec->multiout.dac_nids = spec->private_dac_nids;
15167 	for (i = 0; i < cfg->line_outs; i++) {
15168 		nid = cfg->line_out_pins[i];
15169 		dac = alc861_look_for_dac(codec, nid);
15170 		if (!dac)
15171 			continue;
15172 		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
15173 	}
15174 	return 0;
15175 }
15176 
15177 static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
15178 				hda_nid_t nid, unsigned int chs)
15179 {
15180 	return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx,
15181 			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
15182 }
15183 
15184 /* add playback controls from the parsed DAC table */
15185 static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
15186 					     const struct auto_pin_cfg *cfg)
15187 {
15188 	struct alc_spec *spec = codec->spec;
15189 	static const char *chname[4] = {
15190 		"Front", "Surround", NULL /*CLFE*/, "Side"
15191 	};
15192 	hda_nid_t nid;
15193 	int i, err;
15194 
15195 	if (cfg->line_outs == 1) {
15196 		const char *pfx = NULL;
15197 		if (!cfg->hp_outs)
15198 			pfx = "Master";
15199 		else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
15200 			pfx = "Speaker";
15201 		if (pfx) {
15202 			nid = spec->multiout.dac_nids[0];
15203 			return alc861_create_out_sw(codec, pfx, nid, 3);
15204 		}
15205 	}
15206 
15207 	for (i = 0; i < cfg->line_outs; i++) {
15208 		nid = spec->multiout.dac_nids[i];
15209 		if (!nid)
15210 			continue;
15211 		if (i == 2) {
15212 			/* Center/LFE */
15213 			err = alc861_create_out_sw(codec, "Center", nid, 1);
15214 			if (err < 0)
15215 				return err;
15216 			err = alc861_create_out_sw(codec, "LFE", nid, 2);
15217 			if (err < 0)
15218 				return err;
15219 		} else {
15220 			err = alc861_create_out_sw(codec, chname[i], nid, 3);
15221 			if (err < 0)
15222 				return err;
15223 		}
15224 	}
15225 	return 0;
15226 }
15227 
15228 static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
15229 {
15230 	struct alc_spec *spec = codec->spec;
15231 	int err;
15232 	hda_nid_t nid;
15233 
15234 	if (!pin)
15235 		return 0;
15236 
15237 	if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
15238 		nid = alc861_look_for_dac(codec, pin);
15239 		if (nid) {
15240 			err = alc861_create_out_sw(codec, "Headphone", nid, 3);
15241 			if (err < 0)
15242 				return err;
15243 			spec->multiout.hp_nid = nid;
15244 		}
15245 	}
15246 	return 0;
15247 }
15248 
15249 /* create playback/capture controls for input pins */
15250 static int alc861_auto_create_input_ctls(struct hda_codec *codec,
15251 						const struct auto_pin_cfg *cfg)
15252 {
15253 	return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
15254 }
15255 
15256 static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
15257 					      hda_nid_t nid,
15258 					      int pin_type, hda_nid_t dac)
15259 {
15260 	hda_nid_t mix, srcs[5];
15261 	int i, num;
15262 
15263 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
15264 			    pin_type);
15265 	snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15266 			    AMP_OUT_UNMUTE);
15267 	if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
15268 		return;
15269 	num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15270 	if (num < 0)
15271 		return;
15272 	for (i = 0; i < num; i++) {
15273 		unsigned int mute;
15274 		if (srcs[i] == dac || srcs[i] == 0x15)
15275 			mute = AMP_IN_UNMUTE(i);
15276 		else
15277 			mute = AMP_IN_MUTE(i);
15278 		snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15279 				    mute);
15280 	}
15281 }
15282 
15283 static void alc861_auto_init_multi_out(struct hda_codec *codec)
15284 {
15285 	struct alc_spec *spec = codec->spec;
15286 	int i;
15287 
15288 	for (i = 0; i < spec->autocfg.line_outs; i++) {
15289 		hda_nid_t nid = spec->autocfg.line_out_pins[i];
15290 		int pin_type = get_pin_type(spec->autocfg.line_out_type);
15291 		if (nid)
15292 			alc861_auto_set_output_and_unmute(codec, nid, pin_type,
15293 							  spec->multiout.dac_nids[i]);
15294 	}
15295 }
15296 
15297 static void alc861_auto_init_hp_out(struct hda_codec *codec)
15298 {
15299 	struct alc_spec *spec = codec->spec;
15300 
15301 	if (spec->autocfg.hp_outs)
15302 		alc861_auto_set_output_and_unmute(codec,
15303 						  spec->autocfg.hp_pins[0],
15304 						  PIN_HP,
15305 						  spec->multiout.hp_nid);
15306 	if (spec->autocfg.speaker_outs)
15307 		alc861_auto_set_output_and_unmute(codec,
15308 						  spec->autocfg.speaker_pins[0],
15309 						  PIN_OUT,
15310 						  spec->multiout.dac_nids[0]);
15311 }
15312 
15313 static void alc861_auto_init_analog_input(struct hda_codec *codec)
15314 {
15315 	struct alc_spec *spec = codec->spec;
15316 	int i;
15317 
15318 	for (i = 0; i < AUTO_PIN_LAST; i++) {
15319 		hda_nid_t nid = spec->autocfg.input_pins[i];
15320 		if (nid >= 0x0c && nid <= 0x11)
15321 			alc_set_input_pin(codec, nid, i);
15322 	}
15323 }
15324 
15325 /* parse the BIOS configuration and set up the alc_spec */
15326 /* return 1 if successful, 0 if the proper config is not found,
15327  * or a negative error code
15328  */
15329 static int alc861_parse_auto_config(struct hda_codec *codec)
15330 {
15331 	struct alc_spec *spec = codec->spec;
15332 	int err;
15333 	static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
15334 
15335 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15336 					   alc861_ignore);
15337 	if (err < 0)
15338 		return err;
15339 	if (!spec->autocfg.line_outs)
15340 		return 0; /* can't find valid BIOS pin config */
15341 
15342 	err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
15343 	if (err < 0)
15344 		return err;
15345 	err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
15346 	if (err < 0)
15347 		return err;
15348 	err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
15349 	if (err < 0)
15350 		return err;
15351 	err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
15352 	if (err < 0)
15353 		return err;
15354 
15355 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15356 
15357 	if (spec->autocfg.dig_outs)
15358 		spec->multiout.dig_out_nid = ALC861_DIGOUT_NID;
15359 
15360 	if (spec->kctls.list)
15361 		add_mixer(spec, spec->kctls.list);
15362 
15363 	add_verb(spec, alc861_auto_init_verbs);
15364 
15365 	spec->num_mux_defs = 1;
15366 	spec->input_mux = &spec->private_imux[0];
15367 
15368 	spec->adc_nids = alc861_adc_nids;
15369 	spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
15370 	set_capture_mixer(codec);
15371 
15372 	alc_ssid_check(codec, 0x0e, 0x0f, 0x0b, 0);
15373 
15374 	return 1;
15375 }
15376 
15377 /* additional initialization for auto-configuration model */
15378 static void alc861_auto_init(struct hda_codec *codec)
15379 {
15380 	struct alc_spec *spec = codec->spec;
15381 	alc861_auto_init_multi_out(codec);
15382 	alc861_auto_init_hp_out(codec);
15383 	alc861_auto_init_analog_input(codec);
15384 	if (spec->unsol_event)
15385 		alc_inithook(codec);
15386 }
15387 
15388 #ifdef CONFIG_SND_HDA_POWER_SAVE
15389 static struct hda_amp_list alc861_loopbacks[] = {
15390 	{ 0x15, HDA_INPUT, 0 },
15391 	{ 0x15, HDA_INPUT, 1 },
15392 	{ 0x15, HDA_INPUT, 2 },
15393 	{ 0x15, HDA_INPUT, 3 },
15394 	{ } /* end */
15395 };
15396 #endif
15397 
15398 
15399 /*
15400  * configuration and preset
15401  */
15402 static const char *alc861_models[ALC861_MODEL_LAST] = {
15403 	[ALC861_3ST]		= "3stack",
15404 	[ALC660_3ST]		= "3stack-660",
15405 	[ALC861_3ST_DIG]	= "3stack-dig",
15406 	[ALC861_6ST_DIG]	= "6stack-dig",
15407 	[ALC861_UNIWILL_M31]	= "uniwill-m31",
15408 	[ALC861_TOSHIBA]	= "toshiba",
15409 	[ALC861_ASUS]		= "asus",
15410 	[ALC861_ASUS_LAPTOP]	= "asus-laptop",
15411 	[ALC861_AUTO]		= "auto",
15412 };
15413 
15414 static struct snd_pci_quirk alc861_cfg_tbl[] = {
15415 	SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
15416 	SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15417 	SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15418 	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
15419 	SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
15420 	SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
15421 	SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
15422 	/* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
15423 	 *        Any other models that need this preset?
15424 	 */
15425 	/* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
15426 	SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
15427 	SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
15428 	SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
15429 	SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
15430 	SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
15431 	/* FIXME: the below seems conflict */
15432 	/* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
15433 	SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
15434 	SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
15435 	{}
15436 };
15437 
15438 static struct alc_config_preset alc861_presets[] = {
15439 	[ALC861_3ST] = {
15440 		.mixers = { alc861_3ST_mixer },
15441 		.init_verbs = { alc861_threestack_init_verbs },
15442 		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15443 		.dac_nids = alc861_dac_nids,
15444 		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15445 		.channel_mode = alc861_threestack_modes,
15446 		.need_dac_fix = 1,
15447 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15448 		.adc_nids = alc861_adc_nids,
15449 		.input_mux = &alc861_capture_source,
15450 	},
15451 	[ALC861_3ST_DIG] = {
15452 		.mixers = { alc861_base_mixer },
15453 		.init_verbs = { alc861_threestack_init_verbs },
15454 		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15455 		.dac_nids = alc861_dac_nids,
15456 		.dig_out_nid = ALC861_DIGOUT_NID,
15457 		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15458 		.channel_mode = alc861_threestack_modes,
15459 		.need_dac_fix = 1,
15460 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15461 		.adc_nids = alc861_adc_nids,
15462 		.input_mux = &alc861_capture_source,
15463 	},
15464 	[ALC861_6ST_DIG] = {
15465 		.mixers = { alc861_base_mixer },
15466 		.init_verbs = { alc861_base_init_verbs },
15467 		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15468 		.dac_nids = alc861_dac_nids,
15469 		.dig_out_nid = ALC861_DIGOUT_NID,
15470 		.num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
15471 		.channel_mode = alc861_8ch_modes,
15472 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15473 		.adc_nids = alc861_adc_nids,
15474 		.input_mux = &alc861_capture_source,
15475 	},
15476 	[ALC660_3ST] = {
15477 		.mixers = { alc861_3ST_mixer },
15478 		.init_verbs = { alc861_threestack_init_verbs },
15479 		.num_dacs = ARRAY_SIZE(alc660_dac_nids),
15480 		.dac_nids = alc660_dac_nids,
15481 		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15482 		.channel_mode = alc861_threestack_modes,
15483 		.need_dac_fix = 1,
15484 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15485 		.adc_nids = alc861_adc_nids,
15486 		.input_mux = &alc861_capture_source,
15487 	},
15488 	[ALC861_UNIWILL_M31] = {
15489 		.mixers = { alc861_uniwill_m31_mixer },
15490 		.init_verbs = { alc861_uniwill_m31_init_verbs },
15491 		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15492 		.dac_nids = alc861_dac_nids,
15493 		.dig_out_nid = ALC861_DIGOUT_NID,
15494 		.num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
15495 		.channel_mode = alc861_uniwill_m31_modes,
15496 		.need_dac_fix = 1,
15497 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15498 		.adc_nids = alc861_adc_nids,
15499 		.input_mux = &alc861_capture_source,
15500 	},
15501 	[ALC861_TOSHIBA] = {
15502 		.mixers = { alc861_toshiba_mixer },
15503 		.init_verbs = { alc861_base_init_verbs,
15504 				alc861_toshiba_init_verbs },
15505 		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15506 		.dac_nids = alc861_dac_nids,
15507 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15508 		.channel_mode = alc883_3ST_2ch_modes,
15509 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15510 		.adc_nids = alc861_adc_nids,
15511 		.input_mux = &alc861_capture_source,
15512 		.unsol_event = alc861_toshiba_unsol_event,
15513 		.init_hook = alc861_toshiba_automute,
15514 	},
15515 	[ALC861_ASUS] = {
15516 		.mixers = { alc861_asus_mixer },
15517 		.init_verbs = { alc861_asus_init_verbs },
15518 		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15519 		.dac_nids = alc861_dac_nids,
15520 		.dig_out_nid = ALC861_DIGOUT_NID,
15521 		.num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
15522 		.channel_mode = alc861_asus_modes,
15523 		.need_dac_fix = 1,
15524 		.hp_nid = 0x06,
15525 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15526 		.adc_nids = alc861_adc_nids,
15527 		.input_mux = &alc861_capture_source,
15528 	},
15529 	[ALC861_ASUS_LAPTOP] = {
15530 		.mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
15531 		.init_verbs = { alc861_asus_init_verbs,
15532 				alc861_asus_laptop_init_verbs },
15533 		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15534 		.dac_nids = alc861_dac_nids,
15535 		.dig_out_nid = ALC861_DIGOUT_NID,
15536 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15537 		.channel_mode = alc883_3ST_2ch_modes,
15538 		.need_dac_fix = 1,
15539 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15540 		.adc_nids = alc861_adc_nids,
15541 		.input_mux = &alc861_capture_source,
15542 	},
15543 };
15544 
15545 /* Pin config fixes */
15546 enum {
15547 	PINFIX_FSC_AMILO_PI1505,
15548 };
15549 
15550 static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = {
15551 	{ 0x0b, 0x0221101f }, /* HP */
15552 	{ 0x0f, 0x90170310 }, /* speaker */
15553 	{ }
15554 };
15555 
15556 static const struct alc_fixup alc861_fixups[] = {
15557 	[PINFIX_FSC_AMILO_PI1505] = {
15558 		.pins = alc861_fsc_amilo_pi1505_pinfix
15559 	},
15560 };
15561 
15562 static struct snd_pci_quirk alc861_fixup_tbl[] = {
15563 	SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
15564 	{}
15565 };
15566 
15567 static int patch_alc861(struct hda_codec *codec)
15568 {
15569 	struct alc_spec *spec;
15570 	int board_config;
15571 	int err;
15572 
15573 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
15574 	if (spec == NULL)
15575 		return -ENOMEM;
15576 
15577 	codec->spec = spec;
15578 
15579         board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
15580 						  alc861_models,
15581 						  alc861_cfg_tbl);
15582 
15583 	if (board_config < 0) {
15584 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15585 		       codec->chip_name);
15586 		board_config = ALC861_AUTO;
15587 	}
15588 
15589 	if (board_config == ALC861_AUTO)
15590 		alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 1);
15591 
15592 	if (board_config == ALC861_AUTO) {
15593 		/* automatic parse from the BIOS config */
15594 		err = alc861_parse_auto_config(codec);
15595 		if (err < 0) {
15596 			alc_free(codec);
15597 			return err;
15598 		} else if (!err) {
15599 			printk(KERN_INFO
15600 			       "hda_codec: Cannot set up configuration "
15601 			       "from BIOS.  Using base mode...\n");
15602 		   board_config = ALC861_3ST_DIG;
15603 		}
15604 	}
15605 
15606 	err = snd_hda_attach_beep_device(codec, 0x23);
15607 	if (err < 0) {
15608 		alc_free(codec);
15609 		return err;
15610 	}
15611 
15612 	if (board_config != ALC861_AUTO)
15613 		setup_preset(codec, &alc861_presets[board_config]);
15614 
15615 	spec->stream_analog_playback = &alc861_pcm_analog_playback;
15616 	spec->stream_analog_capture = &alc861_pcm_analog_capture;
15617 
15618 	spec->stream_digital_playback = &alc861_pcm_digital_playback;
15619 	spec->stream_digital_capture = &alc861_pcm_digital_capture;
15620 
15621 	if (!spec->cap_mixer)
15622 		set_capture_mixer(codec);
15623 	set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
15624 
15625 	spec->vmaster_nid = 0x03;
15626 
15627 	if (board_config == ALC861_AUTO)
15628 		alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 0);
15629 
15630 	codec->patch_ops = alc_patch_ops;
15631 	if (board_config == ALC861_AUTO) {
15632 		spec->init_hook = alc861_auto_init;
15633 #ifdef CONFIG_SND_HDA_POWER_SAVE
15634 		spec->power_hook = alc_power_eapd;
15635 #endif
15636 	}
15637 #ifdef CONFIG_SND_HDA_POWER_SAVE
15638 	if (!spec->loopback.amplist)
15639 		spec->loopback.amplist = alc861_loopbacks;
15640 #endif
15641 
15642 	return 0;
15643 }
15644 
15645 /*
15646  * ALC861-VD support
15647  *
15648  * Based on ALC882
15649  *
15650  * In addition, an independent DAC
15651  */
15652 #define ALC861VD_DIGOUT_NID	0x06
15653 
15654 static hda_nid_t alc861vd_dac_nids[4] = {
15655 	/* front, surr, clfe, side surr */
15656 	0x02, 0x03, 0x04, 0x05
15657 };
15658 
15659 /* dac_nids for ALC660vd are in a different order - according to
15660  * Realtek's driver.
15661  * This should probably result in a different mixer for 6stack models
15662  * of ALC660vd codecs, but for now there is only 3stack mixer
15663  * - and it is the same as in 861vd.
15664  * adc_nids in ALC660vd are (is) the same as in 861vd
15665  */
15666 static hda_nid_t alc660vd_dac_nids[3] = {
15667 	/* front, rear, clfe, rear_surr */
15668 	0x02, 0x04, 0x03
15669 };
15670 
15671 static hda_nid_t alc861vd_adc_nids[1] = {
15672 	/* ADC0 */
15673 	0x09,
15674 };
15675 
15676 static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
15677 
15678 /* input MUX */
15679 /* FIXME: should be a matrix-type input source selection */
15680 static struct hda_input_mux alc861vd_capture_source = {
15681 	.num_items = 4,
15682 	.items = {
15683 		{ "Mic", 0x0 },
15684 		{ "Front Mic", 0x1 },
15685 		{ "Line", 0x2 },
15686 		{ "CD", 0x4 },
15687 	},
15688 };
15689 
15690 static struct hda_input_mux alc861vd_dallas_capture_source = {
15691 	.num_items = 2,
15692 	.items = {
15693 		{ "Ext Mic", 0x0 },
15694 		{ "Int Mic", 0x1 },
15695 	},
15696 };
15697 
15698 static struct hda_input_mux alc861vd_hp_capture_source = {
15699 	.num_items = 2,
15700 	.items = {
15701 		{ "Front Mic", 0x0 },
15702 		{ "ATAPI Mic", 0x1 },
15703 	},
15704 };
15705 
15706 /*
15707  * 2ch mode
15708  */
15709 static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
15710 	{ 2, NULL }
15711 };
15712 
15713 /*
15714  * 6ch mode
15715  */
15716 static struct hda_verb alc861vd_6stack_ch6_init[] = {
15717 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15718 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15719 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15720 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15721 	{ } /* end */
15722 };
15723 
15724 /*
15725  * 8ch mode
15726  */
15727 static struct hda_verb alc861vd_6stack_ch8_init[] = {
15728 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15729 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15730 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15731 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15732 	{ } /* end */
15733 };
15734 
15735 static struct hda_channel_mode alc861vd_6stack_modes[2] = {
15736 	{ 6, alc861vd_6stack_ch6_init },
15737 	{ 8, alc861vd_6stack_ch8_init },
15738 };
15739 
15740 static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
15741 	{
15742 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15743 		.name = "Channel Mode",
15744 		.info = alc_ch_mode_info,
15745 		.get = alc_ch_mode_get,
15746 		.put = alc_ch_mode_put,
15747 	},
15748 	{ } /* end */
15749 };
15750 
15751 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
15752  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
15753  */
15754 static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
15755 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15756 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15757 
15758 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15759 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
15760 
15761 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
15762 				HDA_OUTPUT),
15763 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
15764 				HDA_OUTPUT),
15765 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
15766 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
15767 
15768 	HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
15769 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
15770 
15771 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15772 
15773 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15774 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15775 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15776 
15777 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15778 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15779 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15780 
15781 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15782 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15783 
15784 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15785 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15786 
15787 	{ } /* end */
15788 };
15789 
15790 static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
15791 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15792 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15793 
15794 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15795 
15796 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15797 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15798 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15799 
15800 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15801 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15802 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15803 
15804 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15805 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15806 
15807 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15808 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15809 
15810 	{ } /* end */
15811 };
15812 
15813 static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
15814 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15815 	/*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
15816 	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
15817 
15818 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15819 
15820 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15821 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15822 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15823 
15824 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15825 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15826 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15827 
15828 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15829 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15830 
15831 	{ } /* end */
15832 };
15833 
15834 /* Pin assignment: Speaker=0x14, HP = 0x15,
15835  *                 Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
15836  */
15837 static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
15838 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15839 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
15840 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15841 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15842 	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
15843 	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15844 	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15845 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
15846 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15847 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15848 	{ } /* end */
15849 };
15850 
15851 /* Pin assignment: Speaker=0x14, Line-out = 0x15,
15852  *                 Front Mic=0x18, ATAPI Mic = 0x19,
15853  */
15854 static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
15855 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15856 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15857 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15858 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15859 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15860 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15861 	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15862 	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15863 
15864 	{ } /* end */
15865 };
15866 
15867 /*
15868  * generic initialization of ADC, input mixers and output mixers
15869  */
15870 static struct hda_verb alc861vd_volume_init_verbs[] = {
15871 	/*
15872 	 * Unmute ADC0 and set the default input to mic-in
15873 	 */
15874 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15875 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15876 
15877 	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
15878 	 * the analog-loopback mixer widget
15879 	 */
15880 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
15881 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15882 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15883 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15884 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15885 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15886 
15887 	/* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
15888 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15889 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15890 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15891 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
15892 
15893 	/*
15894 	 * Set up output mixers (0x02 - 0x05)
15895 	 */
15896 	/* set vol=0 to output mixers */
15897 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15898 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15899 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15900 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15901 
15902 	/* set up input amps for analog loopback */
15903 	/* Amp Indices: DAC = 0, mixer = 1 */
15904 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15905 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15906 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15907 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15908 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15909 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15910 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15911 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15912 
15913 	{ }
15914 };
15915 
15916 /*
15917  * 3-stack pin configuration:
15918  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
15919  */
15920 static struct hda_verb alc861vd_3stack_init_verbs[] = {
15921 	/*
15922 	 * Set pin mode and muting
15923 	 */
15924 	/* set front pin widgets 0x14 for output */
15925 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15926 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15927 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15928 
15929 	/* Mic (rear) pin: input vref at 80% */
15930 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15931 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15932 	/* Front Mic pin: input vref at 80% */
15933 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15934 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15935 	/* Line In pin: input */
15936 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15937 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15938 	/* Line-2 In: Headphone output (output 0 - 0x0c) */
15939 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15940 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15941 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15942 	/* CD pin widget for input */
15943 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15944 
15945 	{ }
15946 };
15947 
15948 /*
15949  * 6-stack pin configuration:
15950  */
15951 static struct hda_verb alc861vd_6stack_init_verbs[] = {
15952 	/*
15953 	 * Set pin mode and muting
15954 	 */
15955 	/* set front pin widgets 0x14 for output */
15956 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15957 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15958 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15959 
15960 	/* Rear Pin: output 1 (0x0d) */
15961 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15962 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15963 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
15964 	/* CLFE Pin: output 2 (0x0e) */
15965 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15966 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15967 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
15968 	/* Side Pin: output 3 (0x0f) */
15969 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15970 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15971 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
15972 
15973 	/* Mic (rear) pin: input vref at 80% */
15974 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15975 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15976 	/* Front Mic pin: input vref at 80% */
15977 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15978 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15979 	/* Line In pin: input */
15980 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15981 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15982 	/* Line-2 In: Headphone output (output 0 - 0x0c) */
15983 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15984 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15985 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15986 	/* CD pin widget for input */
15987 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15988 
15989 	{ }
15990 };
15991 
15992 static struct hda_verb alc861vd_eapd_verbs[] = {
15993 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15994 	{ }
15995 };
15996 
15997 static struct hda_verb alc660vd_eapd_verbs[] = {
15998 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15999 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16000 	{ }
16001 };
16002 
16003 static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
16004 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16005 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16006 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
16007 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16008 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16009 	{}
16010 };
16011 
16012 static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
16013 {
16014 	unsigned int present;
16015 	unsigned char bits;
16016 
16017 	present = snd_hda_jack_detect(codec, 0x18);
16018 	bits = present ? HDA_AMP_MUTE : 0;
16019 
16020 	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
16021 				 HDA_AMP_MUTE, bits);
16022 }
16023 
16024 static void alc861vd_lenovo_setup(struct hda_codec *codec)
16025 {
16026 	struct alc_spec *spec = codec->spec;
16027 	spec->autocfg.hp_pins[0] = 0x1b;
16028 	spec->autocfg.speaker_pins[0] = 0x14;
16029 }
16030 
16031 static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
16032 {
16033 	alc_automute_amp(codec);
16034 	alc861vd_lenovo_mic_automute(codec);
16035 }
16036 
16037 static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
16038 					unsigned int res)
16039 {
16040 	switch (res >> 26) {
16041 	case ALC880_MIC_EVENT:
16042 		alc861vd_lenovo_mic_automute(codec);
16043 		break;
16044 	default:
16045 		alc_automute_amp_unsol_event(codec, res);
16046 		break;
16047 	}
16048 }
16049 
16050 static struct hda_verb alc861vd_dallas_verbs[] = {
16051 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16052 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16053 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16054 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16055 
16056 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16057 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16058 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16059 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16060 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16061 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16062 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16063 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16064 
16065 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16066 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16067 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16068 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16069 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16070 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16071 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16072 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16073 
16074 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16075 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16076 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16077 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16078 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16079 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16080 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16081 	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16082 
16083 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16084 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16085 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16086 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16087 
16088 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16089 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16090 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16091 
16092 	{ } /* end */
16093 };
16094 
16095 /* toggle speaker-output according to the hp-jack state */
16096 static void alc861vd_dallas_setup(struct hda_codec *codec)
16097 {
16098 	struct alc_spec *spec = codec->spec;
16099 
16100 	spec->autocfg.hp_pins[0] = 0x15;
16101 	spec->autocfg.speaker_pins[0] = 0x14;
16102 }
16103 
16104 #ifdef CONFIG_SND_HDA_POWER_SAVE
16105 #define alc861vd_loopbacks	alc880_loopbacks
16106 #endif
16107 
16108 /* pcm configuration: identical with ALC880 */
16109 #define alc861vd_pcm_analog_playback	alc880_pcm_analog_playback
16110 #define alc861vd_pcm_analog_capture	alc880_pcm_analog_capture
16111 #define alc861vd_pcm_digital_playback	alc880_pcm_digital_playback
16112 #define alc861vd_pcm_digital_capture	alc880_pcm_digital_capture
16113 
16114 /*
16115  * configuration and preset
16116  */
16117 static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
16118 	[ALC660VD_3ST]		= "3stack-660",
16119 	[ALC660VD_3ST_DIG]	= "3stack-660-digout",
16120 	[ALC660VD_ASUS_V1S]	= "asus-v1s",
16121 	[ALC861VD_3ST]		= "3stack",
16122 	[ALC861VD_3ST_DIG]	= "3stack-digout",
16123 	[ALC861VD_6ST_DIG]	= "6stack-digout",
16124 	[ALC861VD_LENOVO]	= "lenovo",
16125 	[ALC861VD_DALLAS]	= "dallas",
16126 	[ALC861VD_HP]		= "hp",
16127 	[ALC861VD_AUTO]		= "auto",
16128 };
16129 
16130 static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
16131 	SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
16132 	SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
16133 	SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
16134 	/*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
16135 	SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
16136 	SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
16137 	SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
16138 	SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
16139 	/*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
16140 	SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
16141 	SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
16142 	SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
16143 	SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
16144 	SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
16145 	SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
16146 	{}
16147 };
16148 
16149 static struct alc_config_preset alc861vd_presets[] = {
16150 	[ALC660VD_3ST] = {
16151 		.mixers = { alc861vd_3st_mixer },
16152 		.init_verbs = { alc861vd_volume_init_verbs,
16153 				 alc861vd_3stack_init_verbs },
16154 		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16155 		.dac_nids = alc660vd_dac_nids,
16156 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16157 		.channel_mode = alc861vd_3stack_2ch_modes,
16158 		.input_mux = &alc861vd_capture_source,
16159 	},
16160 	[ALC660VD_3ST_DIG] = {
16161 		.mixers = { alc861vd_3st_mixer },
16162 		.init_verbs = { alc861vd_volume_init_verbs,
16163 				 alc861vd_3stack_init_verbs },
16164 		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16165 		.dac_nids = alc660vd_dac_nids,
16166 		.dig_out_nid = ALC861VD_DIGOUT_NID,
16167 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16168 		.channel_mode = alc861vd_3stack_2ch_modes,
16169 		.input_mux = &alc861vd_capture_source,
16170 	},
16171 	[ALC861VD_3ST] = {
16172 		.mixers = { alc861vd_3st_mixer },
16173 		.init_verbs = { alc861vd_volume_init_verbs,
16174 				 alc861vd_3stack_init_verbs },
16175 		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16176 		.dac_nids = alc861vd_dac_nids,
16177 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16178 		.channel_mode = alc861vd_3stack_2ch_modes,
16179 		.input_mux = &alc861vd_capture_source,
16180 	},
16181 	[ALC861VD_3ST_DIG] = {
16182 		.mixers = { alc861vd_3st_mixer },
16183 		.init_verbs = { alc861vd_volume_init_verbs,
16184 		 		 alc861vd_3stack_init_verbs },
16185 		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16186 		.dac_nids = alc861vd_dac_nids,
16187 		.dig_out_nid = ALC861VD_DIGOUT_NID,
16188 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16189 		.channel_mode = alc861vd_3stack_2ch_modes,
16190 		.input_mux = &alc861vd_capture_source,
16191 	},
16192 	[ALC861VD_6ST_DIG] = {
16193 		.mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
16194 		.init_verbs = { alc861vd_volume_init_verbs,
16195 				alc861vd_6stack_init_verbs },
16196 		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16197 		.dac_nids = alc861vd_dac_nids,
16198 		.dig_out_nid = ALC861VD_DIGOUT_NID,
16199 		.num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
16200 		.channel_mode = alc861vd_6stack_modes,
16201 		.input_mux = &alc861vd_capture_source,
16202 	},
16203 	[ALC861VD_LENOVO] = {
16204 		.mixers = { alc861vd_lenovo_mixer },
16205 		.init_verbs = { alc861vd_volume_init_verbs,
16206 				alc861vd_3stack_init_verbs,
16207 				alc861vd_eapd_verbs,
16208 				alc861vd_lenovo_unsol_verbs },
16209 		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16210 		.dac_nids = alc660vd_dac_nids,
16211 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16212 		.channel_mode = alc861vd_3stack_2ch_modes,
16213 		.input_mux = &alc861vd_capture_source,
16214 		.unsol_event = alc861vd_lenovo_unsol_event,
16215 		.setup = alc861vd_lenovo_setup,
16216 		.init_hook = alc861vd_lenovo_init_hook,
16217 	},
16218 	[ALC861VD_DALLAS] = {
16219 		.mixers = { alc861vd_dallas_mixer },
16220 		.init_verbs = { alc861vd_dallas_verbs },
16221 		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16222 		.dac_nids = alc861vd_dac_nids,
16223 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16224 		.channel_mode = alc861vd_3stack_2ch_modes,
16225 		.input_mux = &alc861vd_dallas_capture_source,
16226 		.unsol_event = alc_automute_amp_unsol_event,
16227 		.setup = alc861vd_dallas_setup,
16228 		.init_hook = alc_automute_amp,
16229 	},
16230 	[ALC861VD_HP] = {
16231 		.mixers = { alc861vd_hp_mixer },
16232 		.init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
16233 		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16234 		.dac_nids = alc861vd_dac_nids,
16235 		.dig_out_nid = ALC861VD_DIGOUT_NID,
16236 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16237 		.channel_mode = alc861vd_3stack_2ch_modes,
16238 		.input_mux = &alc861vd_hp_capture_source,
16239 		.unsol_event = alc_automute_amp_unsol_event,
16240 		.setup = alc861vd_dallas_setup,
16241 		.init_hook = alc_automute_amp,
16242 	},
16243 	[ALC660VD_ASUS_V1S] = {
16244 		.mixers = { alc861vd_lenovo_mixer },
16245 		.init_verbs = { alc861vd_volume_init_verbs,
16246 				alc861vd_3stack_init_verbs,
16247 				alc861vd_eapd_verbs,
16248 				alc861vd_lenovo_unsol_verbs },
16249 		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16250 		.dac_nids = alc660vd_dac_nids,
16251 		.dig_out_nid = ALC861VD_DIGOUT_NID,
16252 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16253 		.channel_mode = alc861vd_3stack_2ch_modes,
16254 		.input_mux = &alc861vd_capture_source,
16255 		.unsol_event = alc861vd_lenovo_unsol_event,
16256 		.setup = alc861vd_lenovo_setup,
16257 		.init_hook = alc861vd_lenovo_init_hook,
16258 	},
16259 };
16260 
16261 /*
16262  * BIOS auto configuration
16263  */
16264 static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
16265 						const struct auto_pin_cfg *cfg)
16266 {
16267 	return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
16268 }
16269 
16270 
16271 static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
16272 				hda_nid_t nid, int pin_type, int dac_idx)
16273 {
16274 	alc_set_pin_output(codec, nid, pin_type);
16275 }
16276 
16277 static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
16278 {
16279 	struct alc_spec *spec = codec->spec;
16280 	int i;
16281 
16282 	for (i = 0; i <= HDA_SIDE; i++) {
16283 		hda_nid_t nid = spec->autocfg.line_out_pins[i];
16284 		int pin_type = get_pin_type(spec->autocfg.line_out_type);
16285 		if (nid)
16286 			alc861vd_auto_set_output_and_unmute(codec, nid,
16287 							    pin_type, i);
16288 	}
16289 }
16290 
16291 
16292 static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
16293 {
16294 	struct alc_spec *spec = codec->spec;
16295 	hda_nid_t pin;
16296 
16297 	pin = spec->autocfg.hp_pins[0];
16298 	if (pin) /* connect to front and use dac 0 */
16299 		alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
16300 	pin = spec->autocfg.speaker_pins[0];
16301 	if (pin)
16302 		alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
16303 }
16304 
16305 #define ALC861VD_PIN_CD_NID		ALC880_PIN_CD_NID
16306 
16307 static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
16308 {
16309 	struct alc_spec *spec = codec->spec;
16310 	int i;
16311 
16312 	for (i = 0; i < AUTO_PIN_LAST; i++) {
16313 		hda_nid_t nid = spec->autocfg.input_pins[i];
16314 		if (alc_is_input_pin(codec, nid)) {
16315 			alc_set_input_pin(codec, nid, i);
16316 			if (nid != ALC861VD_PIN_CD_NID &&
16317 			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
16318 				snd_hda_codec_write(codec, nid, 0,
16319 						AC_VERB_SET_AMP_GAIN_MUTE,
16320 						AMP_OUT_MUTE);
16321 		}
16322 	}
16323 }
16324 
16325 #define alc861vd_auto_init_input_src	alc882_auto_init_input_src
16326 
16327 #define alc861vd_idx_to_mixer_vol(nid)		((nid) + 0x02)
16328 #define alc861vd_idx_to_mixer_switch(nid)	((nid) + 0x0c)
16329 
16330 /* add playback controls from the parsed DAC table */
16331 /* Based on ALC880 version. But ALC861VD has separate,
16332  * different NIDs for mute/unmute switch and volume control */
16333 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
16334 					     const struct auto_pin_cfg *cfg)
16335 {
16336 	static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
16337 	hda_nid_t nid_v, nid_s;
16338 	int i, err;
16339 
16340 	for (i = 0; i < cfg->line_outs; i++) {
16341 		if (!spec->multiout.dac_nids[i])
16342 			continue;
16343 		nid_v = alc861vd_idx_to_mixer_vol(
16344 				alc880_dac_to_idx(
16345 					spec->multiout.dac_nids[i]));
16346 		nid_s = alc861vd_idx_to_mixer_switch(
16347 				alc880_dac_to_idx(
16348 					spec->multiout.dac_nids[i]));
16349 
16350 		if (i == 2) {
16351 			/* Center/LFE */
16352 			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16353 					      "Center",
16354 					  HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
16355 							      HDA_OUTPUT));
16356 			if (err < 0)
16357 				return err;
16358 			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16359 					      "LFE",
16360 					  HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
16361 							      HDA_OUTPUT));
16362 			if (err < 0)
16363 				return err;
16364 			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16365 					     "Center",
16366 					  HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
16367 							      HDA_INPUT));
16368 			if (err < 0)
16369 				return err;
16370 			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16371 					     "LFE",
16372 					  HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
16373 							      HDA_INPUT));
16374 			if (err < 0)
16375 				return err;
16376 		} else {
16377 			const char *pfx;
16378 			if (cfg->line_outs == 1 &&
16379 			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
16380 				if (!cfg->hp_pins)
16381 					pfx = "Speaker";
16382 				else
16383 					pfx = "PCM";
16384 			} else
16385 				pfx = chname[i];
16386 			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16387 					  HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
16388 							      HDA_OUTPUT));
16389 			if (err < 0)
16390 				return err;
16391 			if (cfg->line_outs == 1 &&
16392 			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
16393 				pfx = "Speaker";
16394 			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16395 					  HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
16396 							      HDA_INPUT));
16397 			if (err < 0)
16398 				return err;
16399 		}
16400 	}
16401 	return 0;
16402 }
16403 
16404 /* add playback controls for speaker and HP outputs */
16405 /* Based on ALC880 version. But ALC861VD has separate,
16406  * different NIDs for mute/unmute switch and volume control */
16407 static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
16408 					hda_nid_t pin, const char *pfx)
16409 {
16410 	hda_nid_t nid_v, nid_s;
16411 	int err;
16412 
16413 	if (!pin)
16414 		return 0;
16415 
16416 	if (alc880_is_fixed_pin(pin)) {
16417 		nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
16418 		/* specify the DAC as the extra output */
16419 		if (!spec->multiout.hp_nid)
16420 			spec->multiout.hp_nid = nid_v;
16421 		else
16422 			spec->multiout.extra_out_nid[0] = nid_v;
16423 		/* control HP volume/switch on the output mixer amp */
16424 		nid_v = alc861vd_idx_to_mixer_vol(
16425 				alc880_fixed_pin_idx(pin));
16426 		nid_s = alc861vd_idx_to_mixer_switch(
16427 				alc880_fixed_pin_idx(pin));
16428 
16429 		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16430 				  HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
16431 		if (err < 0)
16432 			return err;
16433 		err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16434 				  HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
16435 		if (err < 0)
16436 			return err;
16437 	} else if (alc880_is_multi_pin(pin)) {
16438 		/* set manual connection */
16439 		/* we have only a switch on HP-out PIN */
16440 		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
16441 				  HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
16442 		if (err < 0)
16443 			return err;
16444 	}
16445 	return 0;
16446 }
16447 
16448 /* parse the BIOS configuration and set up the alc_spec
16449  * return 1 if successful, 0 if the proper config is not found,
16450  * or a negative error code
16451  * Based on ALC880 version - had to change it to override
16452  * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
16453 static int alc861vd_parse_auto_config(struct hda_codec *codec)
16454 {
16455 	struct alc_spec *spec = codec->spec;
16456 	int err;
16457 	static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
16458 
16459 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
16460 					   alc861vd_ignore);
16461 	if (err < 0)
16462 		return err;
16463 	if (!spec->autocfg.line_outs)
16464 		return 0; /* can't find valid BIOS pin config */
16465 
16466 	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
16467 	if (err < 0)
16468 		return err;
16469 	err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
16470 	if (err < 0)
16471 		return err;
16472 	err = alc861vd_auto_create_extra_out(spec,
16473 					     spec->autocfg.speaker_pins[0],
16474 					     "Speaker");
16475 	if (err < 0)
16476 		return err;
16477 	err = alc861vd_auto_create_extra_out(spec,
16478 					     spec->autocfg.hp_pins[0],
16479 					     "Headphone");
16480 	if (err < 0)
16481 		return err;
16482 	err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
16483 	if (err < 0)
16484 		return err;
16485 
16486 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
16487 
16488 	if (spec->autocfg.dig_outs)
16489 		spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID;
16490 
16491 	if (spec->kctls.list)
16492 		add_mixer(spec, spec->kctls.list);
16493 
16494 	add_verb(spec, alc861vd_volume_init_verbs);
16495 
16496 	spec->num_mux_defs = 1;
16497 	spec->input_mux = &spec->private_imux[0];
16498 
16499 	err = alc_auto_add_mic_boost(codec);
16500 	if (err < 0)
16501 		return err;
16502 
16503 	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
16504 
16505 	return 1;
16506 }
16507 
16508 /* additional initialization for auto-configuration model */
16509 static void alc861vd_auto_init(struct hda_codec *codec)
16510 {
16511 	struct alc_spec *spec = codec->spec;
16512 	alc861vd_auto_init_multi_out(codec);
16513 	alc861vd_auto_init_hp_out(codec);
16514 	alc861vd_auto_init_analog_input(codec);
16515 	alc861vd_auto_init_input_src(codec);
16516 	if (spec->unsol_event)
16517 		alc_inithook(codec);
16518 }
16519 
16520 enum {
16521 	ALC660VD_FIX_ASUS_GPIO1
16522 };
16523 
16524 /* reset GPIO1 */
16525 static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
16526 	{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
16527 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
16528 	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
16529 	{ }
16530 };
16531 
16532 static const struct alc_fixup alc861vd_fixups[] = {
16533 	[ALC660VD_FIX_ASUS_GPIO1] = {
16534 		.verbs = alc660vd_fix_asus_gpio1_verbs,
16535 	},
16536 };
16537 
16538 static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
16539 	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
16540 	{}
16541 };
16542 
16543 static int patch_alc861vd(struct hda_codec *codec)
16544 {
16545 	struct alc_spec *spec;
16546 	int err, board_config;
16547 
16548 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
16549 	if (spec == NULL)
16550 		return -ENOMEM;
16551 
16552 	codec->spec = spec;
16553 
16554 	board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
16555 						  alc861vd_models,
16556 						  alc861vd_cfg_tbl);
16557 
16558 	if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
16559 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
16560 		       codec->chip_name);
16561 		board_config = ALC861VD_AUTO;
16562 	}
16563 
16564 	if (board_config == ALC861VD_AUTO)
16565 		alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 1);
16566 
16567 	if (board_config == ALC861VD_AUTO) {
16568 		/* automatic parse from the BIOS config */
16569 		err = alc861vd_parse_auto_config(codec);
16570 		if (err < 0) {
16571 			alc_free(codec);
16572 			return err;
16573 		} else if (!err) {
16574 			printk(KERN_INFO
16575 			       "hda_codec: Cannot set up configuration "
16576 			       "from BIOS.  Using base mode...\n");
16577 			board_config = ALC861VD_3ST;
16578 		}
16579 	}
16580 
16581 	err = snd_hda_attach_beep_device(codec, 0x23);
16582 	if (err < 0) {
16583 		alc_free(codec);
16584 		return err;
16585 	}
16586 
16587 	if (board_config != ALC861VD_AUTO)
16588 		setup_preset(codec, &alc861vd_presets[board_config]);
16589 
16590 	if (codec->vendor_id == 0x10ec0660) {
16591 		/* always turn on EAPD */
16592 		add_verb(spec, alc660vd_eapd_verbs);
16593 	}
16594 
16595 	spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
16596 	spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
16597 
16598 	spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
16599 	spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
16600 
16601 	if (!spec->adc_nids) {
16602 		spec->adc_nids = alc861vd_adc_nids;
16603 		spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
16604 	}
16605 	if (!spec->capsrc_nids)
16606 		spec->capsrc_nids = alc861vd_capsrc_nids;
16607 
16608 	set_capture_mixer(codec);
16609 	set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
16610 
16611 	spec->vmaster_nid = 0x02;
16612 
16613 	if (board_config == ALC861VD_AUTO)
16614 		alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 0);
16615 
16616 	codec->patch_ops = alc_patch_ops;
16617 
16618 	if (board_config == ALC861VD_AUTO)
16619 		spec->init_hook = alc861vd_auto_init;
16620 #ifdef CONFIG_SND_HDA_POWER_SAVE
16621 	if (!spec->loopback.amplist)
16622 		spec->loopback.amplist = alc861vd_loopbacks;
16623 #endif
16624 
16625 	return 0;
16626 }
16627 
16628 /*
16629  * ALC662 support
16630  *
16631  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
16632  * configuration.  Each pin widget can choose any input DACs and a mixer.
16633  * Each ADC is connected from a mixer of all inputs.  This makes possible
16634  * 6-channel independent captures.
16635  *
16636  * In addition, an independent DAC for the multi-playback (not used in this
16637  * driver yet).
16638  */
16639 #define ALC662_DIGOUT_NID	0x06
16640 #define ALC662_DIGIN_NID	0x0a
16641 
16642 static hda_nid_t alc662_dac_nids[4] = {
16643 	/* front, rear, clfe, rear_surr */
16644 	0x02, 0x03, 0x04
16645 };
16646 
16647 static hda_nid_t alc272_dac_nids[2] = {
16648 	0x02, 0x03
16649 };
16650 
16651 static hda_nid_t alc662_adc_nids[2] = {
16652 	/* ADC1-2 */
16653 	0x09, 0x08
16654 };
16655 
16656 static hda_nid_t alc272_adc_nids[1] = {
16657 	/* ADC1-2 */
16658 	0x08,
16659 };
16660 
16661 static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
16662 static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
16663 
16664 
16665 /* input MUX */
16666 /* FIXME: should be a matrix-type input source selection */
16667 static struct hda_input_mux alc662_capture_source = {
16668 	.num_items = 4,
16669 	.items = {
16670 		{ "Mic", 0x0 },
16671 		{ "Front Mic", 0x1 },
16672 		{ "Line", 0x2 },
16673 		{ "CD", 0x4 },
16674 	},
16675 };
16676 
16677 static struct hda_input_mux alc662_lenovo_101e_capture_source = {
16678 	.num_items = 2,
16679 	.items = {
16680 		{ "Mic", 0x1 },
16681 		{ "Line", 0x2 },
16682 	},
16683 };
16684 
16685 static struct hda_input_mux alc663_capture_source = {
16686 	.num_items = 3,
16687 	.items = {
16688 		{ "Mic", 0x0 },
16689 		{ "Front Mic", 0x1 },
16690 		{ "Line", 0x2 },
16691 	},
16692 };
16693 
16694 #if 0 /* set to 1 for testing other input sources below */
16695 static struct hda_input_mux alc272_nc10_capture_source = {
16696 	.num_items = 16,
16697 	.items = {
16698 		{ "Autoselect Mic", 0x0 },
16699 		{ "Internal Mic", 0x1 },
16700 		{ "In-0x02", 0x2 },
16701 		{ "In-0x03", 0x3 },
16702 		{ "In-0x04", 0x4 },
16703 		{ "In-0x05", 0x5 },
16704 		{ "In-0x06", 0x6 },
16705 		{ "In-0x07", 0x7 },
16706 		{ "In-0x08", 0x8 },
16707 		{ "In-0x09", 0x9 },
16708 		{ "In-0x0a", 0x0a },
16709 		{ "In-0x0b", 0x0b },
16710 		{ "In-0x0c", 0x0c },
16711 		{ "In-0x0d", 0x0d },
16712 		{ "In-0x0e", 0x0e },
16713 		{ "In-0x0f", 0x0f },
16714 	},
16715 };
16716 #endif
16717 
16718 /*
16719  * 2ch mode
16720  */
16721 static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
16722 	{ 2, NULL }
16723 };
16724 
16725 /*
16726  * 2ch mode
16727  */
16728 static struct hda_verb alc662_3ST_ch2_init[] = {
16729 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
16730 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16731 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
16732 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16733 	{ } /* end */
16734 };
16735 
16736 /*
16737  * 6ch mode
16738  */
16739 static struct hda_verb alc662_3ST_ch6_init[] = {
16740 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16741 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16742 	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
16743 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16744 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16745 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
16746 	{ } /* end */
16747 };
16748 
16749 static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
16750 	{ 2, alc662_3ST_ch2_init },
16751 	{ 6, alc662_3ST_ch6_init },
16752 };
16753 
16754 /*
16755  * 2ch mode
16756  */
16757 static struct hda_verb alc662_sixstack_ch6_init[] = {
16758 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16759 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16760 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16761 	{ } /* end */
16762 };
16763 
16764 /*
16765  * 6ch mode
16766  */
16767 static struct hda_verb alc662_sixstack_ch8_init[] = {
16768 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16769 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16770 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16771 	{ } /* end */
16772 };
16773 
16774 static struct hda_channel_mode alc662_5stack_modes[2] = {
16775 	{ 2, alc662_sixstack_ch6_init },
16776 	{ 6, alc662_sixstack_ch8_init },
16777 };
16778 
16779 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
16780  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
16781  */
16782 
16783 static struct snd_kcontrol_new alc662_base_mixer[] = {
16784 	/* output mixer control */
16785 	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
16786 	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16787 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
16788 	HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16789 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16790 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16791 	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16792 	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16793 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16794 
16795 	/*Input mixer control */
16796 	HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
16797 	HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
16798 	HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
16799 	HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
16800 	HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
16801 	HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
16802 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
16803 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
16804 	{ } /* end */
16805 };
16806 
16807 static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
16808 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16809 	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16810 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16811 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16812 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16813 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16814 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16815 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16816 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16817 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16818 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16819 	{ } /* end */
16820 };
16821 
16822 static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
16823 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16824 	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16825 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16826 	HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16827 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16828 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16829 	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16830 	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16831 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16832 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16833 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16834 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16835 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16836 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16837 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16838 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16839 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16840 	{ } /* end */
16841 };
16842 
16843 static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
16844 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16845 	HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
16846 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16847 	HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
16848 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16849 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16850 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16851 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16852 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16853 	{ } /* end */
16854 };
16855 
16856 static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
16857 	HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16858 	ALC262_HIPPO_MASTER_SWITCH,
16859 
16860 	HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
16861 	HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16862 	HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16863 
16864 	HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
16865 	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16866 	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16867 	{ } /* end */
16868 };
16869 
16870 static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
16871 	ALC262_HIPPO_MASTER_SWITCH,
16872 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16873 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16874 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16875 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16876 	HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
16877 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16878 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16879 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16880 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16881 	{ } /* end */
16882 };
16883 
16884 static struct hda_bind_ctls alc663_asus_bind_master_vol = {
16885 	.ops = &snd_hda_bind_vol,
16886 	.values = {
16887 		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16888 		HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
16889 		0
16890 	},
16891 };
16892 
16893 static struct hda_bind_ctls alc663_asus_one_bind_switch = {
16894 	.ops = &snd_hda_bind_sw,
16895 	.values = {
16896 		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16897 		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16898 		0
16899 	},
16900 };
16901 
16902 static struct snd_kcontrol_new alc663_m51va_mixer[] = {
16903 	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16904 	HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
16905 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16906 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16907 	{ } /* end */
16908 };
16909 
16910 static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
16911 	.ops = &snd_hda_bind_sw,
16912 	.values = {
16913 		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16914 		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16915 		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16916 		0
16917 	},
16918 };
16919 
16920 static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
16921 	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16922 	HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
16923 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16924 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16925 	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16926 	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16927 
16928 	{ } /* end */
16929 };
16930 
16931 static struct hda_bind_ctls alc663_asus_four_bind_switch = {
16932 	.ops = &snd_hda_bind_sw,
16933 	.values = {
16934 		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16935 		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16936 		HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16937 		0
16938 	},
16939 };
16940 
16941 static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
16942 	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16943 	HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
16944 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16945 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16946 	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16947 	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16948 	{ } /* end */
16949 };
16950 
16951 static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
16952 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16953 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16954 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16955 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16956 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16957 	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16958 	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16959 	{ } /* end */
16960 };
16961 
16962 static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
16963 	.ops = &snd_hda_bind_vol,
16964 	.values = {
16965 		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16966 		HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
16967 		0
16968 	},
16969 };
16970 
16971 static struct hda_bind_ctls alc663_asus_two_bind_switch = {
16972 	.ops = &snd_hda_bind_sw,
16973 	.values = {
16974 		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16975 		HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
16976 		0
16977 	},
16978 };
16979 
16980 static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
16981 	HDA_BIND_VOL("Master Playback Volume",
16982 				&alc663_asus_two_bind_master_vol),
16983 	HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16984 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16985 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16986 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16987 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16988 	{ } /* end */
16989 };
16990 
16991 static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
16992 	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16993 	HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16994 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16995 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16996 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16997 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16998 	{ } /* end */
16999 };
17000 
17001 static struct snd_kcontrol_new alc663_g71v_mixer[] = {
17002 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17003 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17004 	HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17005 	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17006 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17007 
17008 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17009 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17010 	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17011 	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17012 	{ } /* end */
17013 };
17014 
17015 static struct snd_kcontrol_new alc663_g50v_mixer[] = {
17016 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17017 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17018 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17019 
17020 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17021 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17022 	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17023 	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17024 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17025 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17026 	{ } /* end */
17027 };
17028 
17029 static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
17030 	.ops = &snd_hda_bind_sw,
17031 	.values = {
17032 		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17033 		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
17034 		HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17035 		HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
17036 		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
17037 		0
17038 	},
17039 };
17040 
17041 static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
17042 	.ops = &snd_hda_bind_sw,
17043 	.values = {
17044 		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17045 		HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17046 		0
17047 	},
17048 };
17049 
17050 static struct snd_kcontrol_new alc663_mode7_mixer[] = {
17051 	HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17052 	HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17053 	HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17054 	HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17055 	HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17056 	HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17057 	HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17058 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17059 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17060 	{ } /* end */
17061 };
17062 
17063 static struct snd_kcontrol_new alc663_mode8_mixer[] = {
17064 	HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17065 	HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17066 	HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17067 	HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17068 	HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17069 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17070 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17071 	{ } /* end */
17072 };
17073 
17074 
17075 static struct snd_kcontrol_new alc662_chmode_mixer[] = {
17076 	{
17077 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
17078 		.name = "Channel Mode",
17079 		.info = alc_ch_mode_info,
17080 		.get = alc_ch_mode_get,
17081 		.put = alc_ch_mode_put,
17082 	},
17083 	{ } /* end */
17084 };
17085 
17086 static struct hda_verb alc662_init_verbs[] = {
17087 	/* ADC: mute amp left and right */
17088 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17089 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
17090 
17091 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17092 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17093 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17094 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17095 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17096 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17097 
17098 	/* Front Pin: output 0 (0x0c) */
17099 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17100 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17101 
17102 	/* Rear Pin: output 1 (0x0d) */
17103 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17104 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17105 
17106 	/* CLFE Pin: output 2 (0x0e) */
17107 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17108 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17109 
17110 	/* Mic (rear) pin: input vref at 80% */
17111 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17112 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17113 	/* Front Mic pin: input vref at 80% */
17114 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17115 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17116 	/* Line In pin: input */
17117 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17118 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17119 	/* Line-2 In: Headphone output (output 0 - 0x0c) */
17120 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17121 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17122 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
17123 	/* CD pin widget for input */
17124 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17125 
17126 	/* FIXME: use matrix-type input source selection */
17127 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
17128 	/* Input mixer */
17129 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17130 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17131 
17132 	/* always trun on EAPD */
17133 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
17134 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
17135 
17136 	{ }
17137 };
17138 
17139 static struct hda_verb alc663_init_verbs[] = {
17140 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17141 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17142 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17143 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17144 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17145 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17146 	{ }
17147 };
17148 
17149 static struct hda_verb alc272_init_verbs[] = {
17150 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17151 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17152 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17153 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17154 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17155 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17156 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17157 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17158 	{ }
17159 };
17160 
17161 static struct hda_verb alc662_sue_init_verbs[] = {
17162 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17163 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17164 	{}
17165 };
17166 
17167 static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
17168 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17169 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17170 	{}
17171 };
17172 
17173 /* Set Unsolicited Event*/
17174 static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
17175 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17176 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17177 	{}
17178 };
17179 
17180 static struct hda_verb alc663_m51va_init_verbs[] = {
17181 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17182 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17183 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17184 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17185 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17186 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17187 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17188 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17189 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17190 	{}
17191 };
17192 
17193 static struct hda_verb alc663_21jd_amic_init_verbs[] = {
17194 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17195 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17196 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17197 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17198 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17199 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17200 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17201 	{}
17202 };
17203 
17204 static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
17205 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17206 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17207 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17208 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
17209 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17210 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17211 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17212 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17213 	{}
17214 };
17215 
17216 static struct hda_verb alc663_15jd_amic_init_verbs[] = {
17217 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17218 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17219 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17220 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17221 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17222 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17223 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17224 	{}
17225 };
17226 
17227 static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
17228 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17229 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17230 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17231 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Headphone */
17232 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17233 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17234 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Headphone */
17235 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17236 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17237 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17238 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17239 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17240 	{}
17241 };
17242 
17243 static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
17244 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17245 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17246 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17247 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17248 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17249 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17250 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17251 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17252 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17253 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17254 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17255 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17256 	{}
17257 };
17258 
17259 static struct hda_verb alc663_g71v_init_verbs[] = {
17260 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17261 	/* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
17262 	/* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
17263 
17264 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17265 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17266 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
17267 
17268 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17269 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
17270 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17271 	{}
17272 };
17273 
17274 static struct hda_verb alc663_g50v_init_verbs[] = {
17275 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17276 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17277 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
17278 
17279 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17280 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17281 	{}
17282 };
17283 
17284 static struct hda_verb alc662_ecs_init_verbs[] = {
17285 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
17286 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17287 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17288 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17289 	{}
17290 };
17291 
17292 static struct hda_verb alc272_dell_zm1_init_verbs[] = {
17293 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17294 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17295 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17296 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17297 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17298 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17299 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17300 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17301 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17302 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17303 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17304 	{}
17305 };
17306 
17307 static struct hda_verb alc272_dell_init_verbs[] = {
17308 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17309 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17310 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17311 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17312 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17313 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17314 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17315 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17316 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17317 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17318 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17319 	{}
17320 };
17321 
17322 static struct hda_verb alc663_mode7_init_verbs[] = {
17323 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17324 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17325 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17326 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17327 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17328 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17329 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
17330 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17331 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17332 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17333 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17334 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17335 	{0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17336 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17337 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17338 	{}
17339 };
17340 
17341 static struct hda_verb alc663_mode8_init_verbs[] = {
17342 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17343 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17344 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17345 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
17346 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17347 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17348 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17349 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17350 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17351 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17352 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17353 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17354 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17355 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17356 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17357 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17358 	{}
17359 };
17360 
17361 static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
17362 	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
17363 	HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
17364 	{ } /* end */
17365 };
17366 
17367 static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
17368 	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
17369 	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
17370 	{ } /* end */
17371 };
17372 
17373 static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
17374 {
17375 	unsigned int present;
17376 	unsigned char bits;
17377 
17378 	present = snd_hda_jack_detect(codec, 0x14);
17379 	bits = present ? HDA_AMP_MUTE : 0;
17380 
17381 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17382 				 HDA_AMP_MUTE, bits);
17383 }
17384 
17385 static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
17386 {
17387 	unsigned int present;
17388 	unsigned char bits;
17389 
17390  	present = snd_hda_jack_detect(codec, 0x1b);
17391 	bits = present ? HDA_AMP_MUTE : 0;
17392 
17393 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17394 				 HDA_AMP_MUTE, bits);
17395 	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17396 				 HDA_AMP_MUTE, bits);
17397 }
17398 
17399 static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
17400 					   unsigned int res)
17401 {
17402 	if ((res >> 26) == ALC880_HP_EVENT)
17403 		alc662_lenovo_101e_all_automute(codec);
17404 	if ((res >> 26) == ALC880_FRONT_EVENT)
17405 		alc662_lenovo_101e_ispeaker_automute(codec);
17406 }
17407 
17408 /* unsolicited event for HP jack sensing */
17409 static void alc662_eeepc_unsol_event(struct hda_codec *codec,
17410 				     unsigned int res)
17411 {
17412 	if ((res >> 26) == ALC880_MIC_EVENT)
17413 		alc_mic_automute(codec);
17414 	else
17415 		alc262_hippo_unsol_event(codec, res);
17416 }
17417 
17418 static void alc662_eeepc_setup(struct hda_codec *codec)
17419 {
17420 	struct alc_spec *spec = codec->spec;
17421 
17422 	alc262_hippo1_setup(codec);
17423 	spec->ext_mic.pin = 0x18;
17424 	spec->ext_mic.mux_idx = 0;
17425 	spec->int_mic.pin = 0x19;
17426 	spec->int_mic.mux_idx = 1;
17427 	spec->auto_mic = 1;
17428 }
17429 
17430 static void alc662_eeepc_inithook(struct hda_codec *codec)
17431 {
17432 	alc262_hippo_automute(codec);
17433 	alc_mic_automute(codec);
17434 }
17435 
17436 static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
17437 {
17438 	struct alc_spec *spec = codec->spec;
17439 
17440 	spec->autocfg.hp_pins[0] = 0x14;
17441 	spec->autocfg.speaker_pins[0] = 0x1b;
17442 }
17443 
17444 #define alc662_eeepc_ep20_inithook	alc262_hippo_master_update
17445 
17446 static void alc663_m51va_speaker_automute(struct hda_codec *codec)
17447 {
17448 	unsigned int present;
17449 	unsigned char bits;
17450 
17451 	present = snd_hda_jack_detect(codec, 0x21);
17452 	bits = present ? HDA_AMP_MUTE : 0;
17453 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17454 				 HDA_AMP_MUTE, bits);
17455 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17456 				 HDA_AMP_MUTE, bits);
17457 }
17458 
17459 static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
17460 {
17461 	unsigned int present;
17462 	unsigned char bits;
17463 
17464 	present = snd_hda_jack_detect(codec, 0x21);
17465 	bits = present ? HDA_AMP_MUTE : 0;
17466 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17467 				 HDA_AMP_MUTE, bits);
17468 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17469 				 HDA_AMP_MUTE, bits);
17470 	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
17471 				 HDA_AMP_MUTE, bits);
17472 	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17473 				 HDA_AMP_MUTE, bits);
17474 }
17475 
17476 static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
17477 {
17478 	unsigned int present;
17479 	unsigned char bits;
17480 
17481 	present = snd_hda_jack_detect(codec, 0x15);
17482 	bits = present ? HDA_AMP_MUTE : 0;
17483 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17484 				 HDA_AMP_MUTE, bits);
17485 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17486 				 HDA_AMP_MUTE, bits);
17487 	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
17488 				 HDA_AMP_MUTE, bits);
17489 	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17490 				 HDA_AMP_MUTE, bits);
17491 }
17492 
17493 static void alc662_f5z_speaker_automute(struct hda_codec *codec)
17494 {
17495 	unsigned int present;
17496 	unsigned char bits;
17497 
17498 	present = snd_hda_jack_detect(codec, 0x1b);
17499 	bits = present ? 0 : PIN_OUT;
17500 	snd_hda_codec_write(codec, 0x14, 0,
17501 			 AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
17502 }
17503 
17504 static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
17505 {
17506 	unsigned int present1, present2;
17507 
17508 	present1 = snd_hda_jack_detect(codec, 0x21);
17509 	present2 = snd_hda_jack_detect(codec, 0x15);
17510 
17511 	if (present1 || present2) {
17512 		snd_hda_codec_write_cache(codec, 0x14, 0,
17513 			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17514 	} else {
17515 		snd_hda_codec_write_cache(codec, 0x14, 0,
17516 			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17517 	}
17518 }
17519 
17520 static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
17521 {
17522 	unsigned int present1, present2;
17523 
17524 	present1 = snd_hda_jack_detect(codec, 0x1b);
17525 	present2 = snd_hda_jack_detect(codec, 0x15);
17526 
17527 	if (present1 || present2) {
17528 		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17529 					 HDA_AMP_MUTE, HDA_AMP_MUTE);
17530 		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17531 					 HDA_AMP_MUTE, HDA_AMP_MUTE);
17532 	} else {
17533 		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17534 					 HDA_AMP_MUTE, 0);
17535 		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17536 					 HDA_AMP_MUTE, 0);
17537 	}
17538 }
17539 
17540 static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
17541 {
17542 	unsigned int present1, present2;
17543 
17544 	present1 = snd_hda_codec_read(codec, 0x1b, 0,
17545 			AC_VERB_GET_PIN_SENSE, 0)
17546 			& AC_PINSENSE_PRESENCE;
17547 	present2 = snd_hda_codec_read(codec, 0x21, 0,
17548 			AC_VERB_GET_PIN_SENSE, 0)
17549 			& AC_PINSENSE_PRESENCE;
17550 
17551 	if (present1 || present2) {
17552 		snd_hda_codec_write_cache(codec, 0x14, 0,
17553 			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17554 		snd_hda_codec_write_cache(codec, 0x17, 0,
17555 			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17556 	} else {
17557 		snd_hda_codec_write_cache(codec, 0x14, 0,
17558 			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17559 		snd_hda_codec_write_cache(codec, 0x17, 0,
17560 			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17561 	}
17562 }
17563 
17564 static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
17565 {
17566 	unsigned int present1, present2;
17567 
17568 	present1 = snd_hda_codec_read(codec, 0x21, 0,
17569 			AC_VERB_GET_PIN_SENSE, 0)
17570 			& AC_PINSENSE_PRESENCE;
17571 	present2 = snd_hda_codec_read(codec, 0x15, 0,
17572 			AC_VERB_GET_PIN_SENSE, 0)
17573 			& AC_PINSENSE_PRESENCE;
17574 
17575 	if (present1 || present2) {
17576 		snd_hda_codec_write_cache(codec, 0x14, 0,
17577 			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17578 		snd_hda_codec_write_cache(codec, 0x17, 0,
17579 			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17580 	} else {
17581 		snd_hda_codec_write_cache(codec, 0x14, 0,
17582 			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17583 		snd_hda_codec_write_cache(codec, 0x17, 0,
17584 			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17585 	}
17586 }
17587 
17588 static void alc663_m51va_unsol_event(struct hda_codec *codec,
17589 					   unsigned int res)
17590 {
17591 	switch (res >> 26) {
17592 	case ALC880_HP_EVENT:
17593 		alc663_m51va_speaker_automute(codec);
17594 		break;
17595 	case ALC880_MIC_EVENT:
17596 		alc_mic_automute(codec);
17597 		break;
17598 	}
17599 }
17600 
17601 static void alc663_m51va_setup(struct hda_codec *codec)
17602 {
17603 	struct alc_spec *spec = codec->spec;
17604 	spec->ext_mic.pin = 0x18;
17605 	spec->ext_mic.mux_idx = 0;
17606 	spec->int_mic.pin = 0x12;
17607 	spec->int_mic.mux_idx = 9;
17608 	spec->auto_mic = 1;
17609 }
17610 
17611 static void alc663_m51va_inithook(struct hda_codec *codec)
17612 {
17613 	alc663_m51va_speaker_automute(codec);
17614 	alc_mic_automute(codec);
17615 }
17616 
17617 /* ***************** Mode1 ******************************/
17618 #define alc663_mode1_unsol_event	alc663_m51va_unsol_event
17619 
17620 static void alc663_mode1_setup(struct hda_codec *codec)
17621 {
17622 	struct alc_spec *spec = codec->spec;
17623 	spec->ext_mic.pin = 0x18;
17624 	spec->ext_mic.mux_idx = 0;
17625 	spec->int_mic.pin = 0x19;
17626 	spec->int_mic.mux_idx = 1;
17627 	spec->auto_mic = 1;
17628 }
17629 
17630 #define alc663_mode1_inithook		alc663_m51va_inithook
17631 
17632 /* ***************** Mode2 ******************************/
17633 static void alc662_mode2_unsol_event(struct hda_codec *codec,
17634 					   unsigned int res)
17635 {
17636 	switch (res >> 26) {
17637 	case ALC880_HP_EVENT:
17638 		alc662_f5z_speaker_automute(codec);
17639 		break;
17640 	case ALC880_MIC_EVENT:
17641 		alc_mic_automute(codec);
17642 		break;
17643 	}
17644 }
17645 
17646 #define alc662_mode2_setup	alc663_mode1_setup
17647 
17648 static void alc662_mode2_inithook(struct hda_codec *codec)
17649 {
17650 	alc662_f5z_speaker_automute(codec);
17651 	alc_mic_automute(codec);
17652 }
17653 /* ***************** Mode3 ******************************/
17654 static void alc663_mode3_unsol_event(struct hda_codec *codec,
17655 					   unsigned int res)
17656 {
17657 	switch (res >> 26) {
17658 	case ALC880_HP_EVENT:
17659 		alc663_two_hp_m1_speaker_automute(codec);
17660 		break;
17661 	case ALC880_MIC_EVENT:
17662 		alc_mic_automute(codec);
17663 		break;
17664 	}
17665 }
17666 
17667 #define alc663_mode3_setup	alc663_mode1_setup
17668 
17669 static void alc663_mode3_inithook(struct hda_codec *codec)
17670 {
17671 	alc663_two_hp_m1_speaker_automute(codec);
17672 	alc_mic_automute(codec);
17673 }
17674 /* ***************** Mode4 ******************************/
17675 static void alc663_mode4_unsol_event(struct hda_codec *codec,
17676 					   unsigned int res)
17677 {
17678 	switch (res >> 26) {
17679 	case ALC880_HP_EVENT:
17680 		alc663_21jd_two_speaker_automute(codec);
17681 		break;
17682 	case ALC880_MIC_EVENT:
17683 		alc_mic_automute(codec);
17684 		break;
17685 	}
17686 }
17687 
17688 #define alc663_mode4_setup	alc663_mode1_setup
17689 
17690 static void alc663_mode4_inithook(struct hda_codec *codec)
17691 {
17692 	alc663_21jd_two_speaker_automute(codec);
17693 	alc_mic_automute(codec);
17694 }
17695 /* ***************** Mode5 ******************************/
17696 static void alc663_mode5_unsol_event(struct hda_codec *codec,
17697 					   unsigned int res)
17698 {
17699 	switch (res >> 26) {
17700 	case ALC880_HP_EVENT:
17701 		alc663_15jd_two_speaker_automute(codec);
17702 		break;
17703 	case ALC880_MIC_EVENT:
17704 		alc_mic_automute(codec);
17705 		break;
17706 	}
17707 }
17708 
17709 #define alc663_mode5_setup	alc663_mode1_setup
17710 
17711 static void alc663_mode5_inithook(struct hda_codec *codec)
17712 {
17713 	alc663_15jd_two_speaker_automute(codec);
17714 	alc_mic_automute(codec);
17715 }
17716 /* ***************** Mode6 ******************************/
17717 static void alc663_mode6_unsol_event(struct hda_codec *codec,
17718 					   unsigned int res)
17719 {
17720 	switch (res >> 26) {
17721 	case ALC880_HP_EVENT:
17722 		alc663_two_hp_m2_speaker_automute(codec);
17723 		break;
17724 	case ALC880_MIC_EVENT:
17725 		alc_mic_automute(codec);
17726 		break;
17727 	}
17728 }
17729 
17730 #define alc663_mode6_setup	alc663_mode1_setup
17731 
17732 static void alc663_mode6_inithook(struct hda_codec *codec)
17733 {
17734 	alc663_two_hp_m2_speaker_automute(codec);
17735 	alc_mic_automute(codec);
17736 }
17737 
17738 /* ***************** Mode7 ******************************/
17739 static void alc663_mode7_unsol_event(struct hda_codec *codec,
17740 					   unsigned int res)
17741 {
17742 	switch (res >> 26) {
17743 	case ALC880_HP_EVENT:
17744 		alc663_two_hp_m7_speaker_automute(codec);
17745 		break;
17746 	case ALC880_MIC_EVENT:
17747 		alc_mic_automute(codec);
17748 		break;
17749 	}
17750 }
17751 
17752 #define alc663_mode7_setup	alc663_mode1_setup
17753 
17754 static void alc663_mode7_inithook(struct hda_codec *codec)
17755 {
17756 	alc663_two_hp_m7_speaker_automute(codec);
17757 	alc_mic_automute(codec);
17758 }
17759 
17760 /* ***************** Mode8 ******************************/
17761 static void alc663_mode8_unsol_event(struct hda_codec *codec,
17762 					   unsigned int res)
17763 {
17764 	switch (res >> 26) {
17765 	case ALC880_HP_EVENT:
17766 		alc663_two_hp_m8_speaker_automute(codec);
17767 		break;
17768 	case ALC880_MIC_EVENT:
17769 		alc_mic_automute(codec);
17770 		break;
17771 	}
17772 }
17773 
17774 #define alc663_mode8_setup	alc663_m51va_setup
17775 
17776 static void alc663_mode8_inithook(struct hda_codec *codec)
17777 {
17778 	alc663_two_hp_m8_speaker_automute(codec);
17779 	alc_mic_automute(codec);
17780 }
17781 
17782 static void alc663_g71v_hp_automute(struct hda_codec *codec)
17783 {
17784 	unsigned int present;
17785 	unsigned char bits;
17786 
17787 	present = snd_hda_jack_detect(codec, 0x21);
17788 	bits = present ? HDA_AMP_MUTE : 0;
17789 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17790 				 HDA_AMP_MUTE, bits);
17791 	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17792 				 HDA_AMP_MUTE, bits);
17793 }
17794 
17795 static void alc663_g71v_front_automute(struct hda_codec *codec)
17796 {
17797 	unsigned int present;
17798 	unsigned char bits;
17799 
17800 	present = snd_hda_jack_detect(codec, 0x15);
17801 	bits = present ? HDA_AMP_MUTE : 0;
17802 	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17803 				 HDA_AMP_MUTE, bits);
17804 }
17805 
17806 static void alc663_g71v_unsol_event(struct hda_codec *codec,
17807 					   unsigned int res)
17808 {
17809 	switch (res >> 26) {
17810 	case ALC880_HP_EVENT:
17811 		alc663_g71v_hp_automute(codec);
17812 		break;
17813 	case ALC880_FRONT_EVENT:
17814 		alc663_g71v_front_automute(codec);
17815 		break;
17816 	case ALC880_MIC_EVENT:
17817 		alc_mic_automute(codec);
17818 		break;
17819 	}
17820 }
17821 
17822 #define alc663_g71v_setup	alc663_m51va_setup
17823 
17824 static void alc663_g71v_inithook(struct hda_codec *codec)
17825 {
17826 	alc663_g71v_front_automute(codec);
17827 	alc663_g71v_hp_automute(codec);
17828 	alc_mic_automute(codec);
17829 }
17830 
17831 static void alc663_g50v_unsol_event(struct hda_codec *codec,
17832 					   unsigned int res)
17833 {
17834 	switch (res >> 26) {
17835 	case ALC880_HP_EVENT:
17836 		alc663_m51va_speaker_automute(codec);
17837 		break;
17838 	case ALC880_MIC_EVENT:
17839 		alc_mic_automute(codec);
17840 		break;
17841 	}
17842 }
17843 
17844 #define alc663_g50v_setup	alc663_m51va_setup
17845 
17846 static void alc663_g50v_inithook(struct hda_codec *codec)
17847 {
17848 	alc663_m51va_speaker_automute(codec);
17849 	alc_mic_automute(codec);
17850 }
17851 
17852 static struct snd_kcontrol_new alc662_ecs_mixer[] = {
17853 	HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17854 	ALC262_HIPPO_MASTER_SWITCH,
17855 
17856 	HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
17857 	HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
17858 	HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
17859 
17860 	HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
17861 	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17862 	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17863 	{ } /* end */
17864 };
17865 
17866 static struct snd_kcontrol_new alc272_nc10_mixer[] = {
17867 	/* Master Playback automatically created from Speaker and Headphone */
17868 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17869 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17870 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17871 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17872 
17873 	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17874 	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17875 	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
17876 
17877 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17878 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17879 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
17880 	{ } /* end */
17881 };
17882 
17883 #ifdef CONFIG_SND_HDA_POWER_SAVE
17884 #define alc662_loopbacks	alc880_loopbacks
17885 #endif
17886 
17887 
17888 /* pcm configuration: identical with ALC880 */
17889 #define alc662_pcm_analog_playback	alc880_pcm_analog_playback
17890 #define alc662_pcm_analog_capture	alc880_pcm_analog_capture
17891 #define alc662_pcm_digital_playback	alc880_pcm_digital_playback
17892 #define alc662_pcm_digital_capture	alc880_pcm_digital_capture
17893 
17894 /*
17895  * configuration and preset
17896  */
17897 static const char *alc662_models[ALC662_MODEL_LAST] = {
17898 	[ALC662_3ST_2ch_DIG]	= "3stack-dig",
17899 	[ALC662_3ST_6ch_DIG]	= "3stack-6ch-dig",
17900 	[ALC662_3ST_6ch]	= "3stack-6ch",
17901 	[ALC662_5ST_DIG]	= "6stack-dig",
17902 	[ALC662_LENOVO_101E]	= "lenovo-101e",
17903 	[ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
17904 	[ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
17905 	[ALC662_ECS] = "ecs",
17906 	[ALC663_ASUS_M51VA] = "m51va",
17907 	[ALC663_ASUS_G71V] = "g71v",
17908 	[ALC663_ASUS_H13] = "h13",
17909 	[ALC663_ASUS_G50V] = "g50v",
17910 	[ALC663_ASUS_MODE1] = "asus-mode1",
17911 	[ALC662_ASUS_MODE2] = "asus-mode2",
17912 	[ALC663_ASUS_MODE3] = "asus-mode3",
17913 	[ALC663_ASUS_MODE4] = "asus-mode4",
17914 	[ALC663_ASUS_MODE5] = "asus-mode5",
17915 	[ALC663_ASUS_MODE6] = "asus-mode6",
17916 	[ALC663_ASUS_MODE7] = "asus-mode7",
17917 	[ALC663_ASUS_MODE8] = "asus-mode8",
17918 	[ALC272_DELL]		= "dell",
17919 	[ALC272_DELL_ZM1]	= "dell-zm1",
17920 	[ALC272_SAMSUNG_NC10]	= "samsung-nc10",
17921 	[ALC662_AUTO]		= "auto",
17922 };
17923 
17924 static struct snd_pci_quirk alc662_cfg_tbl[] = {
17925 	SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
17926 	SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
17927 	SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
17928 	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
17929 	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
17930 	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1),
17931 	SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
17932 	SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
17933 	SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
17934 	SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
17935 	SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
17936 	SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
17937 	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
17938 	SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
17939 	SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
17940 	SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
17941 	SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
17942 	SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
17943 	SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
17944 	SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
17945 	SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
17946 	SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
17947 	SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
17948 	SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
17949 	SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
17950 	SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
17951 	SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
17952 	SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
17953 	SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
17954 	SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
17955 	SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
17956 	SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
17957 	SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
17958 	SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
17959 	SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
17960 	SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
17961 	SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
17962 	/*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
17963 	SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
17964 	SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
17965 	SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
17966 	SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1),
17967 	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
17968 	SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
17969 	SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
17970 	SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
17971 	SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
17972 	SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
17973 	SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
17974 	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
17975 	SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
17976 	SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
17977 	SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
17978 	/*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
17979 	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
17980 	SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
17981 	SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
17982 	SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
17983 	SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
17984 	SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
17985 	SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
17986 	SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
17987 	SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
17988 	SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
17989 		      ALC662_3ST_6ch_DIG),
17990 	SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
17991 	SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
17992 	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
17993 		      ALC662_3ST_6ch_DIG),
17994 	SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13),
17995 	SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
17996 	SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
17997 	SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
17998 	SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
17999 					ALC662_3ST_6ch_DIG),
18000 	SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
18001 			   ALC663_ASUS_H13),
18002 	{}
18003 };
18004 
18005 static struct alc_config_preset alc662_presets[] = {
18006 	[ALC662_3ST_2ch_DIG] = {
18007 		.mixers = { alc662_3ST_2ch_mixer },
18008 		.init_verbs = { alc662_init_verbs },
18009 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18010 		.dac_nids = alc662_dac_nids,
18011 		.dig_out_nid = ALC662_DIGOUT_NID,
18012 		.dig_in_nid = ALC662_DIGIN_NID,
18013 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18014 		.channel_mode = alc662_3ST_2ch_modes,
18015 		.input_mux = &alc662_capture_source,
18016 	},
18017 	[ALC662_3ST_6ch_DIG] = {
18018 		.mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18019 		.init_verbs = { alc662_init_verbs },
18020 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18021 		.dac_nids = alc662_dac_nids,
18022 		.dig_out_nid = ALC662_DIGOUT_NID,
18023 		.dig_in_nid = ALC662_DIGIN_NID,
18024 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18025 		.channel_mode = alc662_3ST_6ch_modes,
18026 		.need_dac_fix = 1,
18027 		.input_mux = &alc662_capture_source,
18028 	},
18029 	[ALC662_3ST_6ch] = {
18030 		.mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18031 		.init_verbs = { alc662_init_verbs },
18032 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18033 		.dac_nids = alc662_dac_nids,
18034 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18035 		.channel_mode = alc662_3ST_6ch_modes,
18036 		.need_dac_fix = 1,
18037 		.input_mux = &alc662_capture_source,
18038 	},
18039 	[ALC662_5ST_DIG] = {
18040 		.mixers = { alc662_base_mixer, alc662_chmode_mixer },
18041 		.init_verbs = { alc662_init_verbs },
18042 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18043 		.dac_nids = alc662_dac_nids,
18044 		.dig_out_nid = ALC662_DIGOUT_NID,
18045 		.dig_in_nid = ALC662_DIGIN_NID,
18046 		.num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
18047 		.channel_mode = alc662_5stack_modes,
18048 		.input_mux = &alc662_capture_source,
18049 	},
18050 	[ALC662_LENOVO_101E] = {
18051 		.mixers = { alc662_lenovo_101e_mixer },
18052 		.init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
18053 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18054 		.dac_nids = alc662_dac_nids,
18055 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18056 		.channel_mode = alc662_3ST_2ch_modes,
18057 		.input_mux = &alc662_lenovo_101e_capture_source,
18058 		.unsol_event = alc662_lenovo_101e_unsol_event,
18059 		.init_hook = alc662_lenovo_101e_all_automute,
18060 	},
18061 	[ALC662_ASUS_EEEPC_P701] = {
18062 		.mixers = { alc662_eeepc_p701_mixer },
18063 		.init_verbs = { alc662_init_verbs,
18064 				alc662_eeepc_sue_init_verbs },
18065 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18066 		.dac_nids = alc662_dac_nids,
18067 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18068 		.channel_mode = alc662_3ST_2ch_modes,
18069 		.unsol_event = alc662_eeepc_unsol_event,
18070 		.setup = alc662_eeepc_setup,
18071 		.init_hook = alc662_eeepc_inithook,
18072 	},
18073 	[ALC662_ASUS_EEEPC_EP20] = {
18074 		.mixers = { alc662_eeepc_ep20_mixer,
18075 			    alc662_chmode_mixer },
18076 		.init_verbs = { alc662_init_verbs,
18077 				alc662_eeepc_ep20_sue_init_verbs },
18078 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18079 		.dac_nids = alc662_dac_nids,
18080 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18081 		.channel_mode = alc662_3ST_6ch_modes,
18082 		.input_mux = &alc662_lenovo_101e_capture_source,
18083 		.unsol_event = alc662_eeepc_unsol_event,
18084 		.setup = alc662_eeepc_ep20_setup,
18085 		.init_hook = alc662_eeepc_ep20_inithook,
18086 	},
18087 	[ALC662_ECS] = {
18088 		.mixers = { alc662_ecs_mixer },
18089 		.init_verbs = { alc662_init_verbs,
18090 				alc662_ecs_init_verbs },
18091 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18092 		.dac_nids = alc662_dac_nids,
18093 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18094 		.channel_mode = alc662_3ST_2ch_modes,
18095 		.unsol_event = alc662_eeepc_unsol_event,
18096 		.setup = alc662_eeepc_setup,
18097 		.init_hook = alc662_eeepc_inithook,
18098 	},
18099 	[ALC663_ASUS_M51VA] = {
18100 		.mixers = { alc663_m51va_mixer },
18101 		.init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18102 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18103 		.dac_nids = alc662_dac_nids,
18104 		.dig_out_nid = ALC662_DIGOUT_NID,
18105 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18106 		.channel_mode = alc662_3ST_2ch_modes,
18107 		.unsol_event = alc663_m51va_unsol_event,
18108 		.setup = alc663_m51va_setup,
18109 		.init_hook = alc663_m51va_inithook,
18110 	},
18111 	[ALC663_ASUS_G71V] = {
18112 		.mixers = { alc663_g71v_mixer },
18113 		.init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
18114 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18115 		.dac_nids = alc662_dac_nids,
18116 		.dig_out_nid = ALC662_DIGOUT_NID,
18117 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18118 		.channel_mode = alc662_3ST_2ch_modes,
18119 		.unsol_event = alc663_g71v_unsol_event,
18120 		.setup = alc663_g71v_setup,
18121 		.init_hook = alc663_g71v_inithook,
18122 	},
18123 	[ALC663_ASUS_H13] = {
18124 		.mixers = { alc663_m51va_mixer },
18125 		.init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18126 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18127 		.dac_nids = alc662_dac_nids,
18128 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18129 		.channel_mode = alc662_3ST_2ch_modes,
18130 		.unsol_event = alc663_m51va_unsol_event,
18131 		.init_hook = alc663_m51va_inithook,
18132 	},
18133 	[ALC663_ASUS_G50V] = {
18134 		.mixers = { alc663_g50v_mixer },
18135 		.init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
18136 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18137 		.dac_nids = alc662_dac_nids,
18138 		.dig_out_nid = ALC662_DIGOUT_NID,
18139 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18140 		.channel_mode = alc662_3ST_6ch_modes,
18141 		.input_mux = &alc663_capture_source,
18142 		.unsol_event = alc663_g50v_unsol_event,
18143 		.setup = alc663_g50v_setup,
18144 		.init_hook = alc663_g50v_inithook,
18145 	},
18146 	[ALC663_ASUS_MODE1] = {
18147 		.mixers = { alc663_m51va_mixer },
18148 		.cap_mixer = alc662_auto_capture_mixer,
18149 		.init_verbs = { alc662_init_verbs,
18150 				alc663_21jd_amic_init_verbs },
18151 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18152 		.hp_nid = 0x03,
18153 		.dac_nids = alc662_dac_nids,
18154 		.dig_out_nid = ALC662_DIGOUT_NID,
18155 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18156 		.channel_mode = alc662_3ST_2ch_modes,
18157 		.unsol_event = alc663_mode1_unsol_event,
18158 		.setup = alc663_mode1_setup,
18159 		.init_hook = alc663_mode1_inithook,
18160 	},
18161 	[ALC662_ASUS_MODE2] = {
18162 		.mixers = { alc662_1bjd_mixer },
18163 		.cap_mixer = alc662_auto_capture_mixer,
18164 		.init_verbs = { alc662_init_verbs,
18165 				alc662_1bjd_amic_init_verbs },
18166 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18167 		.dac_nids = alc662_dac_nids,
18168 		.dig_out_nid = ALC662_DIGOUT_NID,
18169 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18170 		.channel_mode = alc662_3ST_2ch_modes,
18171 		.unsol_event = alc662_mode2_unsol_event,
18172 		.setup = alc662_mode2_setup,
18173 		.init_hook = alc662_mode2_inithook,
18174 	},
18175 	[ALC663_ASUS_MODE3] = {
18176 		.mixers = { alc663_two_hp_m1_mixer },
18177 		.cap_mixer = alc662_auto_capture_mixer,
18178 		.init_verbs = { alc662_init_verbs,
18179 				alc663_two_hp_amic_m1_init_verbs },
18180 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18181 		.hp_nid = 0x03,
18182 		.dac_nids = alc662_dac_nids,
18183 		.dig_out_nid = ALC662_DIGOUT_NID,
18184 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18185 		.channel_mode = alc662_3ST_2ch_modes,
18186 		.unsol_event = alc663_mode3_unsol_event,
18187 		.setup = alc663_mode3_setup,
18188 		.init_hook = alc663_mode3_inithook,
18189 	},
18190 	[ALC663_ASUS_MODE4] = {
18191 		.mixers = { alc663_asus_21jd_clfe_mixer },
18192 		.cap_mixer = alc662_auto_capture_mixer,
18193 		.init_verbs = { alc662_init_verbs,
18194 				alc663_21jd_amic_init_verbs},
18195 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18196 		.hp_nid = 0x03,
18197 		.dac_nids = alc662_dac_nids,
18198 		.dig_out_nid = ALC662_DIGOUT_NID,
18199 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18200 		.channel_mode = alc662_3ST_2ch_modes,
18201 		.unsol_event = alc663_mode4_unsol_event,
18202 		.setup = alc663_mode4_setup,
18203 		.init_hook = alc663_mode4_inithook,
18204 	},
18205 	[ALC663_ASUS_MODE5] = {
18206 		.mixers = { alc663_asus_15jd_clfe_mixer },
18207 		.cap_mixer = alc662_auto_capture_mixer,
18208 		.init_verbs = { alc662_init_verbs,
18209 				alc663_15jd_amic_init_verbs },
18210 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18211 		.hp_nid = 0x03,
18212 		.dac_nids = alc662_dac_nids,
18213 		.dig_out_nid = ALC662_DIGOUT_NID,
18214 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18215 		.channel_mode = alc662_3ST_2ch_modes,
18216 		.unsol_event = alc663_mode5_unsol_event,
18217 		.setup = alc663_mode5_setup,
18218 		.init_hook = alc663_mode5_inithook,
18219 	},
18220 	[ALC663_ASUS_MODE6] = {
18221 		.mixers = { alc663_two_hp_m2_mixer },
18222 		.cap_mixer = alc662_auto_capture_mixer,
18223 		.init_verbs = { alc662_init_verbs,
18224 				alc663_two_hp_amic_m2_init_verbs },
18225 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18226 		.hp_nid = 0x03,
18227 		.dac_nids = alc662_dac_nids,
18228 		.dig_out_nid = ALC662_DIGOUT_NID,
18229 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18230 		.channel_mode = alc662_3ST_2ch_modes,
18231 		.unsol_event = alc663_mode6_unsol_event,
18232 		.setup = alc663_mode6_setup,
18233 		.init_hook = alc663_mode6_inithook,
18234 	},
18235 	[ALC663_ASUS_MODE7] = {
18236 		.mixers = { alc663_mode7_mixer },
18237 		.cap_mixer = alc662_auto_capture_mixer,
18238 		.init_verbs = { alc662_init_verbs,
18239 				alc663_mode7_init_verbs },
18240 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18241 		.hp_nid = 0x03,
18242 		.dac_nids = alc662_dac_nids,
18243 		.dig_out_nid = ALC662_DIGOUT_NID,
18244 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18245 		.channel_mode = alc662_3ST_2ch_modes,
18246 		.unsol_event = alc663_mode7_unsol_event,
18247 		.setup = alc663_mode7_setup,
18248 		.init_hook = alc663_mode7_inithook,
18249 	},
18250 	[ALC663_ASUS_MODE8] = {
18251 		.mixers = { alc663_mode8_mixer },
18252 		.cap_mixer = alc662_auto_capture_mixer,
18253 		.init_verbs = { alc662_init_verbs,
18254 				alc663_mode8_init_verbs },
18255 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18256 		.hp_nid = 0x03,
18257 		.dac_nids = alc662_dac_nids,
18258 		.dig_out_nid = ALC662_DIGOUT_NID,
18259 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18260 		.channel_mode = alc662_3ST_2ch_modes,
18261 		.unsol_event = alc663_mode8_unsol_event,
18262 		.setup = alc663_mode8_setup,
18263 		.init_hook = alc663_mode8_inithook,
18264 	},
18265 	[ALC272_DELL] = {
18266 		.mixers = { alc663_m51va_mixer },
18267 		.cap_mixer = alc272_auto_capture_mixer,
18268 		.init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
18269 		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
18270 		.dac_nids = alc662_dac_nids,
18271 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18272 		.adc_nids = alc272_adc_nids,
18273 		.num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
18274 		.capsrc_nids = alc272_capsrc_nids,
18275 		.channel_mode = alc662_3ST_2ch_modes,
18276 		.unsol_event = alc663_m51va_unsol_event,
18277 		.setup = alc663_m51va_setup,
18278 		.init_hook = alc663_m51va_inithook,
18279 	},
18280 	[ALC272_DELL_ZM1] = {
18281 		.mixers = { alc663_m51va_mixer },
18282 		.cap_mixer = alc662_auto_capture_mixer,
18283 		.init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
18284 		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
18285 		.dac_nids = alc662_dac_nids,
18286 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18287 		.adc_nids = alc662_adc_nids,
18288 		.num_adc_nids = 1,
18289 		.capsrc_nids = alc662_capsrc_nids,
18290 		.channel_mode = alc662_3ST_2ch_modes,
18291 		.unsol_event = alc663_m51va_unsol_event,
18292 		.setup = alc663_m51va_setup,
18293 		.init_hook = alc663_m51va_inithook,
18294 	},
18295 	[ALC272_SAMSUNG_NC10] = {
18296 		.mixers = { alc272_nc10_mixer },
18297 		.init_verbs = { alc662_init_verbs,
18298 				alc663_21jd_amic_init_verbs },
18299 		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
18300 		.dac_nids = alc272_dac_nids,
18301 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18302 		.channel_mode = alc662_3ST_2ch_modes,
18303 		/*.input_mux = &alc272_nc10_capture_source,*/
18304 		.unsol_event = alc663_mode4_unsol_event,
18305 		.setup = alc663_mode4_setup,
18306 		.init_hook = alc663_mode4_inithook,
18307 	},
18308 };
18309 
18310 
18311 /*
18312  * BIOS auto configuration
18313  */
18314 
18315 /* convert from MIX nid to DAC */
18316 static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
18317 {
18318 	if (nid == 0x0f)
18319 		return 0x02;
18320 	else if (nid >= 0x0c && nid <= 0x0e)
18321 		return nid - 0x0c + 0x02;
18322 	else
18323 		return 0;
18324 }
18325 
18326 /* get MIX nid connected to the given pin targeted to DAC */
18327 static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
18328 				   hda_nid_t dac)
18329 {
18330 	hda_nid_t mix[4];
18331 	int i, num;
18332 
18333 	num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
18334 	for (i = 0; i < num; i++) {
18335 		if (alc662_mix_to_dac(mix[i]) == dac)
18336 			return mix[i];
18337 	}
18338 	return 0;
18339 }
18340 
18341 /* look for an empty DAC slot */
18342 static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
18343 {
18344 	struct alc_spec *spec = codec->spec;
18345 	hda_nid_t srcs[5];
18346 	int i, j, num;
18347 
18348 	num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
18349 	if (num < 0)
18350 		return 0;
18351 	for (i = 0; i < num; i++) {
18352 		hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
18353 		if (!nid)
18354 			continue;
18355 		for (j = 0; j < spec->multiout.num_dacs; j++)
18356 			if (spec->multiout.dac_nids[j] == nid)
18357 				break;
18358 		if (j >= spec->multiout.num_dacs)
18359 			return nid;
18360 	}
18361 	return 0;
18362 }
18363 
18364 /* fill in the dac_nids table from the parsed pin configuration */
18365 static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
18366 				     const struct auto_pin_cfg *cfg)
18367 {
18368 	struct alc_spec *spec = codec->spec;
18369 	int i;
18370 	hda_nid_t dac;
18371 
18372 	spec->multiout.dac_nids = spec->private_dac_nids;
18373 	for (i = 0; i < cfg->line_outs; i++) {
18374 		dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
18375 		if (!dac)
18376 			continue;
18377 		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
18378 	}
18379 	return 0;
18380 }
18381 
18382 static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
18383 			      hda_nid_t nid, unsigned int chs)
18384 {
18385 	return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
18386 			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
18387 }
18388 
18389 static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
18390 			     hda_nid_t nid, unsigned int chs)
18391 {
18392 	return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18393 			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
18394 }
18395 
18396 #define alc662_add_stereo_vol(spec, pfx, nid) \
18397 	alc662_add_vol_ctl(spec, pfx, nid, 3)
18398 #define alc662_add_stereo_sw(spec, pfx, nid) \
18399 	alc662_add_sw_ctl(spec, pfx, nid, 3)
18400 
18401 /* add playback controls from the parsed DAC table */
18402 static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
18403 					     const struct auto_pin_cfg *cfg)
18404 {
18405 	struct alc_spec *spec = codec->spec;
18406 	static const char *chname[4] = {
18407 		"Front", "Surround", NULL /*CLFE*/, "Side"
18408 	};
18409 	hda_nid_t nid, mix;
18410 	int i, err;
18411 
18412 	for (i = 0; i < cfg->line_outs; i++) {
18413 		nid = spec->multiout.dac_nids[i];
18414 		if (!nid)
18415 			continue;
18416 		mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
18417 		if (!mix)
18418 			continue;
18419 		if (i == 2) {
18420 			/* Center/LFE */
18421 			err = alc662_add_vol_ctl(spec, "Center", nid, 1);
18422 			if (err < 0)
18423 				return err;
18424 			err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
18425 			if (err < 0)
18426 				return err;
18427 			err = alc662_add_sw_ctl(spec, "Center", mix, 1);
18428 			if (err < 0)
18429 				return err;
18430 			err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
18431 			if (err < 0)
18432 				return err;
18433 		} else {
18434 			const char *pfx;
18435 			if (cfg->line_outs == 1 &&
18436 			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
18437 				if (cfg->hp_outs)
18438 					pfx = "Speaker";
18439 				else
18440 					pfx = "PCM";
18441 			} else
18442 				pfx = chname[i];
18443 			err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18444 			if (err < 0)
18445 				return err;
18446 			if (cfg->line_outs == 1 &&
18447 			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
18448 				pfx = "Speaker";
18449 			err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18450 			if (err < 0)
18451 				return err;
18452 		}
18453 	}
18454 	return 0;
18455 }
18456 
18457 /* add playback controls for speaker and HP outputs */
18458 /* return DAC nid if any new DAC is assigned */
18459 static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
18460 					const char *pfx)
18461 {
18462 	struct alc_spec *spec = codec->spec;
18463 	hda_nid_t nid, mix;
18464 	int err;
18465 
18466 	if (!pin)
18467 		return 0;
18468 	nid = alc662_look_for_dac(codec, pin);
18469 	if (!nid) {
18470 		/* the corresponding DAC is already occupied */
18471 		if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
18472 			return 0; /* no way */
18473 		/* create a switch only */
18474 		return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18475 				   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
18476 	}
18477 
18478 	mix = alc662_dac_to_mix(codec, pin, nid);
18479 	if (!mix)
18480 		return 0;
18481 	err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18482 	if (err < 0)
18483 		return err;
18484 	err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18485 	if (err < 0)
18486 		return err;
18487 	return nid;
18488 }
18489 
18490 /* create playback/capture controls for input pins */
18491 #define alc662_auto_create_input_ctls \
18492 	alc882_auto_create_input_ctls
18493 
18494 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
18495 					      hda_nid_t nid, int pin_type,
18496 					      hda_nid_t dac)
18497 {
18498 	int i, num;
18499 	hda_nid_t srcs[4];
18500 
18501 	alc_set_pin_output(codec, nid, pin_type);
18502 	/* need the manual connection? */
18503 	num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
18504 	if (num <= 1)
18505 		return;
18506 	for (i = 0; i < num; i++) {
18507 		if (alc662_mix_to_dac(srcs[i]) != dac)
18508 			continue;
18509 		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
18510 		return;
18511 	}
18512 }
18513 
18514 static void alc662_auto_init_multi_out(struct hda_codec *codec)
18515 {
18516 	struct alc_spec *spec = codec->spec;
18517 	int pin_type = get_pin_type(spec->autocfg.line_out_type);
18518 	int i;
18519 
18520 	for (i = 0; i <= HDA_SIDE; i++) {
18521 		hda_nid_t nid = spec->autocfg.line_out_pins[i];
18522 		if (nid)
18523 			alc662_auto_set_output_and_unmute(codec, nid, pin_type,
18524 					spec->multiout.dac_nids[i]);
18525 	}
18526 }
18527 
18528 static void alc662_auto_init_hp_out(struct hda_codec *codec)
18529 {
18530 	struct alc_spec *spec = codec->spec;
18531 	hda_nid_t pin;
18532 
18533 	pin = spec->autocfg.hp_pins[0];
18534 	if (pin)
18535 		alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
18536 						  spec->multiout.hp_nid);
18537 	pin = spec->autocfg.speaker_pins[0];
18538 	if (pin)
18539 		alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
18540 					spec->multiout.extra_out_nid[0]);
18541 }
18542 
18543 #define ALC662_PIN_CD_NID		ALC880_PIN_CD_NID
18544 
18545 static void alc662_auto_init_analog_input(struct hda_codec *codec)
18546 {
18547 	struct alc_spec *spec = codec->spec;
18548 	int i;
18549 
18550 	for (i = 0; i < AUTO_PIN_LAST; i++) {
18551 		hda_nid_t nid = spec->autocfg.input_pins[i];
18552 		if (alc_is_input_pin(codec, nid)) {
18553 			alc_set_input_pin(codec, nid, i);
18554 			if (nid != ALC662_PIN_CD_NID &&
18555 			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
18556 				snd_hda_codec_write(codec, nid, 0,
18557 						    AC_VERB_SET_AMP_GAIN_MUTE,
18558 						    AMP_OUT_MUTE);
18559 		}
18560 	}
18561 }
18562 
18563 #define alc662_auto_init_input_src	alc882_auto_init_input_src
18564 
18565 static int alc662_parse_auto_config(struct hda_codec *codec)
18566 {
18567 	struct alc_spec *spec = codec->spec;
18568 	int err;
18569 	static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
18570 
18571 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
18572 					   alc662_ignore);
18573 	if (err < 0)
18574 		return err;
18575 	if (!spec->autocfg.line_outs)
18576 		return 0; /* can't find valid BIOS pin config */
18577 
18578 	err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
18579 	if (err < 0)
18580 		return err;
18581 	err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
18582 	if (err < 0)
18583 		return err;
18584 	err = alc662_auto_create_extra_out(codec,
18585 					   spec->autocfg.speaker_pins[0],
18586 					   "Speaker");
18587 	if (err < 0)
18588 		return err;
18589 	if (err)
18590 		spec->multiout.extra_out_nid[0] = err;
18591 	err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
18592 					   "Headphone");
18593 	if (err < 0)
18594 		return err;
18595 	if (err)
18596 		spec->multiout.hp_nid = err;
18597 	err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
18598 	if (err < 0)
18599 		return err;
18600 
18601 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
18602 
18603 	if (spec->autocfg.dig_outs)
18604 		spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
18605 
18606 	if (spec->kctls.list)
18607 		add_mixer(spec, spec->kctls.list);
18608 
18609 	spec->num_mux_defs = 1;
18610 	spec->input_mux = &spec->private_imux[0];
18611 
18612 	add_verb(spec, alc662_init_verbs);
18613 	if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18614 	    codec->vendor_id == 0x10ec0665)
18615 		add_verb(spec, alc663_init_verbs);
18616 
18617 	if (codec->vendor_id == 0x10ec0272)
18618 		add_verb(spec, alc272_init_verbs);
18619 
18620 	err = alc_auto_add_mic_boost(codec);
18621 	if (err < 0)
18622 		return err;
18623 
18624 	if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18625 	    codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
18626 	    alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0x21);
18627 	else
18628 	    alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
18629 
18630 	return 1;
18631 }
18632 
18633 /* additional initialization for auto-configuration model */
18634 static void alc662_auto_init(struct hda_codec *codec)
18635 {
18636 	struct alc_spec *spec = codec->spec;
18637 	alc662_auto_init_multi_out(codec);
18638 	alc662_auto_init_hp_out(codec);
18639 	alc662_auto_init_analog_input(codec);
18640 	alc662_auto_init_input_src(codec);
18641 	if (spec->unsol_event)
18642 		alc_inithook(codec);
18643 }
18644 
18645 static int patch_alc662(struct hda_codec *codec)
18646 {
18647 	struct alc_spec *spec;
18648 	int err, board_config;
18649 
18650 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
18651 	if (!spec)
18652 		return -ENOMEM;
18653 
18654 	codec->spec = spec;
18655 
18656 	alc_auto_parse_customize_define(codec);
18657 
18658 	alc_fix_pll_init(codec, 0x20, 0x04, 15);
18659 
18660 	if (alc_read_coef_idx(codec, 0) == 0x8020)
18661 		alc_codec_rename(codec, "ALC661");
18662 	else if ((alc_read_coef_idx(codec, 0) & (1 << 14)) &&
18663 		 codec->bus->pci->subsystem_vendor == 0x1025 &&
18664 		 spec->cdefine.platform_type == 1)
18665 		alc_codec_rename(codec, "ALC272X");
18666 
18667 	board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
18668 						  alc662_models,
18669 			  	                  alc662_cfg_tbl);
18670 	if (board_config < 0) {
18671 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
18672 		       codec->chip_name);
18673 		board_config = ALC662_AUTO;
18674 	}
18675 
18676 	if (board_config == ALC662_AUTO) {
18677 		/* automatic parse from the BIOS config */
18678 		err = alc662_parse_auto_config(codec);
18679 		if (err < 0) {
18680 			alc_free(codec);
18681 			return err;
18682 		} else if (!err) {
18683 			printk(KERN_INFO
18684 			       "hda_codec: Cannot set up configuration "
18685 			       "from BIOS.  Using base mode...\n");
18686 			board_config = ALC662_3ST_2ch_DIG;
18687 		}
18688 	}
18689 
18690 	err = snd_hda_attach_beep_device(codec, 0x1);
18691 	if (err < 0) {
18692 		alc_free(codec);
18693 		return err;
18694 	}
18695 
18696 	if (board_config != ALC662_AUTO)
18697 		setup_preset(codec, &alc662_presets[board_config]);
18698 
18699 	spec->stream_analog_playback = &alc662_pcm_analog_playback;
18700 	spec->stream_analog_capture = &alc662_pcm_analog_capture;
18701 
18702 	spec->stream_digital_playback = &alc662_pcm_digital_playback;
18703 	spec->stream_digital_capture = &alc662_pcm_digital_capture;
18704 
18705 	if (!spec->adc_nids) {
18706 		spec->adc_nids = alc662_adc_nids;
18707 		spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
18708 	}
18709 	if (!spec->capsrc_nids)
18710 		spec->capsrc_nids = alc662_capsrc_nids;
18711 
18712 	if (!spec->cap_mixer)
18713 		set_capture_mixer(codec);
18714 
18715 	if (spec->cdefine.enable_pcbeep) {
18716 		switch (codec->vendor_id) {
18717 		case 0x10ec0662:
18718 			set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
18719 			break;
18720 		case 0x10ec0272:
18721 		case 0x10ec0663:
18722 		case 0x10ec0665:
18723 			set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
18724 			break;
18725 		case 0x10ec0273:
18726 			set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
18727 			break;
18728 		}
18729 	}
18730 	spec->vmaster_nid = 0x02;
18731 
18732 	codec->patch_ops = alc_patch_ops;
18733 	if (board_config == ALC662_AUTO)
18734 		spec->init_hook = alc662_auto_init;
18735 #ifdef CONFIG_SND_HDA_POWER_SAVE
18736 	if (!spec->loopback.amplist)
18737 		spec->loopback.amplist = alc662_loopbacks;
18738 #endif
18739 
18740 	return 0;
18741 }
18742 
18743 static int patch_alc888(struct hda_codec *codec)
18744 {
18745 	if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
18746 		kfree(codec->chip_name);
18747 		codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
18748 		if (!codec->chip_name) {
18749 			alc_free(codec);
18750 			return -ENOMEM;
18751 		}
18752 		return patch_alc662(codec);
18753 	}
18754 	return patch_alc882(codec);
18755 }
18756 
18757 /*
18758  * patch entries
18759  */
18760 static struct hda_codec_preset snd_hda_preset_realtek[] = {
18761 	{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
18762 	{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
18763 	{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
18764 	{ .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
18765 	{ .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
18766 	{ .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
18767 	{ .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
18768 	{ .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
18769 	{ .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
18770 	  .patch = patch_alc861 },
18771 	{ .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
18772 	{ .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
18773 	{ .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
18774 	{ .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
18775 	  .patch = patch_alc882 },
18776 	{ .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
18777 	  .patch = patch_alc662 },
18778 	{ .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
18779 	{ .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
18780 	{ .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
18781 	{ .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
18782 	{ .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
18783 	{ .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
18784 	{ .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
18785 	  .patch = patch_alc882 },
18786 	{ .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
18787 	  .patch = patch_alc882 },
18788 	{ .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
18789 	{ .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
18790 	{ .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
18791 	  .patch = patch_alc882 },
18792 	{ .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
18793 	{ .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
18794 	{ .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
18795 	{} /* terminator */
18796 };
18797 
18798 MODULE_ALIAS("snd-hda-codec-id:10ec*");
18799 
18800 MODULE_LICENSE("GPL");
18801 MODULE_DESCRIPTION("Realtek HD-audio codec");
18802 
18803 static struct hda_codec_preset_list realtek_list = {
18804 	.preset = snd_hda_preset_realtek,
18805 	.owner = THIS_MODULE,
18806 };
18807 
18808 static int __init patch_realtek_init(void)
18809 {
18810 	return snd_hda_add_codec_preset(&realtek_list);
18811 }
18812 
18813 static void __exit patch_realtek_exit(void)
18814 {
18815 	snd_hda_delete_codec_preset(&realtek_list);
18816 }
18817 
18818 module_init(patch_realtek_init)
18819 module_exit(patch_realtek_exit)
18820