xref: /openbmc/linux/sound/pci/hda/patch_realtek.c (revision 7dd65feb)
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_ASUS_AMIC,
135 	ALC269_ASUS_DMIC,
136 	ALC269_FUJITSU,
137 	ALC269_LIFEBOOK,
138 	ALC269_AUTO,
139 	ALC269_MODEL_LAST /* last tag */
140 };
141 
142 /* ALC861 models */
143 enum {
144 	ALC861_3ST,
145 	ALC660_3ST,
146 	ALC861_3ST_DIG,
147 	ALC861_6ST_DIG,
148 	ALC861_UNIWILL_M31,
149 	ALC861_TOSHIBA,
150 	ALC861_ASUS,
151 	ALC861_ASUS_LAPTOP,
152 	ALC861_AUTO,
153 	ALC861_MODEL_LAST,
154 };
155 
156 /* ALC861-VD models */
157 enum {
158 	ALC660VD_3ST,
159 	ALC660VD_3ST_DIG,
160 	ALC660VD_ASUS_V1S,
161 	ALC861VD_3ST,
162 	ALC861VD_3ST_DIG,
163 	ALC861VD_6ST_DIG,
164 	ALC861VD_LENOVO,
165 	ALC861VD_DALLAS,
166 	ALC861VD_HP,
167 	ALC861VD_AUTO,
168 	ALC861VD_MODEL_LAST,
169 };
170 
171 /* ALC662 models */
172 enum {
173 	ALC662_3ST_2ch_DIG,
174 	ALC662_3ST_6ch_DIG,
175 	ALC662_3ST_6ch,
176 	ALC662_5ST_DIG,
177 	ALC662_LENOVO_101E,
178 	ALC662_ASUS_EEEPC_P701,
179 	ALC662_ASUS_EEEPC_EP20,
180 	ALC663_ASUS_M51VA,
181 	ALC663_ASUS_G71V,
182 	ALC663_ASUS_H13,
183 	ALC663_ASUS_G50V,
184 	ALC662_ECS,
185 	ALC663_ASUS_MODE1,
186 	ALC662_ASUS_MODE2,
187 	ALC663_ASUS_MODE3,
188 	ALC663_ASUS_MODE4,
189 	ALC663_ASUS_MODE5,
190 	ALC663_ASUS_MODE6,
191 	ALC663_ASUS_MODE7,
192 	ALC663_ASUS_MODE8,
193 	ALC272_DELL,
194 	ALC272_DELL_ZM1,
195 	ALC272_SAMSUNG_NC10,
196 	ALC662_AUTO,
197 	ALC662_MODEL_LAST,
198 };
199 
200 /* ALC882 models */
201 enum {
202 	ALC882_3ST_DIG,
203 	ALC882_6ST_DIG,
204 	ALC882_ARIMA,
205 	ALC882_W2JC,
206 	ALC882_TARGA,
207 	ALC882_ASUS_A7J,
208 	ALC882_ASUS_A7M,
209 	ALC885_MACPRO,
210 	ALC885_MBP3,
211 	ALC885_MB5,
212 	ALC885_IMAC24,
213 	ALC885_IMAC91,
214 	ALC883_3ST_2ch_DIG,
215 	ALC883_3ST_6ch_DIG,
216 	ALC883_3ST_6ch,
217 	ALC883_6ST_DIG,
218 	ALC883_TARGA_DIG,
219 	ALC883_TARGA_2ch_DIG,
220 	ALC883_TARGA_8ch_DIG,
221 	ALC883_ACER,
222 	ALC883_ACER_ASPIRE,
223 	ALC888_ACER_ASPIRE_4930G,
224 	ALC888_ACER_ASPIRE_6530G,
225 	ALC888_ACER_ASPIRE_8930G,
226 	ALC888_ACER_ASPIRE_7730G,
227 	ALC883_MEDION,
228 	ALC883_MEDION_MD2,
229 	ALC883_LAPTOP_EAPD,
230 	ALC883_LENOVO_101E_2ch,
231 	ALC883_LENOVO_NB0763,
232 	ALC888_LENOVO_MS7195_DIG,
233 	ALC888_LENOVO_SKY,
234 	ALC883_HAIER_W66,
235 	ALC888_3ST_HP,
236 	ALC888_6ST_DELL,
237 	ALC883_MITAC,
238 	ALC883_CLEVO_M540R,
239 	ALC883_CLEVO_M720,
240 	ALC883_FUJITSU_PI2515,
241 	ALC888_FUJITSU_XA3530,
242 	ALC883_3ST_6ch_INTEL,
243 	ALC889A_INTEL,
244 	ALC889_INTEL,
245 	ALC888_ASUS_M90V,
246 	ALC888_ASUS_EEE1601,
247 	ALC889A_MB31,
248 	ALC1200_ASUS_P5Q,
249 	ALC883_SONY_VAIO_TT,
250 	ALC882_AUTO,
251 	ALC882_MODEL_LAST,
252 };
253 
254 /* for GPIO Poll */
255 #define GPIO_MASK	0x03
256 
257 /* extra amp-initialization sequence types */
258 enum {
259 	ALC_INIT_NONE,
260 	ALC_INIT_DEFAULT,
261 	ALC_INIT_GPIO1,
262 	ALC_INIT_GPIO2,
263 	ALC_INIT_GPIO3,
264 };
265 
266 struct alc_mic_route {
267 	hda_nid_t pin;
268 	unsigned char mux_idx;
269 	unsigned char amix_idx;
270 };
271 
272 #define MUX_IDX_UNDEF	((unsigned char)-1)
273 
274 struct alc_spec {
275 	/* codec parameterization */
276 	struct snd_kcontrol_new *mixers[5];	/* mixer arrays */
277 	unsigned int num_mixers;
278 	struct snd_kcontrol_new *cap_mixer;	/* capture mixer */
279 	unsigned int beep_amp;	/* beep amp value, set via set_beep_amp() */
280 
281 	const struct hda_verb *init_verbs[10];	/* initialization verbs
282 						 * don't forget NULL
283 						 * termination!
284 						 */
285 	unsigned int num_init_verbs;
286 
287 	char stream_name_analog[32];	/* analog PCM stream */
288 	struct hda_pcm_stream *stream_analog_playback;
289 	struct hda_pcm_stream *stream_analog_capture;
290 	struct hda_pcm_stream *stream_analog_alt_playback;
291 	struct hda_pcm_stream *stream_analog_alt_capture;
292 
293 	char stream_name_digital[32];	/* digital PCM stream */
294 	struct hda_pcm_stream *stream_digital_playback;
295 	struct hda_pcm_stream *stream_digital_capture;
296 
297 	/* playback */
298 	struct hda_multi_out multiout;	/* playback set-up
299 					 * max_channels, dacs must be set
300 					 * dig_out_nid and hp_nid are optional
301 					 */
302 	hda_nid_t alt_dac_nid;
303 	hda_nid_t slave_dig_outs[3];	/* optional - for auto-parsing */
304 	int dig_out_type;
305 
306 	/* capture */
307 	unsigned int num_adc_nids;
308 	hda_nid_t *adc_nids;
309 	hda_nid_t *capsrc_nids;
310 	hda_nid_t dig_in_nid;		/* digital-in NID; optional */
311 
312 	/* capture source */
313 	unsigned int num_mux_defs;
314 	const struct hda_input_mux *input_mux;
315 	unsigned int cur_mux[3];
316 	struct alc_mic_route ext_mic;
317 	struct alc_mic_route int_mic;
318 
319 	/* channel model */
320 	const struct hda_channel_mode *channel_mode;
321 	int num_channel_mode;
322 	int need_dac_fix;
323 	int const_channel_count;
324 	int ext_channel_count;
325 
326 	/* PCM information */
327 	struct hda_pcm pcm_rec[3];	/* used in alc_build_pcms() */
328 
329 	/* dynamic controls, init_verbs and input_mux */
330 	struct auto_pin_cfg autocfg;
331 	struct snd_array kctls;
332 	struct hda_input_mux private_imux[3];
333 	hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
334 	hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
335 	hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
336 
337 	/* hooks */
338 	void (*init_hook)(struct hda_codec *codec);
339 	void (*unsol_event)(struct hda_codec *codec, unsigned int res);
340 #ifdef CONFIG_SND_HDA_POWER_SAVE
341 	void (*power_hook)(struct hda_codec *codec, int power);
342 #endif
343 
344 	/* for pin sensing */
345 	unsigned int sense_updated: 1;
346 	unsigned int jack_present: 1;
347 	unsigned int master_sw: 1;
348 	unsigned int auto_mic:1;
349 
350 	/* other flags */
351 	unsigned int no_analog :1; /* digital I/O only */
352 	int init_amp;
353 
354 	/* for virtual master */
355 	hda_nid_t vmaster_nid;
356 #ifdef CONFIG_SND_HDA_POWER_SAVE
357 	struct hda_loopback_check loopback;
358 #endif
359 
360 	/* for PLL fix */
361 	hda_nid_t pll_nid;
362 	unsigned int pll_coef_idx, pll_coef_bit;
363 };
364 
365 /*
366  * configuration template - to be copied to the spec instance
367  */
368 struct alc_config_preset {
369 	struct snd_kcontrol_new *mixers[5]; /* should be identical size
370 					     * with spec
371 					     */
372 	struct snd_kcontrol_new *cap_mixer; /* capture mixer */
373 	const struct hda_verb *init_verbs[5];
374 	unsigned int num_dacs;
375 	hda_nid_t *dac_nids;
376 	hda_nid_t dig_out_nid;		/* optional */
377 	hda_nid_t hp_nid;		/* optional */
378 	hda_nid_t *slave_dig_outs;
379 	unsigned int num_adc_nids;
380 	hda_nid_t *adc_nids;
381 	hda_nid_t *capsrc_nids;
382 	hda_nid_t dig_in_nid;
383 	unsigned int num_channel_mode;
384 	const struct hda_channel_mode *channel_mode;
385 	int need_dac_fix;
386 	int const_channel_count;
387 	unsigned int num_mux_defs;
388 	const struct hda_input_mux *input_mux;
389 	void (*unsol_event)(struct hda_codec *, unsigned int);
390 	void (*setup)(struct hda_codec *);
391 	void (*init_hook)(struct hda_codec *);
392 #ifdef CONFIG_SND_HDA_POWER_SAVE
393 	struct hda_amp_list *loopbacks;
394 	void (*power_hook)(struct hda_codec *codec, int power);
395 #endif
396 };
397 
398 
399 /*
400  * input MUX handling
401  */
402 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
403 			     struct snd_ctl_elem_info *uinfo)
404 {
405 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
406 	struct alc_spec *spec = codec->spec;
407 	unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
408 	if (mux_idx >= spec->num_mux_defs)
409 		mux_idx = 0;
410 	return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
411 }
412 
413 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
414 			    struct snd_ctl_elem_value *ucontrol)
415 {
416 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
417 	struct alc_spec *spec = codec->spec;
418 	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
419 
420 	ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
421 	return 0;
422 }
423 
424 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
425 			    struct snd_ctl_elem_value *ucontrol)
426 {
427 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
428 	struct alc_spec *spec = codec->spec;
429 	const struct hda_input_mux *imux;
430 	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
431 	unsigned int mux_idx;
432 	hda_nid_t nid = spec->capsrc_nids ?
433 		spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
434 	unsigned int type;
435 
436 	mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
437 	imux = &spec->input_mux[mux_idx];
438 
439 	type = get_wcaps_type(get_wcaps(codec, nid));
440 	if (type == AC_WID_AUD_MIX) {
441 		/* Matrix-mixer style (e.g. ALC882) */
442 		unsigned int *cur_val = &spec->cur_mux[adc_idx];
443 		unsigned int i, idx;
444 
445 		idx = ucontrol->value.enumerated.item[0];
446 		if (idx >= imux->num_items)
447 			idx = imux->num_items - 1;
448 		if (*cur_val == idx)
449 			return 0;
450 		for (i = 0; i < imux->num_items; i++) {
451 			unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
452 			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
453 						 imux->items[i].index,
454 						 HDA_AMP_MUTE, v);
455 		}
456 		*cur_val = idx;
457 		return 1;
458 	} else {
459 		/* MUX style (e.g. ALC880) */
460 		return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
461 					     &spec->cur_mux[adc_idx]);
462 	}
463 }
464 
465 /*
466  * channel mode setting
467  */
468 static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
469 			    struct snd_ctl_elem_info *uinfo)
470 {
471 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
472 	struct alc_spec *spec = codec->spec;
473 	return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
474 				    spec->num_channel_mode);
475 }
476 
477 static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
478 			   struct snd_ctl_elem_value *ucontrol)
479 {
480 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
481 	struct alc_spec *spec = codec->spec;
482 	return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
483 				   spec->num_channel_mode,
484 				   spec->ext_channel_count);
485 }
486 
487 static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
488 			   struct snd_ctl_elem_value *ucontrol)
489 {
490 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
491 	struct alc_spec *spec = codec->spec;
492 	int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
493 				      spec->num_channel_mode,
494 				      &spec->ext_channel_count);
495 	if (err >= 0 && !spec->const_channel_count) {
496 		spec->multiout.max_channels = spec->ext_channel_count;
497 		if (spec->need_dac_fix)
498 			spec->multiout.num_dacs = spec->multiout.max_channels / 2;
499 	}
500 	return err;
501 }
502 
503 /*
504  * Control the mode of pin widget settings via the mixer.  "pc" is used
505  * instead of "%" to avoid consequences of accidently treating the % as
506  * being part of a format specifier.  Maximum allowed length of a value is
507  * 63 characters plus NULL terminator.
508  *
509  * Note: some retasking pin complexes seem to ignore requests for input
510  * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
511  * are requested.  Therefore order this list so that this behaviour will not
512  * cause problems when mixer clients move through the enum sequentially.
513  * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
514  * March 2006.
515  */
516 static char *alc_pin_mode_names[] = {
517 	"Mic 50pc bias", "Mic 80pc bias",
518 	"Line in", "Line out", "Headphone out",
519 };
520 static unsigned char alc_pin_mode_values[] = {
521 	PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
522 };
523 /* The control can present all 5 options, or it can limit the options based
524  * in the pin being assumed to be exclusively an input or an output pin.  In
525  * addition, "input" pins may or may not process the mic bias option
526  * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
527  * accept requests for bias as of chip versions up to March 2006) and/or
528  * wiring in the computer.
529  */
530 #define ALC_PIN_DIR_IN              0x00
531 #define ALC_PIN_DIR_OUT             0x01
532 #define ALC_PIN_DIR_INOUT           0x02
533 #define ALC_PIN_DIR_IN_NOMICBIAS    0x03
534 #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
535 
536 /* Info about the pin modes supported by the different pin direction modes.
537  * For each direction the minimum and maximum values are given.
538  */
539 static signed char alc_pin_mode_dir_info[5][2] = {
540 	{ 0, 2 },    /* ALC_PIN_DIR_IN */
541 	{ 3, 4 },    /* ALC_PIN_DIR_OUT */
542 	{ 0, 4 },    /* ALC_PIN_DIR_INOUT */
543 	{ 2, 2 },    /* ALC_PIN_DIR_IN_NOMICBIAS */
544 	{ 2, 4 },    /* ALC_PIN_DIR_INOUT_NOMICBIAS */
545 };
546 #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
547 #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
548 #define alc_pin_mode_n_items(_dir) \
549 	(alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
550 
551 static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
552 			     struct snd_ctl_elem_info *uinfo)
553 {
554 	unsigned int item_num = uinfo->value.enumerated.item;
555 	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
556 
557 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
558 	uinfo->count = 1;
559 	uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
560 
561 	if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
562 		item_num = alc_pin_mode_min(dir);
563 	strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
564 	return 0;
565 }
566 
567 static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
568 			    struct snd_ctl_elem_value *ucontrol)
569 {
570 	unsigned int i;
571 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
572 	hda_nid_t nid = kcontrol->private_value & 0xffff;
573 	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
574 	long *valp = ucontrol->value.integer.value;
575 	unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
576 						 AC_VERB_GET_PIN_WIDGET_CONTROL,
577 						 0x00);
578 
579 	/* Find enumerated value for current pinctl setting */
580 	i = alc_pin_mode_min(dir);
581 	while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
582 		i++;
583 	*valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
584 	return 0;
585 }
586 
587 static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
588 			    struct snd_ctl_elem_value *ucontrol)
589 {
590 	signed int change;
591 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
592 	hda_nid_t nid = kcontrol->private_value & 0xffff;
593 	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
594 	long val = *ucontrol->value.integer.value;
595 	unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
596 						 AC_VERB_GET_PIN_WIDGET_CONTROL,
597 						 0x00);
598 
599 	if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
600 		val = alc_pin_mode_min(dir);
601 
602 	change = pinctl != alc_pin_mode_values[val];
603 	if (change) {
604 		/* Set pin mode to that requested */
605 		snd_hda_codec_write_cache(codec, nid, 0,
606 					  AC_VERB_SET_PIN_WIDGET_CONTROL,
607 					  alc_pin_mode_values[val]);
608 
609 		/* Also enable the retasking pin's input/output as required
610 		 * for the requested pin mode.  Enum values of 2 or less are
611 		 * input modes.
612 		 *
613 		 * Dynamically switching the input/output buffers probably
614 		 * reduces noise slightly (particularly on input) so we'll
615 		 * do it.  However, having both input and output buffers
616 		 * enabled simultaneously doesn't seem to be problematic if
617 		 * this turns out to be necessary in the future.
618 		 */
619 		if (val <= 2) {
620 			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
621 						 HDA_AMP_MUTE, HDA_AMP_MUTE);
622 			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
623 						 HDA_AMP_MUTE, 0);
624 		} else {
625 			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
626 						 HDA_AMP_MUTE, HDA_AMP_MUTE);
627 			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
628 						 HDA_AMP_MUTE, 0);
629 		}
630 	}
631 	return change;
632 }
633 
634 #define ALC_PIN_MODE(xname, nid, dir) \
635 	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
636 	  .info = alc_pin_mode_info, \
637 	  .get = alc_pin_mode_get, \
638 	  .put = alc_pin_mode_put, \
639 	  .private_value = nid | (dir<<16) }
640 
641 /* A switch control for ALC260 GPIO pins.  Multiple GPIOs can be ganged
642  * together using a mask with more than one bit set.  This control is
643  * currently used only by the ALC260 test model.  At this stage they are not
644  * needed for any "production" models.
645  */
646 #ifdef CONFIG_SND_DEBUG
647 #define alc_gpio_data_info	snd_ctl_boolean_mono_info
648 
649 static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
650 			     struct snd_ctl_elem_value *ucontrol)
651 {
652 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
653 	hda_nid_t nid = kcontrol->private_value & 0xffff;
654 	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
655 	long *valp = ucontrol->value.integer.value;
656 	unsigned int val = snd_hda_codec_read(codec, nid, 0,
657 					      AC_VERB_GET_GPIO_DATA, 0x00);
658 
659 	*valp = (val & mask) != 0;
660 	return 0;
661 }
662 static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
663 			     struct snd_ctl_elem_value *ucontrol)
664 {
665 	signed int change;
666 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
667 	hda_nid_t nid = kcontrol->private_value & 0xffff;
668 	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
669 	long val = *ucontrol->value.integer.value;
670 	unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
671 						    AC_VERB_GET_GPIO_DATA,
672 						    0x00);
673 
674 	/* Set/unset the masked GPIO bit(s) as needed */
675 	change = (val == 0 ? 0 : mask) != (gpio_data & mask);
676 	if (val == 0)
677 		gpio_data &= ~mask;
678 	else
679 		gpio_data |= mask;
680 	snd_hda_codec_write_cache(codec, nid, 0,
681 				  AC_VERB_SET_GPIO_DATA, gpio_data);
682 
683 	return change;
684 }
685 #define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
686 	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
687 	  .info = alc_gpio_data_info, \
688 	  .get = alc_gpio_data_get, \
689 	  .put = alc_gpio_data_put, \
690 	  .private_value = nid | (mask<<16) }
691 #endif   /* CONFIG_SND_DEBUG */
692 
693 /* A switch control to allow the enabling of the digital IO pins on the
694  * ALC260.  This is incredibly simplistic; the intention of this control is
695  * to provide something in the test model allowing digital outputs to be
696  * identified if present.  If models are found which can utilise these
697  * outputs a more complete mixer control can be devised for those models if
698  * necessary.
699  */
700 #ifdef CONFIG_SND_DEBUG
701 #define alc_spdif_ctrl_info	snd_ctl_boolean_mono_info
702 
703 static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
704 			      struct snd_ctl_elem_value *ucontrol)
705 {
706 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
707 	hda_nid_t nid = kcontrol->private_value & 0xffff;
708 	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
709 	long *valp = ucontrol->value.integer.value;
710 	unsigned int val = snd_hda_codec_read(codec, nid, 0,
711 					      AC_VERB_GET_DIGI_CONVERT_1, 0x00);
712 
713 	*valp = (val & mask) != 0;
714 	return 0;
715 }
716 static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
717 			      struct snd_ctl_elem_value *ucontrol)
718 {
719 	signed int change;
720 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
721 	hda_nid_t nid = kcontrol->private_value & 0xffff;
722 	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
723 	long val = *ucontrol->value.integer.value;
724 	unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
725 						    AC_VERB_GET_DIGI_CONVERT_1,
726 						    0x00);
727 
728 	/* Set/unset the masked control bit(s) as needed */
729 	change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
730 	if (val==0)
731 		ctrl_data &= ~mask;
732 	else
733 		ctrl_data |= mask;
734 	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
735 				  ctrl_data);
736 
737 	return change;
738 }
739 #define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
740 	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
741 	  .info = alc_spdif_ctrl_info, \
742 	  .get = alc_spdif_ctrl_get, \
743 	  .put = alc_spdif_ctrl_put, \
744 	  .private_value = nid | (mask<<16) }
745 #endif   /* CONFIG_SND_DEBUG */
746 
747 /* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
748  * Again, this is only used in the ALC26x test models to help identify when
749  * the EAPD line must be asserted for features to work.
750  */
751 #ifdef CONFIG_SND_DEBUG
752 #define alc_eapd_ctrl_info	snd_ctl_boolean_mono_info
753 
754 static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
755 			      struct snd_ctl_elem_value *ucontrol)
756 {
757 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
758 	hda_nid_t nid = kcontrol->private_value & 0xffff;
759 	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
760 	long *valp = ucontrol->value.integer.value;
761 	unsigned int val = snd_hda_codec_read(codec, nid, 0,
762 					      AC_VERB_GET_EAPD_BTLENABLE, 0x00);
763 
764 	*valp = (val & mask) != 0;
765 	return 0;
766 }
767 
768 static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
769 			      struct snd_ctl_elem_value *ucontrol)
770 {
771 	int change;
772 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
773 	hda_nid_t nid = kcontrol->private_value & 0xffff;
774 	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
775 	long val = *ucontrol->value.integer.value;
776 	unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
777 						    AC_VERB_GET_EAPD_BTLENABLE,
778 						    0x00);
779 
780 	/* Set/unset the masked control bit(s) as needed */
781 	change = (!val ? 0 : mask) != (ctrl_data & mask);
782 	if (!val)
783 		ctrl_data &= ~mask;
784 	else
785 		ctrl_data |= mask;
786 	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
787 				  ctrl_data);
788 
789 	return change;
790 }
791 
792 #define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
793 	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
794 	  .info = alc_eapd_ctrl_info, \
795 	  .get = alc_eapd_ctrl_get, \
796 	  .put = alc_eapd_ctrl_put, \
797 	  .private_value = nid | (mask<<16) }
798 #endif   /* CONFIG_SND_DEBUG */
799 
800 /*
801  * set up the input pin config (depending on the given auto-pin type)
802  */
803 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
804 			      int auto_pin_type)
805 {
806 	unsigned int val = PIN_IN;
807 
808 	if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
809 		unsigned int pincap;
810 		pincap = snd_hda_query_pin_caps(codec, nid);
811 		pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
812 		if (pincap & AC_PINCAP_VREF_80)
813 			val = PIN_VREF80;
814 		else if (pincap & AC_PINCAP_VREF_50)
815 			val = PIN_VREF50;
816 		else if (pincap & AC_PINCAP_VREF_100)
817 			val = PIN_VREF100;
818 		else if (pincap & AC_PINCAP_VREF_GRD)
819 			val = PIN_VREFGRD;
820 	}
821 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
822 }
823 
824 /*
825  */
826 static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
827 {
828 	if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
829 		return;
830 	spec->mixers[spec->num_mixers++] = mix;
831 }
832 
833 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
834 {
835 	if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
836 		return;
837 	spec->init_verbs[spec->num_init_verbs++] = verb;
838 }
839 
840 #ifdef CONFIG_PROC_FS
841 /*
842  * hook for proc
843  */
844 static void print_realtek_coef(struct snd_info_buffer *buffer,
845 			       struct hda_codec *codec, hda_nid_t nid)
846 {
847 	int coeff;
848 
849 	if (nid != 0x20)
850 		return;
851 	coeff = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
852 	snd_iprintf(buffer, "  Processing Coefficient: 0x%02x\n", coeff);
853 	coeff = snd_hda_codec_read(codec, nid, 0,
854 				   AC_VERB_GET_COEF_INDEX, 0);
855 	snd_iprintf(buffer, "  Coefficient Index: 0x%02x\n", coeff);
856 }
857 #else
858 #define print_realtek_coef	NULL
859 #endif
860 
861 /*
862  * set up from the preset table
863  */
864 static void setup_preset(struct hda_codec *codec,
865 			 const struct alc_config_preset *preset)
866 {
867 	struct alc_spec *spec = codec->spec;
868 	int i;
869 
870 	for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
871 		add_mixer(spec, preset->mixers[i]);
872 	spec->cap_mixer = preset->cap_mixer;
873 	for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
874 	     i++)
875 		add_verb(spec, preset->init_verbs[i]);
876 
877 	spec->channel_mode = preset->channel_mode;
878 	spec->num_channel_mode = preset->num_channel_mode;
879 	spec->need_dac_fix = preset->need_dac_fix;
880 	spec->const_channel_count = preset->const_channel_count;
881 
882 	if (preset->const_channel_count)
883 		spec->multiout.max_channels = preset->const_channel_count;
884 	else
885 		spec->multiout.max_channels = spec->channel_mode[0].channels;
886 	spec->ext_channel_count = spec->channel_mode[0].channels;
887 
888 	spec->multiout.num_dacs = preset->num_dacs;
889 	spec->multiout.dac_nids = preset->dac_nids;
890 	spec->multiout.dig_out_nid = preset->dig_out_nid;
891 	spec->multiout.slave_dig_outs = preset->slave_dig_outs;
892 	spec->multiout.hp_nid = preset->hp_nid;
893 
894 	spec->num_mux_defs = preset->num_mux_defs;
895 	if (!spec->num_mux_defs)
896 		spec->num_mux_defs = 1;
897 	spec->input_mux = preset->input_mux;
898 
899 	spec->num_adc_nids = preset->num_adc_nids;
900 	spec->adc_nids = preset->adc_nids;
901 	spec->capsrc_nids = preset->capsrc_nids;
902 	spec->dig_in_nid = preset->dig_in_nid;
903 
904 	spec->unsol_event = preset->unsol_event;
905 	spec->init_hook = preset->init_hook;
906 #ifdef CONFIG_SND_HDA_POWER_SAVE
907 	spec->power_hook = preset->power_hook;
908 	spec->loopback.amplist = preset->loopbacks;
909 #endif
910 
911 	if (preset->setup)
912 		preset->setup(codec);
913 }
914 
915 /* Enable GPIO mask and set output */
916 static struct hda_verb alc_gpio1_init_verbs[] = {
917 	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
918 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
919 	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
920 	{ }
921 };
922 
923 static struct hda_verb alc_gpio2_init_verbs[] = {
924 	{0x01, AC_VERB_SET_GPIO_MASK, 0x02},
925 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
926 	{0x01, AC_VERB_SET_GPIO_DATA, 0x02},
927 	{ }
928 };
929 
930 static struct hda_verb alc_gpio3_init_verbs[] = {
931 	{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
932 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
933 	{0x01, AC_VERB_SET_GPIO_DATA, 0x03},
934 	{ }
935 };
936 
937 /*
938  * Fix hardware PLL issue
939  * On some codecs, the analog PLL gating control must be off while
940  * the default value is 1.
941  */
942 static void alc_fix_pll(struct hda_codec *codec)
943 {
944 	struct alc_spec *spec = codec->spec;
945 	unsigned int val;
946 
947 	if (!spec->pll_nid)
948 		return;
949 	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
950 			    spec->pll_coef_idx);
951 	val = snd_hda_codec_read(codec, spec->pll_nid, 0,
952 				 AC_VERB_GET_PROC_COEF, 0);
953 	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
954 			    spec->pll_coef_idx);
955 	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
956 			    val & ~(1 << spec->pll_coef_bit));
957 }
958 
959 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
960 			     unsigned int coef_idx, unsigned int coef_bit)
961 {
962 	struct alc_spec *spec = codec->spec;
963 	spec->pll_nid = nid;
964 	spec->pll_coef_idx = coef_idx;
965 	spec->pll_coef_bit = coef_bit;
966 	alc_fix_pll(codec);
967 }
968 
969 static void alc_automute_pin(struct hda_codec *codec)
970 {
971 	struct alc_spec *spec = codec->spec;
972 	unsigned int nid = spec->autocfg.hp_pins[0];
973 	int i;
974 
975 	if (!nid)
976 		return;
977 	spec->jack_present = snd_hda_jack_detect(codec, nid);
978 	for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
979 		nid = spec->autocfg.speaker_pins[i];
980 		if (!nid)
981 			break;
982 		snd_hda_codec_write(codec, nid, 0,
983 				    AC_VERB_SET_PIN_WIDGET_CONTROL,
984 				    spec->jack_present ? 0 : PIN_OUT);
985 	}
986 }
987 
988 static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
989 				hda_nid_t nid)
990 {
991 	hda_nid_t conn[HDA_MAX_NUM_INPUTS];
992 	int i, nums;
993 
994 	nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
995 	for (i = 0; i < nums; i++)
996 		if (conn[i] == nid)
997 			return i;
998 	return -1;
999 }
1000 
1001 static void alc_mic_automute(struct hda_codec *codec)
1002 {
1003 	struct alc_spec *spec = codec->spec;
1004 	struct alc_mic_route *dead, *alive;
1005 	unsigned int present, type;
1006 	hda_nid_t cap_nid;
1007 
1008 	if (!spec->auto_mic)
1009 		return;
1010 	if (!spec->int_mic.pin || !spec->ext_mic.pin)
1011 		return;
1012 	if (snd_BUG_ON(!spec->adc_nids))
1013 		return;
1014 
1015 	cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1016 
1017 	present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1018 	if (present) {
1019 		alive = &spec->ext_mic;
1020 		dead = &spec->int_mic;
1021 	} else {
1022 		alive = &spec->int_mic;
1023 		dead = &spec->ext_mic;
1024 	}
1025 
1026 	type = get_wcaps_type(get_wcaps(codec, cap_nid));
1027 	if (type == AC_WID_AUD_MIX) {
1028 		/* Matrix-mixer style (e.g. ALC882) */
1029 		snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1030 					 alive->mux_idx,
1031 					 HDA_AMP_MUTE, 0);
1032 		snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1033 					 dead->mux_idx,
1034 					 HDA_AMP_MUTE, HDA_AMP_MUTE);
1035 	} else {
1036 		/* MUX style (e.g. ALC880) */
1037 		snd_hda_codec_write_cache(codec, cap_nid, 0,
1038 					  AC_VERB_SET_CONNECT_SEL,
1039 					  alive->mux_idx);
1040 	}
1041 
1042 	/* FIXME: analog mixer */
1043 }
1044 
1045 /* unsolicited event for HP jack sensing */
1046 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1047 {
1048 	if (codec->vendor_id == 0x10ec0880)
1049 		res >>= 28;
1050 	else
1051 		res >>= 26;
1052 	switch (res) {
1053 	case ALC880_HP_EVENT:
1054 		alc_automute_pin(codec);
1055 		break;
1056 	case ALC880_MIC_EVENT:
1057 		alc_mic_automute(codec);
1058 		break;
1059 	}
1060 }
1061 
1062 static void alc_inithook(struct hda_codec *codec)
1063 {
1064 	alc_automute_pin(codec);
1065 	alc_mic_automute(codec);
1066 }
1067 
1068 /* additional initialization for ALC888 variants */
1069 static void alc888_coef_init(struct hda_codec *codec)
1070 {
1071 	unsigned int tmp;
1072 
1073 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1074 	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1075 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1076 	if ((tmp & 0xf0) == 0x20)
1077 		/* alc888S-VC */
1078 		snd_hda_codec_read(codec, 0x20, 0,
1079 				   AC_VERB_SET_PROC_COEF, 0x830);
1080 	 else
1081 		 /* alc888-VB */
1082 		 snd_hda_codec_read(codec, 0x20, 0,
1083 				    AC_VERB_SET_PROC_COEF, 0x3030);
1084 }
1085 
1086 static void alc889_coef_init(struct hda_codec *codec)
1087 {
1088 	unsigned int tmp;
1089 
1090 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1091 	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1092 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1093 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1094 }
1095 
1096 static void alc_auto_init_amp(struct hda_codec *codec, int type)
1097 {
1098 	unsigned int tmp;
1099 
1100 	switch (type) {
1101 	case ALC_INIT_GPIO1:
1102 		snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1103 		break;
1104 	case ALC_INIT_GPIO2:
1105 		snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1106 		break;
1107 	case ALC_INIT_GPIO3:
1108 		snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1109 		break;
1110 	case ALC_INIT_DEFAULT:
1111 		switch (codec->vendor_id) {
1112 		case 0x10ec0260:
1113 			snd_hda_codec_write(codec, 0x0f, 0,
1114 					    AC_VERB_SET_EAPD_BTLENABLE, 2);
1115 			snd_hda_codec_write(codec, 0x10, 0,
1116 					    AC_VERB_SET_EAPD_BTLENABLE, 2);
1117 			break;
1118 		case 0x10ec0262:
1119 		case 0x10ec0267:
1120 		case 0x10ec0268:
1121 		case 0x10ec0269:
1122 		case 0x10ec0272:
1123 		case 0x10ec0660:
1124 		case 0x10ec0662:
1125 		case 0x10ec0663:
1126 		case 0x10ec0862:
1127 		case 0x10ec0889:
1128 			snd_hda_codec_write(codec, 0x14, 0,
1129 					    AC_VERB_SET_EAPD_BTLENABLE, 2);
1130 			snd_hda_codec_write(codec, 0x15, 0,
1131 					    AC_VERB_SET_EAPD_BTLENABLE, 2);
1132 			break;
1133 		}
1134 		switch (codec->vendor_id) {
1135 		case 0x10ec0260:
1136 			snd_hda_codec_write(codec, 0x1a, 0,
1137 					    AC_VERB_SET_COEF_INDEX, 7);
1138 			tmp = snd_hda_codec_read(codec, 0x1a, 0,
1139 						 AC_VERB_GET_PROC_COEF, 0);
1140 			snd_hda_codec_write(codec, 0x1a, 0,
1141 					    AC_VERB_SET_COEF_INDEX, 7);
1142 			snd_hda_codec_write(codec, 0x1a, 0,
1143 					    AC_VERB_SET_PROC_COEF,
1144 					    tmp | 0x2010);
1145 			break;
1146 		case 0x10ec0262:
1147 		case 0x10ec0880:
1148 		case 0x10ec0882:
1149 		case 0x10ec0883:
1150 		case 0x10ec0885:
1151 		case 0x10ec0887:
1152 		case 0x10ec0889:
1153 			alc889_coef_init(codec);
1154 			break;
1155 		case 0x10ec0888:
1156 			alc888_coef_init(codec);
1157 			break;
1158 		case 0x10ec0267:
1159 		case 0x10ec0268:
1160 			snd_hda_codec_write(codec, 0x20, 0,
1161 					    AC_VERB_SET_COEF_INDEX, 7);
1162 			tmp = snd_hda_codec_read(codec, 0x20, 0,
1163 						 AC_VERB_GET_PROC_COEF, 0);
1164 			snd_hda_codec_write(codec, 0x20, 0,
1165 					    AC_VERB_SET_COEF_INDEX, 7);
1166 			snd_hda_codec_write(codec, 0x20, 0,
1167 					    AC_VERB_SET_PROC_COEF,
1168 					    tmp | 0x3000);
1169 			break;
1170 		}
1171 		break;
1172 	}
1173 }
1174 
1175 static void alc_init_auto_hp(struct hda_codec *codec)
1176 {
1177 	struct alc_spec *spec = codec->spec;
1178 
1179 	if (!spec->autocfg.hp_pins[0])
1180 		return;
1181 
1182 	if (!spec->autocfg.speaker_pins[0]) {
1183 		if (spec->autocfg.line_out_pins[0] &&
1184 		    spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
1185 			spec->autocfg.speaker_pins[0] =
1186 				spec->autocfg.line_out_pins[0];
1187 		else
1188 			return;
1189 	}
1190 
1191 	snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1192 		    spec->autocfg.hp_pins[0]);
1193 	snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1194 				  AC_VERB_SET_UNSOLICITED_ENABLE,
1195 				  AC_USRSP_EN | ALC880_HP_EVENT);
1196 	spec->unsol_event = alc_sku_unsol_event;
1197 }
1198 
1199 static void alc_init_auto_mic(struct hda_codec *codec)
1200 {
1201 	struct alc_spec *spec = codec->spec;
1202 	struct auto_pin_cfg *cfg = &spec->autocfg;
1203 	hda_nid_t fixed, ext;
1204 	int i;
1205 
1206 	/* there must be only two mic inputs exclusively */
1207 	for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1208 		if (cfg->input_pins[i])
1209 			return;
1210 
1211 	fixed = ext = 0;
1212 	for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1213 		hda_nid_t nid = cfg->input_pins[i];
1214 		unsigned int defcfg;
1215 		if (!nid)
1216 			return;
1217 		defcfg = snd_hda_codec_get_pincfg(codec, nid);
1218 		switch (get_defcfg_connect(defcfg)) {
1219 		case AC_JACK_PORT_FIXED:
1220 			if (fixed)
1221 				return; /* already occupied */
1222 			fixed = nid;
1223 			break;
1224 		case AC_JACK_PORT_COMPLEX:
1225 			if (ext)
1226 				return; /* already occupied */
1227 			ext = nid;
1228 			break;
1229 		default:
1230 			return; /* invalid entry */
1231 		}
1232 	}
1233 	if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1234 		return; /* no unsol support */
1235 	snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1236 		    ext, fixed);
1237 	spec->ext_mic.pin = ext;
1238 	spec->int_mic.pin = fixed;
1239 	spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1240 	spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1241 	spec->auto_mic = 1;
1242 	snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1243 				  AC_VERB_SET_UNSOLICITED_ENABLE,
1244 				  AC_USRSP_EN | ALC880_MIC_EVENT);
1245 	spec->unsol_event = alc_sku_unsol_event;
1246 }
1247 
1248 /* check subsystem ID and set up device-specific initialization;
1249  * return 1 if initialized, 0 if invalid SSID
1250  */
1251 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1252  *	31 ~ 16 :	Manufacture ID
1253  *	15 ~ 8	:	SKU ID
1254  *	7  ~ 0	:	Assembly ID
1255  *	port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1256  */
1257 static int alc_subsystem_id(struct hda_codec *codec,
1258 			    hda_nid_t porta, hda_nid_t porte,
1259 			    hda_nid_t portd)
1260 {
1261 	unsigned int ass, tmp, i;
1262 	unsigned nid;
1263 	struct alc_spec *spec = codec->spec;
1264 
1265 	ass = codec->subsystem_id & 0xffff;
1266 	if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1267 		goto do_sku;
1268 
1269 	/* invalid SSID, check the special NID pin defcfg instead */
1270 	/*
1271 	 * 31~30	: port connectivity
1272 	 * 29~21	: reserve
1273 	 * 20		: PCBEEP input
1274 	 * 19~16	: Check sum (15:1)
1275 	 * 15~1		: Custom
1276 	 * 0		: override
1277 	*/
1278 	nid = 0x1d;
1279 	if (codec->vendor_id == 0x10ec0260)
1280 		nid = 0x17;
1281 	ass = snd_hda_codec_get_pincfg(codec, nid);
1282 	snd_printd("realtek: No valid SSID, "
1283 		   "checking pincfg 0x%08x for NID 0x%x\n",
1284 		   ass, nid);
1285 	if (!(ass & 1) && !(ass & 0x100000))
1286 		return 0;
1287 	if ((ass >> 30) != 1)	/* no physical connection */
1288 		return 0;
1289 
1290 	/* check sum */
1291 	tmp = 0;
1292 	for (i = 1; i < 16; i++) {
1293 		if ((ass >> i) & 1)
1294 			tmp++;
1295 	}
1296 	if (((ass >> 16) & 0xf) != tmp)
1297 		return 0;
1298 do_sku:
1299 	snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1300 		   ass & 0xffff, codec->vendor_id);
1301 	/*
1302 	 * 0 : override
1303 	 * 1 :	Swap Jack
1304 	 * 2 : 0 --> Desktop, 1 --> Laptop
1305 	 * 3~5 : External Amplifier control
1306 	 * 7~6 : Reserved
1307 	*/
1308 	tmp = (ass & 0x38) >> 3;	/* external Amp control */
1309 	switch (tmp) {
1310 	case 1:
1311 		spec->init_amp = ALC_INIT_GPIO1;
1312 		break;
1313 	case 3:
1314 		spec->init_amp = ALC_INIT_GPIO2;
1315 		break;
1316 	case 7:
1317 		spec->init_amp = ALC_INIT_GPIO3;
1318 		break;
1319 	case 5:
1320 		spec->init_amp = ALC_INIT_DEFAULT;
1321 		break;
1322 	}
1323 
1324 	/* is laptop or Desktop and enable the function "Mute internal speaker
1325 	 * when the external headphone out jack is plugged"
1326 	 */
1327 	if (!(ass & 0x8000))
1328 		return 1;
1329 	/*
1330 	 * 10~8 : Jack location
1331 	 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1332 	 * 14~13: Resvered
1333 	 * 15   : 1 --> enable the function "Mute internal speaker
1334 	 *	        when the external headphone out jack is plugged"
1335 	 */
1336 	if (!spec->autocfg.hp_pins[0]) {
1337 		hda_nid_t nid;
1338 		tmp = (ass >> 11) & 0x3;	/* HP to chassis */
1339 		if (tmp == 0)
1340 			nid = porta;
1341 		else if (tmp == 1)
1342 			nid = porte;
1343 		else if (tmp == 2)
1344 			nid = portd;
1345 		else
1346 			return 1;
1347 		for (i = 0; i < spec->autocfg.line_outs; i++)
1348 			if (spec->autocfg.line_out_pins[i] == nid)
1349 				return 1;
1350 		spec->autocfg.hp_pins[0] = nid;
1351 	}
1352 
1353 	alc_init_auto_hp(codec);
1354 	alc_init_auto_mic(codec);
1355 	return 1;
1356 }
1357 
1358 static void alc_ssid_check(struct hda_codec *codec,
1359 			   hda_nid_t porta, hda_nid_t porte, hda_nid_t portd)
1360 {
1361 	if (!alc_subsystem_id(codec, porta, porte, portd)) {
1362 		struct alc_spec *spec = codec->spec;
1363 		snd_printd("realtek: "
1364 			   "Enable default setup for auto mode as fallback\n");
1365 		spec->init_amp = ALC_INIT_DEFAULT;
1366 		alc_init_auto_hp(codec);
1367 		alc_init_auto_mic(codec);
1368 	}
1369 }
1370 
1371 /*
1372  * Fix-up pin default configurations and add default verbs
1373  */
1374 
1375 struct alc_pincfg {
1376 	hda_nid_t nid;
1377 	u32 val;
1378 };
1379 
1380 struct alc_fixup {
1381 	const struct alc_pincfg *pins;
1382 	const struct hda_verb *verbs;
1383 };
1384 
1385 static void alc_pick_fixup(struct hda_codec *codec,
1386 			   const struct snd_pci_quirk *quirk,
1387 			   const struct alc_fixup *fix)
1388 {
1389 	const struct alc_pincfg *cfg;
1390 
1391 	quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1392 	if (!quirk)
1393 		return;
1394 
1395 	fix += quirk->value;
1396 	cfg = fix->pins;
1397 	if (cfg) {
1398 		for (; cfg->nid; cfg++)
1399 			snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1400 	}
1401 	if (fix->verbs)
1402 		add_verb(codec->spec, fix->verbs);
1403 }
1404 
1405 static int alc_read_coef_idx(struct hda_codec *codec,
1406 			unsigned int coef_idx)
1407 {
1408 	unsigned int val;
1409 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1410 		    		coef_idx);
1411 	val = snd_hda_codec_read(codec, 0x20, 0,
1412 			 	AC_VERB_GET_PROC_COEF, 0);
1413 	return val;
1414 }
1415 
1416 /*
1417  * ALC888
1418  */
1419 
1420 /*
1421  * 2ch mode
1422  */
1423 static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1424 /* Mic-in jack as mic in */
1425 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1426 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1427 /* Line-in jack as Line in */
1428 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1429 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1430 /* Line-Out as Front */
1431 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1432 	{ } /* end */
1433 };
1434 
1435 /*
1436  * 4ch mode
1437  */
1438 static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1439 /* Mic-in jack as mic in */
1440 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1441 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1442 /* Line-in jack as Surround */
1443 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1444 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1445 /* Line-Out as Front */
1446 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1447 	{ } /* end */
1448 };
1449 
1450 /*
1451  * 6ch mode
1452  */
1453 static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1454 /* Mic-in jack as CLFE */
1455 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1456 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1457 /* Line-in jack as Surround */
1458 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1459 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1460 /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1461 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1462 	{ } /* end */
1463 };
1464 
1465 /*
1466  * 8ch mode
1467  */
1468 static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1469 /* Mic-in jack as CLFE */
1470 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1471 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1472 /* Line-in jack as Surround */
1473 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1474 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1475 /* Line-Out as Side */
1476 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1477 	{ } /* end */
1478 };
1479 
1480 static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1481 	{ 2, alc888_4ST_ch2_intel_init },
1482 	{ 4, alc888_4ST_ch4_intel_init },
1483 	{ 6, alc888_4ST_ch6_intel_init },
1484 	{ 8, alc888_4ST_ch8_intel_init },
1485 };
1486 
1487 /*
1488  * ALC888 Fujitsu Siemens Amillo xa3530
1489  */
1490 
1491 static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1492 /* Front Mic: set to PIN_IN (empty by default) */
1493 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1494 /* Connect Internal HP to Front */
1495 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1496 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1497 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1498 /* Connect Bass HP to Front */
1499 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1500 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1501 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1502 /* Connect Line-Out side jack (SPDIF) to Side */
1503 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1504 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1505 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1506 /* Connect Mic jack to CLFE */
1507 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1508 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1509 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1510 /* Connect Line-in jack to Surround */
1511 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1512 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1513 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1514 /* Connect HP out jack to Front */
1515 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1516 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1517 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1518 /* Enable unsolicited event for HP jack and Line-out jack */
1519 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1520 	{0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1521 	{}
1522 };
1523 
1524 static void alc_automute_amp(struct hda_codec *codec)
1525 {
1526 	struct alc_spec *spec = codec->spec;
1527 	unsigned int mute;
1528 	hda_nid_t nid;
1529 	int i;
1530 
1531 	spec->jack_present = 0;
1532 	for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1533 		nid = spec->autocfg.hp_pins[i];
1534 		if (!nid)
1535 			break;
1536 		if (snd_hda_jack_detect(codec, nid)) {
1537 			spec->jack_present = 1;
1538 			break;
1539 		}
1540 	}
1541 
1542 	mute = spec->jack_present ? HDA_AMP_MUTE : 0;
1543 	/* Toggle internal speakers muting */
1544 	for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1545 		nid = spec->autocfg.speaker_pins[i];
1546 		if (!nid)
1547 			break;
1548 		snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1549 					 HDA_AMP_MUTE, mute);
1550 	}
1551 }
1552 
1553 static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1554 					 unsigned int res)
1555 {
1556 	if (codec->vendor_id == 0x10ec0880)
1557 		res >>= 28;
1558 	else
1559 		res >>= 26;
1560 	if (res == ALC880_HP_EVENT)
1561 		alc_automute_amp(codec);
1562 }
1563 
1564 static void alc889_automute_setup(struct hda_codec *codec)
1565 {
1566 	struct alc_spec *spec = codec->spec;
1567 
1568 	spec->autocfg.hp_pins[0] = 0x15;
1569 	spec->autocfg.speaker_pins[0] = 0x14;
1570 	spec->autocfg.speaker_pins[1] = 0x16;
1571 	spec->autocfg.speaker_pins[2] = 0x17;
1572 	spec->autocfg.speaker_pins[3] = 0x19;
1573 	spec->autocfg.speaker_pins[4] = 0x1a;
1574 }
1575 
1576 static void alc889_intel_init_hook(struct hda_codec *codec)
1577 {
1578 	alc889_coef_init(codec);
1579 	alc_automute_amp(codec);
1580 }
1581 
1582 static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
1583 {
1584 	struct alc_spec *spec = codec->spec;
1585 
1586 	spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1587 	spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1588 	spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1589 	spec->autocfg.speaker_pins[1] = 0x15; /* bass */
1590 }
1591 
1592 /*
1593  * ALC888 Acer Aspire 4930G model
1594  */
1595 
1596 static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1597 /* Front Mic: set to PIN_IN (empty by default) */
1598 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1599 /* Unselect Front Mic by default in input mixer 3 */
1600 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1601 /* Enable unsolicited event for HP jack */
1602 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1603 /* Connect Internal HP to front */
1604 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1605 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1606 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1607 /* Connect HP out to front */
1608 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1609 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1610 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1611 	{ }
1612 };
1613 
1614 /*
1615  * ALC888 Acer Aspire 6530G model
1616  */
1617 
1618 static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1619 /* Bias voltage on for external mic port */
1620 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
1621 /* Front Mic: set to PIN_IN (empty by default) */
1622 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1623 /* Unselect Front Mic by default in input mixer 3 */
1624 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1625 /* Enable unsolicited event for HP jack */
1626 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1627 /* Enable speaker output */
1628 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1629 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1630 /* Enable headphone output */
1631 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1632 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1633 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1634 	{ }
1635 };
1636 
1637 /*
1638  * ALC889 Acer Aspire 8930G model
1639  */
1640 
1641 static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
1642 /* Front Mic: set to PIN_IN (empty by default) */
1643 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1644 /* Unselect Front Mic by default in input mixer 3 */
1645 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1646 /* Enable unsolicited event for HP jack */
1647 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1648 /* Connect Internal Front to Front */
1649 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1650 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1651 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1652 /* Connect Internal Rear to Rear */
1653 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1654 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1655 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1656 /* Connect Internal CLFE to CLFE */
1657 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1658 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1659 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1660 /* Connect HP out to Front */
1661 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1662 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1663 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1664 /* Enable all DACs */
1665 /*  DAC DISABLE/MUTE 1? */
1666 /*  setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1667 	{0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1668 	{0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1669 /*  DAC DISABLE/MUTE 2? */
1670 /*  some bit here disables the other DACs. Init=0x4900 */
1671 	{0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1672 	{0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1673 /* DMIC fix
1674  * This laptop has a stereo digital microphone. The mics are only 1cm apart
1675  * which makes the stereo useless. However, either the mic or the ALC889
1676  * makes the signal become a difference/sum signal instead of standard
1677  * stereo, which is annoying. So instead we flip this bit which makes the
1678  * codec replicate the sum signal to both channels, turning it into a
1679  * normal mono mic.
1680  */
1681 /*  DMIC_CONTROL? Init value = 0x0001 */
1682 	{0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1683 	{0x20, AC_VERB_SET_PROC_COEF, 0x0003},
1684 	{ }
1685 };
1686 
1687 static struct hda_input_mux alc888_2_capture_sources[2] = {
1688 	/* Front mic only available on one ADC */
1689 	{
1690 		.num_items = 4,
1691 		.items = {
1692 			{ "Mic", 0x0 },
1693 			{ "Line", 0x2 },
1694 			{ "CD", 0x4 },
1695 			{ "Front Mic", 0xb },
1696 		},
1697 	},
1698 	{
1699 		.num_items = 3,
1700 		.items = {
1701 			{ "Mic", 0x0 },
1702 			{ "Line", 0x2 },
1703 			{ "CD", 0x4 },
1704 		},
1705 	}
1706 };
1707 
1708 static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
1709 	/* Interal mic only available on one ADC */
1710 	{
1711 		.num_items = 5,
1712 		.items = {
1713 			{ "Ext Mic", 0x0 },
1714 			{ "Line In", 0x2 },
1715 			{ "CD", 0x4 },
1716 			{ "Input Mix", 0xa },
1717 			{ "Int Mic", 0xb },
1718 		},
1719 	},
1720 	{
1721 		.num_items = 4,
1722 		.items = {
1723 			{ "Ext Mic", 0x0 },
1724 			{ "Line In", 0x2 },
1725 			{ "CD", 0x4 },
1726 			{ "Input Mix", 0xa },
1727 		},
1728 	}
1729 };
1730 
1731 static struct hda_input_mux alc889_capture_sources[3] = {
1732 	/* Digital mic only available on first "ADC" */
1733 	{
1734 		.num_items = 5,
1735 		.items = {
1736 			{ "Mic", 0x0 },
1737 			{ "Line", 0x2 },
1738 			{ "CD", 0x4 },
1739 			{ "Front Mic", 0xb },
1740 			{ "Input Mix", 0xa },
1741 		},
1742 	},
1743 	{
1744 		.num_items = 4,
1745 		.items = {
1746 			{ "Mic", 0x0 },
1747 			{ "Line", 0x2 },
1748 			{ "CD", 0x4 },
1749 			{ "Input Mix", 0xa },
1750 		},
1751 	},
1752 	{
1753 		.num_items = 4,
1754 		.items = {
1755 			{ "Mic", 0x0 },
1756 			{ "Line", 0x2 },
1757 			{ "CD", 0x4 },
1758 			{ "Input Mix", 0xa },
1759 		},
1760 	}
1761 };
1762 
1763 static struct snd_kcontrol_new alc888_base_mixer[] = {
1764 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1765 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1766 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1767 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1768 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1769 		HDA_OUTPUT),
1770 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1771 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1772 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1773 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1774 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1775 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1776 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1777 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1778 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1779 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1780 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1781 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1782 	{ } /* end */
1783 };
1784 
1785 static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
1786 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1787 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1788 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1789 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1790 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1791 		HDA_OUTPUT),
1792 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1793 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1794 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1795 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1796 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1797 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1798 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1799 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1800 	{ } /* end */
1801 };
1802 
1803 
1804 static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
1805 {
1806 	struct alc_spec *spec = codec->spec;
1807 
1808 	spec->autocfg.hp_pins[0] = 0x15;
1809 	spec->autocfg.speaker_pins[0] = 0x14;
1810 	spec->autocfg.speaker_pins[1] = 0x16;
1811 	spec->autocfg.speaker_pins[2] = 0x17;
1812 }
1813 
1814 static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
1815 {
1816 	struct alc_spec *spec = codec->spec;
1817 
1818 	spec->autocfg.hp_pins[0] = 0x15;
1819 	spec->autocfg.speaker_pins[0] = 0x14;
1820 	spec->autocfg.speaker_pins[1] = 0x16;
1821 	spec->autocfg.speaker_pins[2] = 0x17;
1822 }
1823 
1824 static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
1825 {
1826 	struct alc_spec *spec = codec->spec;
1827 
1828 	spec->autocfg.hp_pins[0] = 0x15;
1829 	spec->autocfg.speaker_pins[0] = 0x14;
1830 	spec->autocfg.speaker_pins[1] = 0x16;
1831 	spec->autocfg.speaker_pins[2] = 0x1b;
1832 }
1833 
1834 #ifdef CONFIG_SND_HDA_POWER_SAVE
1835 static void alc889_power_eapd(struct hda_codec *codec, int power)
1836 {
1837 	snd_hda_codec_write(codec, 0x14, 0,
1838 			    AC_VERB_SET_EAPD_BTLENABLE, power ? 2 : 0);
1839 	snd_hda_codec_write(codec, 0x15, 0,
1840 			    AC_VERB_SET_EAPD_BTLENABLE, power ? 2 : 0);
1841 }
1842 #endif
1843 
1844 /*
1845  * ALC880 3-stack model
1846  *
1847  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
1848  * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
1849  *                 F-Mic = 0x1b, HP = 0x19
1850  */
1851 
1852 static hda_nid_t alc880_dac_nids[4] = {
1853 	/* front, rear, clfe, rear_surr */
1854 	0x02, 0x05, 0x04, 0x03
1855 };
1856 
1857 static hda_nid_t alc880_adc_nids[3] = {
1858 	/* ADC0-2 */
1859 	0x07, 0x08, 0x09,
1860 };
1861 
1862 /* The datasheet says the node 0x07 is connected from inputs,
1863  * but it shows zero connection in the real implementation on some devices.
1864  * Note: this is a 915GAV bug, fixed on 915GLV
1865  */
1866 static hda_nid_t alc880_adc_nids_alt[2] = {
1867 	/* ADC1-2 */
1868 	0x08, 0x09,
1869 };
1870 
1871 #define ALC880_DIGOUT_NID	0x06
1872 #define ALC880_DIGIN_NID	0x0a
1873 
1874 static struct hda_input_mux alc880_capture_source = {
1875 	.num_items = 4,
1876 	.items = {
1877 		{ "Mic", 0x0 },
1878 		{ "Front Mic", 0x3 },
1879 		{ "Line", 0x2 },
1880 		{ "CD", 0x4 },
1881 	},
1882 };
1883 
1884 /* channel source setting (2/6 channel selection for 3-stack) */
1885 /* 2ch mode */
1886 static struct hda_verb alc880_threestack_ch2_init[] = {
1887 	/* set line-in to input, mute it */
1888 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1889 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1890 	/* set mic-in to input vref 80%, mute it */
1891 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1892 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1893 	{ } /* end */
1894 };
1895 
1896 /* 6ch mode */
1897 static struct hda_verb alc880_threestack_ch6_init[] = {
1898 	/* set line-in to output, unmute it */
1899 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1900 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1901 	/* set mic-in to output, unmute it */
1902 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1903 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1904 	{ } /* end */
1905 };
1906 
1907 static struct hda_channel_mode alc880_threestack_modes[2] = {
1908 	{ 2, alc880_threestack_ch2_init },
1909 	{ 6, alc880_threestack_ch6_init },
1910 };
1911 
1912 static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
1913 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1914 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1915 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1916 	HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
1917 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1918 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1919 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1920 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1921 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1922 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1923 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1924 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1925 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1926 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1927 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
1928 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
1929 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
1930 	{
1931 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1932 		.name = "Channel Mode",
1933 		.info = alc_ch_mode_info,
1934 		.get = alc_ch_mode_get,
1935 		.put = alc_ch_mode_put,
1936 	},
1937 	{ } /* end */
1938 };
1939 
1940 /* capture mixer elements */
1941 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
1942 			    struct snd_ctl_elem_info *uinfo)
1943 {
1944 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1945 	struct alc_spec *spec = codec->spec;
1946 	int err;
1947 
1948 	mutex_lock(&codec->control_mutex);
1949 	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1950 						      HDA_INPUT);
1951 	err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
1952 	mutex_unlock(&codec->control_mutex);
1953 	return err;
1954 }
1955 
1956 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1957 			   unsigned int size, unsigned int __user *tlv)
1958 {
1959 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1960 	struct alc_spec *spec = codec->spec;
1961 	int err;
1962 
1963 	mutex_lock(&codec->control_mutex);
1964 	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1965 						      HDA_INPUT);
1966 	err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
1967 	mutex_unlock(&codec->control_mutex);
1968 	return err;
1969 }
1970 
1971 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
1972 			     struct snd_ctl_elem_value *ucontrol);
1973 
1974 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
1975 				 struct snd_ctl_elem_value *ucontrol,
1976 				 getput_call_t func)
1977 {
1978 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1979 	struct alc_spec *spec = codec->spec;
1980 	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1981 	int err;
1982 
1983 	mutex_lock(&codec->control_mutex);
1984 	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
1985 						      3, 0, HDA_INPUT);
1986 	err = func(kcontrol, ucontrol);
1987 	mutex_unlock(&codec->control_mutex);
1988 	return err;
1989 }
1990 
1991 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
1992 			   struct snd_ctl_elem_value *ucontrol)
1993 {
1994 	return alc_cap_getput_caller(kcontrol, ucontrol,
1995 				     snd_hda_mixer_amp_volume_get);
1996 }
1997 
1998 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
1999 			   struct snd_ctl_elem_value *ucontrol)
2000 {
2001 	return alc_cap_getput_caller(kcontrol, ucontrol,
2002 				     snd_hda_mixer_amp_volume_put);
2003 }
2004 
2005 /* capture mixer elements */
2006 #define alc_cap_sw_info		snd_ctl_boolean_stereo_info
2007 
2008 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
2009 			  struct snd_ctl_elem_value *ucontrol)
2010 {
2011 	return alc_cap_getput_caller(kcontrol, ucontrol,
2012 				     snd_hda_mixer_amp_switch_get);
2013 }
2014 
2015 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2016 			  struct snd_ctl_elem_value *ucontrol)
2017 {
2018 	return alc_cap_getput_caller(kcontrol, ucontrol,
2019 				     snd_hda_mixer_amp_switch_put);
2020 }
2021 
2022 #define _DEFINE_CAPMIX(num) \
2023 	{ \
2024 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2025 		.name = "Capture Switch", \
2026 		.access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2027 		.count = num, \
2028 		.info = alc_cap_sw_info, \
2029 		.get = alc_cap_sw_get, \
2030 		.put = alc_cap_sw_put, \
2031 	}, \
2032 	{ \
2033 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2034 		.name = "Capture Volume", \
2035 		.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2036 			   SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2037 			   SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2038 		.count = num, \
2039 		.info = alc_cap_vol_info, \
2040 		.get = alc_cap_vol_get, \
2041 		.put = alc_cap_vol_put, \
2042 		.tlv = { .c = alc_cap_vol_tlv }, \
2043 	}
2044 
2045 #define _DEFINE_CAPSRC(num) \
2046 	{ \
2047 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2048 		/* .name = "Capture Source", */ \
2049 		.name = "Input Source", \
2050 		.count = num, \
2051 		.info = alc_mux_enum_info, \
2052 		.get = alc_mux_enum_get, \
2053 		.put = alc_mux_enum_put, \
2054 	}
2055 
2056 #define DEFINE_CAPMIX(num) \
2057 static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2058 	_DEFINE_CAPMIX(num),				      \
2059 	_DEFINE_CAPSRC(num),				      \
2060 	{ } /* end */					      \
2061 }
2062 
2063 #define DEFINE_CAPMIX_NOSRC(num) \
2064 static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2065 	_DEFINE_CAPMIX(num),					    \
2066 	{ } /* end */						    \
2067 }
2068 
2069 /* up to three ADCs */
2070 DEFINE_CAPMIX(1);
2071 DEFINE_CAPMIX(2);
2072 DEFINE_CAPMIX(3);
2073 DEFINE_CAPMIX_NOSRC(1);
2074 DEFINE_CAPMIX_NOSRC(2);
2075 DEFINE_CAPMIX_NOSRC(3);
2076 
2077 /*
2078  * ALC880 5-stack model
2079  *
2080  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2081  *      Side = 0x02 (0xd)
2082  * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2083  *                 Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2084  */
2085 
2086 /* additional mixers to alc880_three_stack_mixer */
2087 static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2088 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2089 	HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2090 	{ } /* end */
2091 };
2092 
2093 /* channel source setting (6/8 channel selection for 5-stack) */
2094 /* 6ch mode */
2095 static struct hda_verb alc880_fivestack_ch6_init[] = {
2096 	/* set line-in to input, mute it */
2097 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2098 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2099 	{ } /* end */
2100 };
2101 
2102 /* 8ch mode */
2103 static struct hda_verb alc880_fivestack_ch8_init[] = {
2104 	/* set line-in to output, unmute it */
2105 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2106 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2107 	{ } /* end */
2108 };
2109 
2110 static struct hda_channel_mode alc880_fivestack_modes[2] = {
2111 	{ 6, alc880_fivestack_ch6_init },
2112 	{ 8, alc880_fivestack_ch8_init },
2113 };
2114 
2115 
2116 /*
2117  * ALC880 6-stack model
2118  *
2119  * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2120  *      Side = 0x05 (0x0f)
2121  * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2122  *   Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2123  */
2124 
2125 static hda_nid_t alc880_6st_dac_nids[4] = {
2126 	/* front, rear, clfe, rear_surr */
2127 	0x02, 0x03, 0x04, 0x05
2128 };
2129 
2130 static struct hda_input_mux alc880_6stack_capture_source = {
2131 	.num_items = 4,
2132 	.items = {
2133 		{ "Mic", 0x0 },
2134 		{ "Front Mic", 0x1 },
2135 		{ "Line", 0x2 },
2136 		{ "CD", 0x4 },
2137 	},
2138 };
2139 
2140 /* fixed 8-channels */
2141 static struct hda_channel_mode alc880_sixstack_modes[1] = {
2142 	{ 8, NULL },
2143 };
2144 
2145 static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2146 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2147 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2148 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2149 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2150 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2151 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2152 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2153 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2154 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2155 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2156 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2157 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2158 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2159 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2160 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2161 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2162 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2163 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2164 	{
2165 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2166 		.name = "Channel Mode",
2167 		.info = alc_ch_mode_info,
2168 		.get = alc_ch_mode_get,
2169 		.put = alc_ch_mode_put,
2170 	},
2171 	{ } /* end */
2172 };
2173 
2174 
2175 /*
2176  * ALC880 W810 model
2177  *
2178  * W810 has rear IO for:
2179  * Front (DAC 02)
2180  * Surround (DAC 03)
2181  * Center/LFE (DAC 04)
2182  * Digital out (06)
2183  *
2184  * The system also has a pair of internal speakers, and a headphone jack.
2185  * These are both connected to Line2 on the codec, hence to DAC 02.
2186  *
2187  * There is a variable resistor to control the speaker or headphone
2188  * volume. This is a hardware-only device without a software API.
2189  *
2190  * Plugging headphones in will disable the internal speakers. This is
2191  * implemented in hardware, not via the driver using jack sense. In
2192  * a similar fashion, plugging into the rear socket marked "front" will
2193  * disable both the speakers and headphones.
2194  *
2195  * For input, there's a microphone jack, and an "audio in" jack.
2196  * These may not do anything useful with this driver yet, because I
2197  * haven't setup any initialization verbs for these yet...
2198  */
2199 
2200 static hda_nid_t alc880_w810_dac_nids[3] = {
2201 	/* front, rear/surround, clfe */
2202 	0x02, 0x03, 0x04
2203 };
2204 
2205 /* fixed 6 channels */
2206 static struct hda_channel_mode alc880_w810_modes[1] = {
2207 	{ 6, NULL }
2208 };
2209 
2210 /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2211 static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2212 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2213 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2214 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2215 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2216 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2217 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2218 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2219 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2220 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2221 	{ } /* end */
2222 };
2223 
2224 
2225 /*
2226  * Z710V model
2227  *
2228  * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
2229  * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2230  *                 Line = 0x1a
2231  */
2232 
2233 static hda_nid_t alc880_z71v_dac_nids[1] = {
2234 	0x02
2235 };
2236 #define ALC880_Z71V_HP_DAC	0x03
2237 
2238 /* fixed 2 channels */
2239 static struct hda_channel_mode alc880_2_jack_modes[1] = {
2240 	{ 2, NULL }
2241 };
2242 
2243 static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2244 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2245 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2246 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2247 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
2248 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2249 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2250 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2251 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2252 	{ } /* end */
2253 };
2254 
2255 
2256 /*
2257  * ALC880 F1734 model
2258  *
2259  * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2260  * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2261  */
2262 
2263 static hda_nid_t alc880_f1734_dac_nids[1] = {
2264 	0x03
2265 };
2266 #define ALC880_F1734_HP_DAC	0x02
2267 
2268 static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2269 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2270 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2271 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2272 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2273 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2274 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2275 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2276 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2277 	{ } /* end */
2278 };
2279 
2280 static struct hda_input_mux alc880_f1734_capture_source = {
2281 	.num_items = 2,
2282 	.items = {
2283 		{ "Mic", 0x1 },
2284 		{ "CD", 0x4 },
2285 	},
2286 };
2287 
2288 
2289 /*
2290  * ALC880 ASUS model
2291  *
2292  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2293  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2294  *  Mic = 0x18, Line = 0x1a
2295  */
2296 
2297 #define alc880_asus_dac_nids	alc880_w810_dac_nids	/* identical with w810 */
2298 #define alc880_asus_modes	alc880_threestack_modes	/* 2/6 channel mode */
2299 
2300 static struct snd_kcontrol_new alc880_asus_mixer[] = {
2301 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2302 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2303 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2304 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2305 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2306 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2307 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2308 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2309 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2310 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2311 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2312 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2313 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2314 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2315 	{
2316 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2317 		.name = "Channel Mode",
2318 		.info = alc_ch_mode_info,
2319 		.get = alc_ch_mode_get,
2320 		.put = alc_ch_mode_put,
2321 	},
2322 	{ } /* end */
2323 };
2324 
2325 /*
2326  * ALC880 ASUS W1V model
2327  *
2328  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2329  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2330  *  Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2331  */
2332 
2333 /* additional mixers to alc880_asus_mixer */
2334 static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2335 	HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2336 	HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2337 	{ } /* end */
2338 };
2339 
2340 /* TCL S700 */
2341 static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2342 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2343 	HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2344 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2345 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2346 	HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2347 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2348 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2349 	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2350 	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
2351 	{ } /* end */
2352 };
2353 
2354 /* Uniwill */
2355 static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2356 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2357 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2358 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2359 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2360 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2361 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2362 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2363 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2364 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2365 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2366 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2367 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2368 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2369 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2370 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2371 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2372 	{
2373 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2374 		.name = "Channel Mode",
2375 		.info = alc_ch_mode_info,
2376 		.get = alc_ch_mode_get,
2377 		.put = alc_ch_mode_put,
2378 	},
2379 	{ } /* end */
2380 };
2381 
2382 static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2383 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2384 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2385 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2386 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2387 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2388 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2389 	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2390 	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2391 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2392 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2393 	{ } /* end */
2394 };
2395 
2396 static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2397 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2398 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2399 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2400 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2401 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2402 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2403 	{ } /* end */
2404 };
2405 
2406 /*
2407  * virtual master controls
2408  */
2409 
2410 /*
2411  * slave controls for virtual master
2412  */
2413 static const char *alc_slave_vols[] = {
2414 	"Front Playback Volume",
2415 	"Surround Playback Volume",
2416 	"Center Playback Volume",
2417 	"LFE Playback Volume",
2418 	"Side Playback Volume",
2419 	"Headphone Playback Volume",
2420 	"Speaker Playback Volume",
2421 	"Mono Playback Volume",
2422 	"Line-Out Playback Volume",
2423 	"PCM Playback Volume",
2424 	NULL,
2425 };
2426 
2427 static const char *alc_slave_sws[] = {
2428 	"Front Playback Switch",
2429 	"Surround Playback Switch",
2430 	"Center Playback Switch",
2431 	"LFE Playback Switch",
2432 	"Side Playback Switch",
2433 	"Headphone Playback Switch",
2434 	"Speaker Playback Switch",
2435 	"Mono Playback Switch",
2436 	"IEC958 Playback Switch",
2437 	"Line-Out Playback Switch",
2438 	"PCM Playback Switch",
2439 	NULL,
2440 };
2441 
2442 /*
2443  * build control elements
2444  */
2445 
2446 static void alc_free_kctls(struct hda_codec *codec);
2447 
2448 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2449 /* additional beep mixers; the actual parameters are overwritten at build */
2450 static struct snd_kcontrol_new alc_beep_mixer[] = {
2451 	HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2452 	HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
2453 	{ } /* end */
2454 };
2455 #endif
2456 
2457 static int alc_build_controls(struct hda_codec *codec)
2458 {
2459 	struct alc_spec *spec = codec->spec;
2460 	int err;
2461 	int i;
2462 
2463 	for (i = 0; i < spec->num_mixers; i++) {
2464 		err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2465 		if (err < 0)
2466 			return err;
2467 	}
2468 	if (spec->cap_mixer) {
2469 		err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2470 		if (err < 0)
2471 			return err;
2472 	}
2473 	if (spec->multiout.dig_out_nid) {
2474 		err = snd_hda_create_spdif_out_ctls(codec,
2475 						    spec->multiout.dig_out_nid);
2476 		if (err < 0)
2477 			return err;
2478 		if (!spec->no_analog) {
2479 			err = snd_hda_create_spdif_share_sw(codec,
2480 							    &spec->multiout);
2481 			if (err < 0)
2482 				return err;
2483 			spec->multiout.share_spdif = 1;
2484 		}
2485 	}
2486 	if (spec->dig_in_nid) {
2487 		err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2488 		if (err < 0)
2489 			return err;
2490 	}
2491 
2492 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2493 	/* create beep controls if needed */
2494 	if (spec->beep_amp) {
2495 		struct snd_kcontrol_new *knew;
2496 		for (knew = alc_beep_mixer; knew->name; knew++) {
2497 			struct snd_kcontrol *kctl;
2498 			kctl = snd_ctl_new1(knew, codec);
2499 			if (!kctl)
2500 				return -ENOMEM;
2501 			kctl->private_value = spec->beep_amp;
2502 			err = snd_hda_ctl_add(codec,
2503 					get_amp_nid_(spec->beep_amp), kctl);
2504 			if (err < 0)
2505 				return err;
2506 		}
2507 	}
2508 #endif
2509 
2510 	/* if we have no master control, let's create it */
2511 	if (!spec->no_analog &&
2512 	    !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
2513 		unsigned int vmaster_tlv[4];
2514 		snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
2515 					HDA_OUTPUT, vmaster_tlv);
2516 		err = snd_hda_add_vmaster(codec, "Master Playback Volume",
2517 					  vmaster_tlv, alc_slave_vols);
2518 		if (err < 0)
2519 			return err;
2520 	}
2521 	if (!spec->no_analog &&
2522 	    !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2523 		err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2524 					  NULL, alc_slave_sws);
2525 		if (err < 0)
2526 			return err;
2527 	}
2528 
2529 	alc_free_kctls(codec); /* no longer needed */
2530 	return 0;
2531 }
2532 
2533 
2534 /*
2535  * initialize the codec volumes, etc
2536  */
2537 
2538 /*
2539  * generic initialization of ADC, input mixers and output mixers
2540  */
2541 static struct hda_verb alc880_volume_init_verbs[] = {
2542 	/*
2543 	 * Unmute ADC0-2 and set the default input to mic-in
2544 	 */
2545 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2546 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2547 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
2548 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2549 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
2550 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2551 
2552 	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2553 	 * mixer widget
2554 	 * Note: PASD motherboards uses the Line In 2 as the input for front
2555 	 * panel mic (mic 2)
2556 	 */
2557 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
2558 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2559 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2560 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2561 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2562 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2563 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2564 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2565 
2566 	/*
2567 	 * Set up output mixers (0x0c - 0x0f)
2568 	 */
2569 	/* set vol=0 to output mixers */
2570 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2571 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2572 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2573 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2574 	/* set up input amps for analog loopback */
2575 	/* Amp Indices: DAC = 0, mixer = 1 */
2576 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2577 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2578 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2579 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2580 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2581 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2582 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2583 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2584 
2585 	{ }
2586 };
2587 
2588 /*
2589  * 3-stack pin configuration:
2590  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2591  */
2592 static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2593 	/*
2594 	 * preset connection lists of input pins
2595 	 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2596 	 */
2597 	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2598 	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2599 	{0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2600 
2601 	/*
2602 	 * Set pin mode and muting
2603 	 */
2604 	/* set front pin widgets 0x14 for output */
2605 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2606 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2607 	/* Mic1 (rear panel) pin widget for input and vref at 80% */
2608 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2609 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2610 	/* Mic2 (as headphone out) for HP output */
2611 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2612 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2613 	/* Line In pin widget for input */
2614 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2615 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2616 	/* Line2 (as front mic) pin widget for input and vref at 80% */
2617 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2618 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2619 	/* CD pin widget for input */
2620 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2621 
2622 	{ }
2623 };
2624 
2625 /*
2626  * 5-stack pin configuration:
2627  * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2628  * line-in/side = 0x1a, f-mic = 0x1b
2629  */
2630 static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2631 	/*
2632 	 * preset connection lists of input pins
2633 	 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2634 	 */
2635 	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2636 	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
2637 
2638 	/*
2639 	 * Set pin mode and muting
2640 	 */
2641 	/* set pin widgets 0x14-0x17 for output */
2642 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2643 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2644 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2645 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2646 	/* unmute pins for output (no gain on this amp) */
2647 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2648 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2649 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2650 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2651 
2652 	/* Mic1 (rear panel) pin widget for input and vref at 80% */
2653 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2654 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2655 	/* Mic2 (as headphone out) for HP output */
2656 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2657 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2658 	/* Line In pin widget for input */
2659 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2660 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2661 	/* Line2 (as front mic) pin widget for input and vref at 80% */
2662 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2663 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2664 	/* CD pin widget for input */
2665 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2666 
2667 	{ }
2668 };
2669 
2670 /*
2671  * W810 pin configuration:
2672  * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2673  */
2674 static struct hda_verb alc880_pin_w810_init_verbs[] = {
2675 	/* hphone/speaker input selector: front DAC */
2676 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
2677 
2678 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2679 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2680 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2681 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2682 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2683 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2684 
2685 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2686 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2687 
2688 	{ }
2689 };
2690 
2691 /*
2692  * Z71V pin configuration:
2693  * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2694  */
2695 static struct hda_verb alc880_pin_z71v_init_verbs[] = {
2696 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2697 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2698 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2699 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2700 
2701 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2702 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2703 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2704 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2705 
2706 	{ }
2707 };
2708 
2709 /*
2710  * 6-stack pin configuration:
2711  * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2712  * f-mic = 0x19, line = 0x1a, HP = 0x1b
2713  */
2714 static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2715 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2716 
2717 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2718 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2719 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2720 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2721 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2722 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2723 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2724 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2725 
2726 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2727 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2728 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2729 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2730 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2731 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2732 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2733 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2734 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2735 
2736 	{ }
2737 };
2738 
2739 /*
2740  * Uniwill pin configuration:
2741  * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
2742  * line = 0x1a
2743  */
2744 static struct hda_verb alc880_uniwill_init_verbs[] = {
2745 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2746 
2747 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2748 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2749 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2750 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2751 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2752 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2753 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2754 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2755 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2756 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2757 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2758 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2759 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2760 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2761 
2762 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2763 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2764 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2765 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2766 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2767 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2768 	/* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
2769 	/* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
2770 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2771 
2772 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2773 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
2774 
2775 	{ }
2776 };
2777 
2778 /*
2779 * Uniwill P53
2780 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
2781  */
2782 static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
2783 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2784 
2785 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2786 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2787 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2788 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2789 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2790 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2791 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2792 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2793 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2794 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2795 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2796 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2797 
2798 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2799 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2800 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2801 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2802 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2803 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2804 
2805 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2806 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
2807 
2808 	{ }
2809 };
2810 
2811 static struct hda_verb alc880_beep_init_verbs[] = {
2812 	{ 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
2813 	{ }
2814 };
2815 
2816 /* auto-toggle front mic */
2817 static void alc880_uniwill_mic_automute(struct hda_codec *codec)
2818 {
2819  	unsigned int present;
2820 	unsigned char bits;
2821 
2822 	present = snd_hda_jack_detect(codec, 0x18);
2823 	bits = present ? HDA_AMP_MUTE : 0;
2824 	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
2825 }
2826 
2827 static void alc880_uniwill_setup(struct hda_codec *codec)
2828 {
2829 	struct alc_spec *spec = codec->spec;
2830 
2831 	spec->autocfg.hp_pins[0] = 0x14;
2832 	spec->autocfg.speaker_pins[0] = 0x15;
2833 	spec->autocfg.speaker_pins[0] = 0x16;
2834 }
2835 
2836 static void alc880_uniwill_init_hook(struct hda_codec *codec)
2837 {
2838 	alc_automute_amp(codec);
2839 	alc880_uniwill_mic_automute(codec);
2840 }
2841 
2842 static void alc880_uniwill_unsol_event(struct hda_codec *codec,
2843 				       unsigned int res)
2844 {
2845 	/* Looks like the unsol event is incompatible with the standard
2846 	 * definition.  4bit tag is placed at 28 bit!
2847 	 */
2848 	switch (res >> 28) {
2849 	case ALC880_MIC_EVENT:
2850 		alc880_uniwill_mic_automute(codec);
2851 		break;
2852 	default:
2853 		alc_automute_amp_unsol_event(codec, res);
2854 		break;
2855 	}
2856 }
2857 
2858 static void alc880_uniwill_p53_setup(struct hda_codec *codec)
2859 {
2860 	struct alc_spec *spec = codec->spec;
2861 
2862 	spec->autocfg.hp_pins[0] = 0x14;
2863 	spec->autocfg.speaker_pins[0] = 0x15;
2864 }
2865 
2866 static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
2867 {
2868 	unsigned int present;
2869 
2870 	present = snd_hda_codec_read(codec, 0x21, 0,
2871 				     AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
2872 	present &= HDA_AMP_VOLMASK;
2873 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
2874 				 HDA_AMP_VOLMASK, present);
2875 	snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
2876 				 HDA_AMP_VOLMASK, present);
2877 }
2878 
2879 static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
2880 					   unsigned int res)
2881 {
2882 	/* Looks like the unsol event is incompatible with the standard
2883 	 * definition.  4bit tag is placed at 28 bit!
2884 	 */
2885 	if ((res >> 28) == ALC880_DCVOL_EVENT)
2886 		alc880_uniwill_p53_dcvol_automute(codec);
2887 	else
2888 		alc_automute_amp_unsol_event(codec, res);
2889 }
2890 
2891 /*
2892  * F1734 pin configuration:
2893  * HP = 0x14, speaker-out = 0x15, mic = 0x18
2894  */
2895 static struct hda_verb alc880_pin_f1734_init_verbs[] = {
2896 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
2897 	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2898 	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2899 	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2900 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2901 
2902 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2903 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2904 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2905 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2906 
2907 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2908 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2909 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
2910 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2911 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2912 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2913 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2914 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2915 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2916 
2917 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
2918 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
2919 
2920 	{ }
2921 };
2922 
2923 /*
2924  * ASUS pin configuration:
2925  * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
2926  */
2927 static struct hda_verb alc880_pin_asus_init_verbs[] = {
2928 	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2929 	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2930 	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2931 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2932 
2933 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2934 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2935 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2936 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2937 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2938 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2939 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2940 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2941 
2942 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2943 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2944 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2945 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2946 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2947 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2948 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2949 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2950 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2951 
2952 	{ }
2953 };
2954 
2955 /* Enable GPIO mask and set output */
2956 #define alc880_gpio1_init_verbs	alc_gpio1_init_verbs
2957 #define alc880_gpio2_init_verbs	alc_gpio2_init_verbs
2958 #define alc880_gpio3_init_verbs	alc_gpio3_init_verbs
2959 
2960 /* Clevo m520g init */
2961 static struct hda_verb alc880_pin_clevo_init_verbs[] = {
2962 	/* headphone output */
2963 	{0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
2964 	/* line-out */
2965 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2966 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2967 	/* Line-in */
2968 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2969 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2970 	/* CD */
2971 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2972 	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2973 	/* Mic1 (rear panel) */
2974 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2975 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2976 	/* Mic2 (front panel) */
2977 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2978 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2979 	/* headphone */
2980 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2981 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2982         /* change to EAPD mode */
2983 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
2984 	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
2985 
2986 	{ }
2987 };
2988 
2989 static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
2990 	/* change to EAPD mode */
2991 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
2992 	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
2993 
2994 	/* Headphone output */
2995 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2996 	/* Front output*/
2997 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2998 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
2999 
3000 	/* Line In pin widget for input */
3001 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3002 	/* CD pin widget for input */
3003 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3004 	/* Mic1 (rear panel) pin widget for input and vref at 80% */
3005 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3006 
3007 	/* change to EAPD mode */
3008 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3009 	{0x20, AC_VERB_SET_PROC_COEF,  0x3070},
3010 
3011 	{ }
3012 };
3013 
3014 /*
3015  * LG m1 express dual
3016  *
3017  * Pin assignment:
3018  *   Rear Line-In/Out (blue): 0x14
3019  *   Build-in Mic-In: 0x15
3020  *   Speaker-out: 0x17
3021  *   HP-Out (green): 0x1b
3022  *   Mic-In/Out (red): 0x19
3023  *   SPDIF-Out: 0x1e
3024  */
3025 
3026 /* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3027 static hda_nid_t alc880_lg_dac_nids[3] = {
3028 	0x05, 0x02, 0x03
3029 };
3030 
3031 /* seems analog CD is not working */
3032 static struct hda_input_mux alc880_lg_capture_source = {
3033 	.num_items = 3,
3034 	.items = {
3035 		{ "Mic", 0x1 },
3036 		{ "Line", 0x5 },
3037 		{ "Internal Mic", 0x6 },
3038 	},
3039 };
3040 
3041 /* 2,4,6 channel modes */
3042 static struct hda_verb alc880_lg_ch2_init[] = {
3043 	/* set line-in and mic-in to input */
3044 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3045 	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3046 	{ }
3047 };
3048 
3049 static struct hda_verb alc880_lg_ch4_init[] = {
3050 	/* set line-in to out and mic-in to input */
3051 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3052 	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3053 	{ }
3054 };
3055 
3056 static struct hda_verb alc880_lg_ch6_init[] = {
3057 	/* set line-in and mic-in to output */
3058 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3059 	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3060 	{ }
3061 };
3062 
3063 static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3064 	{ 2, alc880_lg_ch2_init },
3065 	{ 4, alc880_lg_ch4_init },
3066 	{ 6, alc880_lg_ch6_init },
3067 };
3068 
3069 static struct snd_kcontrol_new alc880_lg_mixer[] = {
3070 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3071 	HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3072 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3073 	HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3074 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3075 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3076 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3077 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3078 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3079 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3080 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3081 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3082 	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3083 	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3084 	{
3085 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3086 		.name = "Channel Mode",
3087 		.info = alc_ch_mode_info,
3088 		.get = alc_ch_mode_get,
3089 		.put = alc_ch_mode_put,
3090 	},
3091 	{ } /* end */
3092 };
3093 
3094 static struct hda_verb alc880_lg_init_verbs[] = {
3095 	/* set capture source to mic-in */
3096 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3097 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3098 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3099 	/* mute all amp mixer inputs */
3100 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
3101 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3102 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3103 	/* line-in to input */
3104 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3105 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3106 	/* built-in mic */
3107 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3108 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3109 	/* speaker-out */
3110 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3111 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3112 	/* mic-in to input */
3113 	{0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3114 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3115 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3116 	/* HP-out */
3117 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3118 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3119 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3120 	/* jack sense */
3121 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3122 	{ }
3123 };
3124 
3125 /* toggle speaker-output according to the hp-jack state */
3126 static void alc880_lg_setup(struct hda_codec *codec)
3127 {
3128 	struct alc_spec *spec = codec->spec;
3129 
3130 	spec->autocfg.hp_pins[0] = 0x1b;
3131 	spec->autocfg.speaker_pins[0] = 0x17;
3132 }
3133 
3134 /*
3135  * LG LW20
3136  *
3137  * Pin assignment:
3138  *   Speaker-out: 0x14
3139  *   Mic-In: 0x18
3140  *   Built-in Mic-In: 0x19
3141  *   Line-In: 0x1b
3142  *   HP-Out: 0x1a
3143  *   SPDIF-Out: 0x1e
3144  */
3145 
3146 static struct hda_input_mux alc880_lg_lw_capture_source = {
3147 	.num_items = 3,
3148 	.items = {
3149 		{ "Mic", 0x0 },
3150 		{ "Internal Mic", 0x1 },
3151 		{ "Line In", 0x2 },
3152 	},
3153 };
3154 
3155 #define alc880_lg_lw_modes alc880_threestack_modes
3156 
3157 static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3158 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3159 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3160 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3161 	HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3162 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3163 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3164 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3165 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3166 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3167 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
3168 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3169 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3170 	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3171 	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
3172 	{
3173 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3174 		.name = "Channel Mode",
3175 		.info = alc_ch_mode_info,
3176 		.get = alc_ch_mode_get,
3177 		.put = alc_ch_mode_put,
3178 	},
3179 	{ } /* end */
3180 };
3181 
3182 static struct hda_verb alc880_lg_lw_init_verbs[] = {
3183 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3184 	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3185 	{0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3186 
3187 	/* set capture source to mic-in */
3188 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3189 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3190 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3191 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3192 	/* speaker-out */
3193 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3194 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3195 	/* HP-out */
3196 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3197 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3198 	/* mic-in to input */
3199 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3200 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3201 	/* built-in mic */
3202 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3203 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3204 	/* jack sense */
3205 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3206 	{ }
3207 };
3208 
3209 /* toggle speaker-output according to the hp-jack state */
3210 static void alc880_lg_lw_setup(struct hda_codec *codec)
3211 {
3212 	struct alc_spec *spec = codec->spec;
3213 
3214 	spec->autocfg.hp_pins[0] = 0x1b;
3215 	spec->autocfg.speaker_pins[0] = 0x14;
3216 }
3217 
3218 static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3219 	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3220 	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3221 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3222 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3223 	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3224 	HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3225 	{ } /* end */
3226 };
3227 
3228 static struct hda_input_mux alc880_medion_rim_capture_source = {
3229 	.num_items = 2,
3230 	.items = {
3231 		{ "Mic", 0x0 },
3232 		{ "Internal Mic", 0x1 },
3233 	},
3234 };
3235 
3236 static struct hda_verb alc880_medion_rim_init_verbs[] = {
3237 	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3238 
3239 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3240 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3241 
3242 	/* Mic1 (rear panel) pin widget for input and vref at 80% */
3243 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3244 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3245 	/* Mic2 (as headphone out) for HP output */
3246 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3247 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3248 	/* Internal Speaker */
3249 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3250 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3251 
3252 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3253 	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3254 
3255 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3256 	{ }
3257 };
3258 
3259 /* toggle speaker-output according to the hp-jack state */
3260 static void alc880_medion_rim_automute(struct hda_codec *codec)
3261 {
3262 	struct alc_spec *spec = codec->spec;
3263 	alc_automute_amp(codec);
3264 	/* toggle EAPD */
3265 	if (spec->jack_present)
3266 		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3267 	else
3268 		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3269 }
3270 
3271 static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3272 					  unsigned int res)
3273 {
3274 	/* Looks like the unsol event is incompatible with the standard
3275 	 * definition.  4bit tag is placed at 28 bit!
3276 	 */
3277 	if ((res >> 28) == ALC880_HP_EVENT)
3278 		alc880_medion_rim_automute(codec);
3279 }
3280 
3281 static void alc880_medion_rim_setup(struct hda_codec *codec)
3282 {
3283 	struct alc_spec *spec = codec->spec;
3284 
3285 	spec->autocfg.hp_pins[0] = 0x14;
3286 	spec->autocfg.speaker_pins[0] = 0x1b;
3287 }
3288 
3289 #ifdef CONFIG_SND_HDA_POWER_SAVE
3290 static struct hda_amp_list alc880_loopbacks[] = {
3291 	{ 0x0b, HDA_INPUT, 0 },
3292 	{ 0x0b, HDA_INPUT, 1 },
3293 	{ 0x0b, HDA_INPUT, 2 },
3294 	{ 0x0b, HDA_INPUT, 3 },
3295 	{ 0x0b, HDA_INPUT, 4 },
3296 	{ } /* end */
3297 };
3298 
3299 static struct hda_amp_list alc880_lg_loopbacks[] = {
3300 	{ 0x0b, HDA_INPUT, 1 },
3301 	{ 0x0b, HDA_INPUT, 6 },
3302 	{ 0x0b, HDA_INPUT, 7 },
3303 	{ } /* end */
3304 };
3305 #endif
3306 
3307 /*
3308  * Common callbacks
3309  */
3310 
3311 static int alc_init(struct hda_codec *codec)
3312 {
3313 	struct alc_spec *spec = codec->spec;
3314 	unsigned int i;
3315 
3316 	alc_fix_pll(codec);
3317 	alc_auto_init_amp(codec, spec->init_amp);
3318 
3319 	for (i = 0; i < spec->num_init_verbs; i++)
3320 		snd_hda_sequence_write(codec, spec->init_verbs[i]);
3321 
3322 	if (spec->init_hook)
3323 		spec->init_hook(codec);
3324 
3325 	return 0;
3326 }
3327 
3328 static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3329 {
3330 	struct alc_spec *spec = codec->spec;
3331 
3332 	if (spec->unsol_event)
3333 		spec->unsol_event(codec, res);
3334 }
3335 
3336 #ifdef CONFIG_SND_HDA_POWER_SAVE
3337 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3338 {
3339 	struct alc_spec *spec = codec->spec;
3340 	return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3341 }
3342 #endif
3343 
3344 /*
3345  * Analog playback callbacks
3346  */
3347 static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3348 				    struct hda_codec *codec,
3349 				    struct snd_pcm_substream *substream)
3350 {
3351 	struct alc_spec *spec = codec->spec;
3352 	return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3353 					     hinfo);
3354 }
3355 
3356 static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3357 				       struct hda_codec *codec,
3358 				       unsigned int stream_tag,
3359 				       unsigned int format,
3360 				       struct snd_pcm_substream *substream)
3361 {
3362 	struct alc_spec *spec = codec->spec;
3363 	return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3364 						stream_tag, format, substream);
3365 }
3366 
3367 static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3368 				       struct hda_codec *codec,
3369 				       struct snd_pcm_substream *substream)
3370 {
3371 	struct alc_spec *spec = codec->spec;
3372 	return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3373 }
3374 
3375 /*
3376  * Digital out
3377  */
3378 static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3379 					struct hda_codec *codec,
3380 					struct snd_pcm_substream *substream)
3381 {
3382 	struct alc_spec *spec = codec->spec;
3383 	return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3384 }
3385 
3386 static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3387 					   struct hda_codec *codec,
3388 					   unsigned int stream_tag,
3389 					   unsigned int format,
3390 					   struct snd_pcm_substream *substream)
3391 {
3392 	struct alc_spec *spec = codec->spec;
3393 	return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3394 					     stream_tag, format, substream);
3395 }
3396 
3397 static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3398 					   struct hda_codec *codec,
3399 					   struct snd_pcm_substream *substream)
3400 {
3401 	struct alc_spec *spec = codec->spec;
3402 	return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3403 }
3404 
3405 static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3406 					 struct hda_codec *codec,
3407 					 struct snd_pcm_substream *substream)
3408 {
3409 	struct alc_spec *spec = codec->spec;
3410 	return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3411 }
3412 
3413 /*
3414  * Analog capture
3415  */
3416 static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3417 				      struct hda_codec *codec,
3418 				      unsigned int stream_tag,
3419 				      unsigned int format,
3420 				      struct snd_pcm_substream *substream)
3421 {
3422 	struct alc_spec *spec = codec->spec;
3423 
3424 	snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3425 				   stream_tag, 0, format);
3426 	return 0;
3427 }
3428 
3429 static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3430 				      struct hda_codec *codec,
3431 				      struct snd_pcm_substream *substream)
3432 {
3433 	struct alc_spec *spec = codec->spec;
3434 
3435 	snd_hda_codec_cleanup_stream(codec,
3436 				     spec->adc_nids[substream->number + 1]);
3437 	return 0;
3438 }
3439 
3440 
3441 /*
3442  */
3443 static struct hda_pcm_stream alc880_pcm_analog_playback = {
3444 	.substreams = 1,
3445 	.channels_min = 2,
3446 	.channels_max = 8,
3447 	/* NID is set in alc_build_pcms */
3448 	.ops = {
3449 		.open = alc880_playback_pcm_open,
3450 		.prepare = alc880_playback_pcm_prepare,
3451 		.cleanup = alc880_playback_pcm_cleanup
3452 	},
3453 };
3454 
3455 static struct hda_pcm_stream alc880_pcm_analog_capture = {
3456 	.substreams = 1,
3457 	.channels_min = 2,
3458 	.channels_max = 2,
3459 	/* NID is set in alc_build_pcms */
3460 };
3461 
3462 static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3463 	.substreams = 1,
3464 	.channels_min = 2,
3465 	.channels_max = 2,
3466 	/* NID is set in alc_build_pcms */
3467 };
3468 
3469 static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3470 	.substreams = 2, /* can be overridden */
3471 	.channels_min = 2,
3472 	.channels_max = 2,
3473 	/* NID is set in alc_build_pcms */
3474 	.ops = {
3475 		.prepare = alc880_alt_capture_pcm_prepare,
3476 		.cleanup = alc880_alt_capture_pcm_cleanup
3477 	},
3478 };
3479 
3480 static struct hda_pcm_stream alc880_pcm_digital_playback = {
3481 	.substreams = 1,
3482 	.channels_min = 2,
3483 	.channels_max = 2,
3484 	/* NID is set in alc_build_pcms */
3485 	.ops = {
3486 		.open = alc880_dig_playback_pcm_open,
3487 		.close = alc880_dig_playback_pcm_close,
3488 		.prepare = alc880_dig_playback_pcm_prepare,
3489 		.cleanup = alc880_dig_playback_pcm_cleanup
3490 	},
3491 };
3492 
3493 static struct hda_pcm_stream alc880_pcm_digital_capture = {
3494 	.substreams = 1,
3495 	.channels_min = 2,
3496 	.channels_max = 2,
3497 	/* NID is set in alc_build_pcms */
3498 };
3499 
3500 /* Used by alc_build_pcms to flag that a PCM has no playback stream */
3501 static struct hda_pcm_stream alc_pcm_null_stream = {
3502 	.substreams = 0,
3503 	.channels_min = 0,
3504 	.channels_max = 0,
3505 };
3506 
3507 static int alc_build_pcms(struct hda_codec *codec)
3508 {
3509 	struct alc_spec *spec = codec->spec;
3510 	struct hda_pcm *info = spec->pcm_rec;
3511 	int i;
3512 
3513 	codec->num_pcms = 1;
3514 	codec->pcm_info = info;
3515 
3516 	if (spec->no_analog)
3517 		goto skip_analog;
3518 
3519 	snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3520 		 "%s Analog", codec->chip_name);
3521 	info->name = spec->stream_name_analog;
3522 
3523 	if (spec->stream_analog_playback) {
3524 		if (snd_BUG_ON(!spec->multiout.dac_nids))
3525 			return -EINVAL;
3526 		info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3527 		info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3528 	}
3529 	if (spec->stream_analog_capture) {
3530 		if (snd_BUG_ON(!spec->adc_nids))
3531 			return -EINVAL;
3532 		info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3533 		info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3534 	}
3535 
3536 	if (spec->channel_mode) {
3537 		info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3538 		for (i = 0; i < spec->num_channel_mode; i++) {
3539 			if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3540 				info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3541 			}
3542 		}
3543 	}
3544 
3545  skip_analog:
3546 	/* SPDIF for stream index #1 */
3547 	if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3548 		snprintf(spec->stream_name_digital,
3549 			 sizeof(spec->stream_name_digital),
3550 			 "%s Digital", codec->chip_name);
3551 		codec->num_pcms = 2;
3552 	        codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3553 		info = spec->pcm_rec + 1;
3554 		info->name = spec->stream_name_digital;
3555 		if (spec->dig_out_type)
3556 			info->pcm_type = spec->dig_out_type;
3557 		else
3558 			info->pcm_type = HDA_PCM_TYPE_SPDIF;
3559 		if (spec->multiout.dig_out_nid &&
3560 		    spec->stream_digital_playback) {
3561 			info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3562 			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3563 		}
3564 		if (spec->dig_in_nid &&
3565 		    spec->stream_digital_capture) {
3566 			info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3567 			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3568 		}
3569 		/* FIXME: do we need this for all Realtek codec models? */
3570 		codec->spdif_status_reset = 1;
3571 	}
3572 
3573 	if (spec->no_analog)
3574 		return 0;
3575 
3576 	/* If the use of more than one ADC is requested for the current
3577 	 * model, configure a second analog capture-only PCM.
3578 	 */
3579 	/* Additional Analaog capture for index #2 */
3580 	if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3581 	    (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
3582 		codec->num_pcms = 3;
3583 		info = spec->pcm_rec + 2;
3584 		info->name = spec->stream_name_analog;
3585 		if (spec->alt_dac_nid) {
3586 			info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3587 				*spec->stream_analog_alt_playback;
3588 			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3589 				spec->alt_dac_nid;
3590 		} else {
3591 			info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3592 				alc_pcm_null_stream;
3593 			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3594 		}
3595 		if (spec->num_adc_nids > 1) {
3596 			info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3597 				*spec->stream_analog_alt_capture;
3598 			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3599 				spec->adc_nids[1];
3600 			info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3601 				spec->num_adc_nids - 1;
3602 		} else {
3603 			info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3604 				alc_pcm_null_stream;
3605 			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3606 		}
3607 	}
3608 
3609 	return 0;
3610 }
3611 
3612 static void alc_free_kctls(struct hda_codec *codec)
3613 {
3614 	struct alc_spec *spec = codec->spec;
3615 
3616 	if (spec->kctls.list) {
3617 		struct snd_kcontrol_new *kctl = spec->kctls.list;
3618 		int i;
3619 		for (i = 0; i < spec->kctls.used; i++)
3620 			kfree(kctl[i].name);
3621 	}
3622 	snd_array_free(&spec->kctls);
3623 }
3624 
3625 static void alc_free(struct hda_codec *codec)
3626 {
3627 	struct alc_spec *spec = codec->spec;
3628 
3629 	if (!spec)
3630 		return;
3631 
3632 	alc_free_kctls(codec);
3633 	kfree(spec);
3634 	snd_hda_detach_beep_device(codec);
3635 }
3636 
3637 #ifdef CONFIG_SND_HDA_POWER_SAVE
3638 static int alc_suspend(struct hda_codec *codec, pm_message_t state)
3639 {
3640 	struct alc_spec *spec = codec->spec;
3641 	if (spec && spec->power_hook)
3642 		spec->power_hook(codec, 0);
3643 	return 0;
3644 }
3645 #endif
3646 
3647 #ifdef SND_HDA_NEEDS_RESUME
3648 static int alc_resume(struct hda_codec *codec)
3649 {
3650 #ifdef CONFIG_SND_HDA_POWER_SAVE
3651 	struct alc_spec *spec = codec->spec;
3652 #endif
3653 	codec->patch_ops.init(codec);
3654 	snd_hda_codec_resume_amp(codec);
3655 	snd_hda_codec_resume_cache(codec);
3656 #ifdef CONFIG_SND_HDA_POWER_SAVE
3657 	if (spec && spec->power_hook)
3658 		spec->power_hook(codec, 1);
3659 #endif
3660 	return 0;
3661 }
3662 #endif
3663 
3664 /*
3665  */
3666 static struct hda_codec_ops alc_patch_ops = {
3667 	.build_controls = alc_build_controls,
3668 	.build_pcms = alc_build_pcms,
3669 	.init = alc_init,
3670 	.free = alc_free,
3671 	.unsol_event = alc_unsol_event,
3672 #ifdef SND_HDA_NEEDS_RESUME
3673 	.resume = alc_resume,
3674 #endif
3675 #ifdef CONFIG_SND_HDA_POWER_SAVE
3676 	.suspend = alc_suspend,
3677 	.check_power_status = alc_check_power_status,
3678 #endif
3679 };
3680 
3681 
3682 /*
3683  * Test configuration for debugging
3684  *
3685  * Almost all inputs/outputs are enabled.  I/O pins can be configured via
3686  * enum controls.
3687  */
3688 #ifdef CONFIG_SND_DEBUG
3689 static hda_nid_t alc880_test_dac_nids[4] = {
3690 	0x02, 0x03, 0x04, 0x05
3691 };
3692 
3693 static struct hda_input_mux alc880_test_capture_source = {
3694 	.num_items = 7,
3695 	.items = {
3696 		{ "In-1", 0x0 },
3697 		{ "In-2", 0x1 },
3698 		{ "In-3", 0x2 },
3699 		{ "In-4", 0x3 },
3700 		{ "CD", 0x4 },
3701 		{ "Front", 0x5 },
3702 		{ "Surround", 0x6 },
3703 	},
3704 };
3705 
3706 static struct hda_channel_mode alc880_test_modes[4] = {
3707 	{ 2, NULL },
3708 	{ 4, NULL },
3709 	{ 6, NULL },
3710 	{ 8, NULL },
3711 };
3712 
3713 static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
3714 				 struct snd_ctl_elem_info *uinfo)
3715 {
3716 	static char *texts[] = {
3717 		"N/A", "Line Out", "HP Out",
3718 		"In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
3719 	};
3720 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3721 	uinfo->count = 1;
3722 	uinfo->value.enumerated.items = 8;
3723 	if (uinfo->value.enumerated.item >= 8)
3724 		uinfo->value.enumerated.item = 7;
3725 	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3726 	return 0;
3727 }
3728 
3729 static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
3730 				struct snd_ctl_elem_value *ucontrol)
3731 {
3732 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3733 	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3734 	unsigned int pin_ctl, item = 0;
3735 
3736 	pin_ctl = snd_hda_codec_read(codec, nid, 0,
3737 				     AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3738 	if (pin_ctl & AC_PINCTL_OUT_EN) {
3739 		if (pin_ctl & AC_PINCTL_HP_EN)
3740 			item = 2;
3741 		else
3742 			item = 1;
3743 	} else if (pin_ctl & AC_PINCTL_IN_EN) {
3744 		switch (pin_ctl & AC_PINCTL_VREFEN) {
3745 		case AC_PINCTL_VREF_HIZ: item = 3; break;
3746 		case AC_PINCTL_VREF_50:  item = 4; break;
3747 		case AC_PINCTL_VREF_GRD: item = 5; break;
3748 		case AC_PINCTL_VREF_80:  item = 6; break;
3749 		case AC_PINCTL_VREF_100: item = 7; break;
3750 		}
3751 	}
3752 	ucontrol->value.enumerated.item[0] = item;
3753 	return 0;
3754 }
3755 
3756 static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
3757 				struct snd_ctl_elem_value *ucontrol)
3758 {
3759 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3760 	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3761 	static unsigned int ctls[] = {
3762 		0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
3763 		AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
3764 		AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
3765 		AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
3766 		AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
3767 		AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
3768 	};
3769 	unsigned int old_ctl, new_ctl;
3770 
3771 	old_ctl = snd_hda_codec_read(codec, nid, 0,
3772 				     AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3773 	new_ctl = ctls[ucontrol->value.enumerated.item[0]];
3774 	if (old_ctl != new_ctl) {
3775 		int val;
3776 		snd_hda_codec_write_cache(codec, nid, 0,
3777 					  AC_VERB_SET_PIN_WIDGET_CONTROL,
3778 					  new_ctl);
3779 		val = ucontrol->value.enumerated.item[0] >= 3 ?
3780 			HDA_AMP_MUTE : 0;
3781 		snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3782 					 HDA_AMP_MUTE, val);
3783 		return 1;
3784 	}
3785 	return 0;
3786 }
3787 
3788 static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
3789 				 struct snd_ctl_elem_info *uinfo)
3790 {
3791 	static char *texts[] = {
3792 		"Front", "Surround", "CLFE", "Side"
3793 	};
3794 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3795 	uinfo->count = 1;
3796 	uinfo->value.enumerated.items = 4;
3797 	if (uinfo->value.enumerated.item >= 4)
3798 		uinfo->value.enumerated.item = 3;
3799 	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3800 	return 0;
3801 }
3802 
3803 static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
3804 				struct snd_ctl_elem_value *ucontrol)
3805 {
3806 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3807 	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3808 	unsigned int sel;
3809 
3810 	sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
3811 	ucontrol->value.enumerated.item[0] = sel & 3;
3812 	return 0;
3813 }
3814 
3815 static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
3816 				struct snd_ctl_elem_value *ucontrol)
3817 {
3818 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3819 	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3820 	unsigned int sel;
3821 
3822 	sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
3823 	if (ucontrol->value.enumerated.item[0] != sel) {
3824 		sel = ucontrol->value.enumerated.item[0] & 3;
3825 		snd_hda_codec_write_cache(codec, nid, 0,
3826 					  AC_VERB_SET_CONNECT_SEL, sel);
3827 		return 1;
3828 	}
3829 	return 0;
3830 }
3831 
3832 #define PIN_CTL_TEST(xname,nid) {			\
3833 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	\
3834 			.name = xname,		       \
3835 			.info = alc_test_pin_ctl_info, \
3836 			.get = alc_test_pin_ctl_get,   \
3837 			.put = alc_test_pin_ctl_put,   \
3838 			.private_value = nid	       \
3839 			}
3840 
3841 #define PIN_SRC_TEST(xname,nid) {			\
3842 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	\
3843 			.name = xname,		       \
3844 			.info = alc_test_pin_src_info, \
3845 			.get = alc_test_pin_src_get,   \
3846 			.put = alc_test_pin_src_put,   \
3847 			.private_value = nid	       \
3848 			}
3849 
3850 static struct snd_kcontrol_new alc880_test_mixer[] = {
3851 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3852 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
3853 	HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
3854 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3855 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3856 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
3857 	HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
3858 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
3859 	PIN_CTL_TEST("Front Pin Mode", 0x14),
3860 	PIN_CTL_TEST("Surround Pin Mode", 0x15),
3861 	PIN_CTL_TEST("CLFE Pin Mode", 0x16),
3862 	PIN_CTL_TEST("Side Pin Mode", 0x17),
3863 	PIN_CTL_TEST("In-1 Pin Mode", 0x18),
3864 	PIN_CTL_TEST("In-2 Pin Mode", 0x19),
3865 	PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
3866 	PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
3867 	PIN_SRC_TEST("In-1 Pin Source", 0x18),
3868 	PIN_SRC_TEST("In-2 Pin Source", 0x19),
3869 	PIN_SRC_TEST("In-3 Pin Source", 0x1a),
3870 	PIN_SRC_TEST("In-4 Pin Source", 0x1b),
3871 	HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
3872 	HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
3873 	HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
3874 	HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
3875 	HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
3876 	HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
3877 	HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
3878 	HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
3879 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
3880 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
3881 	{
3882 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3883 		.name = "Channel Mode",
3884 		.info = alc_ch_mode_info,
3885 		.get = alc_ch_mode_get,
3886 		.put = alc_ch_mode_put,
3887 	},
3888 	{ } /* end */
3889 };
3890 
3891 static struct hda_verb alc880_test_init_verbs[] = {
3892 	/* Unmute inputs of 0x0c - 0x0f */
3893 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3894 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3895 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3896 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3897 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3898 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3899 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3900 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3901 	/* Vol output for 0x0c-0x0f */
3902 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3903 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3904 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3905 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3906 	/* Set output pins 0x14-0x17 */
3907 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3908 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3909 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3910 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3911 	/* Unmute output pins 0x14-0x17 */
3912 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3913 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3914 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3915 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3916 	/* Set input pins 0x18-0x1c */
3917 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3918 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3919 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3920 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3921 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3922 	/* Mute input pins 0x18-0x1b */
3923 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3924 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3925 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3926 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3927 	/* ADC set up */
3928 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3929 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
3930 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3931 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
3932 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3933 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
3934 	/* Analog input/passthru */
3935 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3936 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3937 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
3938 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
3939 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
3940 	{ }
3941 };
3942 #endif
3943 
3944 /*
3945  */
3946 
3947 static const char *alc880_models[ALC880_MODEL_LAST] = {
3948 	[ALC880_3ST]		= "3stack",
3949 	[ALC880_TCL_S700]	= "tcl",
3950 	[ALC880_3ST_DIG]	= "3stack-digout",
3951 	[ALC880_CLEVO]		= "clevo",
3952 	[ALC880_5ST]		= "5stack",
3953 	[ALC880_5ST_DIG]	= "5stack-digout",
3954 	[ALC880_W810]		= "w810",
3955 	[ALC880_Z71V]		= "z71v",
3956 	[ALC880_6ST]		= "6stack",
3957 	[ALC880_6ST_DIG]	= "6stack-digout",
3958 	[ALC880_ASUS]		= "asus",
3959 	[ALC880_ASUS_W1V]	= "asus-w1v",
3960 	[ALC880_ASUS_DIG]	= "asus-dig",
3961 	[ALC880_ASUS_DIG2]	= "asus-dig2",
3962 	[ALC880_UNIWILL_DIG]	= "uniwill",
3963 	[ALC880_UNIWILL_P53]	= "uniwill-p53",
3964 	[ALC880_FUJITSU]	= "fujitsu",
3965 	[ALC880_F1734]		= "F1734",
3966 	[ALC880_LG]		= "lg",
3967 	[ALC880_LG_LW]		= "lg-lw",
3968 	[ALC880_MEDION_RIM]	= "medion",
3969 #ifdef CONFIG_SND_DEBUG
3970 	[ALC880_TEST]		= "test",
3971 #endif
3972 	[ALC880_AUTO]		= "auto",
3973 };
3974 
3975 static struct snd_pci_quirk alc880_cfg_tbl[] = {
3976 	SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
3977 	SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
3978 	SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
3979 	SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
3980 	SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
3981 	SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
3982 	SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
3983 	SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
3984 	SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
3985 	SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
3986 	SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
3987 	SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
3988 	SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
3989 	SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
3990 	SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
3991 	SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
3992 	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
3993 	SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
3994 	/* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
3995 	SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
3996 	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
3997 	SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
3998 	SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
3999 	SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
4000 	SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
4001 	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
4002 	SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
4003 	SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
4004 	SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
4005 	SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
4006 	SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
4007 	SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
4008 	SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
4009 	SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
4010 	SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
4011 	SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
4012 	SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
4013 	SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
4014 	SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
4015 	SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
4016 	SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
4017 	SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
4018 	SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
4019 	SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
4020 	SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
4021 	SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
4022 	SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
4023 	SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
4024 	SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
4025 	SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL),
4026 	SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
4027 	SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
4028 	SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
4029 	SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
4030 	SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
4031 	SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
4032 	SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
4033 	SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
4034 	SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
4035 	SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
4036 	SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
4037 	SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
4038 	SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
4039 	SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
4040 	SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
4041 	SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
4042 	SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
4043 	SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
4044 	/* default Intel */
4045 	SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
4046 	SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
4047 	SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
4048 	{}
4049 };
4050 
4051 /*
4052  * ALC880 codec presets
4053  */
4054 static struct alc_config_preset alc880_presets[] = {
4055 	[ALC880_3ST] = {
4056 		.mixers = { alc880_three_stack_mixer },
4057 		.init_verbs = { alc880_volume_init_verbs,
4058 				alc880_pin_3stack_init_verbs },
4059 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4060 		.dac_nids = alc880_dac_nids,
4061 		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4062 		.channel_mode = alc880_threestack_modes,
4063 		.need_dac_fix = 1,
4064 		.input_mux = &alc880_capture_source,
4065 	},
4066 	[ALC880_3ST_DIG] = {
4067 		.mixers = { alc880_three_stack_mixer },
4068 		.init_verbs = { alc880_volume_init_verbs,
4069 				alc880_pin_3stack_init_verbs },
4070 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4071 		.dac_nids = alc880_dac_nids,
4072 		.dig_out_nid = ALC880_DIGOUT_NID,
4073 		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4074 		.channel_mode = alc880_threestack_modes,
4075 		.need_dac_fix = 1,
4076 		.input_mux = &alc880_capture_source,
4077 	},
4078 	[ALC880_TCL_S700] = {
4079 		.mixers = { alc880_tcl_s700_mixer },
4080 		.init_verbs = { alc880_volume_init_verbs,
4081 				alc880_pin_tcl_S700_init_verbs,
4082 				alc880_gpio2_init_verbs },
4083 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4084 		.dac_nids = alc880_dac_nids,
4085 		.adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4086 		.num_adc_nids = 1, /* single ADC */
4087 		.hp_nid = 0x03,
4088 		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4089 		.channel_mode = alc880_2_jack_modes,
4090 		.input_mux = &alc880_capture_source,
4091 	},
4092 	[ALC880_5ST] = {
4093 		.mixers = { alc880_three_stack_mixer,
4094 			    alc880_five_stack_mixer},
4095 		.init_verbs = { alc880_volume_init_verbs,
4096 				alc880_pin_5stack_init_verbs },
4097 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4098 		.dac_nids = alc880_dac_nids,
4099 		.num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4100 		.channel_mode = alc880_fivestack_modes,
4101 		.input_mux = &alc880_capture_source,
4102 	},
4103 	[ALC880_5ST_DIG] = {
4104 		.mixers = { alc880_three_stack_mixer,
4105 			    alc880_five_stack_mixer },
4106 		.init_verbs = { alc880_volume_init_verbs,
4107 				alc880_pin_5stack_init_verbs },
4108 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4109 		.dac_nids = alc880_dac_nids,
4110 		.dig_out_nid = ALC880_DIGOUT_NID,
4111 		.num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4112 		.channel_mode = alc880_fivestack_modes,
4113 		.input_mux = &alc880_capture_source,
4114 	},
4115 	[ALC880_6ST] = {
4116 		.mixers = { alc880_six_stack_mixer },
4117 		.init_verbs = { alc880_volume_init_verbs,
4118 				alc880_pin_6stack_init_verbs },
4119 		.num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4120 		.dac_nids = alc880_6st_dac_nids,
4121 		.num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4122 		.channel_mode = alc880_sixstack_modes,
4123 		.input_mux = &alc880_6stack_capture_source,
4124 	},
4125 	[ALC880_6ST_DIG] = {
4126 		.mixers = { alc880_six_stack_mixer },
4127 		.init_verbs = { alc880_volume_init_verbs,
4128 				alc880_pin_6stack_init_verbs },
4129 		.num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4130 		.dac_nids = alc880_6st_dac_nids,
4131 		.dig_out_nid = ALC880_DIGOUT_NID,
4132 		.num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4133 		.channel_mode = alc880_sixstack_modes,
4134 		.input_mux = &alc880_6stack_capture_source,
4135 	},
4136 	[ALC880_W810] = {
4137 		.mixers = { alc880_w810_base_mixer },
4138 		.init_verbs = { alc880_volume_init_verbs,
4139 				alc880_pin_w810_init_verbs,
4140 				alc880_gpio2_init_verbs },
4141 		.num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4142 		.dac_nids = alc880_w810_dac_nids,
4143 		.dig_out_nid = ALC880_DIGOUT_NID,
4144 		.num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4145 		.channel_mode = alc880_w810_modes,
4146 		.input_mux = &alc880_capture_source,
4147 	},
4148 	[ALC880_Z71V] = {
4149 		.mixers = { alc880_z71v_mixer },
4150 		.init_verbs = { alc880_volume_init_verbs,
4151 				alc880_pin_z71v_init_verbs },
4152 		.num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4153 		.dac_nids = alc880_z71v_dac_nids,
4154 		.dig_out_nid = ALC880_DIGOUT_NID,
4155 		.hp_nid = 0x03,
4156 		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4157 		.channel_mode = alc880_2_jack_modes,
4158 		.input_mux = &alc880_capture_source,
4159 	},
4160 	[ALC880_F1734] = {
4161 		.mixers = { alc880_f1734_mixer },
4162 		.init_verbs = { alc880_volume_init_verbs,
4163 				alc880_pin_f1734_init_verbs },
4164 		.num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4165 		.dac_nids = alc880_f1734_dac_nids,
4166 		.hp_nid = 0x02,
4167 		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4168 		.channel_mode = alc880_2_jack_modes,
4169 		.input_mux = &alc880_f1734_capture_source,
4170 		.unsol_event = alc880_uniwill_p53_unsol_event,
4171 		.setup = alc880_uniwill_p53_setup,
4172 		.init_hook = alc_automute_amp,
4173 	},
4174 	[ALC880_ASUS] = {
4175 		.mixers = { alc880_asus_mixer },
4176 		.init_verbs = { alc880_volume_init_verbs,
4177 				alc880_pin_asus_init_verbs,
4178 				alc880_gpio1_init_verbs },
4179 		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4180 		.dac_nids = alc880_asus_dac_nids,
4181 		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4182 		.channel_mode = alc880_asus_modes,
4183 		.need_dac_fix = 1,
4184 		.input_mux = &alc880_capture_source,
4185 	},
4186 	[ALC880_ASUS_DIG] = {
4187 		.mixers = { alc880_asus_mixer },
4188 		.init_verbs = { alc880_volume_init_verbs,
4189 				alc880_pin_asus_init_verbs,
4190 				alc880_gpio1_init_verbs },
4191 		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4192 		.dac_nids = alc880_asus_dac_nids,
4193 		.dig_out_nid = ALC880_DIGOUT_NID,
4194 		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4195 		.channel_mode = alc880_asus_modes,
4196 		.need_dac_fix = 1,
4197 		.input_mux = &alc880_capture_source,
4198 	},
4199 	[ALC880_ASUS_DIG2] = {
4200 		.mixers = { alc880_asus_mixer },
4201 		.init_verbs = { alc880_volume_init_verbs,
4202 				alc880_pin_asus_init_verbs,
4203 				alc880_gpio2_init_verbs }, /* use GPIO2 */
4204 		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4205 		.dac_nids = alc880_asus_dac_nids,
4206 		.dig_out_nid = ALC880_DIGOUT_NID,
4207 		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4208 		.channel_mode = alc880_asus_modes,
4209 		.need_dac_fix = 1,
4210 		.input_mux = &alc880_capture_source,
4211 	},
4212 	[ALC880_ASUS_W1V] = {
4213 		.mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
4214 		.init_verbs = { alc880_volume_init_verbs,
4215 				alc880_pin_asus_init_verbs,
4216 				alc880_gpio1_init_verbs },
4217 		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4218 		.dac_nids = alc880_asus_dac_nids,
4219 		.dig_out_nid = ALC880_DIGOUT_NID,
4220 		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4221 		.channel_mode = alc880_asus_modes,
4222 		.need_dac_fix = 1,
4223 		.input_mux = &alc880_capture_source,
4224 	},
4225 	[ALC880_UNIWILL_DIG] = {
4226 		.mixers = { alc880_asus_mixer },
4227 		.init_verbs = { alc880_volume_init_verbs,
4228 				alc880_pin_asus_init_verbs },
4229 		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4230 		.dac_nids = alc880_asus_dac_nids,
4231 		.dig_out_nid = ALC880_DIGOUT_NID,
4232 		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4233 		.channel_mode = alc880_asus_modes,
4234 		.need_dac_fix = 1,
4235 		.input_mux = &alc880_capture_source,
4236 	},
4237 	[ALC880_UNIWILL] = {
4238 		.mixers = { alc880_uniwill_mixer },
4239 		.init_verbs = { alc880_volume_init_verbs,
4240 				alc880_uniwill_init_verbs },
4241 		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4242 		.dac_nids = alc880_asus_dac_nids,
4243 		.dig_out_nid = ALC880_DIGOUT_NID,
4244 		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4245 		.channel_mode = alc880_threestack_modes,
4246 		.need_dac_fix = 1,
4247 		.input_mux = &alc880_capture_source,
4248 		.unsol_event = alc880_uniwill_unsol_event,
4249 		.setup = alc880_uniwill_setup,
4250 		.init_hook = alc880_uniwill_init_hook,
4251 	},
4252 	[ALC880_UNIWILL_P53] = {
4253 		.mixers = { alc880_uniwill_p53_mixer },
4254 		.init_verbs = { alc880_volume_init_verbs,
4255 				alc880_uniwill_p53_init_verbs },
4256 		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4257 		.dac_nids = alc880_asus_dac_nids,
4258 		.num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4259 		.channel_mode = alc880_threestack_modes,
4260 		.input_mux = &alc880_capture_source,
4261 		.unsol_event = alc880_uniwill_p53_unsol_event,
4262 		.setup = alc880_uniwill_p53_setup,
4263 		.init_hook = alc_automute_amp,
4264 	},
4265 	[ALC880_FUJITSU] = {
4266 		.mixers = { alc880_fujitsu_mixer },
4267 		.init_verbs = { alc880_volume_init_verbs,
4268 				alc880_uniwill_p53_init_verbs,
4269 	       			alc880_beep_init_verbs },
4270 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4271 		.dac_nids = alc880_dac_nids,
4272 		.dig_out_nid = ALC880_DIGOUT_NID,
4273 		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4274 		.channel_mode = alc880_2_jack_modes,
4275 		.input_mux = &alc880_capture_source,
4276 		.unsol_event = alc880_uniwill_p53_unsol_event,
4277 		.setup = alc880_uniwill_p53_setup,
4278 		.init_hook = alc_automute_amp,
4279 	},
4280 	[ALC880_CLEVO] = {
4281 		.mixers = { alc880_three_stack_mixer },
4282 		.init_verbs = { alc880_volume_init_verbs,
4283 				alc880_pin_clevo_init_verbs },
4284 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4285 		.dac_nids = alc880_dac_nids,
4286 		.hp_nid = 0x03,
4287 		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4288 		.channel_mode = alc880_threestack_modes,
4289 		.need_dac_fix = 1,
4290 		.input_mux = &alc880_capture_source,
4291 	},
4292 	[ALC880_LG] = {
4293 		.mixers = { alc880_lg_mixer },
4294 		.init_verbs = { alc880_volume_init_verbs,
4295 				alc880_lg_init_verbs },
4296 		.num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4297 		.dac_nids = alc880_lg_dac_nids,
4298 		.dig_out_nid = ALC880_DIGOUT_NID,
4299 		.num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4300 		.channel_mode = alc880_lg_ch_modes,
4301 		.need_dac_fix = 1,
4302 		.input_mux = &alc880_lg_capture_source,
4303 		.unsol_event = alc_automute_amp_unsol_event,
4304 		.setup = alc880_lg_setup,
4305 		.init_hook = alc_automute_amp,
4306 #ifdef CONFIG_SND_HDA_POWER_SAVE
4307 		.loopbacks = alc880_lg_loopbacks,
4308 #endif
4309 	},
4310 	[ALC880_LG_LW] = {
4311 		.mixers = { alc880_lg_lw_mixer },
4312 		.init_verbs = { alc880_volume_init_verbs,
4313 				alc880_lg_lw_init_verbs },
4314 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4315 		.dac_nids = alc880_dac_nids,
4316 		.dig_out_nid = ALC880_DIGOUT_NID,
4317 		.num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4318 		.channel_mode = alc880_lg_lw_modes,
4319 		.input_mux = &alc880_lg_lw_capture_source,
4320 		.unsol_event = alc_automute_amp_unsol_event,
4321 		.setup = alc880_lg_lw_setup,
4322 		.init_hook = alc_automute_amp,
4323 	},
4324 	[ALC880_MEDION_RIM] = {
4325 		.mixers = { alc880_medion_rim_mixer },
4326 		.init_verbs = { alc880_volume_init_verbs,
4327 				alc880_medion_rim_init_verbs,
4328 				alc_gpio2_init_verbs },
4329 		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4330 		.dac_nids = alc880_dac_nids,
4331 		.dig_out_nid = ALC880_DIGOUT_NID,
4332 		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4333 		.channel_mode = alc880_2_jack_modes,
4334 		.input_mux = &alc880_medion_rim_capture_source,
4335 		.unsol_event = alc880_medion_rim_unsol_event,
4336 		.setup = alc880_medion_rim_setup,
4337 		.init_hook = alc880_medion_rim_automute,
4338 	},
4339 #ifdef CONFIG_SND_DEBUG
4340 	[ALC880_TEST] = {
4341 		.mixers = { alc880_test_mixer },
4342 		.init_verbs = { alc880_test_init_verbs },
4343 		.num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4344 		.dac_nids = alc880_test_dac_nids,
4345 		.dig_out_nid = ALC880_DIGOUT_NID,
4346 		.num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4347 		.channel_mode = alc880_test_modes,
4348 		.input_mux = &alc880_test_capture_source,
4349 	},
4350 #endif
4351 };
4352 
4353 /*
4354  * Automatic parse of I/O pins from the BIOS configuration
4355  */
4356 
4357 enum {
4358 	ALC_CTL_WIDGET_VOL,
4359 	ALC_CTL_WIDGET_MUTE,
4360 	ALC_CTL_BIND_MUTE,
4361 };
4362 static struct snd_kcontrol_new alc880_control_templates[] = {
4363 	HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4364 	HDA_CODEC_MUTE(NULL, 0, 0, 0),
4365 	HDA_BIND_MUTE(NULL, 0, 0, 0),
4366 };
4367 
4368 /* add dynamic controls */
4369 static int add_control(struct alc_spec *spec, int type, const char *name,
4370 		       unsigned long val)
4371 {
4372 	struct snd_kcontrol_new *knew;
4373 
4374 	snd_array_init(&spec->kctls, sizeof(*knew), 32);
4375 	knew = snd_array_new(&spec->kctls);
4376 	if (!knew)
4377 		return -ENOMEM;
4378 	*knew = alc880_control_templates[type];
4379 	knew->name = kstrdup(name, GFP_KERNEL);
4380 	if (!knew->name)
4381 		return -ENOMEM;
4382 	if (get_amp_nid_(val))
4383 		knew->subdevice = HDA_SUBDEV_NID_FLAG | get_amp_nid_(val);
4384 	knew->private_value = val;
4385 	return 0;
4386 }
4387 
4388 static int add_control_with_pfx(struct alc_spec *spec, int type,
4389 				const char *pfx, const char *dir,
4390 				const char *sfx, unsigned long val)
4391 {
4392 	char name[32];
4393 	snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
4394 	return add_control(spec, type, name, val);
4395 }
4396 
4397 #define add_pb_vol_ctrl(spec, type, pfx, val) \
4398 	add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val)
4399 #define add_pb_sw_ctrl(spec, type, pfx, val) \
4400 	add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val)
4401 
4402 #define alc880_is_fixed_pin(nid)	((nid) >= 0x14 && (nid) <= 0x17)
4403 #define alc880_fixed_pin_idx(nid)	((nid) - 0x14)
4404 #define alc880_is_multi_pin(nid)	((nid) >= 0x18)
4405 #define alc880_multi_pin_idx(nid)	((nid) - 0x18)
4406 #define alc880_idx_to_dac(nid)		((nid) + 0x02)
4407 #define alc880_dac_to_idx(nid)		((nid) - 0x02)
4408 #define alc880_idx_to_mixer(nid)	((nid) + 0x0c)
4409 #define alc880_idx_to_selector(nid)	((nid) + 0x10)
4410 #define ALC880_PIN_CD_NID		0x1c
4411 
4412 /* fill in the dac_nids table from the parsed pin configuration */
4413 static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4414 				     const struct auto_pin_cfg *cfg)
4415 {
4416 	hda_nid_t nid;
4417 	int assigned[4];
4418 	int i, j;
4419 
4420 	memset(assigned, 0, sizeof(assigned));
4421 	spec->multiout.dac_nids = spec->private_dac_nids;
4422 
4423 	/* check the pins hardwired to audio widget */
4424 	for (i = 0; i < cfg->line_outs; i++) {
4425 		nid = cfg->line_out_pins[i];
4426 		if (alc880_is_fixed_pin(nid)) {
4427 			int idx = alc880_fixed_pin_idx(nid);
4428 			spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
4429 			assigned[idx] = 1;
4430 		}
4431 	}
4432 	/* left pins can be connect to any audio widget */
4433 	for (i = 0; i < cfg->line_outs; i++) {
4434 		nid = cfg->line_out_pins[i];
4435 		if (alc880_is_fixed_pin(nid))
4436 			continue;
4437 		/* search for an empty channel */
4438 		for (j = 0; j < cfg->line_outs; j++) {
4439 			if (!assigned[j]) {
4440 				spec->multiout.dac_nids[i] =
4441 					alc880_idx_to_dac(j);
4442 				assigned[j] = 1;
4443 				break;
4444 			}
4445 		}
4446 	}
4447 	spec->multiout.num_dacs = cfg->line_outs;
4448 	return 0;
4449 }
4450 
4451 /* add playback controls from the parsed DAC table */
4452 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4453 					     const struct auto_pin_cfg *cfg)
4454 {
4455 	static const char *chname[4] = {
4456 		"Front", "Surround", NULL /*CLFE*/, "Side"
4457 	};
4458 	hda_nid_t nid;
4459 	int i, err;
4460 
4461 	for (i = 0; i < cfg->line_outs; i++) {
4462 		if (!spec->multiout.dac_nids[i])
4463 			continue;
4464 		nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4465 		if (i == 2) {
4466 			/* Center/LFE */
4467 			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4468 					      "Center",
4469 					  HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4470 							      HDA_OUTPUT));
4471 			if (err < 0)
4472 				return err;
4473 			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4474 					      "LFE",
4475 					  HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4476 							      HDA_OUTPUT));
4477 			if (err < 0)
4478 				return err;
4479 			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4480 					     "Center",
4481 					  HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4482 							      HDA_INPUT));
4483 			if (err < 0)
4484 				return err;
4485 			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4486 					     "LFE",
4487 					  HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4488 							      HDA_INPUT));
4489 			if (err < 0)
4490 				return err;
4491 		} else {
4492 			const char *pfx;
4493 			if (cfg->line_outs == 1 &&
4494 			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4495 				pfx = "Speaker";
4496 			else
4497 				pfx = chname[i];
4498 			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4499 					  HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4500 							      HDA_OUTPUT));
4501 			if (err < 0)
4502 				return err;
4503 			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4504 					  HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4505 							      HDA_INPUT));
4506 			if (err < 0)
4507 				return err;
4508 		}
4509 	}
4510 	return 0;
4511 }
4512 
4513 /* add playback controls for speaker and HP outputs */
4514 static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4515 					const char *pfx)
4516 {
4517 	hda_nid_t nid;
4518 	int err;
4519 
4520 	if (!pin)
4521 		return 0;
4522 
4523 	if (alc880_is_fixed_pin(pin)) {
4524 		nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
4525 		/* specify the DAC as the extra output */
4526 		if (!spec->multiout.hp_nid)
4527 			spec->multiout.hp_nid = nid;
4528 		else
4529 			spec->multiout.extra_out_nid[0] = nid;
4530 		/* control HP volume/switch on the output mixer amp */
4531 		nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
4532 		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4533 				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4534 		if (err < 0)
4535 			return err;
4536 		err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4537 				  HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4538 		if (err < 0)
4539 			return err;
4540 	} else if (alc880_is_multi_pin(pin)) {
4541 		/* set manual connection */
4542 		/* we have only a switch on HP-out PIN */
4543 		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
4544 				  HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4545 		if (err < 0)
4546 			return err;
4547 	}
4548 	return 0;
4549 }
4550 
4551 /* create input playback/capture controls for the given pin */
4552 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4553 			    const char *ctlname,
4554 			    int idx, hda_nid_t mix_nid)
4555 {
4556 	int err;
4557 
4558 	err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
4559 			  HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4560 	if (err < 0)
4561 		return err;
4562 	err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
4563 			  HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4564 	if (err < 0)
4565 		return err;
4566 	return 0;
4567 }
4568 
4569 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4570 {
4571 	unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4572 	return (pincap & AC_PINCAP_IN) != 0;
4573 }
4574 
4575 /* create playback/capture controls for input pins */
4576 static int alc_auto_create_input_ctls(struct hda_codec *codec,
4577 				      const struct auto_pin_cfg *cfg,
4578 				      hda_nid_t mixer,
4579 				      hda_nid_t cap1, hda_nid_t cap2)
4580 {
4581 	struct alc_spec *spec = codec->spec;
4582 	struct hda_input_mux *imux = &spec->private_imux[0];
4583 	int i, err, idx;
4584 
4585 	for (i = 0; i < AUTO_PIN_LAST; i++) {
4586 		hda_nid_t pin;
4587 
4588 		pin = cfg->input_pins[i];
4589 		if (!alc_is_input_pin(codec, pin))
4590 			continue;
4591 
4592 		if (mixer) {
4593 			idx = get_connection_index(codec, mixer, pin);
4594 			if (idx >= 0) {
4595 				err = new_analog_input(spec, pin,
4596 						       auto_pin_cfg_labels[i],
4597 						       idx, mixer);
4598 				if (err < 0)
4599 					return err;
4600 			}
4601 		}
4602 
4603 		if (!cap1)
4604 			continue;
4605 		idx = get_connection_index(codec, cap1, pin);
4606 		if (idx < 0 && cap2)
4607 			idx = get_connection_index(codec, cap2, pin);
4608 		if (idx >= 0) {
4609 			imux->items[imux->num_items].label =
4610 				auto_pin_cfg_labels[i];
4611 			imux->items[imux->num_items].index = idx;
4612 			imux->num_items++;
4613 		}
4614 	}
4615 	return 0;
4616 }
4617 
4618 static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4619 						const struct auto_pin_cfg *cfg)
4620 {
4621 	return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4622 }
4623 
4624 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4625 			       unsigned int pin_type)
4626 {
4627 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4628 			    pin_type);
4629 	/* unmute pin */
4630 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4631 			    AMP_OUT_UNMUTE);
4632 }
4633 
4634 static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4635 					      hda_nid_t nid, int pin_type,
4636 					      int dac_idx)
4637 {
4638 	alc_set_pin_output(codec, nid, pin_type);
4639 	/* need the manual connection? */
4640 	if (alc880_is_multi_pin(nid)) {
4641 		struct alc_spec *spec = codec->spec;
4642 		int idx = alc880_multi_pin_idx(nid);
4643 		snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4644 				    AC_VERB_SET_CONNECT_SEL,
4645 				    alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
4646 	}
4647 }
4648 
4649 static int get_pin_type(int line_out_type)
4650 {
4651 	if (line_out_type == AUTO_PIN_HP_OUT)
4652 		return PIN_HP;
4653 	else
4654 		return PIN_OUT;
4655 }
4656 
4657 static void alc880_auto_init_multi_out(struct hda_codec *codec)
4658 {
4659 	struct alc_spec *spec = codec->spec;
4660 	int i;
4661 
4662 	for (i = 0; i < spec->autocfg.line_outs; i++) {
4663 		hda_nid_t nid = spec->autocfg.line_out_pins[i];
4664 		int pin_type = get_pin_type(spec->autocfg.line_out_type);
4665 		alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
4666 	}
4667 }
4668 
4669 static void alc880_auto_init_extra_out(struct hda_codec *codec)
4670 {
4671 	struct alc_spec *spec = codec->spec;
4672 	hda_nid_t pin;
4673 
4674 	pin = spec->autocfg.speaker_pins[0];
4675 	if (pin) /* connect to front */
4676 		alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
4677 	pin = spec->autocfg.hp_pins[0];
4678 	if (pin) /* connect to front */
4679 		alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
4680 }
4681 
4682 static void alc880_auto_init_analog_input(struct hda_codec *codec)
4683 {
4684 	struct alc_spec *spec = codec->spec;
4685 	int i;
4686 
4687 	for (i = 0; i < AUTO_PIN_LAST; i++) {
4688 		hda_nid_t nid = spec->autocfg.input_pins[i];
4689 		if (alc_is_input_pin(codec, nid)) {
4690 			alc_set_input_pin(codec, nid, i);
4691 			if (nid != ALC880_PIN_CD_NID &&
4692 			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
4693 				snd_hda_codec_write(codec, nid, 0,
4694 						    AC_VERB_SET_AMP_GAIN_MUTE,
4695 						    AMP_OUT_MUTE);
4696 		}
4697 	}
4698 }
4699 
4700 /* parse the BIOS configuration and set up the alc_spec */
4701 /* return 1 if successful, 0 if the proper config is not found,
4702  * or a negative error code
4703  */
4704 static int alc880_parse_auto_config(struct hda_codec *codec)
4705 {
4706 	struct alc_spec *spec = codec->spec;
4707 	int i, err;
4708 	static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
4709 
4710 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4711 					   alc880_ignore);
4712 	if (err < 0)
4713 		return err;
4714 	if (!spec->autocfg.line_outs)
4715 		return 0; /* can't find valid BIOS pin config */
4716 
4717 	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
4718 	if (err < 0)
4719 		return err;
4720 	err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
4721 	if (err < 0)
4722 		return err;
4723 	err = alc880_auto_create_extra_out(spec,
4724 					   spec->autocfg.speaker_pins[0],
4725 					   "Speaker");
4726 	if (err < 0)
4727 		return err;
4728 	err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
4729 					   "Headphone");
4730 	if (err < 0)
4731 		return err;
4732 	err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
4733 	if (err < 0)
4734 		return err;
4735 
4736 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4737 
4738 	/* check multiple SPDIF-out (for recent codecs) */
4739 	for (i = 0; i < spec->autocfg.dig_outs; i++) {
4740 		hda_nid_t dig_nid;
4741 		err = snd_hda_get_connections(codec,
4742 					      spec->autocfg.dig_out_pins[i],
4743 					      &dig_nid, 1);
4744 		if (err < 0)
4745 			continue;
4746 		if (!i)
4747 			spec->multiout.dig_out_nid = dig_nid;
4748 		else {
4749 			spec->multiout.slave_dig_outs = spec->slave_dig_outs;
4750 			if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
4751 				break;
4752 			spec->slave_dig_outs[i - 1] = dig_nid;
4753 		}
4754 	}
4755 	if (spec->autocfg.dig_in_pin)
4756 		spec->dig_in_nid = ALC880_DIGIN_NID;
4757 
4758 	if (spec->kctls.list)
4759 		add_mixer(spec, spec->kctls.list);
4760 
4761 	add_verb(spec, alc880_volume_init_verbs);
4762 
4763 	spec->num_mux_defs = 1;
4764 	spec->input_mux = &spec->private_imux[0];
4765 
4766 	alc_ssid_check(codec, 0x15, 0x1b, 0x14);
4767 
4768 	return 1;
4769 }
4770 
4771 /* additional initialization for auto-configuration model */
4772 static void alc880_auto_init(struct hda_codec *codec)
4773 {
4774 	struct alc_spec *spec = codec->spec;
4775 	alc880_auto_init_multi_out(codec);
4776 	alc880_auto_init_extra_out(codec);
4777 	alc880_auto_init_analog_input(codec);
4778 	if (spec->unsol_event)
4779 		alc_inithook(codec);
4780 }
4781 
4782 /* check the ADC/MUX contains all input pins; some ADC/MUX contains only
4783  * one of two digital mic pins, e.g. on ALC272
4784  */
4785 static void fixup_automic_adc(struct hda_codec *codec)
4786 {
4787 	struct alc_spec *spec = codec->spec;
4788 	int i;
4789 
4790 	for (i = 0; i < spec->num_adc_nids; i++) {
4791 		hda_nid_t cap = spec->capsrc_nids ?
4792 			spec->capsrc_nids[i] : spec->adc_nids[i];
4793 		int iidx, eidx;
4794 
4795 		iidx = get_connection_index(codec, cap, spec->int_mic.pin);
4796 		if (iidx < 0)
4797 			continue;
4798 		eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
4799 		if (eidx < 0)
4800 			continue;
4801 		spec->int_mic.mux_idx = iidx;
4802 		spec->ext_mic.mux_idx = eidx;
4803 		if (spec->capsrc_nids)
4804 			spec->capsrc_nids += i;
4805 		spec->adc_nids += i;
4806 		spec->num_adc_nids = 1;
4807 		return;
4808 	}
4809 	snd_printd(KERN_INFO "hda_codec: %s: "
4810 		   "No ADC/MUX containing both 0x%x and 0x%x pins\n",
4811 		   codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
4812 	spec->auto_mic = 0; /* disable auto-mic to be sure */
4813 }
4814 
4815 static void set_capture_mixer(struct hda_codec *codec)
4816 {
4817 	struct alc_spec *spec = codec->spec;
4818 	static struct snd_kcontrol_new *caps[2][3] = {
4819 		{ alc_capture_mixer_nosrc1,
4820 		  alc_capture_mixer_nosrc2,
4821 		  alc_capture_mixer_nosrc3 },
4822 		{ alc_capture_mixer1,
4823 		  alc_capture_mixer2,
4824 		  alc_capture_mixer3 },
4825 	};
4826 	if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
4827 		int mux;
4828 		if (spec->auto_mic) {
4829 			mux = 0;
4830 			fixup_automic_adc(codec);
4831 		} else if (spec->input_mux && spec->input_mux->num_items > 1)
4832 			mux = 1;
4833 		else
4834 			mux = 0;
4835 		spec->cap_mixer = caps[mux][spec->num_adc_nids - 1];
4836 	}
4837 }
4838 
4839 #ifdef CONFIG_SND_HDA_INPUT_BEEP
4840 #define set_beep_amp(spec, nid, idx, dir) \
4841 	((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
4842 #else
4843 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
4844 #endif
4845 
4846 /*
4847  * OK, here we have finally the patch for ALC880
4848  */
4849 
4850 static int patch_alc880(struct hda_codec *codec)
4851 {
4852 	struct alc_spec *spec;
4853 	int board_config;
4854 	int err;
4855 
4856 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4857 	if (spec == NULL)
4858 		return -ENOMEM;
4859 
4860 	codec->spec = spec;
4861 
4862 	board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
4863 						  alc880_models,
4864 						  alc880_cfg_tbl);
4865 	if (board_config < 0) {
4866 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4867 		       codec->chip_name);
4868 		board_config = ALC880_AUTO;
4869 	}
4870 
4871 	if (board_config == ALC880_AUTO) {
4872 		/* automatic parse from the BIOS config */
4873 		err = alc880_parse_auto_config(codec);
4874 		if (err < 0) {
4875 			alc_free(codec);
4876 			return err;
4877 		} else if (!err) {
4878 			printk(KERN_INFO
4879 			       "hda_codec: Cannot set up configuration "
4880 			       "from BIOS.  Using 3-stack mode...\n");
4881 			board_config = ALC880_3ST;
4882 		}
4883 	}
4884 
4885 	err = snd_hda_attach_beep_device(codec, 0x1);
4886 	if (err < 0) {
4887 		alc_free(codec);
4888 		return err;
4889 	}
4890 
4891 	if (board_config != ALC880_AUTO)
4892 		setup_preset(codec, &alc880_presets[board_config]);
4893 
4894 	spec->stream_analog_playback = &alc880_pcm_analog_playback;
4895 	spec->stream_analog_capture = &alc880_pcm_analog_capture;
4896 	spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
4897 
4898 	spec->stream_digital_playback = &alc880_pcm_digital_playback;
4899 	spec->stream_digital_capture = &alc880_pcm_digital_capture;
4900 
4901 	if (!spec->adc_nids && spec->input_mux) {
4902 		/* check whether NID 0x07 is valid */
4903 		unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
4904 		/* get type */
4905 		wcap = get_wcaps_type(wcap);
4906 		if (wcap != AC_WID_AUD_IN) {
4907 			spec->adc_nids = alc880_adc_nids_alt;
4908 			spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
4909 		} else {
4910 			spec->adc_nids = alc880_adc_nids;
4911 			spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
4912 		}
4913 	}
4914 	set_capture_mixer(codec);
4915 	set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
4916 
4917 	spec->vmaster_nid = 0x0c;
4918 
4919 	codec->patch_ops = alc_patch_ops;
4920 	if (board_config == ALC880_AUTO)
4921 		spec->init_hook = alc880_auto_init;
4922 #ifdef CONFIG_SND_HDA_POWER_SAVE
4923 	if (!spec->loopback.amplist)
4924 		spec->loopback.amplist = alc880_loopbacks;
4925 #endif
4926 	codec->proc_widget_hook = print_realtek_coef;
4927 
4928 	return 0;
4929 }
4930 
4931 
4932 /*
4933  * ALC260 support
4934  */
4935 
4936 static hda_nid_t alc260_dac_nids[1] = {
4937 	/* front */
4938 	0x02,
4939 };
4940 
4941 static hda_nid_t alc260_adc_nids[1] = {
4942 	/* ADC0 */
4943 	0x04,
4944 };
4945 
4946 static hda_nid_t alc260_adc_nids_alt[1] = {
4947 	/* ADC1 */
4948 	0x05,
4949 };
4950 
4951 /* NIDs used when simultaneous access to both ADCs makes sense.  Note that
4952  * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
4953  */
4954 static hda_nid_t alc260_dual_adc_nids[2] = {
4955 	/* ADC0, ADC1 */
4956 	0x04, 0x05
4957 };
4958 
4959 #define ALC260_DIGOUT_NID	0x03
4960 #define ALC260_DIGIN_NID	0x06
4961 
4962 static struct hda_input_mux alc260_capture_source = {
4963 	.num_items = 4,
4964 	.items = {
4965 		{ "Mic", 0x0 },
4966 		{ "Front Mic", 0x1 },
4967 		{ "Line", 0x2 },
4968 		{ "CD", 0x4 },
4969 	},
4970 };
4971 
4972 /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
4973  * headphone jack and the internal CD lines since these are the only pins at
4974  * which audio can appear.  For flexibility, also allow the option of
4975  * recording the mixer output on the second ADC (ADC0 doesn't have a
4976  * connection to the mixer output).
4977  */
4978 static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
4979 	{
4980 		.num_items = 3,
4981 		.items = {
4982 			{ "Mic/Line", 0x0 },
4983 			{ "CD", 0x4 },
4984 			{ "Headphone", 0x2 },
4985 		},
4986 	},
4987 	{
4988 		.num_items = 4,
4989 		.items = {
4990 			{ "Mic/Line", 0x0 },
4991 			{ "CD", 0x4 },
4992 			{ "Headphone", 0x2 },
4993 			{ "Mixer", 0x5 },
4994 		},
4995 	},
4996 
4997 };
4998 
4999 /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5000  * the Fujitsu S702x, but jacks are marked differently.
5001  */
5002 static struct hda_input_mux alc260_acer_capture_sources[2] = {
5003 	{
5004 		.num_items = 4,
5005 		.items = {
5006 			{ "Mic", 0x0 },
5007 			{ "Line", 0x2 },
5008 			{ "CD", 0x4 },
5009 			{ "Headphone", 0x5 },
5010 		},
5011 	},
5012 	{
5013 		.num_items = 5,
5014 		.items = {
5015 			{ "Mic", 0x0 },
5016 			{ "Line", 0x2 },
5017 			{ "CD", 0x4 },
5018 			{ "Headphone", 0x6 },
5019 			{ "Mixer", 0x5 },
5020 		},
5021 	},
5022 };
5023 
5024 /* Maxdata Favorit 100XS */
5025 static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5026 	{
5027 		.num_items = 2,
5028 		.items = {
5029 			{ "Line/Mic", 0x0 },
5030 			{ "CD", 0x4 },
5031 		},
5032 	},
5033 	{
5034 		.num_items = 3,
5035 		.items = {
5036 			{ "Line/Mic", 0x0 },
5037 			{ "CD", 0x4 },
5038 			{ "Mixer", 0x5 },
5039 		},
5040 	},
5041 };
5042 
5043 /*
5044  * This is just place-holder, so there's something for alc_build_pcms to look
5045  * at when it calculates the maximum number of channels. ALC260 has no mixer
5046  * element which allows changing the channel mode, so the verb list is
5047  * never used.
5048  */
5049 static struct hda_channel_mode alc260_modes[1] = {
5050 	{ 2, NULL },
5051 };
5052 
5053 
5054 /* Mixer combinations
5055  *
5056  * basic: base_output + input + pc_beep + capture
5057  * HP: base_output + input + capture_alt
5058  * HP_3013: hp_3013 + input + capture
5059  * fujitsu: fujitsu + capture
5060  * acer: acer + capture
5061  */
5062 
5063 static struct snd_kcontrol_new alc260_base_output_mixer[] = {
5064 	HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5065 	HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5066 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5067 	HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5068 	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5069 	HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5070 	{ } /* end */
5071 };
5072 
5073 static struct snd_kcontrol_new alc260_input_mixer[] = {
5074 	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5075 	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5076 	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5077 	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5078 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5079 	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5080 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5081 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
5082 	{ } /* end */
5083 };
5084 
5085 /* update HP, line and mono out pins according to the master switch */
5086 static void alc260_hp_master_update(struct hda_codec *codec,
5087 				    hda_nid_t hp, hda_nid_t line,
5088 				    hda_nid_t mono)
5089 {
5090 	struct alc_spec *spec = codec->spec;
5091 	unsigned int val = spec->master_sw ? PIN_HP : 0;
5092 	/* change HP and line-out pins */
5093 	snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5094 			    val);
5095 	snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5096 			    val);
5097 	/* mono (speaker) depending on the HP jack sense */
5098 	val = (val && !spec->jack_present) ? PIN_OUT : 0;
5099 	snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5100 			    val);
5101 }
5102 
5103 static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5104 				   struct snd_ctl_elem_value *ucontrol)
5105 {
5106 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5107 	struct alc_spec *spec = codec->spec;
5108 	*ucontrol->value.integer.value = spec->master_sw;
5109 	return 0;
5110 }
5111 
5112 static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5113 				   struct snd_ctl_elem_value *ucontrol)
5114 {
5115 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5116 	struct alc_spec *spec = codec->spec;
5117 	int val = !!*ucontrol->value.integer.value;
5118 	hda_nid_t hp, line, mono;
5119 
5120 	if (val == spec->master_sw)
5121 		return 0;
5122 	spec->master_sw = val;
5123 	hp = (kcontrol->private_value >> 16) & 0xff;
5124 	line = (kcontrol->private_value >> 8) & 0xff;
5125 	mono = kcontrol->private_value & 0xff;
5126 	alc260_hp_master_update(codec, hp, line, mono);
5127 	return 1;
5128 }
5129 
5130 static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5131 	{
5132 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5133 		.name = "Master Playback Switch",
5134 		.info = snd_ctl_boolean_mono_info,
5135 		.get = alc260_hp_master_sw_get,
5136 		.put = alc260_hp_master_sw_put,
5137 		.private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5138 	},
5139 	HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5140 	HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5141 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5142 	HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5143 	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5144 			      HDA_OUTPUT),
5145 	HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5146 	{ } /* end */
5147 };
5148 
5149 static struct hda_verb alc260_hp_unsol_verbs[] = {
5150 	{0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5151 	{},
5152 };
5153 
5154 static void alc260_hp_automute(struct hda_codec *codec)
5155 {
5156 	struct alc_spec *spec = codec->spec;
5157 
5158 	spec->jack_present = snd_hda_jack_detect(codec, 0x10);
5159 	alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5160 }
5161 
5162 static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5163 {
5164 	if ((res >> 26) == ALC880_HP_EVENT)
5165 		alc260_hp_automute(codec);
5166 }
5167 
5168 static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5169 	{
5170 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5171 		.name = "Master Playback Switch",
5172 		.info = snd_ctl_boolean_mono_info,
5173 		.get = alc260_hp_master_sw_get,
5174 		.put = alc260_hp_master_sw_put,
5175 		.private_value = (0x15 << 16) | (0x10 << 8) | 0x11
5176 	},
5177 	HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5178 	HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5179 	HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5180 	HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5181 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5182 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
5183 	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5184 	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
5185 	{ } /* end */
5186 };
5187 
5188 static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5189 	.ops = &snd_hda_bind_vol,
5190 	.values = {
5191 		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5192 		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5193 		HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5194 		0
5195 	},
5196 };
5197 
5198 static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5199 	.ops = &snd_hda_bind_sw,
5200 	.values = {
5201 		HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5202 		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5203 		0
5204 	},
5205 };
5206 
5207 static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5208 	HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5209 	HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5210 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5211 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5212 	{ } /* end */
5213 };
5214 
5215 static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5216 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5217 	{},
5218 };
5219 
5220 static void alc260_hp_3013_automute(struct hda_codec *codec)
5221 {
5222 	struct alc_spec *spec = codec->spec;
5223 
5224 	spec->jack_present = snd_hda_jack_detect(codec, 0x15);
5225 	alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
5226 }
5227 
5228 static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5229 				       unsigned int res)
5230 {
5231 	if ((res >> 26) == ALC880_HP_EVENT)
5232 		alc260_hp_3013_automute(codec);
5233 }
5234 
5235 static void alc260_hp_3012_automute(struct hda_codec *codec)
5236 {
5237 	unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
5238 
5239 	snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5240 			    bits);
5241 	snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5242 			    bits);
5243 	snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5244 			    bits);
5245 }
5246 
5247 static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5248 				       unsigned int res)
5249 {
5250 	if ((res >> 26) == ALC880_HP_EVENT)
5251 		alc260_hp_3012_automute(codec);
5252 }
5253 
5254 /* Fujitsu S702x series laptops.  ALC260 pin usage: Mic/Line jack = 0x12,
5255  * HP jack = 0x14, CD audio =  0x16, internal speaker = 0x10.
5256  */
5257 static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
5258 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5259 	HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
5260 	ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5261 	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5262 	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5263 	HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5264 	HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
5265 	ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
5266 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5267 	HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
5268 	{ } /* end */
5269 };
5270 
5271 /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks.  Note that current
5272  * versions of the ALC260 don't act on requests to enable mic bias from NID
5273  * 0x0f (used to drive the headphone jack in these laptops).  The ALC260
5274  * datasheet doesn't mention this restriction.  At this stage it's not clear
5275  * whether this behaviour is intentional or is a hardware bug in chip
5276  * revisions available in early 2006.  Therefore for now allow the
5277  * "Headphone Jack Mode" control to span all choices, but if it turns out
5278  * that the lack of mic bias for this NID is intentional we could change the
5279  * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5280  *
5281  * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5282  * don't appear to make the mic bias available from the "line" jack, even
5283  * though the NID used for this jack (0x14) can supply it.  The theory is
5284  * that perhaps Acer have included blocking capacitors between the ALC260
5285  * and the output jack.  If this turns out to be the case for all such
5286  * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5287  * to ALC_PIN_DIR_INOUT_NOMICBIAS.
5288  *
5289  * The C20x Tablet series have a mono internal speaker which is controlled
5290  * via the chip's Mono sum widget and pin complex, so include the necessary
5291  * controls for such models.  On models without a "mono speaker" the control
5292  * won't do anything.
5293  */
5294 static struct snd_kcontrol_new alc260_acer_mixer[] = {
5295 	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5296 	HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5297 	ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5298 	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5299 			      HDA_OUTPUT),
5300 	HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
5301 			   HDA_INPUT),
5302 	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5303 	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5304 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5305 	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5306 	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5307 	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5308 	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5309 	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5310 	{ } /* end */
5311 };
5312 
5313 /* Maxdata Favorit 100XS: one output and one input (0x12) jack
5314  */
5315 static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5316 	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5317 	HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5318 	ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5319 	HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5320 	HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5321 	ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5322 	{ } /* end */
5323 };
5324 
5325 /* Packard bell V7900  ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5326  * Line In jack = 0x14, CD audio =  0x16, pc beep = 0x17.
5327  */
5328 static struct snd_kcontrol_new alc260_will_mixer[] = {
5329 	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5330 	HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5331 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5332 	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5333 	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5334 	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5335 	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5336 	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5337 	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5338 	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5339 	{ } /* end */
5340 };
5341 
5342 /* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5343  * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5344  */
5345 static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5346 	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5347 	HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5348 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5349 	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5350 	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5351 	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5352 	HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5353 	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5354 	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5355 	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5356 	{ } /* end */
5357 };
5358 
5359 /*
5360  * initialization verbs
5361  */
5362 static struct hda_verb alc260_init_verbs[] = {
5363 	/* Line In pin widget for input */
5364 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5365 	/* CD pin widget for input */
5366 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5367 	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5368 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5369 	/* Mic2 (front panel) pin widget for input and vref at 80% */
5370 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5371 	/* LINE-2 is used for line-out in rear */
5372 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5373 	/* select line-out */
5374 	{0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
5375 	/* LINE-OUT pin */
5376 	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5377 	/* enable HP */
5378 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5379 	/* enable Mono */
5380 	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5381 	/* mute capture amp left and right */
5382 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5383 	/* set connection select to line in (default select for this ADC) */
5384 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5385 	/* mute capture amp left and right */
5386 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5387 	/* set connection select to line in (default select for this ADC) */
5388 	{0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
5389 	/* set vol=0 Line-Out mixer amp left and right */
5390 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5391 	/* unmute pin widget amp left and right (no gain on this amp) */
5392 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5393 	/* set vol=0 HP mixer amp left and right */
5394 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5395 	/* unmute pin widget amp left and right (no gain on this amp) */
5396 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5397 	/* set vol=0 Mono mixer amp left and right */
5398 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5399 	/* unmute pin widget amp left and right (no gain on this amp) */
5400 	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5401 	/* unmute LINE-2 out pin */
5402 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5403 	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5404 	 * Line In 2 = 0x03
5405 	 */
5406 	/* mute analog inputs */
5407 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5408 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5409 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5410 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5411 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5412 	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5413 	/* mute Front out path */
5414 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5415 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5416 	/* mute Headphone out path */
5417 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5418 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5419 	/* mute Mono out path */
5420 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5421 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5422 	{ }
5423 };
5424 
5425 #if 0 /* should be identical with alc260_init_verbs? */
5426 static struct hda_verb alc260_hp_init_verbs[] = {
5427 	/* Headphone and output */
5428 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5429 	/* mono output */
5430 	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5431 	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5432 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5433 	/* Mic2 (front panel) pin widget for input and vref at 80% */
5434 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5435 	/* Line In pin widget for input */
5436 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5437 	/* Line-2 pin widget for output */
5438 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5439 	/* CD pin widget for input */
5440 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5441 	/* unmute amp left and right */
5442 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5443 	/* set connection select to line in (default select for this ADC) */
5444 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5445 	/* unmute Line-Out mixer amp left and right (volume = 0) */
5446 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5447 	/* mute pin widget amp left and right (no gain on this amp) */
5448 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5449 	/* unmute HP mixer amp left and right (volume = 0) */
5450 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5451 	/* mute pin widget amp left and right (no gain on this amp) */
5452 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5453 	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5454 	 * Line In 2 = 0x03
5455 	 */
5456 	/* mute analog inputs */
5457 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5458 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5459 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5460 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5461 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5462 	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5463 	/* Unmute Front out path */
5464 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5465 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5466 	/* Unmute Headphone out path */
5467 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5468 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5469 	/* Unmute Mono out path */
5470 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5471 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5472 	{ }
5473 };
5474 #endif
5475 
5476 static struct hda_verb alc260_hp_3013_init_verbs[] = {
5477 	/* Line out and output */
5478 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5479 	/* mono output */
5480 	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5481 	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5482 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5483 	/* Mic2 (front panel) pin widget for input and vref at 80% */
5484 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5485 	/* Line In pin widget for input */
5486 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5487 	/* Headphone pin widget for output */
5488 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5489 	/* CD pin widget for input */
5490 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5491 	/* unmute amp left and right */
5492 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5493 	/* set connection select to line in (default select for this ADC) */
5494 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5495 	/* unmute Line-Out mixer amp left and right (volume = 0) */
5496 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5497 	/* mute pin widget amp left and right (no gain on this amp) */
5498 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5499 	/* unmute HP mixer amp left and right (volume = 0) */
5500 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5501 	/* mute pin widget amp left and right (no gain on this amp) */
5502 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5503 	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5504 	 * Line In 2 = 0x03
5505 	 */
5506 	/* mute analog inputs */
5507 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5508 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5509 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5510 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5511 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5512 	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5513 	/* Unmute Front out path */
5514 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5515 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5516 	/* Unmute Headphone out path */
5517 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5518 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5519 	/* Unmute Mono out path */
5520 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5521 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5522 	{ }
5523 };
5524 
5525 /* Initialisation sequence for ALC260 as configured in Fujitsu S702x
5526  * laptops.  ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
5527  * audio = 0x16, internal speaker = 0x10.
5528  */
5529 static struct hda_verb alc260_fujitsu_init_verbs[] = {
5530 	/* Disable all GPIOs */
5531 	{0x01, AC_VERB_SET_GPIO_MASK, 0},
5532 	/* Internal speaker is connected to headphone pin */
5533 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5534 	/* Headphone/Line-out jack connects to Line1 pin; make it an output */
5535 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5536 	/* Mic/Line-in jack is connected to mic1 pin, so make it an input */
5537 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5538 	/* Ensure all other unused pins are disabled and muted. */
5539 	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5540 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5541 	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5542 	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5543 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5544 	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5545 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5546 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5547 
5548 	/* Disable digital (SPDIF) pins */
5549 	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5550 	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5551 
5552 	/* Ensure Line1 pin widget takes its input from the OUT1 sum bus
5553 	 * when acting as an output.
5554 	 */
5555 	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5556 
5557 	/* Start with output sum widgets muted and their output gains at min */
5558 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5559 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5560 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5561 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5562 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5563 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5564 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5565 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5566 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5567 
5568 	/* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
5569 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5570 	/* Unmute Line1 pin widget output buffer since it starts as an output.
5571 	 * If the pin mode is changed by the user the pin mode control will
5572 	 * take care of enabling the pin's input/output buffers as needed.
5573 	 * Therefore there's no need to enable the input buffer at this
5574 	 * stage.
5575 	 */
5576 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5577 	/* Unmute input buffer of pin widget used for Line-in (no equiv
5578 	 * mixer ctrl)
5579 	 */
5580 	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5581 
5582 	/* Mute capture amp left and right */
5583 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5584 	/* Set ADC connection select to match default mixer setting - line
5585 	 * in (on mic1 pin)
5586 	 */
5587 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5588 
5589 	/* Do the same for the second ADC: mute capture input amp and
5590 	 * set ADC connection to line in (on mic1 pin)
5591 	 */
5592 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5593 	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5594 
5595 	/* Mute all inputs to mixer widget (even unconnected ones) */
5596 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5597 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5598 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5599 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5600 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5601 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5602 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5603 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5604 
5605 	{ }
5606 };
5607 
5608 /* Initialisation sequence for ALC260 as configured in Acer TravelMate and
5609  * similar laptops (adapted from Fujitsu init verbs).
5610  */
5611 static struct hda_verb alc260_acer_init_verbs[] = {
5612 	/* On TravelMate laptops, GPIO 0 enables the internal speaker and
5613 	 * the headphone jack.  Turn this on and rely on the standard mute
5614 	 * methods whenever the user wants to turn these outputs off.
5615 	 */
5616 	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5617 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5618 	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5619 	/* Internal speaker/Headphone jack is connected to Line-out pin */
5620 	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5621 	/* Internal microphone/Mic jack is connected to Mic1 pin */
5622 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5623 	/* Line In jack is connected to Line1 pin */
5624 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5625 	/* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
5626 	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5627 	/* Ensure all other unused pins are disabled and muted. */
5628 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5629 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5630 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5631 	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5632 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5633 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5634 	/* Disable digital (SPDIF) pins */
5635 	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5636 	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5637 
5638 	/* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5639 	 * bus when acting as outputs.
5640 	 */
5641 	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5642 	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5643 
5644 	/* Start with output sum widgets muted and their output gains at min */
5645 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5646 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5647 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5648 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5649 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5650 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5651 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5652 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5653 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5654 
5655 	/* Unmute Line-out pin widget amp left and right
5656 	 * (no equiv mixer ctrl)
5657 	 */
5658 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5659 	/* Unmute mono pin widget amp output (no equiv mixer ctrl) */
5660 	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5661 	/* Unmute Mic1 and Line1 pin widget input buffers since they start as
5662 	 * inputs. If the pin mode is changed by the user the pin mode control
5663 	 * will take care of enabling the pin's input/output buffers as needed.
5664 	 * Therefore there's no need to enable the input buffer at this
5665 	 * stage.
5666 	 */
5667 	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5668 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5669 
5670 	/* Mute capture amp left and right */
5671 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5672 	/* Set ADC connection select to match default mixer setting - mic
5673 	 * (on mic1 pin)
5674 	 */
5675 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5676 
5677 	/* Do similar with the second ADC: mute capture input amp and
5678 	 * set ADC connection to mic to match ALSA's default state.
5679 	 */
5680 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5681 	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5682 
5683 	/* Mute all inputs to mixer widget (even unconnected ones) */
5684 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5685 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5686 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5687 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5688 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5689 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5690 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5691 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5692 
5693 	{ }
5694 };
5695 
5696 /* Initialisation sequence for Maxdata Favorit 100XS
5697  * (adapted from Acer init verbs).
5698  */
5699 static struct hda_verb alc260_favorit100_init_verbs[] = {
5700 	/* GPIO 0 enables the output jack.
5701 	 * Turn this on and rely on the standard mute
5702 	 * methods whenever the user wants to turn these outputs off.
5703 	 */
5704 	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5705 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5706 	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5707 	/* Line/Mic input jack is connected to Mic1 pin */
5708 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5709 	/* Ensure all other unused pins are disabled and muted. */
5710 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5711 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5712 	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5713 	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5714 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5715 	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5716 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5717 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5718 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5719 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5720 	/* Disable digital (SPDIF) pins */
5721 	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5722 	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5723 
5724 	/* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5725 	 * bus when acting as outputs.
5726 	 */
5727 	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5728 	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5729 
5730 	/* Start with output sum widgets muted and their output gains at min */
5731 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5732 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5733 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5734 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5735 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5736 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5737 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5738 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5739 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5740 
5741 	/* Unmute Line-out pin widget amp left and right
5742 	 * (no equiv mixer ctrl)
5743 	 */
5744 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5745 	/* Unmute Mic1 and Line1 pin widget input buffers since they start as
5746 	 * inputs. If the pin mode is changed by the user the pin mode control
5747 	 * will take care of enabling the pin's input/output buffers as needed.
5748 	 * Therefore there's no need to enable the input buffer at this
5749 	 * stage.
5750 	 */
5751 	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5752 
5753 	/* Mute capture amp left and right */
5754 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5755 	/* Set ADC connection select to match default mixer setting - mic
5756 	 * (on mic1 pin)
5757 	 */
5758 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5759 
5760 	/* Do similar with the second ADC: mute capture input amp and
5761 	 * set ADC connection to mic to match ALSA's default state.
5762 	 */
5763 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5764 	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5765 
5766 	/* Mute all inputs to mixer widget (even unconnected ones) */
5767 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5768 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5769 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5770 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5771 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5772 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5773 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5774 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5775 
5776 	{ }
5777 };
5778 
5779 static struct hda_verb alc260_will_verbs[] = {
5780 	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5781 	{0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
5782 	{0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
5783 	{0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5784 	{0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5785 	{0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
5786 	{}
5787 };
5788 
5789 static struct hda_verb alc260_replacer_672v_verbs[] = {
5790 	{0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5791 	{0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5792 	{0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
5793 
5794 	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5795 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5796 	{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5797 
5798 	{0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5799 	{}
5800 };
5801 
5802 /* toggle speaker-output according to the hp-jack state */
5803 static void alc260_replacer_672v_automute(struct hda_codec *codec)
5804 {
5805         unsigned int present;
5806 
5807 	/* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
5808 	present = snd_hda_jack_detect(codec, 0x0f);
5809 	if (present) {
5810 		snd_hda_codec_write_cache(codec, 0x01, 0,
5811 					  AC_VERB_SET_GPIO_DATA, 1);
5812 		snd_hda_codec_write_cache(codec, 0x0f, 0,
5813 					  AC_VERB_SET_PIN_WIDGET_CONTROL,
5814 					  PIN_HP);
5815 	} else {
5816 		snd_hda_codec_write_cache(codec, 0x01, 0,
5817 					  AC_VERB_SET_GPIO_DATA, 0);
5818 		snd_hda_codec_write_cache(codec, 0x0f, 0,
5819 					  AC_VERB_SET_PIN_WIDGET_CONTROL,
5820 					  PIN_OUT);
5821 	}
5822 }
5823 
5824 static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
5825                                        unsigned int res)
5826 {
5827         if ((res >> 26) == ALC880_HP_EVENT)
5828                 alc260_replacer_672v_automute(codec);
5829 }
5830 
5831 static struct hda_verb alc260_hp_dc7600_verbs[] = {
5832 	{0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
5833 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
5834 	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5835 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5836 	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5837 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5838 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5839 	{0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5840 	{0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5841 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5842 	{}
5843 };
5844 
5845 /* Test configuration for debugging, modelled after the ALC880 test
5846  * configuration.
5847  */
5848 #ifdef CONFIG_SND_DEBUG
5849 static hda_nid_t alc260_test_dac_nids[1] = {
5850 	0x02,
5851 };
5852 static hda_nid_t alc260_test_adc_nids[2] = {
5853 	0x04, 0x05,
5854 };
5855 /* For testing the ALC260, each input MUX needs its own definition since
5856  * the signal assignments are different.  This assumes that the first ADC
5857  * is NID 0x04.
5858  */
5859 static struct hda_input_mux alc260_test_capture_sources[2] = {
5860 	{
5861 		.num_items = 7,
5862 		.items = {
5863 			{ "MIC1 pin", 0x0 },
5864 			{ "MIC2 pin", 0x1 },
5865 			{ "LINE1 pin", 0x2 },
5866 			{ "LINE2 pin", 0x3 },
5867 			{ "CD pin", 0x4 },
5868 			{ "LINE-OUT pin", 0x5 },
5869 			{ "HP-OUT pin", 0x6 },
5870 		},
5871         },
5872 	{
5873 		.num_items = 8,
5874 		.items = {
5875 			{ "MIC1 pin", 0x0 },
5876 			{ "MIC2 pin", 0x1 },
5877 			{ "LINE1 pin", 0x2 },
5878 			{ "LINE2 pin", 0x3 },
5879 			{ "CD pin", 0x4 },
5880 			{ "Mixer", 0x5 },
5881 			{ "LINE-OUT pin", 0x6 },
5882 			{ "HP-OUT pin", 0x7 },
5883 		},
5884         },
5885 };
5886 static struct snd_kcontrol_new alc260_test_mixer[] = {
5887 	/* Output driver widgets */
5888 	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5889 	HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5890 	HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5891 	HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
5892 	HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5893 	HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
5894 
5895 	/* Modes for retasking pin widgets
5896 	 * Note: the ALC260 doesn't seem to act on requests to enable mic
5897          * bias from NIDs 0x0f and 0x10.  The ALC260 datasheet doesn't
5898          * mention this restriction.  At this stage it's not clear whether
5899          * this behaviour is intentional or is a hardware bug in chip
5900          * revisions available at least up until early 2006.  Therefore for
5901          * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
5902          * choices, but if it turns out that the lack of mic bias for these
5903          * NIDs is intentional we could change their modes from
5904          * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5905 	 */
5906 	ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
5907 	ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
5908 	ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
5909 	ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
5910 	ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
5911 	ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
5912 
5913 	/* Loopback mixer controls */
5914 	HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
5915 	HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
5916 	HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
5917 	HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
5918 	HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
5919 	HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
5920 	HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
5921 	HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
5922 	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5923 	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5924 	HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
5925 	HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
5926 	HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
5927 	HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
5928 
5929 	/* Controls for GPIO pins, assuming they are configured as outputs */
5930 	ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
5931 	ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
5932 	ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
5933 	ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
5934 
5935 	/* Switches to allow the digital IO pins to be enabled.  The datasheet
5936 	 * is ambigious as to which NID is which; testing on laptops which
5937 	 * make this output available should provide clarification.
5938 	 */
5939 	ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
5940 	ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
5941 
5942 	/* A switch allowing EAPD to be enabled.  Some laptops seem to use
5943 	 * this output to turn on an external amplifier.
5944 	 */
5945 	ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
5946 	ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
5947 
5948 	{ } /* end */
5949 };
5950 static struct hda_verb alc260_test_init_verbs[] = {
5951 	/* Enable all GPIOs as outputs with an initial value of 0 */
5952 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
5953 	{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5954 	{0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
5955 
5956 	/* Enable retasking pins as output, initially without power amp */
5957 	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5958 	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5959 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5960 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5961 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5962 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5963 
5964 	/* Disable digital (SPDIF) pins initially, but users can enable
5965 	 * them via a mixer switch.  In the case of SPDIF-out, this initverb
5966 	 * payload also sets the generation to 0, output to be in "consumer"
5967 	 * PCM format, copyright asserted, no pre-emphasis and no validity
5968 	 * control.
5969 	 */
5970 	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5971 	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5972 
5973 	/* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
5974 	 * OUT1 sum bus when acting as an output.
5975 	 */
5976 	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5977 	{0x0c, AC_VERB_SET_CONNECT_SEL, 0},
5978 	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5979 	{0x0e, AC_VERB_SET_CONNECT_SEL, 0},
5980 
5981 	/* Start with output sum widgets muted and their output gains at min */
5982 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5983 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5984 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5985 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5986 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5987 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5988 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5989 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5990 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5991 
5992 	/* Unmute retasking pin widget output buffers since the default
5993 	 * state appears to be output.  As the pin mode is changed by the
5994 	 * user the pin mode control will take care of enabling the pin's
5995 	 * input/output buffers as needed.
5996 	 */
5997 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5998 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5999 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6000 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6001 	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6002 	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6003 	/* Also unmute the mono-out pin widget */
6004 	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6005 
6006 	/* Mute capture amp left and right */
6007 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6008 	/* Set ADC connection select to match default mixer setting (mic1
6009 	 * pin)
6010 	 */
6011 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6012 
6013 	/* Do the same for the second ADC: mute capture input amp and
6014 	 * set ADC connection to mic1 pin
6015 	 */
6016 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6017 	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6018 
6019 	/* Mute all inputs to mixer widget (even unconnected ones) */
6020 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6021 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6022 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6023 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6024 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6025 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6026 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6027 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6028 
6029 	{ }
6030 };
6031 #endif
6032 
6033 #define alc260_pcm_analog_playback	alc880_pcm_analog_alt_playback
6034 #define alc260_pcm_analog_capture	alc880_pcm_analog_capture
6035 
6036 #define alc260_pcm_digital_playback	alc880_pcm_digital_playback
6037 #define alc260_pcm_digital_capture	alc880_pcm_digital_capture
6038 
6039 /*
6040  * for BIOS auto-configuration
6041  */
6042 
6043 static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
6044 					const char *pfx, int *vol_bits)
6045 {
6046 	hda_nid_t nid_vol;
6047 	unsigned long vol_val, sw_val;
6048 	int err;
6049 
6050 	if (nid >= 0x0f && nid < 0x11) {
6051 		nid_vol = nid - 0x7;
6052 		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6053 		sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6054 	} else if (nid == 0x11) {
6055 		nid_vol = nid - 0x7;
6056 		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6057 		sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6058 	} else if (nid >= 0x12 && nid <= 0x15) {
6059 		nid_vol = 0x08;
6060 		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6061 		sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6062 	} else
6063 		return 0; /* N/A */
6064 
6065 	if (!(*vol_bits & (1 << nid_vol))) {
6066 		/* first control for the volume widget */
6067 		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
6068 		if (err < 0)
6069 			return err;
6070 		*vol_bits |= (1 << nid_vol);
6071 	}
6072 	err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
6073 	if (err < 0)
6074 		return err;
6075 	return 1;
6076 }
6077 
6078 /* add playback controls from the parsed DAC table */
6079 static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6080 					     const struct auto_pin_cfg *cfg)
6081 {
6082 	hda_nid_t nid;
6083 	int err;
6084 	int vols = 0;
6085 
6086 	spec->multiout.num_dacs = 1;
6087 	spec->multiout.dac_nids = spec->private_dac_nids;
6088 	spec->multiout.dac_nids[0] = 0x02;
6089 
6090 	nid = cfg->line_out_pins[0];
6091 	if (nid) {
6092 		const char *pfx;
6093 		if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6094 			pfx = "Master";
6095 		else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6096 			pfx = "Speaker";
6097 		else
6098 			pfx = "Front";
6099 		err = alc260_add_playback_controls(spec, nid, pfx, &vols);
6100 		if (err < 0)
6101 			return err;
6102 	}
6103 
6104 	nid = cfg->speaker_pins[0];
6105 	if (nid) {
6106 		err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
6107 		if (err < 0)
6108 			return err;
6109 	}
6110 
6111 	nid = cfg->hp_pins[0];
6112 	if (nid) {
6113 		err = alc260_add_playback_controls(spec, nid, "Headphone",
6114 						   &vols);
6115 		if (err < 0)
6116 			return err;
6117 	}
6118 	return 0;
6119 }
6120 
6121 /* create playback/capture controls for input pins */
6122 static int alc260_auto_create_input_ctls(struct hda_codec *codec,
6123 						const struct auto_pin_cfg *cfg)
6124 {
6125 	return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
6126 }
6127 
6128 static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6129 					      hda_nid_t nid, int pin_type,
6130 					      int sel_idx)
6131 {
6132 	alc_set_pin_output(codec, nid, pin_type);
6133 	/* need the manual connection? */
6134 	if (nid >= 0x12) {
6135 		int idx = nid - 0x12;
6136 		snd_hda_codec_write(codec, idx + 0x0b, 0,
6137 				    AC_VERB_SET_CONNECT_SEL, sel_idx);
6138 	}
6139 }
6140 
6141 static void alc260_auto_init_multi_out(struct hda_codec *codec)
6142 {
6143 	struct alc_spec *spec = codec->spec;
6144 	hda_nid_t nid;
6145 
6146 	nid = spec->autocfg.line_out_pins[0];
6147 	if (nid) {
6148 		int pin_type = get_pin_type(spec->autocfg.line_out_type);
6149 		alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6150 	}
6151 
6152 	nid = spec->autocfg.speaker_pins[0];
6153 	if (nid)
6154 		alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6155 
6156 	nid = spec->autocfg.hp_pins[0];
6157 	if (nid)
6158 		alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
6159 }
6160 
6161 #define ALC260_PIN_CD_NID		0x16
6162 static void alc260_auto_init_analog_input(struct hda_codec *codec)
6163 {
6164 	struct alc_spec *spec = codec->spec;
6165 	int i;
6166 
6167 	for (i = 0; i < AUTO_PIN_LAST; i++) {
6168 		hda_nid_t nid = spec->autocfg.input_pins[i];
6169 		if (nid >= 0x12) {
6170 			alc_set_input_pin(codec, nid, i);
6171 			if (nid != ALC260_PIN_CD_NID &&
6172 			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
6173 				snd_hda_codec_write(codec, nid, 0,
6174 						    AC_VERB_SET_AMP_GAIN_MUTE,
6175 						    AMP_OUT_MUTE);
6176 		}
6177 	}
6178 }
6179 
6180 /*
6181  * generic initialization of ADC, input mixers and output mixers
6182  */
6183 static struct hda_verb alc260_volume_init_verbs[] = {
6184 	/*
6185 	 * Unmute ADC0-1 and set the default input to mic-in
6186 	 */
6187 	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6188 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6189 	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6190 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6191 
6192 	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6193 	 * mixer widget
6194 	 * Note: PASD motherboards uses the Line In 2 as the input for
6195 	 * front panel mic (mic 2)
6196 	 */
6197 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
6198 	/* mute analog inputs */
6199 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6200 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6201 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6202 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6203 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6204 
6205 	/*
6206 	 * Set up output mixers (0x08 - 0x0a)
6207 	 */
6208 	/* set vol=0 to output mixers */
6209 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6210 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6211 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6212 	/* set up input amps for analog loopback */
6213 	/* Amp Indices: DAC = 0, mixer = 1 */
6214 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6215 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6216 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6217 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6218 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6219 	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6220 
6221 	{ }
6222 };
6223 
6224 static int alc260_parse_auto_config(struct hda_codec *codec)
6225 {
6226 	struct alc_spec *spec = codec->spec;
6227 	int err;
6228 	static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6229 
6230 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6231 					   alc260_ignore);
6232 	if (err < 0)
6233 		return err;
6234 	err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6235 	if (err < 0)
6236 		return err;
6237 	if (!spec->kctls.list)
6238 		return 0; /* can't find valid BIOS pin config */
6239 	err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
6240 	if (err < 0)
6241 		return err;
6242 
6243 	spec->multiout.max_channels = 2;
6244 
6245 	if (spec->autocfg.dig_outs)
6246 		spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
6247 	if (spec->kctls.list)
6248 		add_mixer(spec, spec->kctls.list);
6249 
6250 	add_verb(spec, alc260_volume_init_verbs);
6251 
6252 	spec->num_mux_defs = 1;
6253 	spec->input_mux = &spec->private_imux[0];
6254 
6255 	alc_ssid_check(codec, 0x10, 0x15, 0x0f);
6256 
6257 	return 1;
6258 }
6259 
6260 /* additional initialization for auto-configuration model */
6261 static void alc260_auto_init(struct hda_codec *codec)
6262 {
6263 	struct alc_spec *spec = codec->spec;
6264 	alc260_auto_init_multi_out(codec);
6265 	alc260_auto_init_analog_input(codec);
6266 	if (spec->unsol_event)
6267 		alc_inithook(codec);
6268 }
6269 
6270 #ifdef CONFIG_SND_HDA_POWER_SAVE
6271 static struct hda_amp_list alc260_loopbacks[] = {
6272 	{ 0x07, HDA_INPUT, 0 },
6273 	{ 0x07, HDA_INPUT, 1 },
6274 	{ 0x07, HDA_INPUT, 2 },
6275 	{ 0x07, HDA_INPUT, 3 },
6276 	{ 0x07, HDA_INPUT, 4 },
6277 	{ } /* end */
6278 };
6279 #endif
6280 
6281 /*
6282  * ALC260 configurations
6283  */
6284 static const char *alc260_models[ALC260_MODEL_LAST] = {
6285 	[ALC260_BASIC]		= "basic",
6286 	[ALC260_HP]		= "hp",
6287 	[ALC260_HP_3013]	= "hp-3013",
6288 	[ALC260_HP_DC7600]	= "hp-dc7600",
6289 	[ALC260_FUJITSU_S702X]	= "fujitsu",
6290 	[ALC260_ACER]		= "acer",
6291 	[ALC260_WILL]		= "will",
6292 	[ALC260_REPLACER_672V]	= "replacer",
6293 	[ALC260_FAVORIT100]	= "favorit100",
6294 #ifdef CONFIG_SND_DEBUG
6295 	[ALC260_TEST]		= "test",
6296 #endif
6297 	[ALC260_AUTO]		= "auto",
6298 };
6299 
6300 static struct snd_pci_quirk alc260_cfg_tbl[] = {
6301 	SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
6302 	SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
6303 	SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
6304 	SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
6305 	SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
6306 	SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
6307 	SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
6308 	SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
6309 	SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
6310 	SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6311 	SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6312 	SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6313 	SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6314 	SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6315 	SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6316 	SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6317 	SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6318 	SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
6319 	SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
6320 	SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
6321 	{}
6322 };
6323 
6324 static struct alc_config_preset alc260_presets[] = {
6325 	[ALC260_BASIC] = {
6326 		.mixers = { alc260_base_output_mixer,
6327 			    alc260_input_mixer },
6328 		.init_verbs = { alc260_init_verbs },
6329 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6330 		.dac_nids = alc260_dac_nids,
6331 		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6332 		.adc_nids = alc260_adc_nids,
6333 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6334 		.channel_mode = alc260_modes,
6335 		.input_mux = &alc260_capture_source,
6336 	},
6337 	[ALC260_HP] = {
6338 		.mixers = { alc260_hp_output_mixer,
6339 			    alc260_input_mixer },
6340 		.init_verbs = { alc260_init_verbs,
6341 				alc260_hp_unsol_verbs },
6342 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6343 		.dac_nids = alc260_dac_nids,
6344 		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6345 		.adc_nids = alc260_adc_nids_alt,
6346 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6347 		.channel_mode = alc260_modes,
6348 		.input_mux = &alc260_capture_source,
6349 		.unsol_event = alc260_hp_unsol_event,
6350 		.init_hook = alc260_hp_automute,
6351 	},
6352 	[ALC260_HP_DC7600] = {
6353 		.mixers = { alc260_hp_dc7600_mixer,
6354 			    alc260_input_mixer },
6355 		.init_verbs = { alc260_init_verbs,
6356 				alc260_hp_dc7600_verbs },
6357 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6358 		.dac_nids = alc260_dac_nids,
6359 		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6360 		.adc_nids = alc260_adc_nids_alt,
6361 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6362 		.channel_mode = alc260_modes,
6363 		.input_mux = &alc260_capture_source,
6364 		.unsol_event = alc260_hp_3012_unsol_event,
6365 		.init_hook = alc260_hp_3012_automute,
6366 	},
6367 	[ALC260_HP_3013] = {
6368 		.mixers = { alc260_hp_3013_mixer,
6369 			    alc260_input_mixer },
6370 		.init_verbs = { alc260_hp_3013_init_verbs,
6371 				alc260_hp_3013_unsol_verbs },
6372 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6373 		.dac_nids = alc260_dac_nids,
6374 		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6375 		.adc_nids = alc260_adc_nids_alt,
6376 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6377 		.channel_mode = alc260_modes,
6378 		.input_mux = &alc260_capture_source,
6379 		.unsol_event = alc260_hp_3013_unsol_event,
6380 		.init_hook = alc260_hp_3013_automute,
6381 	},
6382 	[ALC260_FUJITSU_S702X] = {
6383 		.mixers = { alc260_fujitsu_mixer },
6384 		.init_verbs = { alc260_fujitsu_init_verbs },
6385 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6386 		.dac_nids = alc260_dac_nids,
6387 		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6388 		.adc_nids = alc260_dual_adc_nids,
6389 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6390 		.channel_mode = alc260_modes,
6391 		.num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6392 		.input_mux = alc260_fujitsu_capture_sources,
6393 	},
6394 	[ALC260_ACER] = {
6395 		.mixers = { alc260_acer_mixer },
6396 		.init_verbs = { alc260_acer_init_verbs },
6397 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6398 		.dac_nids = alc260_dac_nids,
6399 		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6400 		.adc_nids = alc260_dual_adc_nids,
6401 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6402 		.channel_mode = alc260_modes,
6403 		.num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6404 		.input_mux = alc260_acer_capture_sources,
6405 	},
6406 	[ALC260_FAVORIT100] = {
6407 		.mixers = { alc260_favorit100_mixer },
6408 		.init_verbs = { alc260_favorit100_init_verbs },
6409 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6410 		.dac_nids = alc260_dac_nids,
6411 		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6412 		.adc_nids = alc260_dual_adc_nids,
6413 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6414 		.channel_mode = alc260_modes,
6415 		.num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6416 		.input_mux = alc260_favorit100_capture_sources,
6417 	},
6418 	[ALC260_WILL] = {
6419 		.mixers = { alc260_will_mixer },
6420 		.init_verbs = { alc260_init_verbs, alc260_will_verbs },
6421 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6422 		.dac_nids = alc260_dac_nids,
6423 		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6424 		.adc_nids = alc260_adc_nids,
6425 		.dig_out_nid = ALC260_DIGOUT_NID,
6426 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6427 		.channel_mode = alc260_modes,
6428 		.input_mux = &alc260_capture_source,
6429 	},
6430 	[ALC260_REPLACER_672V] = {
6431 		.mixers = { alc260_replacer_672v_mixer },
6432 		.init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6433 		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6434 		.dac_nids = alc260_dac_nids,
6435 		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6436 		.adc_nids = alc260_adc_nids,
6437 		.dig_out_nid = ALC260_DIGOUT_NID,
6438 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6439 		.channel_mode = alc260_modes,
6440 		.input_mux = &alc260_capture_source,
6441 		.unsol_event = alc260_replacer_672v_unsol_event,
6442 		.init_hook = alc260_replacer_672v_automute,
6443 	},
6444 #ifdef CONFIG_SND_DEBUG
6445 	[ALC260_TEST] = {
6446 		.mixers = { alc260_test_mixer },
6447 		.init_verbs = { alc260_test_init_verbs },
6448 		.num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6449 		.dac_nids = alc260_test_dac_nids,
6450 		.num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6451 		.adc_nids = alc260_test_adc_nids,
6452 		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6453 		.channel_mode = alc260_modes,
6454 		.num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6455 		.input_mux = alc260_test_capture_sources,
6456 	},
6457 #endif
6458 };
6459 
6460 static int patch_alc260(struct hda_codec *codec)
6461 {
6462 	struct alc_spec *spec;
6463 	int err, board_config;
6464 
6465 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6466 	if (spec == NULL)
6467 		return -ENOMEM;
6468 
6469 	codec->spec = spec;
6470 
6471 	board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
6472 						  alc260_models,
6473 						  alc260_cfg_tbl);
6474 	if (board_config < 0) {
6475 		snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6476 			   codec->chip_name);
6477 		board_config = ALC260_AUTO;
6478 	}
6479 
6480 	if (board_config == ALC260_AUTO) {
6481 		/* automatic parse from the BIOS config */
6482 		err = alc260_parse_auto_config(codec);
6483 		if (err < 0) {
6484 			alc_free(codec);
6485 			return err;
6486 		} else if (!err) {
6487 			printk(KERN_INFO
6488 			       "hda_codec: Cannot set up configuration "
6489 			       "from BIOS.  Using base mode...\n");
6490 			board_config = ALC260_BASIC;
6491 		}
6492 	}
6493 
6494 	err = snd_hda_attach_beep_device(codec, 0x1);
6495 	if (err < 0) {
6496 		alc_free(codec);
6497 		return err;
6498 	}
6499 
6500 	if (board_config != ALC260_AUTO)
6501 		setup_preset(codec, &alc260_presets[board_config]);
6502 
6503 	spec->stream_analog_playback = &alc260_pcm_analog_playback;
6504 	spec->stream_analog_capture = &alc260_pcm_analog_capture;
6505 
6506 	spec->stream_digital_playback = &alc260_pcm_digital_playback;
6507 	spec->stream_digital_capture = &alc260_pcm_digital_capture;
6508 
6509 	if (!spec->adc_nids && spec->input_mux) {
6510 		/* check whether NID 0x04 is valid */
6511 		unsigned int wcap = get_wcaps(codec, 0x04);
6512 		wcap = get_wcaps_type(wcap);
6513 		/* get type */
6514 		if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
6515 			spec->adc_nids = alc260_adc_nids_alt;
6516 			spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
6517 		} else {
6518 			spec->adc_nids = alc260_adc_nids;
6519 			spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
6520 		}
6521 	}
6522 	set_capture_mixer(codec);
6523 	set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
6524 
6525 	spec->vmaster_nid = 0x08;
6526 
6527 	codec->patch_ops = alc_patch_ops;
6528 	if (board_config == ALC260_AUTO)
6529 		spec->init_hook = alc260_auto_init;
6530 #ifdef CONFIG_SND_HDA_POWER_SAVE
6531 	if (!spec->loopback.amplist)
6532 		spec->loopback.amplist = alc260_loopbacks;
6533 #endif
6534 	codec->proc_widget_hook = print_realtek_coef;
6535 
6536 	return 0;
6537 }
6538 
6539 
6540 /*
6541  * ALC882/883/885/888/889 support
6542  *
6543  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
6544  * configuration.  Each pin widget can choose any input DACs and a mixer.
6545  * Each ADC is connected from a mixer of all inputs.  This makes possible
6546  * 6-channel independent captures.
6547  *
6548  * In addition, an independent DAC for the multi-playback (not used in this
6549  * driver yet).
6550  */
6551 #define ALC882_DIGOUT_NID	0x06
6552 #define ALC882_DIGIN_NID	0x0a
6553 #define ALC883_DIGOUT_NID	ALC882_DIGOUT_NID
6554 #define ALC883_DIGIN_NID	ALC882_DIGIN_NID
6555 #define ALC1200_DIGOUT_NID	0x10
6556 
6557 
6558 static struct hda_channel_mode alc882_ch_modes[1] = {
6559 	{ 8, NULL }
6560 };
6561 
6562 /* DACs */
6563 static hda_nid_t alc882_dac_nids[4] = {
6564 	/* front, rear, clfe, rear_surr */
6565 	0x02, 0x03, 0x04, 0x05
6566 };
6567 #define alc883_dac_nids		alc882_dac_nids
6568 
6569 /* ADCs */
6570 #define alc882_adc_nids		alc880_adc_nids
6571 #define alc882_adc_nids_alt	alc880_adc_nids_alt
6572 #define alc883_adc_nids		alc882_adc_nids_alt
6573 static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
6574 static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
6575 #define alc889_adc_nids		alc880_adc_nids
6576 
6577 static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
6578 static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
6579 #define alc883_capsrc_nids	alc882_capsrc_nids_alt
6580 static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
6581 #define alc889_capsrc_nids	alc882_capsrc_nids
6582 
6583 /* input MUX */
6584 /* FIXME: should be a matrix-type input source selection */
6585 
6586 static struct hda_input_mux alc882_capture_source = {
6587 	.num_items = 4,
6588 	.items = {
6589 		{ "Mic", 0x0 },
6590 		{ "Front Mic", 0x1 },
6591 		{ "Line", 0x2 },
6592 		{ "CD", 0x4 },
6593 	},
6594 };
6595 
6596 #define alc883_capture_source	alc882_capture_source
6597 
6598 static struct hda_input_mux alc889_capture_source = {
6599 	.num_items = 3,
6600 	.items = {
6601 		{ "Front Mic", 0x0 },
6602 		{ "Mic", 0x3 },
6603 		{ "Line", 0x2 },
6604 	},
6605 };
6606 
6607 static struct hda_input_mux mb5_capture_source = {
6608 	.num_items = 3,
6609 	.items = {
6610 		{ "Mic", 0x1 },
6611 		{ "Line", 0x2 },
6612 		{ "CD", 0x4 },
6613 	},
6614 };
6615 
6616 static struct hda_input_mux alc883_3stack_6ch_intel = {
6617 	.num_items = 4,
6618 	.items = {
6619 		{ "Mic", 0x1 },
6620 		{ "Front Mic", 0x0 },
6621 		{ "Line", 0x2 },
6622 		{ "CD", 0x4 },
6623 	},
6624 };
6625 
6626 static struct hda_input_mux alc883_lenovo_101e_capture_source = {
6627 	.num_items = 2,
6628 	.items = {
6629 		{ "Mic", 0x1 },
6630 		{ "Line", 0x2 },
6631 	},
6632 };
6633 
6634 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
6635 	.num_items = 4,
6636 	.items = {
6637 		{ "Mic", 0x0 },
6638 		{ "iMic", 0x1 },
6639 		{ "Line", 0x2 },
6640 		{ "CD", 0x4 },
6641 	},
6642 };
6643 
6644 static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
6645 	.num_items = 2,
6646 	.items = {
6647 		{ "Mic", 0x0 },
6648 		{ "Int Mic", 0x1 },
6649 	},
6650 };
6651 
6652 static struct hda_input_mux alc883_lenovo_sky_capture_source = {
6653 	.num_items = 3,
6654 	.items = {
6655 		{ "Mic", 0x0 },
6656 		{ "Front Mic", 0x1 },
6657 		{ "Line", 0x4 },
6658 	},
6659 };
6660 
6661 static struct hda_input_mux alc883_asus_eee1601_capture_source = {
6662 	.num_items = 2,
6663 	.items = {
6664 		{ "Mic", 0x0 },
6665 		{ "Line", 0x2 },
6666 	},
6667 };
6668 
6669 static struct hda_input_mux alc889A_mb31_capture_source = {
6670 	.num_items = 2,
6671 	.items = {
6672 		{ "Mic", 0x0 },
6673 		/* Front Mic (0x01) unused */
6674 		{ "Line", 0x2 },
6675 		/* Line 2 (0x03) unused */
6676 		/* CD (0x04) unused? */
6677 	},
6678 };
6679 
6680 /*
6681  * 2ch mode
6682  */
6683 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
6684 	{ 2, NULL }
6685 };
6686 
6687 /*
6688  * 2ch mode
6689  */
6690 static struct hda_verb alc882_3ST_ch2_init[] = {
6691 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6692 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6693 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6694 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6695 	{ } /* end */
6696 };
6697 
6698 /*
6699  * 4ch mode
6700  */
6701 static struct hda_verb alc882_3ST_ch4_init[] = {
6702 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6703 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6704 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6705 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6706 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6707 	{ } /* end */
6708 };
6709 
6710 /*
6711  * 6ch mode
6712  */
6713 static struct hda_verb alc882_3ST_ch6_init[] = {
6714 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6715 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6716 	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6717 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6718 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6719 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6720 	{ } /* end */
6721 };
6722 
6723 static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
6724 	{ 2, alc882_3ST_ch2_init },
6725 	{ 4, alc882_3ST_ch4_init },
6726 	{ 6, alc882_3ST_ch6_init },
6727 };
6728 
6729 #define alc883_3ST_6ch_modes	alc882_3ST_6ch_modes
6730 
6731 /*
6732  * 2ch mode
6733  */
6734 static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
6735 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
6736 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6737 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6738 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6739 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6740 	{ } /* end */
6741 };
6742 
6743 /*
6744  * 4ch mode
6745  */
6746 static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
6747 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6748 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6749 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6750 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6751 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6752 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6753 	{ } /* end */
6754 };
6755 
6756 /*
6757  * 6ch mode
6758  */
6759 static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
6760 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6761 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6762 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6763 	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6764 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6765 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6766 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6767 	{ } /* end */
6768 };
6769 
6770 static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
6771 	{ 2, alc883_3ST_ch2_clevo_init },
6772 	{ 4, alc883_3ST_ch4_clevo_init },
6773 	{ 6, alc883_3ST_ch6_clevo_init },
6774 };
6775 
6776 
6777 /*
6778  * 6ch mode
6779  */
6780 static struct hda_verb alc882_sixstack_ch6_init[] = {
6781 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
6782 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6783 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6784 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6785 	{ } /* end */
6786 };
6787 
6788 /*
6789  * 8ch mode
6790  */
6791 static struct hda_verb alc882_sixstack_ch8_init[] = {
6792 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6793 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6794 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6795 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6796 	{ } /* end */
6797 };
6798 
6799 static struct hda_channel_mode alc882_sixstack_modes[2] = {
6800 	{ 6, alc882_sixstack_ch6_init },
6801 	{ 8, alc882_sixstack_ch8_init },
6802 };
6803 
6804 /*
6805  * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
6806  */
6807 
6808 /*
6809  * 2ch mode
6810  */
6811 static struct hda_verb alc885_mbp_ch2_init[] = {
6812 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6813 	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6814 	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6815 	{ } /* end */
6816 };
6817 
6818 /*
6819  * 4ch mode
6820  */
6821 static struct hda_verb alc885_mbp_ch4_init[] = {
6822 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6823 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6824 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6825 	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6826 	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6827 	{ } /* end */
6828 };
6829 
6830 static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
6831 	{ 2, alc885_mbp_ch2_init },
6832 	{ 4, alc885_mbp_ch4_init },
6833 };
6834 
6835 /*
6836  * 2ch
6837  * Speakers/Woofer/HP = Front
6838  * LineIn = Input
6839  */
6840 static struct hda_verb alc885_mb5_ch2_init[] = {
6841 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6842 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
6843 	{ } /* end */
6844 };
6845 
6846 /*
6847  * 6ch mode
6848  * Speakers/HP = Front
6849  * Woofer = LFE
6850  * LineIn = Surround
6851  */
6852 static struct hda_verb alc885_mb5_ch6_init[] = {
6853 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6854 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6855 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6856 	{ } /* end */
6857 };
6858 
6859 static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
6860 	{ 2, alc885_mb5_ch2_init },
6861 	{ 6, alc885_mb5_ch6_init },
6862 };
6863 
6864 
6865 /*
6866  * 2ch mode
6867  */
6868 static struct hda_verb alc883_4ST_ch2_init[] = {
6869 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6870 	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6871 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6872 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6873 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6874 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6875 	{ } /* end */
6876 };
6877 
6878 /*
6879  * 4ch mode
6880  */
6881 static struct hda_verb alc883_4ST_ch4_init[] = {
6882 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6883 	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6884 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6885 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6886 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6887 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6888 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6889 	{ } /* end */
6890 };
6891 
6892 /*
6893  * 6ch mode
6894  */
6895 static struct hda_verb alc883_4ST_ch6_init[] = {
6896 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6897 	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6898 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6899 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6900 	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6901 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6902 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6903 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6904 	{ } /* end */
6905 };
6906 
6907 /*
6908  * 8ch mode
6909  */
6910 static struct hda_verb alc883_4ST_ch8_init[] = {
6911 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6912 	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6913 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
6914 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6915 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6916 	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6917 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6918 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6919 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6920 	{ } /* end */
6921 };
6922 
6923 static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
6924 	{ 2, alc883_4ST_ch2_init },
6925 	{ 4, alc883_4ST_ch4_init },
6926 	{ 6, alc883_4ST_ch6_init },
6927 	{ 8, alc883_4ST_ch8_init },
6928 };
6929 
6930 
6931 /*
6932  * 2ch mode
6933  */
6934 static struct hda_verb alc883_3ST_ch2_intel_init[] = {
6935 	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6936 	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6937 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6938 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6939 	{ } /* end */
6940 };
6941 
6942 /*
6943  * 4ch mode
6944  */
6945 static struct hda_verb alc883_3ST_ch4_intel_init[] = {
6946 	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6947 	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6948 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6949 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6950 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6951 	{ } /* end */
6952 };
6953 
6954 /*
6955  * 6ch mode
6956  */
6957 static struct hda_verb alc883_3ST_ch6_intel_init[] = {
6958 	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6959 	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6960 	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
6961 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6962 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6963 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6964 	{ } /* end */
6965 };
6966 
6967 static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
6968 	{ 2, alc883_3ST_ch2_intel_init },
6969 	{ 4, alc883_3ST_ch4_intel_init },
6970 	{ 6, alc883_3ST_ch6_intel_init },
6971 };
6972 
6973 /*
6974  * 2ch mode
6975  */
6976 static struct hda_verb alc889_ch2_intel_init[] = {
6977 	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
6978 	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
6979 	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
6980 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
6981 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6982 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6983 	{ } /* end */
6984 };
6985 
6986 /*
6987  * 6ch mode
6988  */
6989 static struct hda_verb alc889_ch6_intel_init[] = {
6990 	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
6991 	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
6992 	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
6993 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
6994 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6995 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6996 	{ } /* end */
6997 };
6998 
6999 /*
7000  * 8ch mode
7001  */
7002 static struct hda_verb alc889_ch8_intel_init[] = {
7003 	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7004 	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7005 	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7006 	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7007 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
7008 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7009 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7010 	{ } /* end */
7011 };
7012 
7013 static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7014 	{ 2, alc889_ch2_intel_init },
7015 	{ 6, alc889_ch6_intel_init },
7016 	{ 8, alc889_ch8_intel_init },
7017 };
7018 
7019 /*
7020  * 6ch mode
7021  */
7022 static struct hda_verb alc883_sixstack_ch6_init[] = {
7023 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7024 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7025 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7026 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7027 	{ } /* end */
7028 };
7029 
7030 /*
7031  * 8ch mode
7032  */
7033 static struct hda_verb alc883_sixstack_ch8_init[] = {
7034 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7035 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7036 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7037 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7038 	{ } /* end */
7039 };
7040 
7041 static struct hda_channel_mode alc883_sixstack_modes[2] = {
7042 	{ 6, alc883_sixstack_ch6_init },
7043 	{ 8, alc883_sixstack_ch8_init },
7044 };
7045 
7046 
7047 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7048  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7049  */
7050 static struct snd_kcontrol_new alc882_base_mixer[] = {
7051 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7052 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7053 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7054 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7055 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7056 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7057 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7058 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7059 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7060 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7061 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7062 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7063 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7064 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7065 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7066 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7067 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7068 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7069 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7070 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7071 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7072 	{ } /* end */
7073 };
7074 
7075 static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7076 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7077 	HDA_BIND_MUTE   ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7078 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7079 	HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7080 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7081 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7082 	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7083 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7084 	HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7085 	HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
7086 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7087 	{ } /* end */
7088 };
7089 
7090 static struct snd_kcontrol_new alc885_mb5_mixer[] = {
7091 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7092 	HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7093 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7094 	HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7095 	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7096 	HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7097 	HDA_CODEC_VOLUME("HP Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7098 	HDA_BIND_MUTE   ("HP Playback Switch", 0x0f, 0x02, HDA_INPUT),
7099 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7100 	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7101 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7102 	HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7103 	HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7104 	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7105 	{ } /* end */
7106 };
7107 
7108 static struct snd_kcontrol_new alc885_imac91_mixer[] = {
7109 	HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7110 	HDA_BIND_MUTE   ("Line-Out Playback Switch", 0x0c, 0x02, HDA_INPUT),
7111 	HDA_CODEC_MUTE  ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT),
7112 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7113 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7114 	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7115 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7116 	HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7117 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7118 	{ } /* end */
7119 };
7120 
7121 
7122 static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7123 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7124 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7125 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7126 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7127 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7128 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7129 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7130 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7131 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7132 	{ } /* end */
7133 };
7134 
7135 static struct snd_kcontrol_new alc882_targa_mixer[] = {
7136 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7137 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7138 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7139 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7140 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7141 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7142 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7143 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7144 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7145 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7146 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7147 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7148 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7149 	{ } /* end */
7150 };
7151 
7152 /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7153  *                 Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7154  */
7155 static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7156 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7157 	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7158 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7159 	HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7160 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7161 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7162 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7163 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7164 	HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7165 	HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7166 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7167 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7168 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7169 	{ } /* end */
7170 };
7171 
7172 static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7173 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7174 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7175 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7176 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7177 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7178 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7179 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7180 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7181 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7182 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7183 	{ } /* end */
7184 };
7185 
7186 static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7187 	{
7188 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7189 		.name = "Channel Mode",
7190 		.info = alc_ch_mode_info,
7191 		.get = alc_ch_mode_get,
7192 		.put = alc_ch_mode_put,
7193 	},
7194 	{ } /* end */
7195 };
7196 
7197 static struct hda_verb alc882_base_init_verbs[] = {
7198 	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7199 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7200 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7201 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7202 	/* Rear mixer */
7203 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7204 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7205 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7206 	/* CLFE mixer */
7207 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7208 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7209 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7210 	/* Side mixer */
7211 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7212 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7213 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7214 
7215 	/* mute analog input loopbacks */
7216 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7217 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7218 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7219 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7220 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7221 
7222 	/* Front Pin: output 0 (0x0c) */
7223 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7224 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7225 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7226 	/* Rear Pin: output 1 (0x0d) */
7227 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7228 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7229 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7230 	/* CLFE Pin: output 2 (0x0e) */
7231 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7232 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7233 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7234 	/* Side Pin: output 3 (0x0f) */
7235 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7236 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7237 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7238 	/* Mic (rear) pin: input vref at 80% */
7239 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7240 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7241 	/* Front Mic pin: input vref at 80% */
7242 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7243 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7244 	/* Line In pin: input */
7245 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7246 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7247 	/* Line-2 In: Headphone output (output 0 - 0x0c) */
7248 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7249 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7250 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
7251 	/* CD pin widget for input */
7252 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7253 
7254 	/* FIXME: use matrix-type input source selection */
7255 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7256 	/* Input mixer2 */
7257 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7258 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7259 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7260 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7261 	/* Input mixer3 */
7262 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7263 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7264 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7265 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7266 	/* ADC2: mute amp left and right */
7267 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7268 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7269 	/* ADC3: mute amp left and right */
7270 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7271 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7272 
7273 	{ }
7274 };
7275 
7276 static struct hda_verb alc882_adc1_init_verbs[] = {
7277 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7278 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7279 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7280 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7281 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7282 	/* ADC1: mute amp left and right */
7283 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7284 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7285 	{ }
7286 };
7287 
7288 static struct hda_verb alc882_eapd_verbs[] = {
7289 	/* change to EAPD mode */
7290 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7291 	{0x20, AC_VERB_SET_PROC_COEF, 0x3060},
7292 	{ }
7293 };
7294 
7295 static struct hda_verb alc889_eapd_verbs[] = {
7296 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7297 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7298 	{ }
7299 };
7300 
7301 static struct hda_verb alc_hp15_unsol_verbs[] = {
7302 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7303 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7304 	{}
7305 };
7306 
7307 static struct hda_verb alc885_init_verbs[] = {
7308 	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7309 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7310 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7311 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7312 	/* Rear mixer */
7313 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7314 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7315 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7316 	/* CLFE mixer */
7317 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7318 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7319 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7320 	/* Side mixer */
7321 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7322 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7323 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7324 
7325 	/* mute analog input loopbacks */
7326 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7327 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7328 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7329 
7330 	/* Front HP Pin: output 0 (0x0c) */
7331 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7332 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7333 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7334 	/* Front Pin: output 0 (0x0c) */
7335 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7336 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7337 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7338 	/* Rear Pin: output 1 (0x0d) */
7339 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7340 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7341 	{0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7342 	/* CLFE Pin: output 2 (0x0e) */
7343 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7344 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7345 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7346 	/* Side Pin: output 3 (0x0f) */
7347 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7348 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7349 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7350 	/* Mic (rear) pin: input vref at 80% */
7351 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7352 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7353 	/* Front Mic pin: input vref at 80% */
7354 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7355 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7356 	/* Line In pin: input */
7357 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7358 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7359 
7360 	/* Mixer elements: 0x18, , 0x1a, 0x1b */
7361 	/* Input mixer1 */
7362 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7363 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7364 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7365 	/* Input mixer2 */
7366 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7367 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7368 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7369 	/* Input mixer3 */
7370 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7371 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7372 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7373 	/* ADC2: mute amp left and right */
7374 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7375 	/* ADC3: mute amp left and right */
7376 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7377 
7378 	{ }
7379 };
7380 
7381 static struct hda_verb alc885_init_input_verbs[] = {
7382 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7383 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7384 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7385 	{ }
7386 };
7387 
7388 
7389 /* Unmute Selector 24h and set the default input to front mic */
7390 static struct hda_verb alc889_init_input_verbs[] = {
7391 	{0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7392 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7393 	{ }
7394 };
7395 
7396 
7397 #define alc883_init_verbs	alc882_base_init_verbs
7398 
7399 /* Mac Pro test */
7400 static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7401 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7402 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7403 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7404 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7405 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
7406 	/* FIXME: this looks suspicious...
7407 	HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
7408 	HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
7409 	*/
7410 	{ } /* end */
7411 };
7412 
7413 static struct hda_verb alc882_macpro_init_verbs[] = {
7414 	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7415 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7416 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7417 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7418 	/* Front Pin: output 0 (0x0c) */
7419 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7420 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7421 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7422 	/* Front Mic pin: input vref at 80% */
7423 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7424 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7425 	/* Speaker:  output */
7426 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7427 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7428 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7429 	/* Headphone output (output 0 - 0x0c) */
7430 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7431 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7432 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7433 
7434 	/* FIXME: use matrix-type input source selection */
7435 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7436 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7437 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7438 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7439 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7440 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7441 	/* Input mixer2 */
7442 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7443 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7444 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7445 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7446 	/* Input mixer3 */
7447 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7448 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7449 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7450 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7451 	/* ADC1: mute amp left and right */
7452 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7453 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7454 	/* ADC2: mute amp left and right */
7455 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7456 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7457 	/* ADC3: mute amp left and right */
7458 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7459 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7460 
7461 	{ }
7462 };
7463 
7464 /* Macbook 5,1 */
7465 static struct hda_verb alc885_mb5_init_verbs[] = {
7466 	/* DACs */
7467 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7468 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7469 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7470 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7471 	/* Front mixer */
7472 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7473 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7474 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7475 	/* Surround mixer */
7476 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7477 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7478 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7479 	/* LFE mixer */
7480 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7481 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7482 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7483 	/* HP mixer */
7484 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7485 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7486 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7487 	/* Front Pin (0x0c) */
7488 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7489 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7490 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7491 	/* LFE Pin (0x0e) */
7492 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7493 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7494 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7495 	/* HP Pin (0x0f) */
7496 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7497 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7498 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7499 	/* Front Mic pin: input vref at 80% */
7500 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7501 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7502 	/* Line In pin */
7503 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7504 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7505 
7506 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7507 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7508 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7509 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7510 	{ }
7511 };
7512 
7513 /* Macbook Pro rev3 */
7514 static struct hda_verb alc885_mbp3_init_verbs[] = {
7515 	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7516 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7517 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7518 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7519 	/* Rear mixer */
7520 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7521 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7522 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7523 	/* HP mixer */
7524 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7525 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7526 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7527 	/* Front Pin: output 0 (0x0c) */
7528 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7529 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7530 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7531 	/* HP Pin: output 0 (0x0e) */
7532 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7533 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7534 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
7535 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7536 	/* Mic (rear) pin: input vref at 80% */
7537 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7538 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7539 	/* Front Mic pin: input vref at 80% */
7540 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7541 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7542 	/* Line In pin: use output 1 when in LineOut mode */
7543 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7544 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7545 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7546 
7547 	/* FIXME: use matrix-type input source selection */
7548 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7549 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7550 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7551 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7552 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7553 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7554 	/* Input mixer2 */
7555 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7556 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7557 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7558 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7559 	/* Input mixer3 */
7560 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7561 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7562 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7563 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7564 	/* ADC1: mute amp left and right */
7565 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7566 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7567 	/* ADC2: mute amp left and right */
7568 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7569 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7570 	/* ADC3: mute amp left and right */
7571 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7572 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7573 
7574 	{ }
7575 };
7576 
7577 /* iMac 9,1 */
7578 static struct hda_verb alc885_imac91_init_verbs[] = {
7579 	/* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
7580 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7581 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7582 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7583 	/* Rear mixer */
7584 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7585 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7586 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7587 	/* HP Pin: output 0 (0x0c) */
7588 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7589 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7590 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7591 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7592 	/* Internal Speakers: output 0 (0x0d) */
7593 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7594 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7595 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7596 	/* Mic (rear) pin: input vref at 80% */
7597 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7598 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7599 	/* Front Mic pin: input vref at 80% */
7600 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7601 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7602 	/* Line In pin: use output 1 when in LineOut mode */
7603 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7604 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7605 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7606 
7607 	/* FIXME: use matrix-type input source selection */
7608 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7609 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7610 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7611 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7612 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7613 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7614 	/* Input mixer2 */
7615 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7616 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7617 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7618 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7619 	/* Input mixer3 */
7620 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7621 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7622 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7623 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7624 	/* ADC1: mute amp left and right */
7625 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7626 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7627 	/* ADC2: mute amp left and right */
7628 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7629 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7630 	/* ADC3: mute amp left and right */
7631 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7632 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7633 
7634 	{ }
7635 };
7636 
7637 /* iMac 24 mixer. */
7638 static struct snd_kcontrol_new alc885_imac24_mixer[] = {
7639 	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7640 	HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
7641 	{ } /* end */
7642 };
7643 
7644 /* iMac 24 init verbs. */
7645 static struct hda_verb alc885_imac24_init_verbs[] = {
7646 	/* Internal speakers: output 0 (0x0c) */
7647 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7648 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7649 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7650 	/* Internal speakers: output 0 (0x0c) */
7651 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7652 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7653 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
7654 	/* Headphone: output 0 (0x0c) */
7655 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7656 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7657 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7658 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7659 	/* Front Mic: input vref at 80% */
7660 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7661 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7662 	{ }
7663 };
7664 
7665 /* Toggle speaker-output according to the hp-jack state */
7666 static void alc885_imac24_setup(struct hda_codec *codec)
7667 {
7668 	struct alc_spec *spec = codec->spec;
7669 
7670 	spec->autocfg.hp_pins[0] = 0x14;
7671 	spec->autocfg.speaker_pins[0] = 0x18;
7672 	spec->autocfg.speaker_pins[1] = 0x1a;
7673 }
7674 
7675 static void alc885_mbp3_setup(struct hda_codec *codec)
7676 {
7677 	struct alc_spec *spec = codec->spec;
7678 
7679 	spec->autocfg.hp_pins[0] = 0x15;
7680 	spec->autocfg.speaker_pins[0] = 0x14;
7681 }
7682 
7683 static void alc885_imac91_automute(struct hda_codec *codec)
7684 {
7685  	unsigned int present;
7686 
7687 	present = snd_hda_codec_read(codec, 0x14, 0,
7688 				     AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
7689 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
7690 				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
7691 	snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0,
7692 				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
7693 
7694 }
7695 
7696 static void alc885_imac91_unsol_event(struct hda_codec *codec,
7697 				    unsigned int res)
7698 {
7699 	/* Headphone insertion or removal. */
7700 	if ((res >> 26) == ALC880_HP_EVENT)
7701 		alc885_imac91_automute(codec);
7702 }
7703 
7704 static struct hda_verb alc882_targa_verbs[] = {
7705 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7706 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7707 
7708 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7709 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7710 
7711 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7712 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7713 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7714 
7715 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7716 	{ } /* end */
7717 };
7718 
7719 /* toggle speaker-output according to the hp-jack state */
7720 static void alc882_targa_automute(struct hda_codec *codec)
7721 {
7722 	struct alc_spec *spec = codec->spec;
7723 	alc_automute_amp(codec);
7724 	snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
7725 				  spec->jack_present ? 1 : 3);
7726 }
7727 
7728 static void alc882_targa_setup(struct hda_codec *codec)
7729 {
7730 	struct alc_spec *spec = codec->spec;
7731 
7732 	spec->autocfg.hp_pins[0] = 0x14;
7733 	spec->autocfg.speaker_pins[0] = 0x1b;
7734 }
7735 
7736 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
7737 {
7738 	if ((res >> 26) == ALC880_HP_EVENT)
7739 		alc882_targa_automute(codec);
7740 }
7741 
7742 static struct hda_verb alc882_asus_a7j_verbs[] = {
7743 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7744 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7745 
7746 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7747 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7748 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7749 
7750 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7751 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7752 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7753 
7754 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7755 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7756 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7757 	{ } /* end */
7758 };
7759 
7760 static struct hda_verb alc882_asus_a7m_verbs[] = {
7761 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7762 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7763 
7764 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7765 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7766 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7767 
7768 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7769 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7770 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7771 
7772 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7773 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7774 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7775  	{ } /* end */
7776 };
7777 
7778 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
7779 {
7780 	unsigned int gpiostate, gpiomask, gpiodir;
7781 
7782 	gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
7783 				       AC_VERB_GET_GPIO_DATA, 0);
7784 
7785 	if (!muted)
7786 		gpiostate |= (1 << pin);
7787 	else
7788 		gpiostate &= ~(1 << pin);
7789 
7790 	gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
7791 				      AC_VERB_GET_GPIO_MASK, 0);
7792 	gpiomask |= (1 << pin);
7793 
7794 	gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
7795 				     AC_VERB_GET_GPIO_DIRECTION, 0);
7796 	gpiodir |= (1 << pin);
7797 
7798 
7799 	snd_hda_codec_write(codec, codec->afg, 0,
7800 			    AC_VERB_SET_GPIO_MASK, gpiomask);
7801 	snd_hda_codec_write(codec, codec->afg, 0,
7802 			    AC_VERB_SET_GPIO_DIRECTION, gpiodir);
7803 
7804 	msleep(1);
7805 
7806 	snd_hda_codec_write(codec, codec->afg, 0,
7807 			    AC_VERB_SET_GPIO_DATA, gpiostate);
7808 }
7809 
7810 /* set up GPIO at initialization */
7811 static void alc885_macpro_init_hook(struct hda_codec *codec)
7812 {
7813 	alc882_gpio_mute(codec, 0, 0);
7814 	alc882_gpio_mute(codec, 1, 0);
7815 }
7816 
7817 /* set up GPIO and update auto-muting at initialization */
7818 static void alc885_imac24_init_hook(struct hda_codec *codec)
7819 {
7820 	alc885_macpro_init_hook(codec);
7821 	alc_automute_amp(codec);
7822 }
7823 
7824 /*
7825  * generic initialization of ADC, input mixers and output mixers
7826  */
7827 static struct hda_verb alc883_auto_init_verbs[] = {
7828 	/*
7829 	 * Unmute ADC0-2 and set the default input to mic-in
7830 	 */
7831 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7832 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7833 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7834 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7835 
7836 	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
7837 	 * mixer widget
7838 	 * Note: PASD motherboards uses the Line In 2 as the input for
7839 	 * front panel mic (mic 2)
7840 	 */
7841 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
7842 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7843 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7844 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7845 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7846 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7847 
7848 	/*
7849 	 * Set up output mixers (0x0c - 0x0f)
7850 	 */
7851 	/* set vol=0 to output mixers */
7852 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7853 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7854 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7855 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7856 	/* set up input amps for analog loopback */
7857 	/* Amp Indices: DAC = 0, mixer = 1 */
7858 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7859 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7860 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7861 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7862 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7863 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7864 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7865 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7866 	{0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7867 	{0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7868 
7869 	/* FIXME: use matrix-type input source selection */
7870 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7871 	/* Input mixer2 */
7872 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
7873 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
7874 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
7875 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
7876 	/* Input mixer3 */
7877 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
7878 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
7879 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
7880 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
7881 
7882 	{ }
7883 };
7884 
7885 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
7886 static struct hda_verb alc889A_mb31_ch2_init[] = {
7887 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
7888 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7889 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
7890 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
7891 	{ } /* end */
7892 };
7893 
7894 /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
7895 static struct hda_verb alc889A_mb31_ch4_init[] = {
7896 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
7897 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7898 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
7899 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
7900 	{ } /* end */
7901 };
7902 
7903 /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
7904 static struct hda_verb alc889A_mb31_ch5_init[] = {
7905 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as rear */
7906 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7907 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
7908 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
7909 	{ } /* end */
7910 };
7911 
7912 /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
7913 static struct hda_verb alc889A_mb31_ch6_init[] = {
7914 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as front */
7915 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Subwoofer off */
7916 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
7917 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
7918 	{ } /* end */
7919 };
7920 
7921 static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
7922 	{ 2, alc889A_mb31_ch2_init },
7923 	{ 4, alc889A_mb31_ch4_init },
7924 	{ 5, alc889A_mb31_ch5_init },
7925 	{ 6, alc889A_mb31_ch6_init },
7926 };
7927 
7928 static struct hda_verb alc883_medion_eapd_verbs[] = {
7929         /* eanable EAPD on medion laptop */
7930 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7931 	{0x20, AC_VERB_SET_PROC_COEF, 0x3070},
7932 	{ }
7933 };
7934 
7935 #define alc883_base_mixer	alc882_base_mixer
7936 
7937 static struct snd_kcontrol_new alc883_mitac_mixer[] = {
7938 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7939 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7940 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7941 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7942 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7943 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7944 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7945 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7946 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7947 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7948 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7949 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7950 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7951 	{ } /* end */
7952 };
7953 
7954 static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
7955 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7956 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
7957 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7958 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
7959 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7960 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7961 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7962 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7963 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
7964 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7965 	{ } /* end */
7966 };
7967 
7968 static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
7969 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7970 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
7971 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7972 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
7973 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7974 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7975 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7976 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7977 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
7978 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7979 	{ } /* end */
7980 };
7981 
7982 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
7983 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7984 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7985 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7986 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7987 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7988 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7989 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7990 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7991 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7992 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7993 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7994 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7995 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7996 	{ } /* end */
7997 };
7998 
7999 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8000 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8001 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8002 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8003 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8004 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8005 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8006 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8007 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8008 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8009 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8010 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8011 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8012 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8013 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8014 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8015 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8016 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8017 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8018 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8019 	{ } /* end */
8020 };
8021 
8022 static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8023 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8024 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8025 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8026 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8027 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8028 			      HDA_OUTPUT),
8029 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8030 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8031 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8032 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8033 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8034 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8035 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8036 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8037 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8038 	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8039 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8040 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8041 	HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8042 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8043 	{ } /* end */
8044 };
8045 
8046 static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8047 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8048 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8049 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8050 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8051 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8052 			      HDA_OUTPUT),
8053 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8054 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8055 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8056 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8057 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
8058 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8059 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8060 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8061 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
8062 	HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
8063 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
8064 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8065 	HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8066 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8067 	{ } /* end */
8068 };
8069 
8070 static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
8071 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8072 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8073 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8074 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8075 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8076 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8077 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8078 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8079 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8080 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8081 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8082 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8083 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8084 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8085 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8086 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8087 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8088 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8089 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8090 	{ } /* end */
8091 };
8092 
8093 static struct snd_kcontrol_new alc883_targa_mixer[] = {
8094 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8095 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8096 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8097 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8098 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8099 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8100 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8101 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8102 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8103 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8104 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8105 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8106 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8107 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8108 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8109 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8110 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8111 	{ } /* end */
8112 };
8113 
8114 static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
8115 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8116 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8117 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8118 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8119 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8120 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8121 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8122 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8123 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8124 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8125 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8126 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8127 	{ } /* end */
8128 };
8129 
8130 static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
8131 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8132 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8133 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8134 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8135 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8136 	{ } /* end */
8137 };
8138 
8139 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
8140 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8141 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8142 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8143 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8144 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8145 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8146 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8147 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8148 	{ } /* end */
8149 };
8150 
8151 static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
8152 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8153 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
8154 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8155 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8156 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8157 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8158 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8159 	HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8160 	HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8161 	{ } /* end */
8162 };
8163 
8164 static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8165 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8166 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8167 	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8168 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8169 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8170 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8171 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8172 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8173 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8174 	{ } /* end */
8175 };
8176 
8177 static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
8178 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8179 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8180 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8181 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8182 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8183 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8184 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8185 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8186 	{ } /* end */
8187 };
8188 
8189 static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8190 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8191 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8192 	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8193 	HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, HDA_INPUT),
8194 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8195 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8196 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8197 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8198 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8199 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8200 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8201 	{ } /* end */
8202 };
8203 
8204 static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8205 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8206 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8207 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8208 	HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8209 	HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8210 						0x0d, 1, 0x0, HDA_OUTPUT),
8211 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8212 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8213 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8214 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8215 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8216 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8217 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8218 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8219 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8220 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8221 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8222 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8223 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8224 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8225 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8226 	{ } /* end */
8227 };
8228 
8229 static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8230 	/* Output mixers */
8231 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8232 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8233 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8234 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8235 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8236 		HDA_OUTPUT),
8237 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8238 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8239 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8240 	/* Output switches */
8241 	HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8242 	HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8243 	HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8244 	/* Boost mixers */
8245 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8246 	HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8247 	/* Input mixers */
8248 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8249 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8250 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8251 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8252 	{ } /* end */
8253 };
8254 
8255 static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8256 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8257 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8258 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8259 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8260 	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8261 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8262 	{ } /* end */
8263 };
8264 
8265 static struct hda_bind_ctls alc883_bind_cap_vol = {
8266 	.ops = &snd_hda_bind_vol,
8267 	.values = {
8268 		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8269 		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8270 		0
8271 	},
8272 };
8273 
8274 static struct hda_bind_ctls alc883_bind_cap_switch = {
8275 	.ops = &snd_hda_bind_sw,
8276 	.values = {
8277 		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8278 		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8279 		0
8280 	},
8281 };
8282 
8283 static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8284 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8285 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8286 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8287 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8288 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8289 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8290 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8291 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8292 	{ } /* end */
8293 };
8294 
8295 static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8296 	HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8297 	HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8298 	{
8299 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8300 		/* .name = "Capture Source", */
8301 		.name = "Input Source",
8302 		.count = 1,
8303 		.info = alc_mux_enum_info,
8304 		.get = alc_mux_enum_get,
8305 		.put = alc_mux_enum_put,
8306 	},
8307 	{ } /* end */
8308 };
8309 
8310 static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8311 	{
8312 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8313 		.name = "Channel Mode",
8314 		.info = alc_ch_mode_info,
8315 		.get = alc_ch_mode_get,
8316 		.put = alc_ch_mode_put,
8317 	},
8318 	{ } /* end */
8319 };
8320 
8321 /* toggle speaker-output according to the hp-jack state */
8322 static void alc883_mitac_setup(struct hda_codec *codec)
8323 {
8324 	struct alc_spec *spec = codec->spec;
8325 
8326 	spec->autocfg.hp_pins[0] = 0x15;
8327 	spec->autocfg.speaker_pins[0] = 0x14;
8328 	spec->autocfg.speaker_pins[1] = 0x17;
8329 }
8330 
8331 /* auto-toggle front mic */
8332 /*
8333 static void alc883_mitac_mic_automute(struct hda_codec *codec)
8334 {
8335 	unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0;
8336 
8337 	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8338 }
8339 */
8340 
8341 static struct hda_verb alc883_mitac_verbs[] = {
8342 	/* HP */
8343 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8344 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8345 	/* Subwoofer */
8346 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8347 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8348 
8349 	/* enable unsolicited event */
8350 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8351 	/* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8352 
8353 	{ } /* end */
8354 };
8355 
8356 static struct hda_verb alc883_clevo_m540r_verbs[] = {
8357 	/* HP */
8358 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8359 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8360 	/* Int speaker */
8361 	/*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8362 
8363 	/* enable unsolicited event */
8364 	/*
8365 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8366 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8367 	*/
8368 
8369 	{ } /* end */
8370 };
8371 
8372 static struct hda_verb alc883_clevo_m720_verbs[] = {
8373 	/* HP */
8374 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8375 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8376 	/* Int speaker */
8377 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
8378 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8379 
8380 	/* enable unsolicited event */
8381 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8382 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8383 
8384 	{ } /* end */
8385 };
8386 
8387 static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
8388 	/* HP */
8389 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8390 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8391 	/* Subwoofer */
8392 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8393 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8394 
8395 	/* enable unsolicited event */
8396 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8397 
8398 	{ } /* end */
8399 };
8400 
8401 static struct hda_verb alc883_targa_verbs[] = {
8402 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8403 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8404 
8405 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8406 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8407 
8408 /* Connect Line-Out side jack (SPDIF) to Side */
8409 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8410 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8411 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8412 /* Connect Mic jack to CLFE */
8413 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8414 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8415 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
8416 /* Connect Line-in jack to Surround */
8417 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8418 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8419 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8420 /* Connect HP out jack to Front */
8421 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8422 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8423 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8424 
8425 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8426 
8427 	{ } /* end */
8428 };
8429 
8430 static struct hda_verb alc883_lenovo_101e_verbs[] = {
8431 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8432 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
8433         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
8434 	{ } /* end */
8435 };
8436 
8437 static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
8438         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8439 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8440         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8441         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8442 	{ } /* end */
8443 };
8444 
8445 static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
8446 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8447 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8448 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8449 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
8450 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT    | AC_USRSP_EN},
8451 	{ } /* end */
8452 };
8453 
8454 static struct hda_verb alc883_haier_w66_verbs[] = {
8455 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8456 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8457 
8458 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8459 
8460 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8461 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8462 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8463 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8464 	{ } /* end */
8465 };
8466 
8467 static struct hda_verb alc888_lenovo_sky_verbs[] = {
8468 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8469 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8470 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8471 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8472 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8473 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8474 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8475 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8476 	{ } /* end */
8477 };
8478 
8479 static struct hda_verb alc888_6st_dell_verbs[] = {
8480 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8481 	{ }
8482 };
8483 
8484 static struct hda_verb alc883_vaiott_verbs[] = {
8485 	/* HP */
8486 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8487 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8488 
8489 	/* enable unsolicited event */
8490 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8491 
8492 	{ } /* end */
8493 };
8494 
8495 static void alc888_3st_hp_setup(struct hda_codec *codec)
8496 {
8497 	struct alc_spec *spec = codec->spec;
8498 
8499 	spec->autocfg.hp_pins[0] = 0x1b;
8500 	spec->autocfg.speaker_pins[0] = 0x14;
8501 	spec->autocfg.speaker_pins[1] = 0x16;
8502 	spec->autocfg.speaker_pins[2] = 0x18;
8503 }
8504 
8505 static struct hda_verb alc888_3st_hp_verbs[] = {
8506 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Front: output 0 (0x0c) */
8507 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Rear : output 1 (0x0d) */
8508 	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},	/* CLFE : output 2 (0x0e) */
8509 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8510 	{ } /* end */
8511 };
8512 
8513 /*
8514  * 2ch mode
8515  */
8516 static struct hda_verb alc888_3st_hp_2ch_init[] = {
8517 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8518 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8519 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
8520 	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8521 	{ } /* end */
8522 };
8523 
8524 /*
8525  * 4ch mode
8526  */
8527 static struct hda_verb alc888_3st_hp_4ch_init[] = {
8528 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8529 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8530 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8531 	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8532 	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8533 	{ } /* end */
8534 };
8535 
8536 /*
8537  * 6ch mode
8538  */
8539 static struct hda_verb alc888_3st_hp_6ch_init[] = {
8540 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8541 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8542 	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
8543 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8544 	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8545 	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8546 	{ } /* end */
8547 };
8548 
8549 static struct hda_channel_mode alc888_3st_hp_modes[3] = {
8550 	{ 2, alc888_3st_hp_2ch_init },
8551 	{ 4, alc888_3st_hp_4ch_init },
8552 	{ 6, alc888_3st_hp_6ch_init },
8553 };
8554 
8555 /* toggle front-jack and RCA according to the hp-jack state */
8556 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
8557 {
8558  	unsigned int present = snd_hda_jack_detect(codec, 0x1b);
8559 
8560 	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8561 				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8562 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8563 				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8564 }
8565 
8566 /* toggle RCA according to the front-jack state */
8567 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
8568 {
8569  	unsigned int present = snd_hda_jack_detect(codec, 0x14);
8570 
8571 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8572 				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8573 }
8574 
8575 static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
8576 					     unsigned int res)
8577 {
8578 	if ((res >> 26) == ALC880_HP_EVENT)
8579 		alc888_lenovo_ms7195_front_automute(codec);
8580 	if ((res >> 26) == ALC880_FRONT_EVENT)
8581 		alc888_lenovo_ms7195_rca_automute(codec);
8582 }
8583 
8584 static struct hda_verb alc883_medion_md2_verbs[] = {
8585 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8586 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8587 
8588 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8589 
8590 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8591 	{ } /* end */
8592 };
8593 
8594 /* toggle speaker-output according to the hp-jack state */
8595 static void alc883_medion_md2_setup(struct hda_codec *codec)
8596 {
8597 	struct alc_spec *spec = codec->spec;
8598 
8599 	spec->autocfg.hp_pins[0] = 0x14;
8600 	spec->autocfg.speaker_pins[0] = 0x15;
8601 }
8602 
8603 /* toggle speaker-output according to the hp-jack state */
8604 #define alc883_targa_init_hook		alc882_targa_init_hook
8605 #define alc883_targa_unsol_event	alc882_targa_unsol_event
8606 
8607 static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
8608 {
8609 	unsigned int present;
8610 
8611 	present = snd_hda_jack_detect(codec, 0x18);
8612 	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
8613 				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8614 }
8615 
8616 static void alc883_clevo_m720_setup(struct hda_codec *codec)
8617 {
8618 	struct alc_spec *spec = codec->spec;
8619 
8620 	spec->autocfg.hp_pins[0] = 0x15;
8621 	spec->autocfg.speaker_pins[0] = 0x14;
8622 }
8623 
8624 static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
8625 {
8626 	alc_automute_amp(codec);
8627 	alc883_clevo_m720_mic_automute(codec);
8628 }
8629 
8630 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
8631 					   unsigned int res)
8632 {
8633 	switch (res >> 26) {
8634 	case ALC880_MIC_EVENT:
8635 		alc883_clevo_m720_mic_automute(codec);
8636 		break;
8637 	default:
8638 		alc_automute_amp_unsol_event(codec, res);
8639 		break;
8640 	}
8641 }
8642 
8643 /* toggle speaker-output according to the hp-jack state */
8644 static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
8645 {
8646 	struct alc_spec *spec = codec->spec;
8647 
8648 	spec->autocfg.hp_pins[0] = 0x14;
8649 	spec->autocfg.speaker_pins[0] = 0x15;
8650 }
8651 
8652 static void alc883_haier_w66_setup(struct hda_codec *codec)
8653 {
8654 	struct alc_spec *spec = codec->spec;
8655 
8656 	spec->autocfg.hp_pins[0] = 0x1b;
8657 	spec->autocfg.speaker_pins[0] = 0x14;
8658 }
8659 
8660 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
8661 {
8662 	int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
8663 
8664 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8665 				 HDA_AMP_MUTE, bits);
8666 }
8667 
8668 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
8669 {
8670 	int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
8671 
8672 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8673 				 HDA_AMP_MUTE, bits);
8674 	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8675 				 HDA_AMP_MUTE, bits);
8676 }
8677 
8678 static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
8679 					   unsigned int res)
8680 {
8681 	if ((res >> 26) == ALC880_HP_EVENT)
8682 		alc883_lenovo_101e_all_automute(codec);
8683 	if ((res >> 26) == ALC880_FRONT_EVENT)
8684 		alc883_lenovo_101e_ispeaker_automute(codec);
8685 }
8686 
8687 /* toggle speaker-output according to the hp-jack state */
8688 static void alc883_acer_aspire_setup(struct hda_codec *codec)
8689 {
8690 	struct alc_spec *spec = codec->spec;
8691 
8692 	spec->autocfg.hp_pins[0] = 0x14;
8693 	spec->autocfg.speaker_pins[0] = 0x15;
8694 	spec->autocfg.speaker_pins[1] = 0x16;
8695 }
8696 
8697 static struct hda_verb alc883_acer_eapd_verbs[] = {
8698 	/* HP Pin: output 0 (0x0c) */
8699 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8700 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8701 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8702 	/* Front Pin: output 0 (0x0c) */
8703 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8704 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8705 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8706 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
8707         /* eanable EAPD on medion laptop */
8708 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8709 	{0x20, AC_VERB_SET_PROC_COEF, 0x3050},
8710 	/* enable unsolicited event */
8711 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8712 	{ }
8713 };
8714 
8715 static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
8716 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8717 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8718 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8719 	{ } /* end */
8720 };
8721 
8722 static void alc888_6st_dell_setup(struct hda_codec *codec)
8723 {
8724 	struct alc_spec *spec = codec->spec;
8725 
8726 	spec->autocfg.hp_pins[0] = 0x1b;
8727 	spec->autocfg.speaker_pins[0] = 0x14;
8728 	spec->autocfg.speaker_pins[1] = 0x15;
8729 	spec->autocfg.speaker_pins[2] = 0x16;
8730 	spec->autocfg.speaker_pins[3] = 0x17;
8731 }
8732 
8733 static void alc888_lenovo_sky_setup(struct hda_codec *codec)
8734 {
8735 	struct alc_spec *spec = codec->spec;
8736 
8737 	spec->autocfg.hp_pins[0] = 0x1b;
8738 	spec->autocfg.speaker_pins[0] = 0x14;
8739 	spec->autocfg.speaker_pins[1] = 0x15;
8740 	spec->autocfg.speaker_pins[2] = 0x16;
8741 	spec->autocfg.speaker_pins[3] = 0x17;
8742 	spec->autocfg.speaker_pins[4] = 0x1a;
8743 }
8744 
8745 static void alc883_vaiott_setup(struct hda_codec *codec)
8746 {
8747 	struct alc_spec *spec = codec->spec;
8748 
8749 	spec->autocfg.hp_pins[0] = 0x15;
8750 	spec->autocfg.speaker_pins[0] = 0x14;
8751 	spec->autocfg.speaker_pins[1] = 0x17;
8752 }
8753 
8754 static struct hda_verb alc888_asus_m90v_verbs[] = {
8755 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8756 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8757 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8758 	/* enable unsolicited event */
8759 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8760 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8761 	{ } /* end */
8762 };
8763 
8764 static void alc883_mode2_setup(struct hda_codec *codec)
8765 {
8766 	struct alc_spec *spec = codec->spec;
8767 
8768 	spec->autocfg.hp_pins[0] = 0x1b;
8769 	spec->autocfg.speaker_pins[0] = 0x14;
8770 	spec->autocfg.speaker_pins[1] = 0x15;
8771 	spec->autocfg.speaker_pins[2] = 0x16;
8772 	spec->ext_mic.pin = 0x18;
8773 	spec->int_mic.pin = 0x19;
8774 	spec->ext_mic.mux_idx = 0;
8775 	spec->int_mic.mux_idx = 1;
8776 	spec->auto_mic = 1;
8777 }
8778 
8779 static struct hda_verb alc888_asus_eee1601_verbs[] = {
8780 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8781 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8782 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8783 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8784 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8785 	{0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
8786 	{0x20, AC_VERB_SET_PROC_COEF,  0x0838},
8787 	/* enable unsolicited event */
8788 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8789 	{ } /* end */
8790 };
8791 
8792 static void alc883_eee1601_inithook(struct hda_codec *codec)
8793 {
8794 	struct alc_spec *spec = codec->spec;
8795 
8796 	spec->autocfg.hp_pins[0] = 0x14;
8797 	spec->autocfg.speaker_pins[0] = 0x1b;
8798 	alc_automute_pin(codec);
8799 }
8800 
8801 static struct hda_verb alc889A_mb31_verbs[] = {
8802 	/* Init rear pin (used as headphone output) */
8803 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},    /* Apple Headphones */
8804 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},           /* Connect to front */
8805 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8806 	/* Init line pin (used as output in 4ch and 6ch mode) */
8807 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},           /* Connect to CLFE */
8808 	/* Init line 2 pin (used as headphone out by default) */
8809 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},  /* Use as input */
8810 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
8811 	{ } /* end */
8812 };
8813 
8814 /* Mute speakers according to the headphone jack state */
8815 static void alc889A_mb31_automute(struct hda_codec *codec)
8816 {
8817 	unsigned int present;
8818 
8819 	/* Mute only in 2ch or 4ch mode */
8820 	if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
8821 	    == 0x00) {
8822 		present = snd_hda_jack_detect(codec, 0x15);
8823 		snd_hda_codec_amp_stereo(codec, 0x14,  HDA_OUTPUT, 0,
8824 			HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8825 		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
8826 			HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8827 	}
8828 }
8829 
8830 static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
8831 {
8832 	if ((res >> 26) == ALC880_HP_EVENT)
8833 		alc889A_mb31_automute(codec);
8834 }
8835 
8836 
8837 #ifdef CONFIG_SND_HDA_POWER_SAVE
8838 #define alc882_loopbacks	alc880_loopbacks
8839 #endif
8840 
8841 /* pcm configuration: identical with ALC880 */
8842 #define alc882_pcm_analog_playback	alc880_pcm_analog_playback
8843 #define alc882_pcm_analog_capture	alc880_pcm_analog_capture
8844 #define alc882_pcm_digital_playback	alc880_pcm_digital_playback
8845 #define alc882_pcm_digital_capture	alc880_pcm_digital_capture
8846 
8847 static hda_nid_t alc883_slave_dig_outs[] = {
8848 	ALC1200_DIGOUT_NID, 0,
8849 };
8850 
8851 static hda_nid_t alc1200_slave_dig_outs[] = {
8852 	ALC883_DIGOUT_NID, 0,
8853 };
8854 
8855 /*
8856  * configuration and preset
8857  */
8858 static const char *alc882_models[ALC882_MODEL_LAST] = {
8859 	[ALC882_3ST_DIG]	= "3stack-dig",
8860 	[ALC882_6ST_DIG]	= "6stack-dig",
8861 	[ALC882_ARIMA]		= "arima",
8862 	[ALC882_W2JC]		= "w2jc",
8863 	[ALC882_TARGA]		= "targa",
8864 	[ALC882_ASUS_A7J]	= "asus-a7j",
8865 	[ALC882_ASUS_A7M]	= "asus-a7m",
8866 	[ALC885_MACPRO]		= "macpro",
8867 	[ALC885_MB5]		= "mb5",
8868 	[ALC885_MBP3]		= "mbp3",
8869 	[ALC885_IMAC24]		= "imac24",
8870 	[ALC885_IMAC91]		= "imac91",
8871 	[ALC883_3ST_2ch_DIG]	= "3stack-2ch-dig",
8872 	[ALC883_3ST_6ch_DIG]	= "3stack-6ch-dig",
8873 	[ALC883_3ST_6ch]	= "3stack-6ch",
8874 	[ALC883_6ST_DIG]	= "alc883-6stack-dig",
8875 	[ALC883_TARGA_DIG]	= "targa-dig",
8876 	[ALC883_TARGA_2ch_DIG]	= "targa-2ch-dig",
8877 	[ALC883_TARGA_8ch_DIG]	= "targa-8ch-dig",
8878 	[ALC883_ACER]		= "acer",
8879 	[ALC883_ACER_ASPIRE]	= "acer-aspire",
8880 	[ALC888_ACER_ASPIRE_4930G]	= "acer-aspire-4930g",
8881 	[ALC888_ACER_ASPIRE_6530G]	= "acer-aspire-6530g",
8882 	[ALC888_ACER_ASPIRE_8930G]	= "acer-aspire-8930g",
8883 	[ALC888_ACER_ASPIRE_7730G]	= "acer-aspire-7730g",
8884 	[ALC883_MEDION]		= "medion",
8885 	[ALC883_MEDION_MD2]	= "medion-md2",
8886 	[ALC883_LAPTOP_EAPD]	= "laptop-eapd",
8887 	[ALC883_LENOVO_101E_2ch] = "lenovo-101e",
8888 	[ALC883_LENOVO_NB0763]	= "lenovo-nb0763",
8889 	[ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
8890 	[ALC888_LENOVO_SKY] = "lenovo-sky",
8891 	[ALC883_HAIER_W66] 	= "haier-w66",
8892 	[ALC888_3ST_HP]		= "3stack-hp",
8893 	[ALC888_6ST_DELL]	= "6stack-dell",
8894 	[ALC883_MITAC]		= "mitac",
8895 	[ALC883_CLEVO_M540R]	= "clevo-m540r",
8896 	[ALC883_CLEVO_M720]	= "clevo-m720",
8897 	[ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
8898 	[ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
8899 	[ALC883_3ST_6ch_INTEL]	= "3stack-6ch-intel",
8900 	[ALC889A_INTEL]		= "intel-alc889a",
8901 	[ALC889_INTEL]		= "intel-x58",
8902 	[ALC1200_ASUS_P5Q]	= "asus-p5q",
8903 	[ALC889A_MB31]		= "mb31",
8904 	[ALC883_SONY_VAIO_TT]	= "sony-vaio-tt",
8905 	[ALC882_AUTO]		= "auto",
8906 };
8907 
8908 static struct snd_pci_quirk alc882_cfg_tbl[] = {
8909 	SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
8910 
8911 	SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
8912 	SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
8913 	SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
8914 	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
8915 	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
8916 	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
8917 	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
8918 		ALC888_ACER_ASPIRE_4930G),
8919 	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
8920 		ALC888_ACER_ASPIRE_4930G),
8921 	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
8922 		ALC888_ACER_ASPIRE_8930G),
8923 	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
8924 		ALC888_ACER_ASPIRE_8930G),
8925 	SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
8926 	SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
8927 	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
8928 		ALC888_ACER_ASPIRE_6530G),
8929 	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
8930 		ALC888_ACER_ASPIRE_6530G),
8931 	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
8932 		ALC888_ACER_ASPIRE_7730G),
8933 	/* default Acer -- disabled as it causes more problems.
8934 	 *    model=auto should work fine now
8935 	 */
8936 	/* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
8937 
8938 	SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
8939 
8940 	SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
8941 	SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
8942 	SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
8943 	SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
8944 	SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
8945 	SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
8946 
8947 	SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
8948 	SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
8949 	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
8950 	SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
8951 	SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
8952 	SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
8953 	SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
8954 	SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
8955 	SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
8956 	SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
8957 	SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
8958 
8959 	SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
8960 	SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
8961 	SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
8962 	SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
8963 	SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
8964 	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
8965 	SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
8966 	SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
8967 	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
8968 
8969 	SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
8970 	SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
8971 	SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
8972 	SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */
8973 	SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
8974 	SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
8975 	SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
8976 	SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
8977 	SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
8978 	SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
8979 	SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
8980 	SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
8981 	SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
8982 	SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
8983 	SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
8984 	SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
8985 	SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
8986 	SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
8987 	SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
8988 	SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
8989 	SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
8990 	SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
8991 	SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
8992 	SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
8993 	SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
8994 	SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
8995 	SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
8996 	SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
8997 	SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
8998 
8999 	SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
9000 	SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
9001 	SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
9002 	SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
9003 	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
9004 	SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
9005 	/* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
9006 	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
9007 	SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
9008 		      ALC883_FUJITSU_PI2515),
9009 	SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
9010 		ALC888_FUJITSU_XA3530),
9011 	SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
9012 	SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9013 	SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9014 	SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9015 	SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
9016 	SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
9017 	SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
9018 	SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
9019 	SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
9020 
9021 	SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
9022 	SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
9023 	SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
9024 	SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
9025 	SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
9026 	SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
9027 	SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch),
9028 
9029 	{}
9030 };
9031 
9032 /* codec SSID table for Intel Mac */
9033 static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9034 	SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9035 	SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9036 	SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
9037 	SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
9038 	SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
9039 	SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
9040 	SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
9041 	SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
9042 	SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
9043 	SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
9044 	SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
9045 	SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
9046 	/* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
9047 	 * so apparently no perfect solution yet
9048 	 */
9049 	SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
9050 	SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
9051 	{} /* terminator */
9052 };
9053 
9054 static struct alc_config_preset alc882_presets[] = {
9055 	[ALC882_3ST_DIG] = {
9056 		.mixers = { alc882_base_mixer },
9057 		.init_verbs = { alc882_base_init_verbs,
9058 				alc882_adc1_init_verbs },
9059 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9060 		.dac_nids = alc882_dac_nids,
9061 		.dig_out_nid = ALC882_DIGOUT_NID,
9062 		.dig_in_nid = ALC882_DIGIN_NID,
9063 		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9064 		.channel_mode = alc882_ch_modes,
9065 		.need_dac_fix = 1,
9066 		.input_mux = &alc882_capture_source,
9067 	},
9068 	[ALC882_6ST_DIG] = {
9069 		.mixers = { alc882_base_mixer, alc882_chmode_mixer },
9070 		.init_verbs = { alc882_base_init_verbs,
9071 				alc882_adc1_init_verbs },
9072 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9073 		.dac_nids = alc882_dac_nids,
9074 		.dig_out_nid = ALC882_DIGOUT_NID,
9075 		.dig_in_nid = ALC882_DIGIN_NID,
9076 		.num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9077 		.channel_mode = alc882_sixstack_modes,
9078 		.input_mux = &alc882_capture_source,
9079 	},
9080 	[ALC882_ARIMA] = {
9081 		.mixers = { alc882_base_mixer, alc882_chmode_mixer },
9082 		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9083 				alc882_eapd_verbs },
9084 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9085 		.dac_nids = alc882_dac_nids,
9086 		.num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9087 		.channel_mode = alc882_sixstack_modes,
9088 		.input_mux = &alc882_capture_source,
9089 	},
9090 	[ALC882_W2JC] = {
9091 		.mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
9092 		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9093 				alc882_eapd_verbs, alc880_gpio1_init_verbs },
9094 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9095 		.dac_nids = alc882_dac_nids,
9096 		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9097 		.channel_mode = alc880_threestack_modes,
9098 		.need_dac_fix = 1,
9099 		.input_mux = &alc882_capture_source,
9100 		.dig_out_nid = ALC882_DIGOUT_NID,
9101 	},
9102 	[ALC885_MBP3] = {
9103 		.mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
9104 		.init_verbs = { alc885_mbp3_init_verbs,
9105 				alc880_gpio1_init_verbs },
9106 		.num_dacs = 2,
9107 		.dac_nids = alc882_dac_nids,
9108 		.hp_nid = 0x04,
9109 		.channel_mode = alc885_mbp_4ch_modes,
9110 		.num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9111 		.input_mux = &alc882_capture_source,
9112 		.dig_out_nid = ALC882_DIGOUT_NID,
9113 		.dig_in_nid = ALC882_DIGIN_NID,
9114 		.unsol_event = alc_automute_amp_unsol_event,
9115 		.setup = alc885_mbp3_setup,
9116 		.init_hook = alc_automute_amp,
9117 	},
9118 	[ALC885_MB5] = {
9119 		.mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
9120 		.init_verbs = { alc885_mb5_init_verbs,
9121 				alc880_gpio1_init_verbs },
9122 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9123 		.dac_nids = alc882_dac_nids,
9124 		.channel_mode = alc885_mb5_6ch_modes,
9125 		.num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
9126 		.input_mux = &mb5_capture_source,
9127 		.dig_out_nid = ALC882_DIGOUT_NID,
9128 		.dig_in_nid = ALC882_DIGIN_NID,
9129 	},
9130 	[ALC885_MACPRO] = {
9131 		.mixers = { alc882_macpro_mixer },
9132 		.init_verbs = { alc882_macpro_init_verbs },
9133 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9134 		.dac_nids = alc882_dac_nids,
9135 		.dig_out_nid = ALC882_DIGOUT_NID,
9136 		.dig_in_nid = ALC882_DIGIN_NID,
9137 		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9138 		.channel_mode = alc882_ch_modes,
9139 		.input_mux = &alc882_capture_source,
9140 		.init_hook = alc885_macpro_init_hook,
9141 	},
9142 	[ALC885_IMAC24] = {
9143 		.mixers = { alc885_imac24_mixer },
9144 		.init_verbs = { alc885_imac24_init_verbs },
9145 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9146 		.dac_nids = alc882_dac_nids,
9147 		.dig_out_nid = ALC882_DIGOUT_NID,
9148 		.dig_in_nid = ALC882_DIGIN_NID,
9149 		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9150 		.channel_mode = alc882_ch_modes,
9151 		.input_mux = &alc882_capture_source,
9152 		.unsol_event = alc_automute_amp_unsol_event,
9153 		.setup = alc885_imac24_setup,
9154 		.init_hook = alc885_imac24_init_hook,
9155 	},
9156 	[ALC885_IMAC91] = {
9157 		.mixers = { alc885_imac91_mixer, alc882_chmode_mixer },
9158 		.init_verbs = { alc885_imac91_init_verbs,
9159 				alc880_gpio1_init_verbs },
9160 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9161 		.dac_nids = alc882_dac_nids,
9162 		.channel_mode = alc885_mbp_4ch_modes,
9163 		.num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9164 		.input_mux = &alc882_capture_source,
9165 		.dig_out_nid = ALC882_DIGOUT_NID,
9166 		.dig_in_nid = ALC882_DIGIN_NID,
9167 		.unsol_event = alc885_imac91_unsol_event,
9168 		.init_hook = alc885_imac91_automute,
9169 	},
9170 	[ALC882_TARGA] = {
9171 		.mixers = { alc882_targa_mixer, alc882_chmode_mixer },
9172 		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9173 				alc880_gpio3_init_verbs, alc882_targa_verbs},
9174 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9175 		.dac_nids = alc882_dac_nids,
9176 		.dig_out_nid = ALC882_DIGOUT_NID,
9177 		.num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9178 		.adc_nids = alc882_adc_nids,
9179 		.capsrc_nids = alc882_capsrc_nids,
9180 		.num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9181 		.channel_mode = alc882_3ST_6ch_modes,
9182 		.need_dac_fix = 1,
9183 		.input_mux = &alc882_capture_source,
9184 		.unsol_event = alc882_targa_unsol_event,
9185 		.setup = alc882_targa_setup,
9186 		.init_hook = alc882_targa_automute,
9187 	},
9188 	[ALC882_ASUS_A7J] = {
9189 		.mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
9190 		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9191 				alc882_asus_a7j_verbs},
9192 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9193 		.dac_nids = alc882_dac_nids,
9194 		.dig_out_nid = ALC882_DIGOUT_NID,
9195 		.num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9196 		.adc_nids = alc882_adc_nids,
9197 		.capsrc_nids = alc882_capsrc_nids,
9198 		.num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9199 		.channel_mode = alc882_3ST_6ch_modes,
9200 		.need_dac_fix = 1,
9201 		.input_mux = &alc882_capture_source,
9202 	},
9203 	[ALC882_ASUS_A7M] = {
9204 		.mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
9205 		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9206 				alc882_eapd_verbs, alc880_gpio1_init_verbs,
9207 				alc882_asus_a7m_verbs },
9208 		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9209 		.dac_nids = alc882_dac_nids,
9210 		.dig_out_nid = ALC882_DIGOUT_NID,
9211 		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9212 		.channel_mode = alc880_threestack_modes,
9213 		.need_dac_fix = 1,
9214 		.input_mux = &alc882_capture_source,
9215 	},
9216 	[ALC883_3ST_2ch_DIG] = {
9217 		.mixers = { alc883_3ST_2ch_mixer },
9218 		.init_verbs = { alc883_init_verbs },
9219 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9220 		.dac_nids = alc883_dac_nids,
9221 		.dig_out_nid = ALC883_DIGOUT_NID,
9222 		.dig_in_nid = ALC883_DIGIN_NID,
9223 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9224 		.channel_mode = alc883_3ST_2ch_modes,
9225 		.input_mux = &alc883_capture_source,
9226 	},
9227 	[ALC883_3ST_6ch_DIG] = {
9228 		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9229 		.init_verbs = { alc883_init_verbs },
9230 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9231 		.dac_nids = alc883_dac_nids,
9232 		.dig_out_nid = ALC883_DIGOUT_NID,
9233 		.dig_in_nid = ALC883_DIGIN_NID,
9234 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9235 		.channel_mode = alc883_3ST_6ch_modes,
9236 		.need_dac_fix = 1,
9237 		.input_mux = &alc883_capture_source,
9238 	},
9239 	[ALC883_3ST_6ch] = {
9240 		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9241 		.init_verbs = { alc883_init_verbs },
9242 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9243 		.dac_nids = alc883_dac_nids,
9244 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9245 		.channel_mode = alc883_3ST_6ch_modes,
9246 		.need_dac_fix = 1,
9247 		.input_mux = &alc883_capture_source,
9248 	},
9249 	[ALC883_3ST_6ch_INTEL] = {
9250 		.mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9251 		.init_verbs = { alc883_init_verbs },
9252 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9253 		.dac_nids = alc883_dac_nids,
9254 		.dig_out_nid = ALC883_DIGOUT_NID,
9255 		.dig_in_nid = ALC883_DIGIN_NID,
9256 		.slave_dig_outs = alc883_slave_dig_outs,
9257 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9258 		.channel_mode = alc883_3ST_6ch_intel_modes,
9259 		.need_dac_fix = 1,
9260 		.input_mux = &alc883_3stack_6ch_intel,
9261 	},
9262 	[ALC889A_INTEL] = {
9263 		.mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9264 		.init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9265 				alc_hp15_unsol_verbs },
9266 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9267 		.dac_nids = alc883_dac_nids,
9268 		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9269 		.adc_nids = alc889_adc_nids,
9270 		.dig_out_nid = ALC883_DIGOUT_NID,
9271 		.dig_in_nid = ALC883_DIGIN_NID,
9272 		.slave_dig_outs = alc883_slave_dig_outs,
9273 		.num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9274 		.channel_mode = alc889_8ch_intel_modes,
9275 		.capsrc_nids = alc889_capsrc_nids,
9276 		.input_mux = &alc889_capture_source,
9277 		.setup = alc889_automute_setup,
9278 		.init_hook = alc_automute_amp,
9279 		.unsol_event = alc_automute_amp_unsol_event,
9280 		.need_dac_fix = 1,
9281 	},
9282 	[ALC889_INTEL] = {
9283 		.mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9284 		.init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
9285 				alc889_eapd_verbs, alc_hp15_unsol_verbs},
9286 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9287 		.dac_nids = alc883_dac_nids,
9288 		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9289 		.adc_nids = alc889_adc_nids,
9290 		.dig_out_nid = ALC883_DIGOUT_NID,
9291 		.dig_in_nid = ALC883_DIGIN_NID,
9292 		.slave_dig_outs = alc883_slave_dig_outs,
9293 		.num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9294 		.channel_mode = alc889_8ch_intel_modes,
9295 		.capsrc_nids = alc889_capsrc_nids,
9296 		.input_mux = &alc889_capture_source,
9297 		.setup = alc889_automute_setup,
9298 		.init_hook = alc889_intel_init_hook,
9299 		.unsol_event = alc_automute_amp_unsol_event,
9300 		.need_dac_fix = 1,
9301 	},
9302 	[ALC883_6ST_DIG] = {
9303 		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
9304 		.init_verbs = { alc883_init_verbs },
9305 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9306 		.dac_nids = alc883_dac_nids,
9307 		.dig_out_nid = ALC883_DIGOUT_NID,
9308 		.dig_in_nid = ALC883_DIGIN_NID,
9309 		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9310 		.channel_mode = alc883_sixstack_modes,
9311 		.input_mux = &alc883_capture_source,
9312 	},
9313 	[ALC883_TARGA_DIG] = {
9314 		.mixers = { alc883_targa_mixer, alc883_chmode_mixer },
9315 		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9316 				alc883_targa_verbs},
9317 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9318 		.dac_nids = alc883_dac_nids,
9319 		.dig_out_nid = ALC883_DIGOUT_NID,
9320 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9321 		.channel_mode = alc883_3ST_6ch_modes,
9322 		.need_dac_fix = 1,
9323 		.input_mux = &alc883_capture_source,
9324 		.unsol_event = alc883_targa_unsol_event,
9325 		.setup = alc882_targa_setup,
9326 		.init_hook = alc882_targa_automute,
9327 	},
9328 	[ALC883_TARGA_2ch_DIG] = {
9329 		.mixers = { alc883_targa_2ch_mixer},
9330 		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9331 				alc883_targa_verbs},
9332 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9333 		.dac_nids = alc883_dac_nids,
9334 		.adc_nids = alc883_adc_nids_alt,
9335 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9336 		.capsrc_nids = alc883_capsrc_nids,
9337 		.dig_out_nid = ALC883_DIGOUT_NID,
9338 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9339 		.channel_mode = alc883_3ST_2ch_modes,
9340 		.input_mux = &alc883_capture_source,
9341 		.unsol_event = alc883_targa_unsol_event,
9342 		.setup = alc882_targa_setup,
9343 		.init_hook = alc882_targa_automute,
9344 	},
9345 	[ALC883_TARGA_8ch_DIG] = {
9346 		.mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
9347 			    alc883_chmode_mixer },
9348 		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9349 				alc883_targa_verbs },
9350 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9351 		.dac_nids = alc883_dac_nids,
9352 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9353 		.adc_nids = alc883_adc_nids_rev,
9354 		.capsrc_nids = alc883_capsrc_nids_rev,
9355 		.dig_out_nid = ALC883_DIGOUT_NID,
9356 		.dig_in_nid = ALC883_DIGIN_NID,
9357 		.num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
9358 		.channel_mode = alc883_4ST_8ch_modes,
9359 		.need_dac_fix = 1,
9360 		.input_mux = &alc883_capture_source,
9361 		.unsol_event = alc883_targa_unsol_event,
9362 		.setup = alc882_targa_setup,
9363 		.init_hook = alc882_targa_automute,
9364 	},
9365 	[ALC883_ACER] = {
9366 		.mixers = { alc883_base_mixer },
9367 		/* On TravelMate laptops, GPIO 0 enables the internal speaker
9368 		 * and the headphone jack.  Turn this on and rely on the
9369 		 * standard mute methods whenever the user wants to turn
9370 		 * these outputs off.
9371 		 */
9372 		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
9373 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9374 		.dac_nids = alc883_dac_nids,
9375 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9376 		.channel_mode = alc883_3ST_2ch_modes,
9377 		.input_mux = &alc883_capture_source,
9378 	},
9379 	[ALC883_ACER_ASPIRE] = {
9380 		.mixers = { alc883_acer_aspire_mixer },
9381 		.init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
9382 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9383 		.dac_nids = alc883_dac_nids,
9384 		.dig_out_nid = ALC883_DIGOUT_NID,
9385 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9386 		.channel_mode = alc883_3ST_2ch_modes,
9387 		.input_mux = &alc883_capture_source,
9388 		.unsol_event = alc_automute_amp_unsol_event,
9389 		.setup = alc883_acer_aspire_setup,
9390 		.init_hook = alc_automute_amp,
9391 	},
9392 	[ALC888_ACER_ASPIRE_4930G] = {
9393 		.mixers = { alc888_base_mixer,
9394 				alc883_chmode_mixer },
9395 		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9396 				alc888_acer_aspire_4930g_verbs },
9397 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9398 		.dac_nids = alc883_dac_nids,
9399 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9400 		.adc_nids = alc883_adc_nids_rev,
9401 		.capsrc_nids = alc883_capsrc_nids_rev,
9402 		.dig_out_nid = ALC883_DIGOUT_NID,
9403 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9404 		.channel_mode = alc883_3ST_6ch_modes,
9405 		.need_dac_fix = 1,
9406 		.num_mux_defs =
9407 			ARRAY_SIZE(alc888_2_capture_sources),
9408 		.input_mux = alc888_2_capture_sources,
9409 		.unsol_event = alc_automute_amp_unsol_event,
9410 		.setup = alc888_acer_aspire_4930g_setup,
9411 		.init_hook = alc_automute_amp,
9412 	},
9413 	[ALC888_ACER_ASPIRE_6530G] = {
9414 		.mixers = { alc888_acer_aspire_6530_mixer },
9415 		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9416 				alc888_acer_aspire_6530g_verbs },
9417 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9418 		.dac_nids = alc883_dac_nids,
9419 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9420 		.adc_nids = alc883_adc_nids_rev,
9421 		.capsrc_nids = alc883_capsrc_nids_rev,
9422 		.dig_out_nid = ALC883_DIGOUT_NID,
9423 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9424 		.channel_mode = alc883_3ST_2ch_modes,
9425 		.num_mux_defs =
9426 			ARRAY_SIZE(alc888_2_capture_sources),
9427 		.input_mux = alc888_acer_aspire_6530_sources,
9428 		.unsol_event = alc_automute_amp_unsol_event,
9429 		.setup = alc888_acer_aspire_6530g_setup,
9430 		.init_hook = alc_automute_amp,
9431 	},
9432 	[ALC888_ACER_ASPIRE_8930G] = {
9433 		.mixers = { alc889_acer_aspire_8930g_mixer,
9434 				alc883_chmode_mixer },
9435 		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9436 				alc889_acer_aspire_8930g_verbs,
9437 				alc889_eapd_verbs},
9438 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9439 		.dac_nids = alc883_dac_nids,
9440 		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9441 		.adc_nids = alc889_adc_nids,
9442 		.capsrc_nids = alc889_capsrc_nids,
9443 		.dig_out_nid = ALC883_DIGOUT_NID,
9444 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9445 		.channel_mode = alc883_3ST_6ch_modes,
9446 		.need_dac_fix = 1,
9447 		.const_channel_count = 6,
9448 		.num_mux_defs =
9449 			ARRAY_SIZE(alc889_capture_sources),
9450 		.input_mux = alc889_capture_sources,
9451 		.unsol_event = alc_automute_amp_unsol_event,
9452 		.setup = alc889_acer_aspire_8930g_setup,
9453 		.init_hook = alc_automute_amp,
9454 #ifdef CONFIG_SND_HDA_POWER_SAVE
9455 		.power_hook = alc889_power_eapd,
9456 #endif
9457 	},
9458 	[ALC888_ACER_ASPIRE_7730G] = {
9459 		.mixers = { alc883_3ST_6ch_mixer,
9460 				alc883_chmode_mixer },
9461 		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9462 				alc888_acer_aspire_7730G_verbs },
9463 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9464 		.dac_nids = alc883_dac_nids,
9465 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9466 		.adc_nids = alc883_adc_nids_rev,
9467 		.capsrc_nids = alc883_capsrc_nids_rev,
9468 		.dig_out_nid = ALC883_DIGOUT_NID,
9469 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9470 		.channel_mode = alc883_3ST_6ch_modes,
9471 		.need_dac_fix = 1,
9472 		.const_channel_count = 6,
9473 		.input_mux = &alc883_capture_source,
9474 		.unsol_event = alc_automute_amp_unsol_event,
9475 		.setup = alc888_acer_aspire_6530g_setup,
9476 		.init_hook = alc_automute_amp,
9477 	},
9478 	[ALC883_MEDION] = {
9479 		.mixers = { alc883_fivestack_mixer,
9480 			    alc883_chmode_mixer },
9481 		.init_verbs = { alc883_init_verbs,
9482 				alc883_medion_eapd_verbs },
9483 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9484 		.dac_nids = alc883_dac_nids,
9485 		.adc_nids = alc883_adc_nids_alt,
9486 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9487 		.capsrc_nids = alc883_capsrc_nids,
9488 		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9489 		.channel_mode = alc883_sixstack_modes,
9490 		.input_mux = &alc883_capture_source,
9491 	},
9492 	[ALC883_MEDION_MD2] = {
9493 		.mixers = { alc883_medion_md2_mixer},
9494 		.init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
9495 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9496 		.dac_nids = alc883_dac_nids,
9497 		.dig_out_nid = ALC883_DIGOUT_NID,
9498 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9499 		.channel_mode = alc883_3ST_2ch_modes,
9500 		.input_mux = &alc883_capture_source,
9501 		.unsol_event = alc_automute_amp_unsol_event,
9502 		.setup = alc883_medion_md2_setup,
9503 		.init_hook = alc_automute_amp,
9504 	},
9505 	[ALC883_LAPTOP_EAPD] = {
9506 		.mixers = { alc883_base_mixer },
9507 		.init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
9508 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9509 		.dac_nids = alc883_dac_nids,
9510 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9511 		.channel_mode = alc883_3ST_2ch_modes,
9512 		.input_mux = &alc883_capture_source,
9513 	},
9514 	[ALC883_CLEVO_M540R] = {
9515 		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9516 		.init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
9517 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9518 		.dac_nids = alc883_dac_nids,
9519 		.dig_out_nid = ALC883_DIGOUT_NID,
9520 		.dig_in_nid = ALC883_DIGIN_NID,
9521 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
9522 		.channel_mode = alc883_3ST_6ch_clevo_modes,
9523 		.need_dac_fix = 1,
9524 		.input_mux = &alc883_capture_source,
9525 		/* This machine has the hardware HP auto-muting, thus
9526 		 * we need no software mute via unsol event
9527 		 */
9528 	},
9529 	[ALC883_CLEVO_M720] = {
9530 		.mixers = { alc883_clevo_m720_mixer },
9531 		.init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
9532 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9533 		.dac_nids = alc883_dac_nids,
9534 		.dig_out_nid = ALC883_DIGOUT_NID,
9535 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9536 		.channel_mode = alc883_3ST_2ch_modes,
9537 		.input_mux = &alc883_capture_source,
9538 		.unsol_event = alc883_clevo_m720_unsol_event,
9539 		.setup = alc883_clevo_m720_setup,
9540 		.init_hook = alc883_clevo_m720_init_hook,
9541 	},
9542 	[ALC883_LENOVO_101E_2ch] = {
9543 		.mixers = { alc883_lenovo_101e_2ch_mixer},
9544 		.init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
9545 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9546 		.dac_nids = alc883_dac_nids,
9547 		.adc_nids = alc883_adc_nids_alt,
9548 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9549 		.capsrc_nids = alc883_capsrc_nids,
9550 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9551 		.channel_mode = alc883_3ST_2ch_modes,
9552 		.input_mux = &alc883_lenovo_101e_capture_source,
9553 		.unsol_event = alc883_lenovo_101e_unsol_event,
9554 		.init_hook = alc883_lenovo_101e_all_automute,
9555 	},
9556 	[ALC883_LENOVO_NB0763] = {
9557 		.mixers = { alc883_lenovo_nb0763_mixer },
9558 		.init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
9559 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9560 		.dac_nids = alc883_dac_nids,
9561 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9562 		.channel_mode = alc883_3ST_2ch_modes,
9563 		.need_dac_fix = 1,
9564 		.input_mux = &alc883_lenovo_nb0763_capture_source,
9565 		.unsol_event = alc_automute_amp_unsol_event,
9566 		.setup = alc883_medion_md2_setup,
9567 		.init_hook = alc_automute_amp,
9568 	},
9569 	[ALC888_LENOVO_MS7195_DIG] = {
9570 		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9571 		.init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
9572 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9573 		.dac_nids = alc883_dac_nids,
9574 		.dig_out_nid = ALC883_DIGOUT_NID,
9575 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9576 		.channel_mode = alc883_3ST_6ch_modes,
9577 		.need_dac_fix = 1,
9578 		.input_mux = &alc883_capture_source,
9579 		.unsol_event = alc883_lenovo_ms7195_unsol_event,
9580 		.init_hook = alc888_lenovo_ms7195_front_automute,
9581 	},
9582 	[ALC883_HAIER_W66] = {
9583 		.mixers = { alc883_targa_2ch_mixer},
9584 		.init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
9585 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9586 		.dac_nids = alc883_dac_nids,
9587 		.dig_out_nid = ALC883_DIGOUT_NID,
9588 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9589 		.channel_mode = alc883_3ST_2ch_modes,
9590 		.input_mux = &alc883_capture_source,
9591 		.unsol_event = alc_automute_amp_unsol_event,
9592 		.setup = alc883_haier_w66_setup,
9593 		.init_hook = alc_automute_amp,
9594 	},
9595 	[ALC888_3ST_HP] = {
9596 		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9597 		.init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
9598 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9599 		.dac_nids = alc883_dac_nids,
9600 		.num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
9601 		.channel_mode = alc888_3st_hp_modes,
9602 		.need_dac_fix = 1,
9603 		.input_mux = &alc883_capture_source,
9604 		.unsol_event = alc_automute_amp_unsol_event,
9605 		.setup = alc888_3st_hp_setup,
9606 		.init_hook = alc_automute_amp,
9607 	},
9608 	[ALC888_6ST_DELL] = {
9609 		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
9610 		.init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
9611 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9612 		.dac_nids = alc883_dac_nids,
9613 		.dig_out_nid = ALC883_DIGOUT_NID,
9614 		.dig_in_nid = ALC883_DIGIN_NID,
9615 		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9616 		.channel_mode = alc883_sixstack_modes,
9617 		.input_mux = &alc883_capture_source,
9618 		.unsol_event = alc_automute_amp_unsol_event,
9619 		.setup = alc888_6st_dell_setup,
9620 		.init_hook = alc_automute_amp,
9621 	},
9622 	[ALC883_MITAC] = {
9623 		.mixers = { alc883_mitac_mixer },
9624 		.init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
9625 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9626 		.dac_nids = alc883_dac_nids,
9627 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9628 		.channel_mode = alc883_3ST_2ch_modes,
9629 		.input_mux = &alc883_capture_source,
9630 		.unsol_event = alc_automute_amp_unsol_event,
9631 		.setup = alc883_mitac_setup,
9632 		.init_hook = alc_automute_amp,
9633 	},
9634 	[ALC883_FUJITSU_PI2515] = {
9635 		.mixers = { alc883_2ch_fujitsu_pi2515_mixer },
9636 		.init_verbs = { alc883_init_verbs,
9637 				alc883_2ch_fujitsu_pi2515_verbs},
9638 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9639 		.dac_nids = alc883_dac_nids,
9640 		.dig_out_nid = ALC883_DIGOUT_NID,
9641 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9642 		.channel_mode = alc883_3ST_2ch_modes,
9643 		.input_mux = &alc883_fujitsu_pi2515_capture_source,
9644 		.unsol_event = alc_automute_amp_unsol_event,
9645 		.setup = alc883_2ch_fujitsu_pi2515_setup,
9646 		.init_hook = alc_automute_amp,
9647 	},
9648 	[ALC888_FUJITSU_XA3530] = {
9649 		.mixers = { alc888_base_mixer, alc883_chmode_mixer },
9650 		.init_verbs = { alc883_init_verbs,
9651 			alc888_fujitsu_xa3530_verbs },
9652 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9653 		.dac_nids = alc883_dac_nids,
9654 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9655 		.adc_nids = alc883_adc_nids_rev,
9656 		.capsrc_nids = alc883_capsrc_nids_rev,
9657 		.dig_out_nid = ALC883_DIGOUT_NID,
9658 		.num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
9659 		.channel_mode = alc888_4ST_8ch_intel_modes,
9660 		.num_mux_defs =
9661 			ARRAY_SIZE(alc888_2_capture_sources),
9662 		.input_mux = alc888_2_capture_sources,
9663 		.unsol_event = alc_automute_amp_unsol_event,
9664 		.setup = alc888_fujitsu_xa3530_setup,
9665 		.init_hook = alc_automute_amp,
9666 	},
9667 	[ALC888_LENOVO_SKY] = {
9668 		.mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
9669 		.init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
9670 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9671 		.dac_nids = alc883_dac_nids,
9672 		.dig_out_nid = ALC883_DIGOUT_NID,
9673 		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9674 		.channel_mode = alc883_sixstack_modes,
9675 		.need_dac_fix = 1,
9676 		.input_mux = &alc883_lenovo_sky_capture_source,
9677 		.unsol_event = alc_automute_amp_unsol_event,
9678 		.setup = alc888_lenovo_sky_setup,
9679 		.init_hook = alc_automute_amp,
9680 	},
9681 	[ALC888_ASUS_M90V] = {
9682 		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9683 		.init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
9684 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9685 		.dac_nids = alc883_dac_nids,
9686 		.dig_out_nid = ALC883_DIGOUT_NID,
9687 		.dig_in_nid = ALC883_DIGIN_NID,
9688 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9689 		.channel_mode = alc883_3ST_6ch_modes,
9690 		.need_dac_fix = 1,
9691 		.input_mux = &alc883_fujitsu_pi2515_capture_source,
9692 		.unsol_event = alc_sku_unsol_event,
9693 		.setup = alc883_mode2_setup,
9694 		.init_hook = alc_inithook,
9695 	},
9696 	[ALC888_ASUS_EEE1601] = {
9697 		.mixers = { alc883_asus_eee1601_mixer },
9698 		.cap_mixer = alc883_asus_eee1601_cap_mixer,
9699 		.init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
9700 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9701 		.dac_nids = alc883_dac_nids,
9702 		.dig_out_nid = ALC883_DIGOUT_NID,
9703 		.dig_in_nid = ALC883_DIGIN_NID,
9704 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9705 		.channel_mode = alc883_3ST_2ch_modes,
9706 		.need_dac_fix = 1,
9707 		.input_mux = &alc883_asus_eee1601_capture_source,
9708 		.unsol_event = alc_sku_unsol_event,
9709 		.init_hook = alc883_eee1601_inithook,
9710 	},
9711 	[ALC1200_ASUS_P5Q] = {
9712 		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
9713 		.init_verbs = { alc883_init_verbs },
9714 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9715 		.dac_nids = alc883_dac_nids,
9716 		.dig_out_nid = ALC1200_DIGOUT_NID,
9717 		.dig_in_nid = ALC883_DIGIN_NID,
9718 		.slave_dig_outs = alc1200_slave_dig_outs,
9719 		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9720 		.channel_mode = alc883_sixstack_modes,
9721 		.input_mux = &alc883_capture_source,
9722 	},
9723 	[ALC889A_MB31] = {
9724 		.mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
9725 		.init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
9726 			alc880_gpio1_init_verbs },
9727 		.adc_nids = alc883_adc_nids,
9728 		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
9729 		.capsrc_nids = alc883_capsrc_nids,
9730 		.dac_nids = alc883_dac_nids,
9731 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9732 		.channel_mode = alc889A_mb31_6ch_modes,
9733 		.num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
9734 		.input_mux = &alc889A_mb31_capture_source,
9735 		.dig_out_nid = ALC883_DIGOUT_NID,
9736 		.unsol_event = alc889A_mb31_unsol_event,
9737 		.init_hook = alc889A_mb31_automute,
9738 	},
9739 	[ALC883_SONY_VAIO_TT] = {
9740 		.mixers = { alc883_vaiott_mixer },
9741 		.init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
9742 		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9743 		.dac_nids = alc883_dac_nids,
9744 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9745 		.channel_mode = alc883_3ST_2ch_modes,
9746 		.input_mux = &alc883_capture_source,
9747 		.unsol_event = alc_automute_amp_unsol_event,
9748 		.setup = alc883_vaiott_setup,
9749 		.init_hook = alc_automute_amp,
9750 	},
9751 };
9752 
9753 
9754 /*
9755  * Pin config fixes
9756  */
9757 enum {
9758 	PINFIX_ABIT_AW9D_MAX
9759 };
9760 
9761 static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
9762 	{ 0x15, 0x01080104 }, /* side */
9763 	{ 0x16, 0x01011012 }, /* rear */
9764 	{ 0x17, 0x01016011 }, /* clfe */
9765 	{ }
9766 };
9767 
9768 static const struct alc_fixup alc882_fixups[] = {
9769 	[PINFIX_ABIT_AW9D_MAX] = {
9770 		.pins = alc882_abit_aw9d_pinfix
9771 	},
9772 };
9773 
9774 static struct snd_pci_quirk alc882_fixup_tbl[] = {
9775 	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
9776 	{}
9777 };
9778 
9779 /*
9780  * BIOS auto configuration
9781  */
9782 static int alc882_auto_create_input_ctls(struct hda_codec *codec,
9783 						const struct auto_pin_cfg *cfg)
9784 {
9785 	return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
9786 }
9787 
9788 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
9789 					      hda_nid_t nid, int pin_type,
9790 					      int dac_idx)
9791 {
9792 	/* set as output */
9793 	struct alc_spec *spec = codec->spec;
9794 	int idx;
9795 
9796 	alc_set_pin_output(codec, nid, pin_type);
9797 	if (spec->multiout.dac_nids[dac_idx] == 0x25)
9798 		idx = 4;
9799 	else
9800 		idx = spec->multiout.dac_nids[dac_idx] - 2;
9801 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
9802 
9803 }
9804 
9805 static void alc882_auto_init_multi_out(struct hda_codec *codec)
9806 {
9807 	struct alc_spec *spec = codec->spec;
9808 	int i;
9809 
9810 	for (i = 0; i <= HDA_SIDE; i++) {
9811 		hda_nid_t nid = spec->autocfg.line_out_pins[i];
9812 		int pin_type = get_pin_type(spec->autocfg.line_out_type);
9813 		if (nid)
9814 			alc882_auto_set_output_and_unmute(codec, nid, pin_type,
9815 							  i);
9816 	}
9817 }
9818 
9819 static void alc882_auto_init_hp_out(struct hda_codec *codec)
9820 {
9821 	struct alc_spec *spec = codec->spec;
9822 	hda_nid_t pin;
9823 
9824 	pin = spec->autocfg.hp_pins[0];
9825 	if (pin) /* connect to front */
9826 		/* use dac 0 */
9827 		alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
9828 	pin = spec->autocfg.speaker_pins[0];
9829 	if (pin)
9830 		alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
9831 }
9832 
9833 static void alc882_auto_init_analog_input(struct hda_codec *codec)
9834 {
9835 	struct alc_spec *spec = codec->spec;
9836 	int i;
9837 
9838 	for (i = 0; i < AUTO_PIN_LAST; i++) {
9839 		hda_nid_t nid = spec->autocfg.input_pins[i];
9840 		if (!nid)
9841 			continue;
9842 		alc_set_input_pin(codec, nid, i);
9843 		if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
9844 			snd_hda_codec_write(codec, nid, 0,
9845 					    AC_VERB_SET_AMP_GAIN_MUTE,
9846 					    AMP_OUT_MUTE);
9847 	}
9848 }
9849 
9850 static void alc882_auto_init_input_src(struct hda_codec *codec)
9851 {
9852 	struct alc_spec *spec = codec->spec;
9853 	int c;
9854 
9855 	for (c = 0; c < spec->num_adc_nids; c++) {
9856 		hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
9857 		hda_nid_t nid = spec->capsrc_nids[c];
9858 		unsigned int mux_idx;
9859 		const struct hda_input_mux *imux;
9860 		int conns, mute, idx, item;
9861 
9862 		conns = snd_hda_get_connections(codec, nid, conn_list,
9863 						ARRAY_SIZE(conn_list));
9864 		if (conns < 0)
9865 			continue;
9866 		mux_idx = c >= spec->num_mux_defs ? 0 : c;
9867 		imux = &spec->input_mux[mux_idx];
9868 		for (idx = 0; idx < conns; idx++) {
9869 			/* if the current connection is the selected one,
9870 			 * unmute it as default - otherwise mute it
9871 			 */
9872 			mute = AMP_IN_MUTE(idx);
9873 			for (item = 0; item < imux->num_items; item++) {
9874 				if (imux->items[item].index == idx) {
9875 					if (spec->cur_mux[c] == item)
9876 						mute = AMP_IN_UNMUTE(idx);
9877 					break;
9878 				}
9879 			}
9880 			/* check if we have a selector or mixer
9881 			 * we could check for the widget type instead, but
9882 			 * just check for Amp-In presence (in case of mixer
9883 			 * without amp-in there is something wrong, this
9884 			 * function shouldn't be used or capsrc nid is wrong)
9885 			 */
9886 			if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
9887 				snd_hda_codec_write(codec, nid, 0,
9888 						    AC_VERB_SET_AMP_GAIN_MUTE,
9889 						    mute);
9890 			else if (mute != AMP_IN_MUTE(idx))
9891 				snd_hda_codec_write(codec, nid, 0,
9892 						    AC_VERB_SET_CONNECT_SEL,
9893 						    idx);
9894 		}
9895 	}
9896 }
9897 
9898 /* add mic boosts if needed */
9899 static int alc_auto_add_mic_boost(struct hda_codec *codec)
9900 {
9901 	struct alc_spec *spec = codec->spec;
9902 	int err;
9903 	hda_nid_t nid;
9904 
9905 	nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
9906 	if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
9907 		err = add_control(spec, ALC_CTL_WIDGET_VOL,
9908 				  "Mic Boost",
9909 				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
9910 		if (err < 0)
9911 			return err;
9912 	}
9913 	nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
9914 	if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
9915 		err = add_control(spec, ALC_CTL_WIDGET_VOL,
9916 				  "Front Mic Boost",
9917 				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
9918 		if (err < 0)
9919 			return err;
9920 	}
9921 	return 0;
9922 }
9923 
9924 /* almost identical with ALC880 parser... */
9925 static int alc882_parse_auto_config(struct hda_codec *codec)
9926 {
9927 	struct alc_spec *spec = codec->spec;
9928 	static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
9929 	int i, err;
9930 
9931 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
9932 					   alc882_ignore);
9933 	if (err < 0)
9934 		return err;
9935 	if (!spec->autocfg.line_outs)
9936 		return 0; /* can't find valid BIOS pin config */
9937 
9938 	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
9939 	if (err < 0)
9940 		return err;
9941 	err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
9942 	if (err < 0)
9943 		return err;
9944 	err = alc880_auto_create_extra_out(spec,
9945 					   spec->autocfg.speaker_pins[0],
9946 					   "Speaker");
9947 	if (err < 0)
9948 		return err;
9949 	err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
9950 					   "Headphone");
9951 	if (err < 0)
9952 		return err;
9953 	err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
9954 	if (err < 0)
9955 		return err;
9956 
9957 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
9958 
9959 	/* check multiple SPDIF-out (for recent codecs) */
9960 	for (i = 0; i < spec->autocfg.dig_outs; i++) {
9961 		hda_nid_t dig_nid;
9962 		err = snd_hda_get_connections(codec,
9963 					      spec->autocfg.dig_out_pins[i],
9964 					      &dig_nid, 1);
9965 		if (err < 0)
9966 			continue;
9967 		if (!i)
9968 			spec->multiout.dig_out_nid = dig_nid;
9969 		else {
9970 			spec->multiout.slave_dig_outs = spec->slave_dig_outs;
9971 			if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
9972 				break;
9973 			spec->slave_dig_outs[i - 1] = dig_nid;
9974 		}
9975 	}
9976 	if (spec->autocfg.dig_in_pin)
9977 		spec->dig_in_nid = ALC880_DIGIN_NID;
9978 
9979 	if (spec->kctls.list)
9980 		add_mixer(spec, spec->kctls.list);
9981 
9982 	add_verb(spec, alc883_auto_init_verbs);
9983 	/* if ADC 0x07 is available, initialize it, too */
9984 	if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
9985 		add_verb(spec, alc882_adc1_init_verbs);
9986 
9987 	spec->num_mux_defs = 1;
9988 	spec->input_mux = &spec->private_imux[0];
9989 
9990 	alc_ssid_check(codec, 0x15, 0x1b, 0x14);
9991 
9992 	err = alc_auto_add_mic_boost(codec);
9993 	if (err < 0)
9994 		return err;
9995 
9996 	return 1; /* config found */
9997 }
9998 
9999 /* additional initialization for auto-configuration model */
10000 static void alc882_auto_init(struct hda_codec *codec)
10001 {
10002 	struct alc_spec *spec = codec->spec;
10003 	alc882_auto_init_multi_out(codec);
10004 	alc882_auto_init_hp_out(codec);
10005 	alc882_auto_init_analog_input(codec);
10006 	alc882_auto_init_input_src(codec);
10007 	if (spec->unsol_event)
10008 		alc_inithook(codec);
10009 }
10010 
10011 static int patch_alc882(struct hda_codec *codec)
10012 {
10013 	struct alc_spec *spec;
10014 	int err, board_config;
10015 
10016 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
10017 	if (spec == NULL)
10018 		return -ENOMEM;
10019 
10020 	codec->spec = spec;
10021 
10022 	switch (codec->vendor_id) {
10023 	case 0x10ec0882:
10024 	case 0x10ec0885:
10025 		break;
10026 	default:
10027 		/* ALC883 and variants */
10028 		alc_fix_pll_init(codec, 0x20, 0x0a, 10);
10029 		break;
10030 	}
10031 
10032 	board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
10033 						  alc882_models,
10034 						  alc882_cfg_tbl);
10035 
10036 	if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
10037 		board_config = snd_hda_check_board_codec_sid_config(codec,
10038 			ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
10039 
10040 	if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
10041 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
10042 		       codec->chip_name);
10043 		board_config = ALC882_AUTO;
10044 	}
10045 
10046 	alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups);
10047 
10048 	if (board_config == ALC882_AUTO) {
10049 		/* automatic parse from the BIOS config */
10050 		err = alc882_parse_auto_config(codec);
10051 		if (err < 0) {
10052 			alc_free(codec);
10053 			return err;
10054 		} else if (!err) {
10055 			printk(KERN_INFO
10056 			       "hda_codec: Cannot set up configuration "
10057 			       "from BIOS.  Using base mode...\n");
10058 			board_config = ALC882_3ST_DIG;
10059 		}
10060 	}
10061 
10062 	err = snd_hda_attach_beep_device(codec, 0x1);
10063 	if (err < 0) {
10064 		alc_free(codec);
10065 		return err;
10066 	}
10067 
10068 	if (board_config != ALC882_AUTO)
10069 		setup_preset(codec, &alc882_presets[board_config]);
10070 
10071 	spec->stream_analog_playback = &alc882_pcm_analog_playback;
10072 	spec->stream_analog_capture = &alc882_pcm_analog_capture;
10073 	/* FIXME: setup DAC5 */
10074 	/*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
10075 	spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
10076 
10077 	spec->stream_digital_playback = &alc882_pcm_digital_playback;
10078 	spec->stream_digital_capture = &alc882_pcm_digital_capture;
10079 
10080 	if (codec->vendor_id == 0x10ec0888)
10081 		spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */
10082 
10083 	if (!spec->adc_nids && spec->input_mux) {
10084 		int i, j;
10085 		spec->num_adc_nids = 0;
10086 		for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
10087 			const struct hda_input_mux *imux = spec->input_mux;
10088 			hda_nid_t cap;
10089 			hda_nid_t items[16];
10090 			hda_nid_t nid = alc882_adc_nids[i];
10091 			unsigned int wcap = get_wcaps(codec, nid);
10092 			/* get type */
10093 			wcap = get_wcaps_type(wcap);
10094 			if (wcap != AC_WID_AUD_IN)
10095 				continue;
10096 			spec->private_adc_nids[spec->num_adc_nids] = nid;
10097 			err = snd_hda_get_connections(codec, nid, &cap, 1);
10098 			if (err < 0)
10099 				continue;
10100 			err = snd_hda_get_connections(codec, cap, items,
10101 						      ARRAY_SIZE(items));
10102 			if (err < 0)
10103 				continue;
10104 			for (j = 0; j < imux->num_items; j++)
10105 				if (imux->items[j].index >= err)
10106 					break;
10107 			if (j < imux->num_items)
10108 				continue;
10109 			spec->private_capsrc_nids[spec->num_adc_nids] = cap;
10110 			spec->num_adc_nids++;
10111 		}
10112 		spec->adc_nids = spec->private_adc_nids;
10113 		spec->capsrc_nids = spec->private_capsrc_nids;
10114 	}
10115 
10116 	set_capture_mixer(codec);
10117 	set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10118 
10119 	spec->vmaster_nid = 0x0c;
10120 
10121 	codec->patch_ops = alc_patch_ops;
10122 	if (board_config == ALC882_AUTO)
10123 		spec->init_hook = alc882_auto_init;
10124 #ifdef CONFIG_SND_HDA_POWER_SAVE
10125 	if (!spec->loopback.amplist)
10126 		spec->loopback.amplist = alc882_loopbacks;
10127 #endif
10128 	codec->proc_widget_hook = print_realtek_coef;
10129 
10130 	return 0;
10131 }
10132 
10133 
10134 /*
10135  * ALC262 support
10136  */
10137 
10138 #define ALC262_DIGOUT_NID	ALC880_DIGOUT_NID
10139 #define ALC262_DIGIN_NID	ALC880_DIGIN_NID
10140 
10141 #define alc262_dac_nids		alc260_dac_nids
10142 #define alc262_adc_nids		alc882_adc_nids
10143 #define alc262_adc_nids_alt	alc882_adc_nids_alt
10144 #define alc262_capsrc_nids	alc882_capsrc_nids
10145 #define alc262_capsrc_nids_alt	alc882_capsrc_nids_alt
10146 
10147 #define alc262_modes		alc260_modes
10148 #define alc262_capture_source	alc882_capture_source
10149 
10150 static hda_nid_t alc262_dmic_adc_nids[1] = {
10151 	/* ADC0 */
10152 	0x09
10153 };
10154 
10155 static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
10156 
10157 static struct snd_kcontrol_new alc262_base_mixer[] = {
10158 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10159 	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10160 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10161 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10162 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10163 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10164 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10165 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10166 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10167 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10168 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10169 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10170 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
10171 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10172 	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
10173 	HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
10174 	{ } /* end */
10175 };
10176 
10177 /* update HP, line and mono-out pins according to the master switch */
10178 static void alc262_hp_master_update(struct hda_codec *codec)
10179 {
10180 	struct alc_spec *spec = codec->spec;
10181 	int val = spec->master_sw;
10182 
10183 	/* HP & line-out */
10184 	snd_hda_codec_write_cache(codec, 0x1b, 0,
10185 				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10186 				  val ? PIN_HP : 0);
10187 	snd_hda_codec_write_cache(codec, 0x15, 0,
10188 				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10189 				  val ? PIN_HP : 0);
10190 	/* mono (speaker) depending on the HP jack sense */
10191 	val = val && !spec->jack_present;
10192 	snd_hda_codec_write_cache(codec, 0x16, 0,
10193 				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10194 				  val ? PIN_OUT : 0);
10195 }
10196 
10197 static void alc262_hp_bpc_automute(struct hda_codec *codec)
10198 {
10199 	struct alc_spec *spec = codec->spec;
10200 
10201 	spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
10202 	alc262_hp_master_update(codec);
10203 }
10204 
10205 static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10206 {
10207 	if ((res >> 26) != ALC880_HP_EVENT)
10208 		return;
10209 	alc262_hp_bpc_automute(codec);
10210 }
10211 
10212 static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10213 {
10214 	struct alc_spec *spec = codec->spec;
10215 
10216 	spec->jack_present = snd_hda_jack_detect(codec, 0x15);
10217 	alc262_hp_master_update(codec);
10218 }
10219 
10220 static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10221 					   unsigned int res)
10222 {
10223 	if ((res >> 26) != ALC880_HP_EVENT)
10224 		return;
10225 	alc262_hp_wildwest_automute(codec);
10226 }
10227 
10228 #define alc262_hp_master_sw_get		alc260_hp_master_sw_get
10229 
10230 static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10231 				   struct snd_ctl_elem_value *ucontrol)
10232 {
10233 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10234 	struct alc_spec *spec = codec->spec;
10235 	int val = !!*ucontrol->value.integer.value;
10236 
10237 	if (val == spec->master_sw)
10238 		return 0;
10239 	spec->master_sw = val;
10240 	alc262_hp_master_update(codec);
10241 	return 1;
10242 }
10243 
10244 #define ALC262_HP_MASTER_SWITCH					\
10245 	{							\
10246 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		\
10247 		.name = "Master Playback Switch",		\
10248 		.info = snd_ctl_boolean_mono_info,		\
10249 		.get = alc262_hp_master_sw_get,			\
10250 		.put = alc262_hp_master_sw_put,			\
10251 	}
10252 
10253 static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
10254 	ALC262_HP_MASTER_SWITCH,
10255 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10256 	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10257 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10258 	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10259 			      HDA_OUTPUT),
10260 	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10261 			    HDA_OUTPUT),
10262 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10263 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10264 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10265 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10266 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10267 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10268 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10269 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10270 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10271 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10272 	HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10273 	HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10274 	{ } /* end */
10275 };
10276 
10277 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
10278 	ALC262_HP_MASTER_SWITCH,
10279 	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10280 	HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10281 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10282 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10283 	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10284 			      HDA_OUTPUT),
10285 	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10286 			    HDA_OUTPUT),
10287 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10288 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
10289 	HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
10290 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10291 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10292 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10293 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10294 	{ } /* end */
10295 };
10296 
10297 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
10298 	HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10299 	HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10300 	HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
10301 	{ } /* end */
10302 };
10303 
10304 /* mute/unmute internal speaker according to the hp jack and mute state */
10305 static void alc262_hp_t5735_setup(struct hda_codec *codec)
10306 {
10307 	struct alc_spec *spec = codec->spec;
10308 
10309 	spec->autocfg.hp_pins[0] = 0x15;
10310 	spec->autocfg.speaker_pins[0] = 0x0c; /* HACK: not actually a pin */
10311 }
10312 
10313 static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
10314 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10315 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10316 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10317 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10318 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10319 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10320 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10321 	{ } /* end */
10322 };
10323 
10324 static struct hda_verb alc262_hp_t5735_verbs[] = {
10325 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10326 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10327 
10328 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
10329 	{ }
10330 };
10331 
10332 static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
10333 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10334 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10335 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
10336 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
10337 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10338 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10339 	{ } /* end */
10340 };
10341 
10342 static struct hda_verb alc262_hp_rp5700_verbs[] = {
10343 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10344 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10345 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10346 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10347 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10348 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10349 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10350 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10351 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10352 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10353 	{}
10354 };
10355 
10356 static struct hda_input_mux alc262_hp_rp5700_capture_source = {
10357 	.num_items = 1,
10358 	.items = {
10359 		{ "Line", 0x1 },
10360 	},
10361 };
10362 
10363 /* bind hp and internal speaker mute (with plug check) as master switch */
10364 static void alc262_hippo_master_update(struct hda_codec *codec)
10365 {
10366 	struct alc_spec *spec = codec->spec;
10367 	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10368 	hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
10369 	hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
10370 	unsigned int mute;
10371 
10372 	/* HP */
10373 	mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
10374 	snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
10375 				 HDA_AMP_MUTE, mute);
10376 	/* mute internal speaker per jack sense */
10377 	if (spec->jack_present)
10378 		mute = HDA_AMP_MUTE;
10379 	if (line_nid)
10380 		snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
10381 					 HDA_AMP_MUTE, mute);
10382 	if (speaker_nid && speaker_nid != line_nid)
10383 		snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
10384 					 HDA_AMP_MUTE, mute);
10385 }
10386 
10387 #define alc262_hippo_master_sw_get	alc262_hp_master_sw_get
10388 
10389 static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
10390 				      struct snd_ctl_elem_value *ucontrol)
10391 {
10392 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10393 	struct alc_spec *spec = codec->spec;
10394 	int val = !!*ucontrol->value.integer.value;
10395 
10396 	if (val == spec->master_sw)
10397 		return 0;
10398 	spec->master_sw = val;
10399 	alc262_hippo_master_update(codec);
10400 	return 1;
10401 }
10402 
10403 #define ALC262_HIPPO_MASTER_SWITCH				\
10404 	{							\
10405 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		\
10406 		.name = "Master Playback Switch",		\
10407 		.info = snd_ctl_boolean_mono_info,		\
10408 		.get = alc262_hippo_master_sw_get,		\
10409 		.put = alc262_hippo_master_sw_put,		\
10410 	}
10411 
10412 static struct snd_kcontrol_new alc262_hippo_mixer[] = {
10413 	ALC262_HIPPO_MASTER_SWITCH,
10414 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10415 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10416 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10417 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10418 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10419 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10420 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10421 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10422 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10423 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10424 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10425 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10426 	{ } /* end */
10427 };
10428 
10429 static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
10430 	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10431 	ALC262_HIPPO_MASTER_SWITCH,
10432 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10433 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10434 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10435 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10436 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10437 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10438 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10439 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10440 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10441 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10442 	{ } /* end */
10443 };
10444 
10445 /* mute/unmute internal speaker according to the hp jack and mute state */
10446 static void alc262_hippo_automute(struct hda_codec *codec)
10447 {
10448 	struct alc_spec *spec = codec->spec;
10449 	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10450 
10451 	spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
10452 	alc262_hippo_master_update(codec);
10453 }
10454 
10455 static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
10456 {
10457 	if ((res >> 26) != ALC880_HP_EVENT)
10458 		return;
10459 	alc262_hippo_automute(codec);
10460 }
10461 
10462 static void alc262_hippo_setup(struct hda_codec *codec)
10463 {
10464 	struct alc_spec *spec = codec->spec;
10465 
10466 	spec->autocfg.hp_pins[0] = 0x15;
10467 	spec->autocfg.speaker_pins[0] = 0x14;
10468 }
10469 
10470 static void alc262_hippo1_setup(struct hda_codec *codec)
10471 {
10472 	struct alc_spec *spec = codec->spec;
10473 
10474 	spec->autocfg.hp_pins[0] = 0x1b;
10475 	spec->autocfg.speaker_pins[0] = 0x14;
10476 }
10477 
10478 
10479 static struct snd_kcontrol_new alc262_sony_mixer[] = {
10480 	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10481 	ALC262_HIPPO_MASTER_SWITCH,
10482 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10483 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10484 	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10485 	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10486 	{ } /* end */
10487 };
10488 
10489 static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
10490 	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10491 	ALC262_HIPPO_MASTER_SWITCH,
10492 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10493 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10494 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10495 	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10496 	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10497 	{ } /* end */
10498 };
10499 
10500 static struct snd_kcontrol_new alc262_tyan_mixer[] = {
10501 	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10502 	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
10503 	HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
10504 	HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
10505 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10506 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10507 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10508 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10509 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10510 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10511 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10512 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10513 	{ } /* end */
10514 };
10515 
10516 static struct hda_verb alc262_tyan_verbs[] = {
10517 	/* Headphone automute */
10518 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10519 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10520 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10521 
10522 	/* P11 AUX_IN, white 4-pin connector */
10523 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10524 	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
10525 	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
10526 	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
10527 
10528 	{}
10529 };
10530 
10531 /* unsolicited event for HP jack sensing */
10532 static void alc262_tyan_setup(struct hda_codec *codec)
10533 {
10534 	struct alc_spec *spec = codec->spec;
10535 
10536 	spec->autocfg.hp_pins[0] = 0x1b;
10537 	spec->autocfg.speaker_pins[0] = 0x15;
10538 }
10539 
10540 
10541 #define alc262_capture_mixer		alc882_capture_mixer
10542 #define alc262_capture_alt_mixer	alc882_capture_alt_mixer
10543 
10544 /*
10545  * generic initialization of ADC, input mixers and output mixers
10546  */
10547 static struct hda_verb alc262_init_verbs[] = {
10548 	/*
10549 	 * Unmute ADC0-2 and set the default input to mic-in
10550 	 */
10551 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
10552 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10553 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
10554 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10555 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
10556 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10557 
10558 	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
10559 	 * mixer widget
10560 	 * Note: PASD motherboards uses the Line In 2 as the input for
10561 	 * front panel mic (mic 2)
10562 	 */
10563 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
10564 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10565 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10566 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
10567 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
10568 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
10569 
10570 	/*
10571 	 * Set up output mixers (0x0c - 0x0e)
10572 	 */
10573 	/* set vol=0 to output mixers */
10574 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10575 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10576 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10577 	/* set up input amps for analog loopback */
10578 	/* Amp Indices: DAC = 0, mixer = 1 */
10579 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10580 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10581 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10582 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10583 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10584 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10585 
10586 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10587 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10588 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10589 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10590 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10591 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10592 
10593 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10594 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10595 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10596 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10597 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10598 
10599 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
10600 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
10601 
10602 	/* FIXME: use matrix-type input source selection */
10603 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
10604 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
10605 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10606 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10607 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10608 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10609 	/* Input mixer2 */
10610 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10611 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10612 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10613 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10614 	/* Input mixer3 */
10615 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10616 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10617 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10618 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10619 
10620 	{ }
10621 };
10622 
10623 static struct hda_verb alc262_eapd_verbs[] = {
10624 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
10625 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
10626 	{ }
10627 };
10628 
10629 static struct hda_verb alc262_hippo1_unsol_verbs[] = {
10630 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10631 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10632 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10633 
10634 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10635 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10636 	{}
10637 };
10638 
10639 static struct hda_verb alc262_sony_unsol_verbs[] = {
10640 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10641 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10642 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},	// Front Mic
10643 
10644 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10645 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10646 	{}
10647 };
10648 
10649 static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
10650 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10651 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10652 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10653 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10654 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10655 	{ } /* end */
10656 };
10657 
10658 static struct hda_verb alc262_toshiba_s06_verbs[] = {
10659 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10660 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10661 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10662 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10663 	{0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
10664 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10665 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
10666 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10667 	{}
10668 };
10669 
10670 static void alc262_toshiba_s06_setup(struct hda_codec *codec)
10671 {
10672 	struct alc_spec *spec = codec->spec;
10673 
10674 	spec->autocfg.hp_pins[0] = 0x15;
10675 	spec->autocfg.speaker_pins[0] = 0x14;
10676 	spec->ext_mic.pin = 0x18;
10677 	spec->ext_mic.mux_idx = 0;
10678 	spec->int_mic.pin = 0x12;
10679 	spec->int_mic.mux_idx = 9;
10680 	spec->auto_mic = 1;
10681 }
10682 
10683 /*
10684  * nec model
10685  *  0x15 = headphone
10686  *  0x16 = internal speaker
10687  *  0x18 = external mic
10688  */
10689 
10690 static struct snd_kcontrol_new alc262_nec_mixer[] = {
10691 	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
10692 	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
10693 
10694 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10695 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10696 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10697 
10698 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10699 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10700 	{ } /* end */
10701 };
10702 
10703 static struct hda_verb alc262_nec_verbs[] = {
10704 	/* Unmute Speaker */
10705 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10706 
10707 	/* Headphone */
10708 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10709 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10710 
10711 	/* External mic to headphone */
10712 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10713 	/* External mic to speaker */
10714 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10715 	{}
10716 };
10717 
10718 /*
10719  * fujitsu model
10720  *  0x14 = headphone/spdif-out, 0x15 = internal speaker,
10721  *  0x1b = port replicator headphone out
10722  */
10723 
10724 #define ALC_HP_EVENT	0x37
10725 
10726 static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
10727 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10728 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10729 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10730 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10731 	{}
10732 };
10733 
10734 static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
10735 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10736 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10737 	{}
10738 };
10739 
10740 static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
10741 	/* Front Mic pin: input vref at 50% */
10742 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
10743 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
10744 	{}
10745 };
10746 
10747 static struct hda_input_mux alc262_fujitsu_capture_source = {
10748 	.num_items = 3,
10749 	.items = {
10750 		{ "Mic", 0x0 },
10751 		{ "Int Mic", 0x1 },
10752 		{ "CD", 0x4 },
10753 	},
10754 };
10755 
10756 static struct hda_input_mux alc262_HP_capture_source = {
10757 	.num_items = 5,
10758 	.items = {
10759 		{ "Mic", 0x0 },
10760 		{ "Front Mic", 0x1 },
10761 		{ "Line", 0x2 },
10762 		{ "CD", 0x4 },
10763 		{ "AUX IN", 0x6 },
10764 	},
10765 };
10766 
10767 static struct hda_input_mux alc262_HP_D7000_capture_source = {
10768 	.num_items = 4,
10769 	.items = {
10770 		{ "Mic", 0x0 },
10771 		{ "Front Mic", 0x2 },
10772 		{ "Line", 0x1 },
10773 		{ "CD", 0x4 },
10774 	},
10775 };
10776 
10777 /* mute/unmute internal speaker according to the hp jacks and mute state */
10778 static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
10779 {
10780 	struct alc_spec *spec = codec->spec;
10781 	unsigned int mute;
10782 
10783 	if (force || !spec->sense_updated) {
10784 		spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
10785 				     snd_hda_jack_detect(codec, 0x1b);
10786 		spec->sense_updated = 1;
10787 	}
10788 	/* unmute internal speaker only if both HPs are unplugged and
10789 	 * master switch is on
10790 	 */
10791 	if (spec->jack_present)
10792 		mute = HDA_AMP_MUTE;
10793 	else
10794 		mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
10795 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
10796 				 HDA_AMP_MUTE, mute);
10797 }
10798 
10799 /* unsolicited event for HP jack sensing */
10800 static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
10801 				       unsigned int res)
10802 {
10803 	if ((res >> 26) != ALC_HP_EVENT)
10804 		return;
10805 	alc262_fujitsu_automute(codec, 1);
10806 }
10807 
10808 static void alc262_fujitsu_init_hook(struct hda_codec *codec)
10809 {
10810 	alc262_fujitsu_automute(codec, 1);
10811 }
10812 
10813 /* bind volumes of both NID 0x0c and 0x0d */
10814 static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
10815 	.ops = &snd_hda_bind_vol,
10816 	.values = {
10817 		HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
10818 		HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
10819 		0
10820 	},
10821 };
10822 
10823 /* mute/unmute internal speaker according to the hp jack and mute state */
10824 static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
10825 {
10826 	struct alc_spec *spec = codec->spec;
10827 	unsigned int mute;
10828 
10829 	if (force || !spec->sense_updated) {
10830 		spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
10831 		spec->sense_updated = 1;
10832 	}
10833 	if (spec->jack_present) {
10834 		/* mute internal speaker */
10835 		snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10836 					 HDA_AMP_MUTE, HDA_AMP_MUTE);
10837 		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
10838 					 HDA_AMP_MUTE, HDA_AMP_MUTE);
10839 	} else {
10840 		/* unmute internal speaker if necessary */
10841 		mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
10842 		snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10843 					 HDA_AMP_MUTE, mute);
10844 		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
10845 					 HDA_AMP_MUTE, mute);
10846 	}
10847 }
10848 
10849 /* unsolicited event for HP jack sensing */
10850 static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
10851 				       unsigned int res)
10852 {
10853 	if ((res >> 26) != ALC_HP_EVENT)
10854 		return;
10855 	alc262_lenovo_3000_automute(codec, 1);
10856 }
10857 
10858 static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
10859 				  int dir, int idx, long *valp)
10860 {
10861 	int i, change = 0;
10862 
10863 	for (i = 0; i < 2; i++, valp++)
10864 		change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
10865 						   HDA_AMP_MUTE,
10866 						   *valp ? 0 : HDA_AMP_MUTE);
10867 	return change;
10868 }
10869 
10870 /* bind hp and internal speaker mute (with plug check) */
10871 static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
10872 					 struct snd_ctl_elem_value *ucontrol)
10873 {
10874 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10875 	long *valp = ucontrol->value.integer.value;
10876 	int change;
10877 
10878 	change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
10879 	change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
10880 	if (change)
10881 		alc262_fujitsu_automute(codec, 0);
10882 	return change;
10883 }
10884 
10885 static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
10886 	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
10887 	{
10888 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
10889 		.name = "Master Playback Switch",
10890 		.info = snd_hda_mixer_amp_switch_info,
10891 		.get = snd_hda_mixer_amp_switch_get,
10892 		.put = alc262_fujitsu_master_sw_put,
10893 		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
10894 	},
10895 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10896 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10897 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10898 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10899 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10900 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
10901 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
10902 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
10903 	{ } /* end */
10904 };
10905 
10906 /* bind hp and internal speaker mute (with plug check) */
10907 static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
10908 					 struct snd_ctl_elem_value *ucontrol)
10909 {
10910 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10911 	long *valp = ucontrol->value.integer.value;
10912 	int change;
10913 
10914 	change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
10915 	if (change)
10916 		alc262_lenovo_3000_automute(codec, 0);
10917 	return change;
10918 }
10919 
10920 static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
10921 	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
10922 	{
10923 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
10924 		.name = "Master Playback Switch",
10925 		.info = snd_hda_mixer_amp_switch_info,
10926 		.get = snd_hda_mixer_amp_switch_get,
10927 		.put = alc262_lenovo_3000_master_sw_put,
10928 		.private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
10929 	},
10930 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10931 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10932 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10933 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10934 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10935 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
10936 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
10937 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
10938 	{ } /* end */
10939 };
10940 
10941 static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
10942 	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
10943 	ALC262_HIPPO_MASTER_SWITCH,
10944 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10945 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10946 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10947 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10948 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10949 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10950 	{ } /* end */
10951 };
10952 
10953 /* additional init verbs for Benq laptops */
10954 static struct hda_verb alc262_EAPD_verbs[] = {
10955 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
10956 	{0x20, AC_VERB_SET_PROC_COEF,  0x3070},
10957 	{}
10958 };
10959 
10960 static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
10961 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10962 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10963 
10964 	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
10965 	{0x20, AC_VERB_SET_PROC_COEF,  0x3050},
10966 	{}
10967 };
10968 
10969 /* Samsung Q1 Ultra Vista model setup */
10970 static struct snd_kcontrol_new alc262_ultra_mixer[] = {
10971 	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10972 	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
10973 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10974 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10975 	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
10976 	HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
10977 	{ } /* end */
10978 };
10979 
10980 static struct hda_verb alc262_ultra_verbs[] = {
10981 	/* output mixer */
10982 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10983 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10984 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10985 	/* speaker */
10986 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10987 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
10988 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10989 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
10990 	/* HP */
10991 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10992 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
10993 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10994 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10995 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10996 	/* internal mic */
10997 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
10998 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10999 	/* ADC, choose mic */
11000 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11001 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11002 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11003 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11004 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11005 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11006 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11007 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11008 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11009 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
11010 	{}
11011 };
11012 
11013 /* mute/unmute internal speaker according to the hp jack and mute state */
11014 static void alc262_ultra_automute(struct hda_codec *codec)
11015 {
11016 	struct alc_spec *spec = codec->spec;
11017 	unsigned int mute;
11018 
11019 	mute = 0;
11020 	/* auto-mute only when HP is used as HP */
11021 	if (!spec->cur_mux[0]) {
11022 		spec->jack_present = snd_hda_jack_detect(codec, 0x15);
11023 		if (spec->jack_present)
11024 			mute = HDA_AMP_MUTE;
11025 	}
11026 	/* mute/unmute internal speaker */
11027 	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11028 				 HDA_AMP_MUTE, mute);
11029 	/* mute/unmute HP */
11030 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11031 				 HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
11032 }
11033 
11034 /* unsolicited event for HP jack sensing */
11035 static void alc262_ultra_unsol_event(struct hda_codec *codec,
11036 				       unsigned int res)
11037 {
11038 	if ((res >> 26) != ALC880_HP_EVENT)
11039 		return;
11040 	alc262_ultra_automute(codec);
11041 }
11042 
11043 static struct hda_input_mux alc262_ultra_capture_source = {
11044 	.num_items = 2,
11045 	.items = {
11046 		{ "Mic", 0x1 },
11047 		{ "Headphone", 0x7 },
11048 	},
11049 };
11050 
11051 static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
11052 				     struct snd_ctl_elem_value *ucontrol)
11053 {
11054 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11055 	struct alc_spec *spec = codec->spec;
11056 	int ret;
11057 
11058 	ret = alc_mux_enum_put(kcontrol, ucontrol);
11059 	if (!ret)
11060 		return 0;
11061 	/* reprogram the HP pin as mic or HP according to the input source */
11062 	snd_hda_codec_write_cache(codec, 0x15, 0,
11063 				  AC_VERB_SET_PIN_WIDGET_CONTROL,
11064 				  spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
11065 	alc262_ultra_automute(codec); /* mute/unmute HP */
11066 	return ret;
11067 }
11068 
11069 static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
11070 	HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
11071 	HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
11072 	{
11073 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11074 		.name = "Capture Source",
11075 		.info = alc_mux_enum_info,
11076 		.get = alc_mux_enum_get,
11077 		.put = alc262_ultra_mux_enum_put,
11078 	},
11079 	{ } /* end */
11080 };
11081 
11082 /* We use two mixers depending on the output pin; 0x16 is a mono output
11083  * and thus it's bound with a different mixer.
11084  * This function returns which mixer amp should be used.
11085  */
11086 static int alc262_check_volbit(hda_nid_t nid)
11087 {
11088 	if (!nid)
11089 		return 0;
11090 	else if (nid == 0x16)
11091 		return 2;
11092 	else
11093 		return 1;
11094 }
11095 
11096 static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
11097 				  const char *pfx, int *vbits)
11098 {
11099 	unsigned long val;
11100 	int vbit;
11101 
11102 	vbit = alc262_check_volbit(nid);
11103 	if (!vbit)
11104 		return 0;
11105 	if (*vbits & vbit) /* a volume control for this mixer already there */
11106 		return 0;
11107 	*vbits |= vbit;
11108 	if (vbit == 2)
11109 		val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
11110 	else
11111 		val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
11112 	return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val);
11113 }
11114 
11115 static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
11116 				 const char *pfx)
11117 {
11118 	unsigned long val;
11119 
11120 	if (!nid)
11121 		return 0;
11122 	if (nid == 0x16)
11123 		val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
11124 	else
11125 		val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
11126 	return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val);
11127 }
11128 
11129 /* add playback controls from the parsed DAC table */
11130 static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
11131 					     const struct auto_pin_cfg *cfg)
11132 {
11133 	const char *pfx;
11134 	int vbits;
11135 	int err;
11136 
11137 	spec->multiout.num_dacs = 1;	/* only use one dac */
11138 	spec->multiout.dac_nids = spec->private_dac_nids;
11139 	spec->multiout.dac_nids[0] = 2;
11140 
11141 	if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
11142 		pfx = "Master";
11143 	else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11144 		pfx = "Speaker";
11145 	else
11146 		pfx = "Front";
11147 	err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
11148 	if (err < 0)
11149 		return err;
11150 	err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
11151 	if (err < 0)
11152 		return err;
11153 	err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
11154 	if (err < 0)
11155 		return err;
11156 
11157 	vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
11158 		alc262_check_volbit(cfg->speaker_pins[0]) |
11159 		alc262_check_volbit(cfg->hp_pins[0]);
11160 	if (vbits == 1 || vbits == 2)
11161 		pfx = "Master"; /* only one mixer is used */
11162 	else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11163 		pfx = "Speaker";
11164 	else
11165 		pfx = "Front";
11166 	vbits = 0;
11167 	err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
11168 	if (err < 0)
11169 		return err;
11170 	err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
11171 				     &vbits);
11172 	if (err < 0)
11173 		return err;
11174 	err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
11175 				     &vbits);
11176 	if (err < 0)
11177 		return err;
11178 	return 0;
11179 }
11180 
11181 #define alc262_auto_create_input_ctls \
11182 	alc880_auto_create_input_ctls
11183 
11184 /*
11185  * generic initialization of ADC, input mixers and output mixers
11186  */
11187 static struct hda_verb alc262_volume_init_verbs[] = {
11188 	/*
11189 	 * Unmute ADC0-2 and set the default input to mic-in
11190 	 */
11191 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11192 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11193 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11194 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11195 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11196 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11197 
11198 	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11199 	 * mixer widget
11200 	 * Note: PASD motherboards uses the Line In 2 as the input for
11201 	 * front panel mic (mic 2)
11202 	 */
11203 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11204 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11205 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11206 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11207 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11208 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11209 
11210 	/*
11211 	 * Set up output mixers (0x0c - 0x0f)
11212 	 */
11213 	/* set vol=0 to output mixers */
11214 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11215 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11216 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11217 
11218 	/* set up input amps for analog loopback */
11219 	/* Amp Indices: DAC = 0, mixer = 1 */
11220 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11221 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11222 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11223 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11224 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11225 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11226 
11227 	/* FIXME: use matrix-type input source selection */
11228 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11229 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11230 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11231 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11232 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11233 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11234 	/* Input mixer2 */
11235 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11236 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11237 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11238 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11239 	/* Input mixer3 */
11240 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11241 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11242 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11243 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11244 
11245 	{ }
11246 };
11247 
11248 static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11249 	/*
11250 	 * Unmute ADC0-2 and set the default input to mic-in
11251 	 */
11252 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11253 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11254 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11255 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11256 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11257 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11258 
11259 	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11260 	 * mixer widget
11261 	 * Note: PASD motherboards uses the Line In 2 as the input for
11262 	 * front panel mic (mic 2)
11263 	 */
11264 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11265 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11266 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11267 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11268 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11269 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11270 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11271         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11272 
11273 	/*
11274 	 * Set up output mixers (0x0c - 0x0e)
11275 	 */
11276 	/* set vol=0 to output mixers */
11277 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11278 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11279 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11280 
11281 	/* set up input amps for analog loopback */
11282 	/* Amp Indices: DAC = 0, mixer = 1 */
11283 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11284 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11285 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11286 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11287 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11288 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11289 
11290 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11291 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11292 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11293 
11294 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11295 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11296 
11297 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11298 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11299 
11300 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11301 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11302         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11303 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11304 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11305 
11306 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11307 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11308         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11309 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11310 	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11311 	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11312 
11313 
11314 	/* FIXME: use matrix-type input source selection */
11315 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
11316 	/* Input mixer1: only unmute Mic */
11317 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11318 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11319 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11320 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11321 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11322 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11323 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11324 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11325 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11326 	/* Input mixer2 */
11327 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11328 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11329 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11330 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11331 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11332 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11333 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11334 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11335 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11336 	/* Input mixer3 */
11337 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11338 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11339 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11340 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11341 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11342 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11343 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11344 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11345 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11346 
11347 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11348 
11349 	{ }
11350 };
11351 
11352 static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
11353 	/*
11354 	 * Unmute ADC0-2 and set the default input to mic-in
11355 	 */
11356 	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11357 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11358 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11359 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11360 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11361 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11362 
11363 	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11364 	 * mixer widget
11365 	 * Note: PASD motherboards uses the Line In 2 as the input for front
11366 	 * panel mic (mic 2)
11367 	 */
11368 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11369 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11370 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11371 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11372 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11373 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11374 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11375 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11376 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11377 	/*
11378 	 * Set up output mixers (0x0c - 0x0e)
11379 	 */
11380 	/* set vol=0 to output mixers */
11381 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11382 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11383 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11384 
11385 	/* set up input amps for analog loopback */
11386 	/* Amp Indices: DAC = 0, mixer = 1 */
11387 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11388 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11389 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11390 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11391 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11392 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11393 
11394 
11395 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* HP */
11396 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Mono */
11397 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* rear MIC */
11398 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* Line in */
11399 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* Front MIC */
11400 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Line out */
11401 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* CD in */
11402 
11403 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11404 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11405 
11406 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11407 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11408 
11409 	/* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
11410 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11411 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11412 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
11413 	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11414 	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11415 
11416 	/* FIXME: use matrix-type input source selection */
11417 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11418 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11419 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
11420 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
11421 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
11422 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
11423 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
11424         /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))},  */
11425 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
11426 	/* Input mixer2 */
11427 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11428 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11429 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11430 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11431 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11432         /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11433 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11434 	/* Input mixer3 */
11435 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11436 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11437 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11438 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11439 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11440         /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11441 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11442 
11443 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11444 
11445 	{ }
11446 };
11447 
11448 static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
11449 
11450 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Front Speaker */
11451 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11452 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
11453 
11454 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* MIC jack */
11455 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* Front MIC */
11456 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11457 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11458 
11459 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* HP  jack */
11460 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11461 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11462 	{}
11463 };
11464 
11465 
11466 #ifdef CONFIG_SND_HDA_POWER_SAVE
11467 #define alc262_loopbacks	alc880_loopbacks
11468 #endif
11469 
11470 /* pcm configuration: identical with ALC880 */
11471 #define alc262_pcm_analog_playback	alc880_pcm_analog_playback
11472 #define alc262_pcm_analog_capture	alc880_pcm_analog_capture
11473 #define alc262_pcm_digital_playback	alc880_pcm_digital_playback
11474 #define alc262_pcm_digital_capture	alc880_pcm_digital_capture
11475 
11476 /*
11477  * BIOS auto configuration
11478  */
11479 static int alc262_parse_auto_config(struct hda_codec *codec)
11480 {
11481 	struct alc_spec *spec = codec->spec;
11482 	int err;
11483 	static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
11484 
11485 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
11486 					   alc262_ignore);
11487 	if (err < 0)
11488 		return err;
11489 	if (!spec->autocfg.line_outs) {
11490 		if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
11491 			spec->multiout.max_channels = 2;
11492 			spec->no_analog = 1;
11493 			goto dig_only;
11494 		}
11495 		return 0; /* can't find valid BIOS pin config */
11496 	}
11497 	err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
11498 	if (err < 0)
11499 		return err;
11500 	err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
11501 	if (err < 0)
11502 		return err;
11503 
11504 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
11505 
11506  dig_only:
11507 	if (spec->autocfg.dig_outs) {
11508 		spec->multiout.dig_out_nid = ALC262_DIGOUT_NID;
11509 		spec->dig_out_type = spec->autocfg.dig_out_type[0];
11510 	}
11511 	if (spec->autocfg.dig_in_pin)
11512 		spec->dig_in_nid = ALC262_DIGIN_NID;
11513 
11514 	if (spec->kctls.list)
11515 		add_mixer(spec, spec->kctls.list);
11516 
11517 	add_verb(spec, alc262_volume_init_verbs);
11518 	spec->num_mux_defs = 1;
11519 	spec->input_mux = &spec->private_imux[0];
11520 
11521 	err = alc_auto_add_mic_boost(codec);
11522 	if (err < 0)
11523 		return err;
11524 
11525 	alc_ssid_check(codec, 0x15, 0x14, 0x1b);
11526 
11527 	return 1;
11528 }
11529 
11530 #define alc262_auto_init_multi_out	alc882_auto_init_multi_out
11531 #define alc262_auto_init_hp_out		alc882_auto_init_hp_out
11532 #define alc262_auto_init_analog_input	alc882_auto_init_analog_input
11533 #define alc262_auto_init_input_src	alc882_auto_init_input_src
11534 
11535 
11536 /* init callback for auto-configuration model -- overriding the default init */
11537 static void alc262_auto_init(struct hda_codec *codec)
11538 {
11539 	struct alc_spec *spec = codec->spec;
11540 	alc262_auto_init_multi_out(codec);
11541 	alc262_auto_init_hp_out(codec);
11542 	alc262_auto_init_analog_input(codec);
11543 	alc262_auto_init_input_src(codec);
11544 	if (spec->unsol_event)
11545 		alc_inithook(codec);
11546 }
11547 
11548 /*
11549  * configuration and preset
11550  */
11551 static const char *alc262_models[ALC262_MODEL_LAST] = {
11552 	[ALC262_BASIC]		= "basic",
11553 	[ALC262_HIPPO]		= "hippo",
11554 	[ALC262_HIPPO_1]	= "hippo_1",
11555 	[ALC262_FUJITSU]	= "fujitsu",
11556 	[ALC262_HP_BPC]		= "hp-bpc",
11557 	[ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
11558 	[ALC262_HP_TC_T5735]	= "hp-tc-t5735",
11559 	[ALC262_HP_RP5700]	= "hp-rp5700",
11560 	[ALC262_BENQ_ED8]	= "benq",
11561 	[ALC262_BENQ_T31]	= "benq-t31",
11562 	[ALC262_SONY_ASSAMD]	= "sony-assamd",
11563 	[ALC262_TOSHIBA_S06]	= "toshiba-s06",
11564 	[ALC262_TOSHIBA_RX1]	= "toshiba-rx1",
11565 	[ALC262_ULTRA]		= "ultra",
11566 	[ALC262_LENOVO_3000]	= "lenovo-3000",
11567 	[ALC262_NEC]		= "nec",
11568 	[ALC262_TYAN]		= "tyan",
11569 	[ALC262_AUTO]		= "auto",
11570 };
11571 
11572 static struct snd_pci_quirk alc262_cfg_tbl[] = {
11573 	SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
11574 	SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
11575 	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
11576 			   ALC262_HP_BPC),
11577 	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
11578 			   ALC262_HP_BPC),
11579 	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
11580 			   ALC262_HP_BPC),
11581 	SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
11582 	SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
11583 	SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
11584 	SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
11585 	SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
11586 	SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
11587 	SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
11588 	SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
11589 	SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
11590 	SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
11591 	SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
11592 	SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
11593 		      ALC262_HP_TC_T5735),
11594 	SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
11595 	SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11596 	SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
11597 	SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11598 	SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
11599 	SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
11600 	SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
11601 	SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
11602 #if 0 /* disable the quirk since model=auto works better in recent versions */
11603 	SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
11604 			   ALC262_SONY_ASSAMD),
11605 #endif
11606 	SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
11607 		      ALC262_TOSHIBA_RX1),
11608 	SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
11609 	SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
11610 	SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
11611 	SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
11612 	SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
11613 			   ALC262_ULTRA),
11614 	SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
11615 	SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
11616 	SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
11617 	SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
11618 	SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
11619 	{}
11620 };
11621 
11622 static struct alc_config_preset alc262_presets[] = {
11623 	[ALC262_BASIC] = {
11624 		.mixers = { alc262_base_mixer },
11625 		.init_verbs = { alc262_init_verbs },
11626 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11627 		.dac_nids = alc262_dac_nids,
11628 		.hp_nid = 0x03,
11629 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11630 		.channel_mode = alc262_modes,
11631 		.input_mux = &alc262_capture_source,
11632 	},
11633 	[ALC262_HIPPO] = {
11634 		.mixers = { alc262_hippo_mixer },
11635 		.init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
11636 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11637 		.dac_nids = alc262_dac_nids,
11638 		.hp_nid = 0x03,
11639 		.dig_out_nid = ALC262_DIGOUT_NID,
11640 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11641 		.channel_mode = alc262_modes,
11642 		.input_mux = &alc262_capture_source,
11643 		.unsol_event = alc262_hippo_unsol_event,
11644 		.setup = alc262_hippo_setup,
11645 		.init_hook = alc262_hippo_automute,
11646 	},
11647 	[ALC262_HIPPO_1] = {
11648 		.mixers = { alc262_hippo1_mixer },
11649 		.init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
11650 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11651 		.dac_nids = alc262_dac_nids,
11652 		.hp_nid = 0x02,
11653 		.dig_out_nid = ALC262_DIGOUT_NID,
11654 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11655 		.channel_mode = alc262_modes,
11656 		.input_mux = &alc262_capture_source,
11657 		.unsol_event = alc262_hippo_unsol_event,
11658 		.setup = alc262_hippo1_setup,
11659 		.init_hook = alc262_hippo_automute,
11660 	},
11661 	[ALC262_FUJITSU] = {
11662 		.mixers = { alc262_fujitsu_mixer },
11663 		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
11664 				alc262_fujitsu_unsol_verbs },
11665 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11666 		.dac_nids = alc262_dac_nids,
11667 		.hp_nid = 0x03,
11668 		.dig_out_nid = ALC262_DIGOUT_NID,
11669 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11670 		.channel_mode = alc262_modes,
11671 		.input_mux = &alc262_fujitsu_capture_source,
11672 		.unsol_event = alc262_fujitsu_unsol_event,
11673 		.init_hook = alc262_fujitsu_init_hook,
11674 	},
11675 	[ALC262_HP_BPC] = {
11676 		.mixers = { alc262_HP_BPC_mixer },
11677 		.init_verbs = { alc262_HP_BPC_init_verbs },
11678 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11679 		.dac_nids = alc262_dac_nids,
11680 		.hp_nid = 0x03,
11681 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11682 		.channel_mode = alc262_modes,
11683 		.input_mux = &alc262_HP_capture_source,
11684 		.unsol_event = alc262_hp_bpc_unsol_event,
11685 		.init_hook = alc262_hp_bpc_automute,
11686 	},
11687 	[ALC262_HP_BPC_D7000_WF] = {
11688 		.mixers = { alc262_HP_BPC_WildWest_mixer },
11689 		.init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
11690 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11691 		.dac_nids = alc262_dac_nids,
11692 		.hp_nid = 0x03,
11693 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11694 		.channel_mode = alc262_modes,
11695 		.input_mux = &alc262_HP_D7000_capture_source,
11696 		.unsol_event = alc262_hp_wildwest_unsol_event,
11697 		.init_hook = alc262_hp_wildwest_automute,
11698 	},
11699 	[ALC262_HP_BPC_D7000_WL] = {
11700 		.mixers = { alc262_HP_BPC_WildWest_mixer,
11701 			    alc262_HP_BPC_WildWest_option_mixer },
11702 		.init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
11703 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11704 		.dac_nids = alc262_dac_nids,
11705 		.hp_nid = 0x03,
11706 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11707 		.channel_mode = alc262_modes,
11708 		.input_mux = &alc262_HP_D7000_capture_source,
11709 		.unsol_event = alc262_hp_wildwest_unsol_event,
11710 		.init_hook = alc262_hp_wildwest_automute,
11711 	},
11712 	[ALC262_HP_TC_T5735] = {
11713 		.mixers = { alc262_hp_t5735_mixer },
11714 		.init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
11715 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11716 		.dac_nids = alc262_dac_nids,
11717 		.hp_nid = 0x03,
11718 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11719 		.channel_mode = alc262_modes,
11720 		.input_mux = &alc262_capture_source,
11721 		.unsol_event = alc_automute_amp_unsol_event,
11722 		.setup = alc262_hp_t5735_setup,
11723 		.init_hook = alc_automute_amp,
11724 	},
11725 	[ALC262_HP_RP5700] = {
11726 		.mixers = { alc262_hp_rp5700_mixer },
11727 		.init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
11728 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11729 		.dac_nids = alc262_dac_nids,
11730 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11731 		.channel_mode = alc262_modes,
11732 		.input_mux = &alc262_hp_rp5700_capture_source,
11733         },
11734 	[ALC262_BENQ_ED8] = {
11735 		.mixers = { alc262_base_mixer },
11736 		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
11737 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11738 		.dac_nids = alc262_dac_nids,
11739 		.hp_nid = 0x03,
11740 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11741 		.channel_mode = alc262_modes,
11742 		.input_mux = &alc262_capture_source,
11743 	},
11744 	[ALC262_SONY_ASSAMD] = {
11745 		.mixers = { alc262_sony_mixer },
11746 		.init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
11747 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11748 		.dac_nids = alc262_dac_nids,
11749 		.hp_nid = 0x02,
11750 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11751 		.channel_mode = alc262_modes,
11752 		.input_mux = &alc262_capture_source,
11753 		.unsol_event = alc262_hippo_unsol_event,
11754 		.setup = alc262_hippo_setup,
11755 		.init_hook = alc262_hippo_automute,
11756 	},
11757 	[ALC262_BENQ_T31] = {
11758 		.mixers = { alc262_benq_t31_mixer },
11759 		.init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
11760 				alc_hp15_unsol_verbs },
11761 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11762 		.dac_nids = alc262_dac_nids,
11763 		.hp_nid = 0x03,
11764 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11765 		.channel_mode = alc262_modes,
11766 		.input_mux = &alc262_capture_source,
11767 		.unsol_event = alc262_hippo_unsol_event,
11768 		.setup = alc262_hippo_setup,
11769 		.init_hook = alc262_hippo_automute,
11770 	},
11771 	[ALC262_ULTRA] = {
11772 		.mixers = { alc262_ultra_mixer },
11773 		.cap_mixer = alc262_ultra_capture_mixer,
11774 		.init_verbs = { alc262_ultra_verbs },
11775 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11776 		.dac_nids = alc262_dac_nids,
11777 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11778 		.channel_mode = alc262_modes,
11779 		.input_mux = &alc262_ultra_capture_source,
11780 		.adc_nids = alc262_adc_nids, /* ADC0 */
11781 		.capsrc_nids = alc262_capsrc_nids,
11782 		.num_adc_nids = 1, /* single ADC */
11783 		.unsol_event = alc262_ultra_unsol_event,
11784 		.init_hook = alc262_ultra_automute,
11785 	},
11786 	[ALC262_LENOVO_3000] = {
11787 		.mixers = { alc262_lenovo_3000_mixer },
11788 		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
11789 				alc262_lenovo_3000_unsol_verbs,
11790 				alc262_lenovo_3000_init_verbs },
11791 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11792 		.dac_nids = alc262_dac_nids,
11793 		.hp_nid = 0x03,
11794 		.dig_out_nid = ALC262_DIGOUT_NID,
11795 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11796 		.channel_mode = alc262_modes,
11797 		.input_mux = &alc262_fujitsu_capture_source,
11798 		.unsol_event = alc262_lenovo_3000_unsol_event,
11799 	},
11800 	[ALC262_NEC] = {
11801 		.mixers = { alc262_nec_mixer },
11802 		.init_verbs = { alc262_nec_verbs },
11803 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11804 		.dac_nids = alc262_dac_nids,
11805 		.hp_nid = 0x03,
11806 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11807 		.channel_mode = alc262_modes,
11808 		.input_mux = &alc262_capture_source,
11809 	},
11810 	[ALC262_TOSHIBA_S06] = {
11811 		.mixers = { alc262_toshiba_s06_mixer },
11812 		.init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
11813 							alc262_eapd_verbs },
11814 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11815 		.capsrc_nids = alc262_dmic_capsrc_nids,
11816 		.dac_nids = alc262_dac_nids,
11817 		.adc_nids = alc262_dmic_adc_nids, /* ADC0 */
11818 		.num_adc_nids = 1, /* single ADC */
11819 		.dig_out_nid = ALC262_DIGOUT_NID,
11820 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11821 		.channel_mode = alc262_modes,
11822 		.unsol_event = alc_sku_unsol_event,
11823 		.setup = alc262_toshiba_s06_setup,
11824 		.init_hook = alc_inithook,
11825 	},
11826 	[ALC262_TOSHIBA_RX1] = {
11827 		.mixers = { alc262_toshiba_rx1_mixer },
11828 		.init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
11829 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11830 		.dac_nids = alc262_dac_nids,
11831 		.hp_nid = 0x03,
11832 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11833 		.channel_mode = alc262_modes,
11834 		.input_mux = &alc262_capture_source,
11835 		.unsol_event = alc262_hippo_unsol_event,
11836 		.setup = alc262_hippo_setup,
11837 		.init_hook = alc262_hippo_automute,
11838 	},
11839 	[ALC262_TYAN] = {
11840 		.mixers = { alc262_tyan_mixer },
11841 		.init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
11842 		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11843 		.dac_nids = alc262_dac_nids,
11844 		.hp_nid = 0x02,
11845 		.dig_out_nid = ALC262_DIGOUT_NID,
11846 		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11847 		.channel_mode = alc262_modes,
11848 		.input_mux = &alc262_capture_source,
11849 		.unsol_event = alc_automute_amp_unsol_event,
11850 		.setup = alc262_tyan_setup,
11851 		.init_hook = alc_automute_amp,
11852 	},
11853 };
11854 
11855 static int patch_alc262(struct hda_codec *codec)
11856 {
11857 	struct alc_spec *spec;
11858 	int board_config;
11859 	int err;
11860 
11861 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
11862 	if (spec == NULL)
11863 		return -ENOMEM;
11864 
11865 	codec->spec = spec;
11866 #if 0
11867 	/* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
11868 	 * under-run
11869 	 */
11870 	{
11871 	int tmp;
11872 	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
11873 	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
11874 	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
11875 	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
11876 	}
11877 #endif
11878 
11879 	alc_fix_pll_init(codec, 0x20, 0x0a, 10);
11880 
11881 	board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
11882 						  alc262_models,
11883 						  alc262_cfg_tbl);
11884 
11885 	if (board_config < 0) {
11886 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
11887 		       codec->chip_name);
11888 		board_config = ALC262_AUTO;
11889 	}
11890 
11891 	if (board_config == ALC262_AUTO) {
11892 		/* automatic parse from the BIOS config */
11893 		err = alc262_parse_auto_config(codec);
11894 		if (err < 0) {
11895 			alc_free(codec);
11896 			return err;
11897 		} else if (!err) {
11898 			printk(KERN_INFO
11899 			       "hda_codec: Cannot set up configuration "
11900 			       "from BIOS.  Using base mode...\n");
11901 			board_config = ALC262_BASIC;
11902 		}
11903 	}
11904 
11905 	if (!spec->no_analog) {
11906 		err = snd_hda_attach_beep_device(codec, 0x1);
11907 		if (err < 0) {
11908 			alc_free(codec);
11909 			return err;
11910 		}
11911 	}
11912 
11913 	if (board_config != ALC262_AUTO)
11914 		setup_preset(codec, &alc262_presets[board_config]);
11915 
11916 	spec->stream_analog_playback = &alc262_pcm_analog_playback;
11917 	spec->stream_analog_capture = &alc262_pcm_analog_capture;
11918 
11919 	spec->stream_digital_playback = &alc262_pcm_digital_playback;
11920 	spec->stream_digital_capture = &alc262_pcm_digital_capture;
11921 
11922 	if (!spec->adc_nids && spec->input_mux) {
11923 		int i;
11924 		/* check whether the digital-mic has to be supported */
11925 		for (i = 0; i < spec->input_mux->num_items; i++) {
11926 			if (spec->input_mux->items[i].index >= 9)
11927 				break;
11928 		}
11929 		if (i < spec->input_mux->num_items) {
11930 			/* use only ADC0 */
11931 			spec->adc_nids = alc262_dmic_adc_nids;
11932 			spec->num_adc_nids = 1;
11933 			spec->capsrc_nids = alc262_dmic_capsrc_nids;
11934 		} else {
11935 			/* all analog inputs */
11936 			/* check whether NID 0x07 is valid */
11937 			unsigned int wcap = get_wcaps(codec, 0x07);
11938 
11939 			/* get type */
11940 			wcap = get_wcaps_type(wcap);
11941 			if (wcap != AC_WID_AUD_IN) {
11942 				spec->adc_nids = alc262_adc_nids_alt;
11943 				spec->num_adc_nids =
11944 					ARRAY_SIZE(alc262_adc_nids_alt);
11945 				spec->capsrc_nids = alc262_capsrc_nids_alt;
11946 			} else {
11947 				spec->adc_nids = alc262_adc_nids;
11948 				spec->num_adc_nids =
11949 					ARRAY_SIZE(alc262_adc_nids);
11950 				spec->capsrc_nids = alc262_capsrc_nids;
11951 			}
11952 		}
11953 	}
11954 	if (!spec->cap_mixer && !spec->no_analog)
11955 		set_capture_mixer(codec);
11956 	if (!spec->no_analog)
11957 		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
11958 
11959 	spec->vmaster_nid = 0x0c;
11960 
11961 	codec->patch_ops = alc_patch_ops;
11962 	if (board_config == ALC262_AUTO)
11963 		spec->init_hook = alc262_auto_init;
11964 #ifdef CONFIG_SND_HDA_POWER_SAVE
11965 	if (!spec->loopback.amplist)
11966 		spec->loopback.amplist = alc262_loopbacks;
11967 #endif
11968 	codec->proc_widget_hook = print_realtek_coef;
11969 
11970 	return 0;
11971 }
11972 
11973 /*
11974  *  ALC268 channel source setting (2 channel)
11975  */
11976 #define ALC268_DIGOUT_NID	ALC880_DIGOUT_NID
11977 #define alc268_modes		alc260_modes
11978 
11979 static hda_nid_t alc268_dac_nids[2] = {
11980 	/* front, hp */
11981 	0x02, 0x03
11982 };
11983 
11984 static hda_nid_t alc268_adc_nids[2] = {
11985 	/* ADC0-1 */
11986 	0x08, 0x07
11987 };
11988 
11989 static hda_nid_t alc268_adc_nids_alt[1] = {
11990 	/* ADC0 */
11991 	0x08
11992 };
11993 
11994 static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
11995 
11996 static struct snd_kcontrol_new alc268_base_mixer[] = {
11997 	/* output mixer control */
11998 	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
11999 	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12000 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12001 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12002 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12003 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12004 	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12005 	{ }
12006 };
12007 
12008 static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
12009 	/* output mixer control */
12010 	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12011 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12012 	ALC262_HIPPO_MASTER_SWITCH,
12013 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12014 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12015 	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12016 	{ }
12017 };
12018 
12019 /* bind Beep switches of both NID 0x0f and 0x10 */
12020 static struct hda_bind_ctls alc268_bind_beep_sw = {
12021 	.ops = &snd_hda_bind_sw,
12022 	.values = {
12023 		HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
12024 		HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
12025 		0
12026 	},
12027 };
12028 
12029 static struct snd_kcontrol_new alc268_beep_mixer[] = {
12030 	HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
12031 	HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
12032 	{ }
12033 };
12034 
12035 static struct hda_verb alc268_eapd_verbs[] = {
12036 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
12037 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
12038 	{ }
12039 };
12040 
12041 /* Toshiba specific */
12042 static struct hda_verb alc268_toshiba_verbs[] = {
12043 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12044 	{ } /* end */
12045 };
12046 
12047 /* Acer specific */
12048 /* bind volumes of both NID 0x02 and 0x03 */
12049 static struct hda_bind_ctls alc268_acer_bind_master_vol = {
12050 	.ops = &snd_hda_bind_vol,
12051 	.values = {
12052 		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
12053 		HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
12054 		0
12055 	},
12056 };
12057 
12058 /* mute/unmute internal speaker according to the hp jack and mute state */
12059 static void alc268_acer_automute(struct hda_codec *codec, int force)
12060 {
12061 	struct alc_spec *spec = codec->spec;
12062 	unsigned int mute;
12063 
12064 	if (force || !spec->sense_updated) {
12065 		spec->jack_present = snd_hda_jack_detect(codec, 0x14);
12066 		spec->sense_updated = 1;
12067 	}
12068 	if (spec->jack_present)
12069 		mute = HDA_AMP_MUTE; /* mute internal speaker */
12070 	else /* unmute internal speaker if necessary */
12071 		mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
12072 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
12073 				 HDA_AMP_MUTE, mute);
12074 }
12075 
12076 
12077 /* bind hp and internal speaker mute (with plug check) */
12078 static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
12079 				     struct snd_ctl_elem_value *ucontrol)
12080 {
12081 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
12082 	long *valp = ucontrol->value.integer.value;
12083 	int change;
12084 
12085 	change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
12086 	if (change)
12087 		alc268_acer_automute(codec, 0);
12088 	return change;
12089 }
12090 
12091 static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
12092 	/* output mixer control */
12093 	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12094 	{
12095 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12096 		.name = "Master Playback Switch",
12097 		.info = snd_hda_mixer_amp_switch_info,
12098 		.get = snd_hda_mixer_amp_switch_get,
12099 		.put = alc268_acer_master_sw_put,
12100 		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12101 	},
12102 	HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
12103 	{ }
12104 };
12105 
12106 static struct snd_kcontrol_new alc268_acer_mixer[] = {
12107 	/* output mixer control */
12108 	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12109 	{
12110 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12111 		.name = "Master Playback Switch",
12112 		.info = snd_hda_mixer_amp_switch_info,
12113 		.get = snd_hda_mixer_amp_switch_get,
12114 		.put = alc268_acer_master_sw_put,
12115 		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12116 	},
12117 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12118 	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12119 	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12120 	{ }
12121 };
12122 
12123 static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
12124 	/* output mixer control */
12125 	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12126 	{
12127 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12128 		.name = "Master Playback Switch",
12129 		.info = snd_hda_mixer_amp_switch_info,
12130 		.get = snd_hda_mixer_amp_switch_get,
12131 		.put = alc268_acer_master_sw_put,
12132 		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12133 	},
12134 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12135 	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12136 	{ }
12137 };
12138 
12139 static struct hda_verb alc268_acer_aspire_one_verbs[] = {
12140 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12141 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12142 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12143 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12144 	{0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
12145 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
12146 	{ }
12147 };
12148 
12149 static struct hda_verb alc268_acer_verbs[] = {
12150 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
12151 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12152 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12153 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
12154 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12155 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12156 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12157 	{ }
12158 };
12159 
12160 /* unsolicited event for HP jack sensing */
12161 #define alc268_toshiba_unsol_event	alc262_hippo_unsol_event
12162 #define alc268_toshiba_setup		alc262_hippo_setup
12163 #define alc268_toshiba_automute		alc262_hippo_automute
12164 
12165 static void alc268_acer_unsol_event(struct hda_codec *codec,
12166 				       unsigned int res)
12167 {
12168 	if ((res >> 26) != ALC880_HP_EVENT)
12169 		return;
12170 	alc268_acer_automute(codec, 1);
12171 }
12172 
12173 static void alc268_acer_init_hook(struct hda_codec *codec)
12174 {
12175 	alc268_acer_automute(codec, 1);
12176 }
12177 
12178 /* toggle speaker-output according to the hp-jack state */
12179 static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
12180 {
12181 	unsigned int present;
12182 	unsigned char bits;
12183 
12184 	present = snd_hda_jack_detect(codec, 0x15);
12185 	bits = present ? AMP_IN_MUTE(0) : 0;
12186 	snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
12187 				AMP_IN_MUTE(0), bits);
12188 	snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
12189 				AMP_IN_MUTE(0), bits);
12190 }
12191 
12192 static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
12193 				    unsigned int res)
12194 {
12195 	switch (res >> 26) {
12196 	case ALC880_HP_EVENT:
12197 		alc268_aspire_one_speaker_automute(codec);
12198 		break;
12199 	case ALC880_MIC_EVENT:
12200 		alc_mic_automute(codec);
12201 		break;
12202 	}
12203 }
12204 
12205 static void alc268_acer_lc_setup(struct hda_codec *codec)
12206 {
12207 	struct alc_spec *spec = codec->spec;
12208 	spec->ext_mic.pin = 0x18;
12209 	spec->ext_mic.mux_idx = 0;
12210 	spec->int_mic.pin = 0x12;
12211 	spec->int_mic.mux_idx = 6;
12212 	spec->auto_mic = 1;
12213 }
12214 
12215 static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12216 {
12217 	alc268_aspire_one_speaker_automute(codec);
12218 	alc_mic_automute(codec);
12219 }
12220 
12221 static struct snd_kcontrol_new alc268_dell_mixer[] = {
12222 	/* output mixer control */
12223 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12224 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12225 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12226 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12227 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12228 	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12229 	{ }
12230 };
12231 
12232 static struct hda_verb alc268_dell_verbs[] = {
12233 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12234 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12235 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12236 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12237 	{ }
12238 };
12239 
12240 /* mute/unmute internal speaker according to the hp jack and mute state */
12241 static void alc268_dell_setup(struct hda_codec *codec)
12242 {
12243 	struct alc_spec *spec = codec->spec;
12244 
12245 	spec->autocfg.hp_pins[0] = 0x15;
12246 	spec->autocfg.speaker_pins[0] = 0x14;
12247 	spec->ext_mic.pin = 0x18;
12248 	spec->ext_mic.mux_idx = 0;
12249 	spec->int_mic.pin = 0x19;
12250 	spec->int_mic.mux_idx = 1;
12251 	spec->auto_mic = 1;
12252 }
12253 
12254 static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12255 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12256 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12257 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12258 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12259 	HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12260 	HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12261 	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12262 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12263 	{ }
12264 };
12265 
12266 static struct hda_verb alc267_quanta_il1_verbs[] = {
12267 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12268 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12269 	{ }
12270 };
12271 
12272 static void alc267_quanta_il1_setup(struct hda_codec *codec)
12273 {
12274 	struct alc_spec *spec = codec->spec;
12275 	spec->autocfg.hp_pins[0] = 0x15;
12276 	spec->autocfg.speaker_pins[0] = 0x14;
12277 	spec->ext_mic.pin = 0x18;
12278 	spec->ext_mic.mux_idx = 0;
12279 	spec->int_mic.pin = 0x19;
12280 	spec->int_mic.mux_idx = 1;
12281 	spec->auto_mic = 1;
12282 }
12283 
12284 /*
12285  * generic initialization of ADC, input mixers and output mixers
12286  */
12287 static struct hda_verb alc268_base_init_verbs[] = {
12288 	/* Unmute DAC0-1 and set vol = 0 */
12289 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12290 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12291 
12292 	/*
12293 	 * Set up output mixers (0x0c - 0x0e)
12294 	 */
12295 	/* set vol=0 to output mixers */
12296 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12297         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
12298 
12299 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12300 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12301 
12302 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12303 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
12304 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12305 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12306 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12307 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12308 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12309 	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12310 
12311 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12312 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12313 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12314 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12315 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12316 
12317 	/* set PCBEEP vol = 0, mute connections */
12318 	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12319 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12320 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12321 
12322 	/* Unmute Selector 23h,24h and set the default input to mic-in */
12323 
12324 	{0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
12325 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12326 	{0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
12327 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12328 
12329 	{ }
12330 };
12331 
12332 /*
12333  * generic initialization of ADC, input mixers and output mixers
12334  */
12335 static struct hda_verb alc268_volume_init_verbs[] = {
12336 	/* set output DAC */
12337 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12338 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12339 
12340 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12341 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12342 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12343 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12344 	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12345 
12346 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12347 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12348 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12349 
12350 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12351 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12352 
12353 	/* set PCBEEP vol = 0, mute connections */
12354 	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12355 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12356 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12357 
12358 	{ }
12359 };
12360 
12361 static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
12362 	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12363 	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12364 	{ } /* end */
12365 };
12366 
12367 static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
12368 	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12369 	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12370 	_DEFINE_CAPSRC(1),
12371 	{ } /* end */
12372 };
12373 
12374 static struct snd_kcontrol_new alc268_capture_mixer[] = {
12375 	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12376 	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12377 	HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
12378 	HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
12379 	_DEFINE_CAPSRC(2),
12380 	{ } /* end */
12381 };
12382 
12383 static struct hda_input_mux alc268_capture_source = {
12384 	.num_items = 4,
12385 	.items = {
12386 		{ "Mic", 0x0 },
12387 		{ "Front Mic", 0x1 },
12388 		{ "Line", 0x2 },
12389 		{ "CD", 0x3 },
12390 	},
12391 };
12392 
12393 static struct hda_input_mux alc268_acer_capture_source = {
12394 	.num_items = 3,
12395 	.items = {
12396 		{ "Mic", 0x0 },
12397 		{ "Internal Mic", 0x1 },
12398 		{ "Line", 0x2 },
12399 	},
12400 };
12401 
12402 static struct hda_input_mux alc268_acer_dmic_capture_source = {
12403 	.num_items = 3,
12404 	.items = {
12405 		{ "Mic", 0x0 },
12406 		{ "Internal Mic", 0x6 },
12407 		{ "Line", 0x2 },
12408 	},
12409 };
12410 
12411 #ifdef CONFIG_SND_DEBUG
12412 static struct snd_kcontrol_new alc268_test_mixer[] = {
12413 	/* Volume widgets */
12414 	HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12415 	HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12416 	HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
12417 	HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
12418 	HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
12419 	HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
12420 	HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
12421 	HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
12422 	HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
12423 	HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
12424 	HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
12425 	HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
12426 	HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
12427 	/* The below appears problematic on some hardwares */
12428 	/*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
12429 	HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12430 	HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
12431 	HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
12432 	HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
12433 
12434 	/* Modes for retasking pin widgets */
12435 	ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
12436 	ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
12437 	ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
12438 	ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
12439 
12440 	/* Controls for GPIO pins, assuming they are configured as outputs */
12441 	ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
12442 	ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
12443 	ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
12444 	ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
12445 
12446 	/* Switches to allow the digital SPDIF output pin to be enabled.
12447 	 * The ALC268 does not have an SPDIF input.
12448 	 */
12449 	ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
12450 
12451 	/* A switch allowing EAPD to be enabled.  Some laptops seem to use
12452 	 * this output to turn on an external amplifier.
12453 	 */
12454 	ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
12455 	ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
12456 
12457 	{ } /* end */
12458 };
12459 #endif
12460 
12461 /* create input playback/capture controls for the given pin */
12462 static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
12463 				    const char *ctlname, int idx)
12464 {
12465 	hda_nid_t dac;
12466 	int err;
12467 
12468 	switch (nid) {
12469 	case 0x14:
12470 	case 0x16:
12471 		dac = 0x02;
12472 		break;
12473 	case 0x15:
12474 		dac = 0x03;
12475 		break;
12476 	default:
12477 		return 0;
12478 	}
12479 	if (spec->multiout.dac_nids[0] != dac &&
12480 	    spec->multiout.dac_nids[1] != dac) {
12481 		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
12482 				  HDA_COMPOSE_AMP_VAL(dac, 3, idx,
12483 						      HDA_OUTPUT));
12484 		if (err < 0)
12485 			return err;
12486 		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
12487 	}
12488 
12489 	if (nid != 0x16)
12490 		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
12491 			  HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
12492 	else /* mono */
12493 		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
12494 			  HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
12495 	if (err < 0)
12496 		return err;
12497 	return 0;
12498 }
12499 
12500 /* add playback controls from the parsed DAC table */
12501 static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
12502 					     const struct auto_pin_cfg *cfg)
12503 {
12504 	hda_nid_t nid;
12505 	int err;
12506 
12507 	spec->multiout.dac_nids = spec->private_dac_nids;
12508 
12509 	nid = cfg->line_out_pins[0];
12510 	if (nid) {
12511 		const char *name;
12512 		if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
12513 			name = "Speaker";
12514 		else
12515 			name = "Front";
12516 		err = alc268_new_analog_output(spec, nid, name, 0);
12517 		if (err < 0)
12518 			return err;
12519 	}
12520 
12521 	nid = cfg->speaker_pins[0];
12522 	if (nid == 0x1d) {
12523 		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
12524 				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
12525 		if (err < 0)
12526 			return err;
12527 	} else {
12528 		err = alc268_new_analog_output(spec, nid, "Speaker", 0);
12529 		if (err < 0)
12530 			return err;
12531 	}
12532 	nid = cfg->hp_pins[0];
12533 	if (nid) {
12534 		err = alc268_new_analog_output(spec, nid, "Headphone", 0);
12535 		if (err < 0)
12536 			return err;
12537 	}
12538 
12539 	nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
12540 	if (nid == 0x16) {
12541 		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
12542 				  HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
12543 		if (err < 0)
12544 			return err;
12545 	}
12546 	return 0;
12547 }
12548 
12549 /* create playback/capture controls for input pins */
12550 static int alc268_auto_create_input_ctls(struct hda_codec *codec,
12551 						const struct auto_pin_cfg *cfg)
12552 {
12553 	return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
12554 }
12555 
12556 static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
12557 					      hda_nid_t nid, int pin_type)
12558 {
12559 	int idx;
12560 
12561 	alc_set_pin_output(codec, nid, pin_type);
12562 	if (nid == 0x14 || nid == 0x16)
12563 		idx = 0;
12564 	else
12565 		idx = 1;
12566 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
12567 }
12568 
12569 static void alc268_auto_init_multi_out(struct hda_codec *codec)
12570 {
12571 	struct alc_spec *spec = codec->spec;
12572 	hda_nid_t nid = spec->autocfg.line_out_pins[0];
12573 	if (nid) {
12574 		int pin_type = get_pin_type(spec->autocfg.line_out_type);
12575 		alc268_auto_set_output_and_unmute(codec, nid, pin_type);
12576 	}
12577 }
12578 
12579 static void alc268_auto_init_hp_out(struct hda_codec *codec)
12580 {
12581 	struct alc_spec *spec = codec->spec;
12582 	hda_nid_t pin;
12583 
12584 	pin = spec->autocfg.hp_pins[0];
12585 	if (pin)
12586 		alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
12587 	pin = spec->autocfg.speaker_pins[0];
12588 	if (pin)
12589 		alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
12590 }
12591 
12592 static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
12593 {
12594 	struct alc_spec *spec = codec->spec;
12595 	hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
12596 	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
12597 	hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
12598 	unsigned int	dac_vol1, dac_vol2;
12599 
12600 	if (line_nid == 0x1d || speaker_nid == 0x1d) {
12601 		snd_hda_codec_write(codec, speaker_nid, 0,
12602 				    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
12603 		/* mute mixer inputs from 0x1d */
12604 		snd_hda_codec_write(codec, 0x0f, 0,
12605 				    AC_VERB_SET_AMP_GAIN_MUTE,
12606 				    AMP_IN_UNMUTE(1));
12607 		snd_hda_codec_write(codec, 0x10, 0,
12608 				    AC_VERB_SET_AMP_GAIN_MUTE,
12609 				    AMP_IN_UNMUTE(1));
12610 	} else {
12611 		/* unmute mixer inputs from 0x1d */
12612 		snd_hda_codec_write(codec, 0x0f, 0,
12613 				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12614 		snd_hda_codec_write(codec, 0x10, 0,
12615 				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12616 	}
12617 
12618 	dac_vol1 = dac_vol2 = 0xb000 | 0x40;	/* set max volume  */
12619 	if (line_nid == 0x14)
12620 		dac_vol2 = AMP_OUT_ZERO;
12621 	else if (line_nid == 0x15)
12622 		dac_vol1 = AMP_OUT_ZERO;
12623 	if (hp_nid == 0x14)
12624 		dac_vol2 = AMP_OUT_ZERO;
12625 	else if (hp_nid == 0x15)
12626 		dac_vol1 = AMP_OUT_ZERO;
12627 	if (line_nid != 0x16 || hp_nid != 0x16 ||
12628 	    spec->autocfg.line_out_pins[1] != 0x16 ||
12629 	    spec->autocfg.line_out_pins[2] != 0x16)
12630 		dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
12631 
12632 	snd_hda_codec_write(codec, 0x02, 0,
12633 			    AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
12634 	snd_hda_codec_write(codec, 0x03, 0,
12635 			    AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
12636 }
12637 
12638 /* pcm configuration: identical with ALC880 */
12639 #define alc268_pcm_analog_playback	alc880_pcm_analog_playback
12640 #define alc268_pcm_analog_capture	alc880_pcm_analog_capture
12641 #define alc268_pcm_analog_alt_capture	alc880_pcm_analog_alt_capture
12642 #define alc268_pcm_digital_playback	alc880_pcm_digital_playback
12643 
12644 /*
12645  * BIOS auto configuration
12646  */
12647 static int alc268_parse_auto_config(struct hda_codec *codec)
12648 {
12649 	struct alc_spec *spec = codec->spec;
12650 	int err;
12651 	static hda_nid_t alc268_ignore[] = { 0 };
12652 
12653 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12654 					   alc268_ignore);
12655 	if (err < 0)
12656 		return err;
12657 	if (!spec->autocfg.line_outs) {
12658 		if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
12659 			spec->multiout.max_channels = 2;
12660 			spec->no_analog = 1;
12661 			goto dig_only;
12662 		}
12663 		return 0; /* can't find valid BIOS pin config */
12664 	}
12665 	err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
12666 	if (err < 0)
12667 		return err;
12668 	err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
12669 	if (err < 0)
12670 		return err;
12671 
12672 	spec->multiout.max_channels = 2;
12673 
12674  dig_only:
12675 	/* digital only support output */
12676 	if (spec->autocfg.dig_outs) {
12677 		spec->multiout.dig_out_nid = ALC268_DIGOUT_NID;
12678 		spec->dig_out_type = spec->autocfg.dig_out_type[0];
12679 	}
12680 	if (spec->kctls.list)
12681 		add_mixer(spec, spec->kctls.list);
12682 
12683 	if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
12684 		add_mixer(spec, alc268_beep_mixer);
12685 
12686 	add_verb(spec, alc268_volume_init_verbs);
12687 	spec->num_mux_defs = 2;
12688 	spec->input_mux = &spec->private_imux[0];
12689 
12690 	err = alc_auto_add_mic_boost(codec);
12691 	if (err < 0)
12692 		return err;
12693 
12694 	alc_ssid_check(codec, 0x15, 0x1b, 0x14);
12695 
12696 	return 1;
12697 }
12698 
12699 #define alc268_auto_init_analog_input	alc882_auto_init_analog_input
12700 
12701 /* init callback for auto-configuration model -- overriding the default init */
12702 static void alc268_auto_init(struct hda_codec *codec)
12703 {
12704 	struct alc_spec *spec = codec->spec;
12705 	alc268_auto_init_multi_out(codec);
12706 	alc268_auto_init_hp_out(codec);
12707 	alc268_auto_init_mono_speaker_out(codec);
12708 	alc268_auto_init_analog_input(codec);
12709 	if (spec->unsol_event)
12710 		alc_inithook(codec);
12711 }
12712 
12713 /*
12714  * configuration and preset
12715  */
12716 static const char *alc268_models[ALC268_MODEL_LAST] = {
12717 	[ALC267_QUANTA_IL1]	= "quanta-il1",
12718 	[ALC268_3ST]		= "3stack",
12719 	[ALC268_TOSHIBA]	= "toshiba",
12720 	[ALC268_ACER]		= "acer",
12721 	[ALC268_ACER_DMIC]	= "acer-dmic",
12722 	[ALC268_ACER_ASPIRE_ONE]	= "acer-aspire",
12723 	[ALC268_DELL]		= "dell",
12724 	[ALC268_ZEPTO]		= "zepto",
12725 #ifdef CONFIG_SND_DEBUG
12726 	[ALC268_TEST]		= "test",
12727 #endif
12728 	[ALC268_AUTO]		= "auto",
12729 };
12730 
12731 static struct snd_pci_quirk alc268_cfg_tbl[] = {
12732 	SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
12733 	SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
12734 	SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
12735 	SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
12736 	SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
12737 	SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
12738 						ALC268_ACER_ASPIRE_ONE),
12739 	SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
12740 	SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
12741 			"Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
12742 	/* almost compatible with toshiba but with optional digital outs;
12743 	 * auto-probing seems working fine
12744 	 */
12745 	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
12746 			   ALC268_AUTO),
12747 	SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
12748 	SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
12749 	SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
12750 	SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
12751 	SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
12752 	SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
12753 	{}
12754 };
12755 
12756 /* Toshiba laptops have no unique PCI SSID but only codec SSID */
12757 static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
12758 	SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
12759 	SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
12760 	SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
12761 			   ALC268_TOSHIBA),
12762 	{}
12763 };
12764 
12765 static struct alc_config_preset alc268_presets[] = {
12766 	[ALC267_QUANTA_IL1] = {
12767 		.mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
12768 			    alc268_capture_nosrc_mixer },
12769 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12770 				alc267_quanta_il1_verbs },
12771 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12772 		.dac_nids = alc268_dac_nids,
12773 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12774 		.adc_nids = alc268_adc_nids_alt,
12775 		.hp_nid = 0x03,
12776 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12777 		.channel_mode = alc268_modes,
12778 		.unsol_event = alc_sku_unsol_event,
12779 		.setup = alc267_quanta_il1_setup,
12780 		.init_hook = alc_inithook,
12781 	},
12782 	[ALC268_3ST] = {
12783 		.mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
12784 			    alc268_beep_mixer },
12785 		.init_verbs = { alc268_base_init_verbs },
12786 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12787 		.dac_nids = alc268_dac_nids,
12788                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12789                 .adc_nids = alc268_adc_nids_alt,
12790 		.capsrc_nids = alc268_capsrc_nids,
12791 		.hp_nid = 0x03,
12792 		.dig_out_nid = ALC268_DIGOUT_NID,
12793 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12794 		.channel_mode = alc268_modes,
12795 		.input_mux = &alc268_capture_source,
12796 	},
12797 	[ALC268_TOSHIBA] = {
12798 		.mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
12799 			    alc268_beep_mixer },
12800 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12801 				alc268_toshiba_verbs },
12802 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12803 		.dac_nids = alc268_dac_nids,
12804 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12805 		.adc_nids = alc268_adc_nids_alt,
12806 		.capsrc_nids = alc268_capsrc_nids,
12807 		.hp_nid = 0x03,
12808 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12809 		.channel_mode = alc268_modes,
12810 		.input_mux = &alc268_capture_source,
12811 		.unsol_event = alc268_toshiba_unsol_event,
12812 		.setup = alc268_toshiba_setup,
12813 		.init_hook = alc268_toshiba_automute,
12814 	},
12815 	[ALC268_ACER] = {
12816 		.mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
12817 			    alc268_beep_mixer },
12818 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12819 				alc268_acer_verbs },
12820 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12821 		.dac_nids = alc268_dac_nids,
12822 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12823 		.adc_nids = alc268_adc_nids_alt,
12824 		.capsrc_nids = alc268_capsrc_nids,
12825 		.hp_nid = 0x02,
12826 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12827 		.channel_mode = alc268_modes,
12828 		.input_mux = &alc268_acer_capture_source,
12829 		.unsol_event = alc268_acer_unsol_event,
12830 		.init_hook = alc268_acer_init_hook,
12831 	},
12832 	[ALC268_ACER_DMIC] = {
12833 		.mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
12834 			    alc268_beep_mixer },
12835 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12836 				alc268_acer_verbs },
12837 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12838 		.dac_nids = alc268_dac_nids,
12839 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12840 		.adc_nids = alc268_adc_nids_alt,
12841 		.capsrc_nids = alc268_capsrc_nids,
12842 		.hp_nid = 0x02,
12843 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12844 		.channel_mode = alc268_modes,
12845 		.input_mux = &alc268_acer_dmic_capture_source,
12846 		.unsol_event = alc268_acer_unsol_event,
12847 		.init_hook = alc268_acer_init_hook,
12848 	},
12849 	[ALC268_ACER_ASPIRE_ONE] = {
12850 		.mixers = { alc268_acer_aspire_one_mixer,
12851 			    alc268_beep_mixer,
12852 			    alc268_capture_nosrc_mixer },
12853 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12854 				alc268_acer_aspire_one_verbs },
12855 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12856 		.dac_nids = alc268_dac_nids,
12857 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12858 		.adc_nids = alc268_adc_nids_alt,
12859 		.capsrc_nids = alc268_capsrc_nids,
12860 		.hp_nid = 0x03,
12861 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12862 		.channel_mode = alc268_modes,
12863 		.unsol_event = alc268_acer_lc_unsol_event,
12864 		.setup = alc268_acer_lc_setup,
12865 		.init_hook = alc268_acer_lc_init_hook,
12866 	},
12867 	[ALC268_DELL] = {
12868 		.mixers = { alc268_dell_mixer, alc268_beep_mixer,
12869 			    alc268_capture_nosrc_mixer },
12870 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12871 				alc268_dell_verbs },
12872 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12873 		.dac_nids = alc268_dac_nids,
12874 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12875 		.adc_nids = alc268_adc_nids_alt,
12876 		.capsrc_nids = alc268_capsrc_nids,
12877 		.hp_nid = 0x02,
12878 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12879 		.channel_mode = alc268_modes,
12880 		.unsol_event = alc_sku_unsol_event,
12881 		.setup = alc268_dell_setup,
12882 		.init_hook = alc_inithook,
12883 	},
12884 	[ALC268_ZEPTO] = {
12885 		.mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
12886 			    alc268_beep_mixer },
12887 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12888 				alc268_toshiba_verbs },
12889 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12890 		.dac_nids = alc268_dac_nids,
12891 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12892 		.adc_nids = alc268_adc_nids_alt,
12893 		.capsrc_nids = alc268_capsrc_nids,
12894 		.hp_nid = 0x03,
12895 		.dig_out_nid = ALC268_DIGOUT_NID,
12896 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12897 		.channel_mode = alc268_modes,
12898 		.input_mux = &alc268_capture_source,
12899 		.setup = alc268_toshiba_setup,
12900 		.init_hook = alc268_toshiba_automute,
12901 	},
12902 #ifdef CONFIG_SND_DEBUG
12903 	[ALC268_TEST] = {
12904 		.mixers = { alc268_test_mixer, alc268_capture_mixer },
12905 		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12906 				alc268_volume_init_verbs },
12907 		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12908 		.dac_nids = alc268_dac_nids,
12909 		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12910 		.adc_nids = alc268_adc_nids_alt,
12911 		.capsrc_nids = alc268_capsrc_nids,
12912 		.hp_nid = 0x03,
12913 		.dig_out_nid = ALC268_DIGOUT_NID,
12914 		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12915 		.channel_mode = alc268_modes,
12916 		.input_mux = &alc268_capture_source,
12917 	},
12918 #endif
12919 };
12920 
12921 static int patch_alc268(struct hda_codec *codec)
12922 {
12923 	struct alc_spec *spec;
12924 	int board_config;
12925 	int i, has_beep, err;
12926 
12927 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
12928 	if (spec == NULL)
12929 		return -ENOMEM;
12930 
12931 	codec->spec = spec;
12932 
12933 	board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
12934 						  alc268_models,
12935 						  alc268_cfg_tbl);
12936 
12937 	if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
12938 		board_config = snd_hda_check_board_codec_sid_config(codec,
12939 			ALC882_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
12940 
12941 	if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
12942 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12943 		       codec->chip_name);
12944 		board_config = ALC268_AUTO;
12945 	}
12946 
12947 	if (board_config == ALC268_AUTO) {
12948 		/* automatic parse from the BIOS config */
12949 		err = alc268_parse_auto_config(codec);
12950 		if (err < 0) {
12951 			alc_free(codec);
12952 			return err;
12953 		} else if (!err) {
12954 			printk(KERN_INFO
12955 			       "hda_codec: Cannot set up configuration "
12956 			       "from BIOS.  Using base mode...\n");
12957 			board_config = ALC268_3ST;
12958 		}
12959 	}
12960 
12961 	if (board_config != ALC268_AUTO)
12962 		setup_preset(codec, &alc268_presets[board_config]);
12963 
12964 	spec->stream_analog_playback = &alc268_pcm_analog_playback;
12965 	spec->stream_analog_capture = &alc268_pcm_analog_capture;
12966 	spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
12967 
12968 	spec->stream_digital_playback = &alc268_pcm_digital_playback;
12969 
12970 	has_beep = 0;
12971 	for (i = 0; i < spec->num_mixers; i++) {
12972 		if (spec->mixers[i] == alc268_beep_mixer) {
12973 			has_beep = 1;
12974 			break;
12975 		}
12976 	}
12977 
12978 	if (has_beep) {
12979 		err = snd_hda_attach_beep_device(codec, 0x1);
12980 		if (err < 0) {
12981 			alc_free(codec);
12982 			return err;
12983 		}
12984 		if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
12985 			/* override the amp caps for beep generator */
12986 			snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
12987 					  (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
12988 					  (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
12989 					  (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
12990 					  (0 << AC_AMPCAP_MUTE_SHIFT));
12991 	}
12992 
12993 	if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
12994 		/* check whether NID 0x07 is valid */
12995 		unsigned int wcap = get_wcaps(codec, 0x07);
12996 		int i;
12997 
12998 		spec->capsrc_nids = alc268_capsrc_nids;
12999 		/* get type */
13000 		wcap = get_wcaps_type(wcap);
13001 		if (spec->auto_mic ||
13002 		    wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
13003 			spec->adc_nids = alc268_adc_nids_alt;
13004 			spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
13005 			if (spec->auto_mic)
13006 				fixup_automic_adc(codec);
13007 			if (spec->auto_mic || spec->input_mux->num_items == 1)
13008 				add_mixer(spec, alc268_capture_nosrc_mixer);
13009 			else
13010 				add_mixer(spec, alc268_capture_alt_mixer);
13011 		} else {
13012 			spec->adc_nids = alc268_adc_nids;
13013 			spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
13014 			add_mixer(spec, alc268_capture_mixer);
13015 		}
13016 		/* set default input source */
13017 		for (i = 0; i < spec->num_adc_nids; i++)
13018 			snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
13019 				0, AC_VERB_SET_CONNECT_SEL,
13020 				i < spec->num_mux_defs ?
13021 				spec->input_mux[i].items[0].index :
13022 				spec->input_mux->items[0].index);
13023 	}
13024 
13025 	spec->vmaster_nid = 0x02;
13026 
13027 	codec->patch_ops = alc_patch_ops;
13028 	if (board_config == ALC268_AUTO)
13029 		spec->init_hook = alc268_auto_init;
13030 
13031 	codec->proc_widget_hook = print_realtek_coef;
13032 
13033 	return 0;
13034 }
13035 
13036 /*
13037  *  ALC269 channel source setting (2 channel)
13038  */
13039 #define ALC269_DIGOUT_NID	ALC880_DIGOUT_NID
13040 
13041 #define alc269_dac_nids		alc260_dac_nids
13042 
13043 static hda_nid_t alc269_adc_nids[1] = {
13044 	/* ADC1 */
13045 	0x08,
13046 };
13047 
13048 static hda_nid_t alc269_capsrc_nids[1] = {
13049 	0x23,
13050 };
13051 
13052 /* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24),
13053  *       not a mux!
13054  */
13055 
13056 #define alc269_modes		alc260_modes
13057 #define alc269_capture_source	alc880_lg_lw_capture_source
13058 
13059 static struct snd_kcontrol_new alc269_base_mixer[] = {
13060 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13061 	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13062 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
13063 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
13064 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13065 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13066 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13067 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13068 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13069 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
13070 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13071 	HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
13072 	{ } /* end */
13073 };
13074 
13075 static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
13076 	/* output mixer control */
13077 	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13078 	{
13079 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13080 		.name = "Master Playback Switch",
13081 		.info = snd_hda_mixer_amp_switch_info,
13082 		.get = snd_hda_mixer_amp_switch_get,
13083 		.put = alc268_acer_master_sw_put,
13084 		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13085 	},
13086 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13087 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13088 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13089 	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13090 	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13091 	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13092 	{ }
13093 };
13094 
13095 static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
13096 	/* output mixer control */
13097 	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13098 	{
13099 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13100 		.name = "Master Playback Switch",
13101 		.info = snd_hda_mixer_amp_switch_info,
13102 		.get = snd_hda_mixer_amp_switch_get,
13103 		.put = alc268_acer_master_sw_put,
13104 		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13105 	},
13106 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13107 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13108 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13109 	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13110 	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13111 	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13112 	HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
13113 	HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
13114 	HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
13115 	{ }
13116 };
13117 
13118 static struct snd_kcontrol_new alc269_eeepc_mixer[] = {
13119 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13120 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13121 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13122 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13123 	{ } /* end */
13124 };
13125 
13126 /* capture mixer elements */
13127 static struct snd_kcontrol_new alc269_epc_capture_mixer[] = {
13128 	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13129 	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13130 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13131 	{ } /* end */
13132 };
13133 
13134 /* FSC amilo */
13135 #define alc269_fujitsu_mixer	alc269_eeepc_mixer
13136 
13137 static struct hda_verb alc269_quanta_fl1_verbs[] = {
13138 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13139 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13140 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13141 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13142 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13143 	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13144 	{ }
13145 };
13146 
13147 static struct hda_verb alc269_lifebook_verbs[] = {
13148 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13149 	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
13150 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13151 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13152 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13153 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13154 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13155 	{0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13156 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13157 	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13158 	{ }
13159 };
13160 
13161 /* toggle speaker-output according to the hp-jack state */
13162 static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
13163 {
13164 	unsigned int present;
13165 	unsigned char bits;
13166 
13167 	present = snd_hda_jack_detect(codec, 0x15);
13168 	bits = present ? AMP_IN_MUTE(0) : 0;
13169 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13170 			AMP_IN_MUTE(0), bits);
13171 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13172 			AMP_IN_MUTE(0), bits);
13173 
13174 	snd_hda_codec_write(codec, 0x20, 0,
13175 			AC_VERB_SET_COEF_INDEX, 0x0c);
13176 	snd_hda_codec_write(codec, 0x20, 0,
13177 			AC_VERB_SET_PROC_COEF, 0x680);
13178 
13179 	snd_hda_codec_write(codec, 0x20, 0,
13180 			AC_VERB_SET_COEF_INDEX, 0x0c);
13181 	snd_hda_codec_write(codec, 0x20, 0,
13182 			AC_VERB_SET_PROC_COEF, 0x480);
13183 }
13184 
13185 /* toggle speaker-output according to the hp-jacks state */
13186 static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
13187 {
13188 	unsigned int present;
13189 	unsigned char bits;
13190 
13191 	/* Check laptop headphone socket */
13192 	present = snd_hda_jack_detect(codec, 0x15);
13193 
13194 	/* Check port replicator headphone socket */
13195 	present |= snd_hda_jack_detect(codec, 0x1a);
13196 
13197 	bits = present ? AMP_IN_MUTE(0) : 0;
13198 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13199 			AMP_IN_MUTE(0), bits);
13200 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13201 			AMP_IN_MUTE(0), bits);
13202 
13203 	snd_hda_codec_write(codec, 0x20, 0,
13204 			AC_VERB_SET_COEF_INDEX, 0x0c);
13205 	snd_hda_codec_write(codec, 0x20, 0,
13206 			AC_VERB_SET_PROC_COEF, 0x680);
13207 
13208 	snd_hda_codec_write(codec, 0x20, 0,
13209 			AC_VERB_SET_COEF_INDEX, 0x0c);
13210 	snd_hda_codec_write(codec, 0x20, 0,
13211 			AC_VERB_SET_PROC_COEF, 0x480);
13212 }
13213 
13214 static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13215 {
13216 	unsigned int present_laptop;
13217 	unsigned int present_dock;
13218 
13219 	present_laptop	= snd_hda_jack_detect(codec, 0x18);
13220 	present_dock	= snd_hda_jack_detect(codec, 0x1b);
13221 
13222 	/* Laptop mic port overrides dock mic port, design decision */
13223 	if (present_dock)
13224 		snd_hda_codec_write(codec, 0x23, 0,
13225 				AC_VERB_SET_CONNECT_SEL, 0x3);
13226 	if (present_laptop)
13227 		snd_hda_codec_write(codec, 0x23, 0,
13228 				AC_VERB_SET_CONNECT_SEL, 0x0);
13229 	if (!present_dock && !present_laptop)
13230 		snd_hda_codec_write(codec, 0x23, 0,
13231 				AC_VERB_SET_CONNECT_SEL, 0x1);
13232 }
13233 
13234 static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
13235 				    unsigned int res)
13236 {
13237 	switch (res >> 26) {
13238 	case ALC880_HP_EVENT:
13239 		alc269_quanta_fl1_speaker_automute(codec);
13240 		break;
13241 	case ALC880_MIC_EVENT:
13242 		alc_mic_automute(codec);
13243 		break;
13244 	}
13245 }
13246 
13247 static void alc269_lifebook_unsol_event(struct hda_codec *codec,
13248 					unsigned int res)
13249 {
13250 	if ((res >> 26) == ALC880_HP_EVENT)
13251 		alc269_lifebook_speaker_automute(codec);
13252 	if ((res >> 26) == ALC880_MIC_EVENT)
13253 		alc269_lifebook_mic_autoswitch(codec);
13254 }
13255 
13256 static void alc269_quanta_fl1_setup(struct hda_codec *codec)
13257 {
13258 	struct alc_spec *spec = codec->spec;
13259 	spec->ext_mic.pin = 0x18;
13260 	spec->ext_mic.mux_idx = 0;
13261 	spec->int_mic.pin = 0x19;
13262 	spec->int_mic.mux_idx = 1;
13263 	spec->auto_mic = 1;
13264 }
13265 
13266 static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
13267 {
13268 	alc269_quanta_fl1_speaker_automute(codec);
13269 	alc_mic_automute(codec);
13270 }
13271 
13272 static void alc269_lifebook_init_hook(struct hda_codec *codec)
13273 {
13274 	alc269_lifebook_speaker_automute(codec);
13275 	alc269_lifebook_mic_autoswitch(codec);
13276 }
13277 
13278 static struct hda_verb alc269_eeepc_dmic_init_verbs[] = {
13279 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13280 	{0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
13281 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13282 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13283 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13284 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13285 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13286 	{}
13287 };
13288 
13289 static struct hda_verb alc269_eeepc_amic_init_verbs[] = {
13290 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13291 	{0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
13292 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13293 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
13294 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13295 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13296 	{}
13297 };
13298 
13299 /* toggle speaker-output according to the hp-jack state */
13300 static void alc269_speaker_automute(struct hda_codec *codec)
13301 {
13302 	struct alc_spec *spec = codec->spec;
13303 	unsigned int nid = spec->autocfg.hp_pins[0];
13304 	unsigned int present;
13305 	unsigned char bits;
13306 
13307 	present = snd_hda_jack_detect(codec, nid);
13308 	bits = present ? AMP_IN_MUTE(0) : 0;
13309 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13310 				AMP_IN_MUTE(0), bits);
13311 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13312 				AMP_IN_MUTE(0), bits);
13313 }
13314 
13315 /* unsolicited event for HP jack sensing */
13316 static void alc269_eeepc_unsol_event(struct hda_codec *codec,
13317 				     unsigned int res)
13318 {
13319 	switch (res >> 26) {
13320 	case ALC880_HP_EVENT:
13321 		alc269_speaker_automute(codec);
13322 		break;
13323 	case ALC880_MIC_EVENT:
13324 		alc_mic_automute(codec);
13325 		break;
13326 	}
13327 }
13328 
13329 static void alc269_eeepc_dmic_setup(struct hda_codec *codec)
13330 {
13331 	struct alc_spec *spec = codec->spec;
13332 	spec->ext_mic.pin = 0x18;
13333 	spec->ext_mic.mux_idx = 0;
13334 	spec->int_mic.pin = 0x12;
13335 	spec->int_mic.mux_idx = 5;
13336 	spec->auto_mic = 1;
13337 }
13338 
13339 static void alc269_eeepc_amic_setup(struct hda_codec *codec)
13340 {
13341 	struct alc_spec *spec = codec->spec;
13342 	spec->ext_mic.pin = 0x18;
13343 	spec->ext_mic.mux_idx = 0;
13344 	spec->int_mic.pin = 0x19;
13345 	spec->int_mic.mux_idx = 1;
13346 	spec->auto_mic = 1;
13347 }
13348 
13349 static void alc269_eeepc_inithook(struct hda_codec *codec)
13350 {
13351 	alc269_speaker_automute(codec);
13352 	alc_mic_automute(codec);
13353 }
13354 
13355 /*
13356  * generic initialization of ADC, input mixers and output mixers
13357  */
13358 static struct hda_verb alc269_init_verbs[] = {
13359 	/*
13360 	 * Unmute ADC0 and set the default input to mic-in
13361 	 */
13362 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13363 
13364 	/* Mute input amps (PCBeep, Line In, Mic 1 & Mic 2) of the
13365 	 * analog-loopback mixer widget
13366 	 * Note: PASD motherboards uses the Line In 2 as the input for
13367 	 * front panel mic (mic 2)
13368 	 */
13369 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
13370 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
13371 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13372 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
13373 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
13374 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
13375 
13376 	/*
13377 	 * Set up output mixers (0x0c - 0x0e)
13378 	 */
13379 	/* set vol=0 to output mixers */
13380 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13381 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13382 
13383 	/* set up input amps for analog loopback */
13384 	/* Amp Indices: DAC = 0, mixer = 1 */
13385 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13386 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13387 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13388 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13389 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13390 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13391 
13392 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13393 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13394 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13395 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13396 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13397 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13398 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13399 
13400 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13401 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13402 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13403 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13404 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13405 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13406 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13407 
13408 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
13409 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
13410 
13411 	/* FIXME: use matrix-type input source selection */
13412 	/* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
13413 	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
13414 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
13415 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13416 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
13417 	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
13418 
13419 	/* set EAPD */
13420 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
13421 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
13422 	{ }
13423 };
13424 
13425 #define alc269_auto_create_multi_out_ctls \
13426 	alc268_auto_create_multi_out_ctls
13427 #define alc269_auto_create_input_ctls \
13428 	alc268_auto_create_input_ctls
13429 
13430 #ifdef CONFIG_SND_HDA_POWER_SAVE
13431 #define alc269_loopbacks	alc880_loopbacks
13432 #endif
13433 
13434 /* pcm configuration: identical with ALC880 */
13435 #define alc269_pcm_analog_playback	alc880_pcm_analog_playback
13436 #define alc269_pcm_analog_capture	alc880_pcm_analog_capture
13437 #define alc269_pcm_digital_playback	alc880_pcm_digital_playback
13438 #define alc269_pcm_digital_capture	alc880_pcm_digital_capture
13439 
13440 static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
13441 	.substreams = 1,
13442 	.channels_min = 2,
13443 	.channels_max = 8,
13444 	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13445 	/* NID is set in alc_build_pcms */
13446 	.ops = {
13447 		.open = alc880_playback_pcm_open,
13448 		.prepare = alc880_playback_pcm_prepare,
13449 		.cleanup = alc880_playback_pcm_cleanup
13450 	},
13451 };
13452 
13453 static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
13454 	.substreams = 1,
13455 	.channels_min = 2,
13456 	.channels_max = 2,
13457 	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13458 	/* NID is set in alc_build_pcms */
13459 };
13460 
13461 /*
13462  * BIOS auto configuration
13463  */
13464 static int alc269_parse_auto_config(struct hda_codec *codec)
13465 {
13466 	struct alc_spec *spec = codec->spec;
13467 	int err;
13468 	static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
13469 
13470 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13471 					   alc269_ignore);
13472 	if (err < 0)
13473 		return err;
13474 
13475 	err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
13476 	if (err < 0)
13477 		return err;
13478 	err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
13479 	if (err < 0)
13480 		return err;
13481 
13482 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
13483 
13484 	if (spec->autocfg.dig_outs)
13485 		spec->multiout.dig_out_nid = ALC269_DIGOUT_NID;
13486 
13487 	if (spec->kctls.list)
13488 		add_mixer(spec, spec->kctls.list);
13489 
13490 	add_verb(spec, alc269_init_verbs);
13491 	spec->num_mux_defs = 1;
13492 	spec->input_mux = &spec->private_imux[0];
13493 	/* set default input source */
13494 	snd_hda_codec_write_cache(codec, alc269_capsrc_nids[0],
13495 				  0, AC_VERB_SET_CONNECT_SEL,
13496 				  spec->input_mux->items[0].index);
13497 
13498 	err = alc_auto_add_mic_boost(codec);
13499 	if (err < 0)
13500 		return err;
13501 
13502 	if (!spec->cap_mixer && !spec->no_analog)
13503 		set_capture_mixer(codec);
13504 
13505 	alc_ssid_check(codec, 0x15, 0x1b, 0x14);
13506 
13507 	return 1;
13508 }
13509 
13510 #define alc269_auto_init_multi_out	alc268_auto_init_multi_out
13511 #define alc269_auto_init_hp_out		alc268_auto_init_hp_out
13512 #define alc269_auto_init_analog_input	alc882_auto_init_analog_input
13513 
13514 
13515 /* init callback for auto-configuration model -- overriding the default init */
13516 static void alc269_auto_init(struct hda_codec *codec)
13517 {
13518 	struct alc_spec *spec = codec->spec;
13519 	alc269_auto_init_multi_out(codec);
13520 	alc269_auto_init_hp_out(codec);
13521 	alc269_auto_init_analog_input(codec);
13522 	if (spec->unsol_event)
13523 		alc_inithook(codec);
13524 }
13525 
13526 /*
13527  * configuration and preset
13528  */
13529 static const char *alc269_models[ALC269_MODEL_LAST] = {
13530 	[ALC269_BASIC]			= "basic",
13531 	[ALC269_QUANTA_FL1]		= "quanta",
13532 	[ALC269_ASUS_AMIC]		= "asus-amic",
13533 	[ALC269_ASUS_DMIC]		= "asus-dmic",
13534 	[ALC269_FUJITSU]		= "fujitsu",
13535 	[ALC269_LIFEBOOK]		= "lifebook",
13536 	[ALC269_AUTO]			= "auto",
13537 };
13538 
13539 static struct snd_pci_quirk alc269_cfg_tbl[] = {
13540 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
13541 	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
13542 		      ALC269_ASUS_AMIC),
13543 	SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_ASUS_AMIC),
13544 	SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80JT", ALC269_ASUS_AMIC),
13545 	SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_ASUS_AMIC),
13546 	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_ASUS_AMIC),
13547 	SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_ASUS_AMIC),
13548 	SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_ASUS_AMIC),
13549 	SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_ASUS_AMIC),
13550 	SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_ASUS_AMIC),
13551 	SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_ASUS_AMIC),
13552 	SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_ASUS_AMIC),
13553 	SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_ASUS_AMIC),
13554 	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_ASUS_AMIC),
13555 	SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_ASUS_AMIC),
13556 	SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_ASUS_AMIC),
13557 	SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_ASUS_AMIC),
13558 	SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_ASUS_AMIC),
13559 	SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_ASUS_AMIC),
13560 	SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_ASUS_AMIC),
13561 	SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_ASUS_AMIC),
13562 	SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_ASUS_AMIC),
13563 	SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_ASUS_AMIC),
13564 	SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_ASUS_AMIC),
13565 	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_ASUS_AMIC),
13566 	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_ASUS_DMIC),
13567 	SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_ASUS_AMIC),
13568 	SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_ASUS_AMIC),
13569 	SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_ASUS_AMIC),
13570 	SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_ASUS_AMIC),
13571 	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
13572 		      ALC269_ASUS_DMIC),
13573 	SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
13574 		      ALC269_ASUS_DMIC),
13575 	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_ASUS_DMIC),
13576 	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_ASUS_DMIC),
13577 	SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
13578 	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
13579 	{}
13580 };
13581 
13582 static struct alc_config_preset alc269_presets[] = {
13583 	[ALC269_BASIC] = {
13584 		.mixers = { alc269_base_mixer },
13585 		.init_verbs = { alc269_init_verbs },
13586 		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
13587 		.dac_nids = alc269_dac_nids,
13588 		.hp_nid = 0x03,
13589 		.num_channel_mode = ARRAY_SIZE(alc269_modes),
13590 		.channel_mode = alc269_modes,
13591 		.input_mux = &alc269_capture_source,
13592 	},
13593 	[ALC269_QUANTA_FL1] = {
13594 		.mixers = { alc269_quanta_fl1_mixer },
13595 		.init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
13596 		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
13597 		.dac_nids = alc269_dac_nids,
13598 		.hp_nid = 0x03,
13599 		.num_channel_mode = ARRAY_SIZE(alc269_modes),
13600 		.channel_mode = alc269_modes,
13601 		.input_mux = &alc269_capture_source,
13602 		.unsol_event = alc269_quanta_fl1_unsol_event,
13603 		.setup = alc269_quanta_fl1_setup,
13604 		.init_hook = alc269_quanta_fl1_init_hook,
13605 	},
13606 	[ALC269_ASUS_AMIC] = {
13607 		.mixers = { alc269_eeepc_mixer },
13608 		.cap_mixer = alc269_epc_capture_mixer,
13609 		.init_verbs = { alc269_init_verbs,
13610 				alc269_eeepc_amic_init_verbs },
13611 		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
13612 		.dac_nids = alc269_dac_nids,
13613 		.hp_nid = 0x03,
13614 		.num_channel_mode = ARRAY_SIZE(alc269_modes),
13615 		.channel_mode = alc269_modes,
13616 		.unsol_event = alc269_eeepc_unsol_event,
13617 		.setup = alc269_eeepc_amic_setup,
13618 		.init_hook = alc269_eeepc_inithook,
13619 	},
13620 	[ALC269_ASUS_DMIC] = {
13621 		.mixers = { alc269_eeepc_mixer },
13622 		.cap_mixer = alc269_epc_capture_mixer,
13623 		.init_verbs = { alc269_init_verbs,
13624 				alc269_eeepc_dmic_init_verbs },
13625 		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
13626 		.dac_nids = alc269_dac_nids,
13627 		.hp_nid = 0x03,
13628 		.num_channel_mode = ARRAY_SIZE(alc269_modes),
13629 		.channel_mode = alc269_modes,
13630 		.unsol_event = alc269_eeepc_unsol_event,
13631 		.setup = alc269_eeepc_dmic_setup,
13632 		.init_hook = alc269_eeepc_inithook,
13633 	},
13634 	[ALC269_FUJITSU] = {
13635 		.mixers = { alc269_fujitsu_mixer },
13636 		.cap_mixer = alc269_epc_capture_mixer,
13637 		.init_verbs = { alc269_init_verbs,
13638 				alc269_eeepc_dmic_init_verbs },
13639 		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
13640 		.dac_nids = alc269_dac_nids,
13641 		.hp_nid = 0x03,
13642 		.num_channel_mode = ARRAY_SIZE(alc269_modes),
13643 		.channel_mode = alc269_modes,
13644 		.unsol_event = alc269_eeepc_unsol_event,
13645 		.setup = alc269_eeepc_dmic_setup,
13646 		.init_hook = alc269_eeepc_inithook,
13647 	},
13648 	[ALC269_LIFEBOOK] = {
13649 		.mixers = { alc269_lifebook_mixer },
13650 		.init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
13651 		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
13652 		.dac_nids = alc269_dac_nids,
13653 		.hp_nid = 0x03,
13654 		.num_channel_mode = ARRAY_SIZE(alc269_modes),
13655 		.channel_mode = alc269_modes,
13656 		.input_mux = &alc269_capture_source,
13657 		.unsol_event = alc269_lifebook_unsol_event,
13658 		.init_hook = alc269_lifebook_init_hook,
13659 	},
13660 };
13661 
13662 static int patch_alc269(struct hda_codec *codec)
13663 {
13664 	struct alc_spec *spec;
13665 	int board_config;
13666 	int err;
13667 
13668 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13669 	if (spec == NULL)
13670 		return -ENOMEM;
13671 
13672 	codec->spec = spec;
13673 
13674 	alc_fix_pll_init(codec, 0x20, 0x04, 15);
13675 
13676 	if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){
13677 		kfree(codec->chip_name);
13678 		codec->chip_name = kstrdup("ALC259", GFP_KERNEL);
13679 		if (!codec->chip_name) {
13680 			alc_free(codec);
13681 			return -ENOMEM;
13682 		}
13683 	}
13684 
13685 	board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
13686 						  alc269_models,
13687 						  alc269_cfg_tbl);
13688 
13689 	if (board_config < 0) {
13690 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13691 		       codec->chip_name);
13692 		board_config = ALC269_AUTO;
13693 	}
13694 
13695 	if (board_config == ALC269_AUTO) {
13696 		/* automatic parse from the BIOS config */
13697 		err = alc269_parse_auto_config(codec);
13698 		if (err < 0) {
13699 			alc_free(codec);
13700 			return err;
13701 		} else if (!err) {
13702 			printk(KERN_INFO
13703 			       "hda_codec: Cannot set up configuration "
13704 			       "from BIOS.  Using base mode...\n");
13705 			board_config = ALC269_BASIC;
13706 		}
13707 	}
13708 
13709 	err = snd_hda_attach_beep_device(codec, 0x1);
13710 	if (err < 0) {
13711 		alc_free(codec);
13712 		return err;
13713 	}
13714 
13715 	if (board_config != ALC269_AUTO)
13716 		setup_preset(codec, &alc269_presets[board_config]);
13717 
13718 	if (codec->subsystem_id == 0x17aa3bf8) {
13719 		/* Due to a hardware problem on Lenovo Ideadpad, we need to
13720 		 * fix the sample rate of analog I/O to 44.1kHz
13721 		 */
13722 		spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
13723 		spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
13724 	} else {
13725 		spec->stream_analog_playback = &alc269_pcm_analog_playback;
13726 		spec->stream_analog_capture = &alc269_pcm_analog_capture;
13727 	}
13728 	spec->stream_digital_playback = &alc269_pcm_digital_playback;
13729 	spec->stream_digital_capture = &alc269_pcm_digital_capture;
13730 
13731 	spec->adc_nids = alc269_adc_nids;
13732 	spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
13733 	spec->capsrc_nids = alc269_capsrc_nids;
13734 	if (!spec->cap_mixer)
13735 		set_capture_mixer(codec);
13736 	set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
13737 
13738 	spec->vmaster_nid = 0x02;
13739 
13740 	codec->patch_ops = alc_patch_ops;
13741 	if (board_config == ALC269_AUTO)
13742 		spec->init_hook = alc269_auto_init;
13743 #ifdef CONFIG_SND_HDA_POWER_SAVE
13744 	if (!spec->loopback.amplist)
13745 		spec->loopback.amplist = alc269_loopbacks;
13746 #endif
13747 	codec->proc_widget_hook = print_realtek_coef;
13748 
13749 	return 0;
13750 }
13751 
13752 /*
13753  *  ALC861 channel source setting (2/6 channel selection for 3-stack)
13754  */
13755 
13756 /*
13757  * set the path ways for 2 channel output
13758  * need to set the codec line out and mic 1 pin widgets to inputs
13759  */
13760 static struct hda_verb alc861_threestack_ch2_init[] = {
13761 	/* set pin widget 1Ah (line in) for input */
13762 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13763 	/* set pin widget 18h (mic1/2) for input, for mic also enable
13764 	 * the vref
13765 	 */
13766 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13767 
13768 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
13769 #if 0
13770 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13771 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
13772 #endif
13773 	{ } /* end */
13774 };
13775 /*
13776  * 6ch mode
13777  * need to set the codec line out and mic 1 pin widgets to outputs
13778  */
13779 static struct hda_verb alc861_threestack_ch6_init[] = {
13780 	/* set pin widget 1Ah (line in) for output (Back Surround)*/
13781 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13782 	/* set pin widget 18h (mic1) for output (CLFE)*/
13783 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13784 
13785 	{ 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
13786 	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
13787 
13788 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
13789 #if 0
13790 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13791 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
13792 #endif
13793 	{ } /* end */
13794 };
13795 
13796 static struct hda_channel_mode alc861_threestack_modes[2] = {
13797 	{ 2, alc861_threestack_ch2_init },
13798 	{ 6, alc861_threestack_ch6_init },
13799 };
13800 /* Set mic1 as input and unmute the mixer */
13801 static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
13802 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13803 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13804 	{ } /* end */
13805 };
13806 /* Set mic1 as output and mute mixer */
13807 static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
13808 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13809 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13810 	{ } /* end */
13811 };
13812 
13813 static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
13814 	{ 2, alc861_uniwill_m31_ch2_init },
13815 	{ 4, alc861_uniwill_m31_ch4_init },
13816 };
13817 
13818 /* Set mic1 and line-in as input and unmute the mixer */
13819 static struct hda_verb alc861_asus_ch2_init[] = {
13820 	/* set pin widget 1Ah (line in) for input */
13821 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13822 	/* set pin widget 18h (mic1/2) for input, for mic also enable
13823 	 * the vref
13824 	 */
13825 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13826 
13827 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
13828 #if 0
13829 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13830 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
13831 #endif
13832 	{ } /* end */
13833 };
13834 /* Set mic1 nad line-in as output and mute mixer */
13835 static struct hda_verb alc861_asus_ch6_init[] = {
13836 	/* set pin widget 1Ah (line in) for output (Back Surround)*/
13837 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13838 	/* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
13839 	/* set pin widget 18h (mic1) for output (CLFE)*/
13840 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13841 	/* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
13842 	{ 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
13843 	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
13844 
13845 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
13846 #if 0
13847 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13848 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
13849 #endif
13850 	{ } /* end */
13851 };
13852 
13853 static struct hda_channel_mode alc861_asus_modes[2] = {
13854 	{ 2, alc861_asus_ch2_init },
13855 	{ 6, alc861_asus_ch6_init },
13856 };
13857 
13858 /* patch-ALC861 */
13859 
13860 static struct snd_kcontrol_new alc861_base_mixer[] = {
13861         /* output mixer control */
13862 	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13863 	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13864 	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13865 	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13866 	HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
13867 
13868         /*Input mixer control */
13869 	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13870 	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
13871 	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13872 	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13873 	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13874 	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13875 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13876 	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13877 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13878 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
13879 
13880 	{ } /* end */
13881 };
13882 
13883 static struct snd_kcontrol_new alc861_3ST_mixer[] = {
13884         /* output mixer control */
13885 	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13886 	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13887 	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13888 	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13889 	/*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
13890 
13891 	/* Input mixer control */
13892 	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13893 	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
13894 	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13895 	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13896 	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13897 	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13898 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13899 	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13900 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13901 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
13902 
13903 	{
13904 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13905 		.name = "Channel Mode",
13906 		.info = alc_ch_mode_info,
13907 		.get = alc_ch_mode_get,
13908 		.put = alc_ch_mode_put,
13909                 .private_value = ARRAY_SIZE(alc861_threestack_modes),
13910 	},
13911 	{ } /* end */
13912 };
13913 
13914 static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
13915         /* output mixer control */
13916 	HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13917 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13918 	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13919 
13920 	{ } /* end */
13921 };
13922 
13923 static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
13924         /* output mixer control */
13925 	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13926 	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13927 	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13928 	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13929 	/*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
13930 
13931 	/* Input mixer control */
13932 	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13933 	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
13934 	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13935 	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13936 	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13937 	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13938 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13939 	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13940 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13941 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
13942 
13943 	{
13944 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13945 		.name = "Channel Mode",
13946 		.info = alc_ch_mode_info,
13947 		.get = alc_ch_mode_get,
13948 		.put = alc_ch_mode_put,
13949                 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
13950 	},
13951 	{ } /* end */
13952 };
13953 
13954 static struct snd_kcontrol_new alc861_asus_mixer[] = {
13955         /* output mixer control */
13956 	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13957 	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13958 	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13959 	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13960 	HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
13961 
13962 	/* Input mixer control */
13963 	HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13964 	HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13965 	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13966 	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13967 	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13968 	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13969 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13970 	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13971 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13972 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
13973 
13974 	{
13975 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13976 		.name = "Channel Mode",
13977 		.info = alc_ch_mode_info,
13978 		.get = alc_ch_mode_get,
13979 		.put = alc_ch_mode_put,
13980                 .private_value = ARRAY_SIZE(alc861_asus_modes),
13981 	},
13982 	{ }
13983 };
13984 
13985 /* additional mixer */
13986 static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
13987 	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13988 	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13989 	{ }
13990 };
13991 
13992 /*
13993  * generic initialization of ADC, input mixers and output mixers
13994  */
13995 static struct hda_verb alc861_base_init_verbs[] = {
13996 	/*
13997 	 * Unmute ADC0 and set the default input to mic-in
13998 	 */
13999 	/* port-A for surround (rear panel) */
14000 	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14001 	{ 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
14002 	/* port-B for mic-in (rear panel) with vref */
14003 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14004 	/* port-C for line-in (rear panel) */
14005 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14006 	/* port-D for Front */
14007 	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14008 	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14009 	/* port-E for HP out (front panel) */
14010 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14011 	/* route front PCM to HP */
14012 	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14013 	/* port-F for mic-in (front panel) with vref */
14014 	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14015 	/* port-G for CLFE (rear panel) */
14016 	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14017 	{ 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14018 	/* port-H for side (rear panel) */
14019 	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14020 	{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
14021 	/* CD-in */
14022 	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14023 	/* route front mic to ADC1*/
14024 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14025 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14026 
14027 	/* Unmute DAC0~3 & spdif out*/
14028 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14029 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14030 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14031 	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14032 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14033 
14034 	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14035 	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14036         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14037 	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14038         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14039 
14040 	/* Unmute Stereo Mixer 15 */
14041 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14042 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14043 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14044 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14045 
14046 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14047 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14048 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14049 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14050 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14051 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14052 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14053 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14054 	/* hp used DAC 3 (Front) */
14055 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14056         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14057 
14058 	{ }
14059 };
14060 
14061 static struct hda_verb alc861_threestack_init_verbs[] = {
14062 	/*
14063 	 * Unmute ADC0 and set the default input to mic-in
14064 	 */
14065 	/* port-A for surround (rear panel) */
14066 	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14067 	/* port-B for mic-in (rear panel) with vref */
14068 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14069 	/* port-C for line-in (rear panel) */
14070 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14071 	/* port-D for Front */
14072 	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14073 	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14074 	/* port-E for HP out (front panel) */
14075 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14076 	/* route front PCM to HP */
14077 	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14078 	/* port-F for mic-in (front panel) with vref */
14079 	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14080 	/* port-G for CLFE (rear panel) */
14081 	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14082 	/* port-H for side (rear panel) */
14083 	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14084 	/* CD-in */
14085 	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14086 	/* route front mic to ADC1*/
14087 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14088 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14089 	/* Unmute DAC0~3 & spdif out*/
14090 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14091 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14092 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14093 	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14094 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14095 
14096 	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14097 	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14098         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14099 	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14100         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14101 
14102 	/* Unmute Stereo Mixer 15 */
14103 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14104 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14105 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14106 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14107 
14108 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14109 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14110 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14111 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14112 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14113 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14114 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14115 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14116 	/* hp used DAC 3 (Front) */
14117 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14118         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14119 	{ }
14120 };
14121 
14122 static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
14123 	/*
14124 	 * Unmute ADC0 and set the default input to mic-in
14125 	 */
14126 	/* port-A for surround (rear panel) */
14127 	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14128 	/* port-B for mic-in (rear panel) with vref */
14129 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14130 	/* port-C for line-in (rear panel) */
14131 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14132 	/* port-D for Front */
14133 	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14134 	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14135 	/* port-E for HP out (front panel) */
14136 	/* this has to be set to VREF80 */
14137 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14138 	/* route front PCM to HP */
14139 	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14140 	/* port-F for mic-in (front panel) with vref */
14141 	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14142 	/* port-G for CLFE (rear panel) */
14143 	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14144 	/* port-H for side (rear panel) */
14145 	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14146 	/* CD-in */
14147 	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14148 	/* route front mic to ADC1*/
14149 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14150 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14151 	/* Unmute DAC0~3 & spdif out*/
14152 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14153 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14154 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14155 	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14156 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14157 
14158 	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14159 	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14160         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14161 	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14162         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14163 
14164 	/* Unmute Stereo Mixer 15 */
14165 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14166 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14167 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14168 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14169 
14170 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14171 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14172 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14173 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14174 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14175 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14176 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14177 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14178 	/* hp used DAC 3 (Front) */
14179 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14180         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14181 	{ }
14182 };
14183 
14184 static struct hda_verb alc861_asus_init_verbs[] = {
14185 	/*
14186 	 * Unmute ADC0 and set the default input to mic-in
14187 	 */
14188 	/* port-A for surround (rear panel)
14189 	 * according to codec#0 this is the HP jack
14190 	 */
14191 	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
14192 	/* route front PCM to HP */
14193 	{ 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
14194 	/* port-B for mic-in (rear panel) with vref */
14195 	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14196 	/* port-C for line-in (rear panel) */
14197 	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14198 	/* port-D for Front */
14199 	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14200 	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14201 	/* port-E for HP out (front panel) */
14202 	/* this has to be set to VREF80 */
14203 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14204 	/* route front PCM to HP */
14205 	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14206 	/* port-F for mic-in (front panel) with vref */
14207 	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14208 	/* port-G for CLFE (rear panel) */
14209 	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14210 	/* port-H for side (rear panel) */
14211 	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14212 	/* CD-in */
14213 	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14214 	/* route front mic to ADC1*/
14215 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14216 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14217 	/* Unmute DAC0~3 & spdif out*/
14218 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14219 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14220 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14221 	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14222 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14223 	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14224 	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14225         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14226 	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14227         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14228 
14229 	/* Unmute Stereo Mixer 15 */
14230 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14231 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14232 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14233 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14234 
14235 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14236 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14237 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14238 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14239 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14240 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14241 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14242 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14243 	/* hp used DAC 3 (Front) */
14244 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14245 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14246 	{ }
14247 };
14248 
14249 /* additional init verbs for ASUS laptops */
14250 static struct hda_verb alc861_asus_laptop_init_verbs[] = {
14251 	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
14252 	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
14253 	{ }
14254 };
14255 
14256 /*
14257  * generic initialization of ADC, input mixers and output mixers
14258  */
14259 static struct hda_verb alc861_auto_init_verbs[] = {
14260 	/*
14261 	 * Unmute ADC0 and set the default input to mic-in
14262 	 */
14263 	/* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
14264 	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14265 
14266 	/* Unmute DAC0~3 & spdif out*/
14267 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14268 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14269 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14270 	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14271 	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14272 
14273 	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14274 	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14275 	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14276 	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14277 	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14278 
14279 	/* Unmute Stereo Mixer 15 */
14280 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14281 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14282 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14283 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
14284 
14285 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14286 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14287 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14288 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14289 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14290 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14291 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14292 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14293 
14294 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14295 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14296 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14297 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14298 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14299 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14300 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14301 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14302 
14303 	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},	/* set Mic 1 */
14304 
14305 	{ }
14306 };
14307 
14308 static struct hda_verb alc861_toshiba_init_verbs[] = {
14309 	{0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14310 
14311 	{ }
14312 };
14313 
14314 /* toggle speaker-output according to the hp-jack state */
14315 static void alc861_toshiba_automute(struct hda_codec *codec)
14316 {
14317 	unsigned int present = snd_hda_jack_detect(codec, 0x0f);
14318 
14319 	snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
14320 				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
14321 	snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
14322 				 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
14323 }
14324 
14325 static void alc861_toshiba_unsol_event(struct hda_codec *codec,
14326 				       unsigned int res)
14327 {
14328 	if ((res >> 26) == ALC880_HP_EVENT)
14329 		alc861_toshiba_automute(codec);
14330 }
14331 
14332 /* pcm configuration: identical with ALC880 */
14333 #define alc861_pcm_analog_playback	alc880_pcm_analog_playback
14334 #define alc861_pcm_analog_capture	alc880_pcm_analog_capture
14335 #define alc861_pcm_digital_playback	alc880_pcm_digital_playback
14336 #define alc861_pcm_digital_capture	alc880_pcm_digital_capture
14337 
14338 
14339 #define ALC861_DIGOUT_NID	0x07
14340 
14341 static struct hda_channel_mode alc861_8ch_modes[1] = {
14342 	{ 8, NULL }
14343 };
14344 
14345 static hda_nid_t alc861_dac_nids[4] = {
14346 	/* front, surround, clfe, side */
14347 	0x03, 0x06, 0x05, 0x04
14348 };
14349 
14350 static hda_nid_t alc660_dac_nids[3] = {
14351 	/* front, clfe, surround */
14352 	0x03, 0x05, 0x06
14353 };
14354 
14355 static hda_nid_t alc861_adc_nids[1] = {
14356 	/* ADC0-2 */
14357 	0x08,
14358 };
14359 
14360 static struct hda_input_mux alc861_capture_source = {
14361 	.num_items = 5,
14362 	.items = {
14363 		{ "Mic", 0x0 },
14364 		{ "Front Mic", 0x3 },
14365 		{ "Line", 0x1 },
14366 		{ "CD", 0x4 },
14367 		{ "Mixer", 0x5 },
14368 	},
14369 };
14370 
14371 static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
14372 {
14373 	struct alc_spec *spec = codec->spec;
14374 	hda_nid_t mix, srcs[5];
14375 	int i, j, num;
14376 
14377 	if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
14378 		return 0;
14379 	num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14380 	if (num < 0)
14381 		return 0;
14382 	for (i = 0; i < num; i++) {
14383 		unsigned int type;
14384 		type = get_wcaps_type(get_wcaps(codec, srcs[i]));
14385 		if (type != AC_WID_AUD_OUT)
14386 			continue;
14387 		for (j = 0; j < spec->multiout.num_dacs; j++)
14388 			if (spec->multiout.dac_nids[j] == srcs[i])
14389 				break;
14390 		if (j >= spec->multiout.num_dacs)
14391 			return srcs[i];
14392 	}
14393 	return 0;
14394 }
14395 
14396 /* fill in the dac_nids table from the parsed pin configuration */
14397 static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
14398 				     const struct auto_pin_cfg *cfg)
14399 {
14400 	struct alc_spec *spec = codec->spec;
14401 	int i;
14402 	hda_nid_t nid, dac;
14403 
14404 	spec->multiout.dac_nids = spec->private_dac_nids;
14405 	for (i = 0; i < cfg->line_outs; i++) {
14406 		nid = cfg->line_out_pins[i];
14407 		dac = alc861_look_for_dac(codec, nid);
14408 		if (!dac)
14409 			continue;
14410 		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
14411 	}
14412 	return 0;
14413 }
14414 
14415 static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
14416 				hda_nid_t nid, unsigned int chs)
14417 {
14418 	return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx,
14419 			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
14420 }
14421 
14422 /* add playback controls from the parsed DAC table */
14423 static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
14424 					     const struct auto_pin_cfg *cfg)
14425 {
14426 	struct alc_spec *spec = codec->spec;
14427 	static const char *chname[4] = {
14428 		"Front", "Surround", NULL /*CLFE*/, "Side"
14429 	};
14430 	hda_nid_t nid;
14431 	int i, err;
14432 
14433 	if (cfg->line_outs == 1) {
14434 		const char *pfx = NULL;
14435 		if (!cfg->hp_outs)
14436 			pfx = "Master";
14437 		else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
14438 			pfx = "Speaker";
14439 		if (pfx) {
14440 			nid = spec->multiout.dac_nids[0];
14441 			return alc861_create_out_sw(codec, pfx, nid, 3);
14442 		}
14443 	}
14444 
14445 	for (i = 0; i < cfg->line_outs; i++) {
14446 		nid = spec->multiout.dac_nids[i];
14447 		if (!nid)
14448 			continue;
14449 		if (i == 2) {
14450 			/* Center/LFE */
14451 			err = alc861_create_out_sw(codec, "Center", nid, 1);
14452 			if (err < 0)
14453 				return err;
14454 			err = alc861_create_out_sw(codec, "LFE", nid, 2);
14455 			if (err < 0)
14456 				return err;
14457 		} else {
14458 			err = alc861_create_out_sw(codec, chname[i], nid, 3);
14459 			if (err < 0)
14460 				return err;
14461 		}
14462 	}
14463 	return 0;
14464 }
14465 
14466 static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
14467 {
14468 	struct alc_spec *spec = codec->spec;
14469 	int err;
14470 	hda_nid_t nid;
14471 
14472 	if (!pin)
14473 		return 0;
14474 
14475 	if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
14476 		nid = alc861_look_for_dac(codec, pin);
14477 		if (nid) {
14478 			err = alc861_create_out_sw(codec, "Headphone", nid, 3);
14479 			if (err < 0)
14480 				return err;
14481 			spec->multiout.hp_nid = nid;
14482 		}
14483 	}
14484 	return 0;
14485 }
14486 
14487 /* create playback/capture controls for input pins */
14488 static int alc861_auto_create_input_ctls(struct hda_codec *codec,
14489 						const struct auto_pin_cfg *cfg)
14490 {
14491 	return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
14492 }
14493 
14494 static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
14495 					      hda_nid_t nid,
14496 					      int pin_type, hda_nid_t dac)
14497 {
14498 	hda_nid_t mix, srcs[5];
14499 	int i, num;
14500 
14501 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
14502 			    pin_type);
14503 	snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
14504 			    AMP_OUT_UNMUTE);
14505 	if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
14506 		return;
14507 	num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14508 	if (num < 0)
14509 		return;
14510 	for (i = 0; i < num; i++) {
14511 		unsigned int mute;
14512 		if (srcs[i] == dac || srcs[i] == 0x15)
14513 			mute = AMP_IN_UNMUTE(i);
14514 		else
14515 			mute = AMP_IN_MUTE(i);
14516 		snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
14517 				    mute);
14518 	}
14519 }
14520 
14521 static void alc861_auto_init_multi_out(struct hda_codec *codec)
14522 {
14523 	struct alc_spec *spec = codec->spec;
14524 	int i;
14525 
14526 	for (i = 0; i < spec->autocfg.line_outs; i++) {
14527 		hda_nid_t nid = spec->autocfg.line_out_pins[i];
14528 		int pin_type = get_pin_type(spec->autocfg.line_out_type);
14529 		if (nid)
14530 			alc861_auto_set_output_and_unmute(codec, nid, pin_type,
14531 							  spec->multiout.dac_nids[i]);
14532 	}
14533 }
14534 
14535 static void alc861_auto_init_hp_out(struct hda_codec *codec)
14536 {
14537 	struct alc_spec *spec = codec->spec;
14538 
14539 	if (spec->autocfg.hp_outs)
14540 		alc861_auto_set_output_and_unmute(codec,
14541 						  spec->autocfg.hp_pins[0],
14542 						  PIN_HP,
14543 						  spec->multiout.hp_nid);
14544 	if (spec->autocfg.speaker_outs)
14545 		alc861_auto_set_output_and_unmute(codec,
14546 						  spec->autocfg.speaker_pins[0],
14547 						  PIN_OUT,
14548 						  spec->multiout.dac_nids[0]);
14549 }
14550 
14551 static void alc861_auto_init_analog_input(struct hda_codec *codec)
14552 {
14553 	struct alc_spec *spec = codec->spec;
14554 	int i;
14555 
14556 	for (i = 0; i < AUTO_PIN_LAST; i++) {
14557 		hda_nid_t nid = spec->autocfg.input_pins[i];
14558 		if (nid >= 0x0c && nid <= 0x11)
14559 			alc_set_input_pin(codec, nid, i);
14560 	}
14561 }
14562 
14563 /* parse the BIOS configuration and set up the alc_spec */
14564 /* return 1 if successful, 0 if the proper config is not found,
14565  * or a negative error code
14566  */
14567 static int alc861_parse_auto_config(struct hda_codec *codec)
14568 {
14569 	struct alc_spec *spec = codec->spec;
14570 	int err;
14571 	static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
14572 
14573 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14574 					   alc861_ignore);
14575 	if (err < 0)
14576 		return err;
14577 	if (!spec->autocfg.line_outs)
14578 		return 0; /* can't find valid BIOS pin config */
14579 
14580 	err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
14581 	if (err < 0)
14582 		return err;
14583 	err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
14584 	if (err < 0)
14585 		return err;
14586 	err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
14587 	if (err < 0)
14588 		return err;
14589 	err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
14590 	if (err < 0)
14591 		return err;
14592 
14593 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
14594 
14595 	if (spec->autocfg.dig_outs)
14596 		spec->multiout.dig_out_nid = ALC861_DIGOUT_NID;
14597 
14598 	if (spec->kctls.list)
14599 		add_mixer(spec, spec->kctls.list);
14600 
14601 	add_verb(spec, alc861_auto_init_verbs);
14602 
14603 	spec->num_mux_defs = 1;
14604 	spec->input_mux = &spec->private_imux[0];
14605 
14606 	spec->adc_nids = alc861_adc_nids;
14607 	spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
14608 	set_capture_mixer(codec);
14609 
14610 	alc_ssid_check(codec, 0x0e, 0x0f, 0x0b);
14611 
14612 	return 1;
14613 }
14614 
14615 /* additional initialization for auto-configuration model */
14616 static void alc861_auto_init(struct hda_codec *codec)
14617 {
14618 	struct alc_spec *spec = codec->spec;
14619 	alc861_auto_init_multi_out(codec);
14620 	alc861_auto_init_hp_out(codec);
14621 	alc861_auto_init_analog_input(codec);
14622 	if (spec->unsol_event)
14623 		alc_inithook(codec);
14624 }
14625 
14626 #ifdef CONFIG_SND_HDA_POWER_SAVE
14627 static struct hda_amp_list alc861_loopbacks[] = {
14628 	{ 0x15, HDA_INPUT, 0 },
14629 	{ 0x15, HDA_INPUT, 1 },
14630 	{ 0x15, HDA_INPUT, 2 },
14631 	{ 0x15, HDA_INPUT, 3 },
14632 	{ } /* end */
14633 };
14634 #endif
14635 
14636 
14637 /*
14638  * configuration and preset
14639  */
14640 static const char *alc861_models[ALC861_MODEL_LAST] = {
14641 	[ALC861_3ST]		= "3stack",
14642 	[ALC660_3ST]		= "3stack-660",
14643 	[ALC861_3ST_DIG]	= "3stack-dig",
14644 	[ALC861_6ST_DIG]	= "6stack-dig",
14645 	[ALC861_UNIWILL_M31]	= "uniwill-m31",
14646 	[ALC861_TOSHIBA]	= "toshiba",
14647 	[ALC861_ASUS]		= "asus",
14648 	[ALC861_ASUS_LAPTOP]	= "asus-laptop",
14649 	[ALC861_AUTO]		= "auto",
14650 };
14651 
14652 static struct snd_pci_quirk alc861_cfg_tbl[] = {
14653 	SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
14654 	SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
14655 	SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
14656 	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
14657 	SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
14658 	SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
14659 	SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
14660 	/* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
14661 	 *        Any other models that need this preset?
14662 	 */
14663 	/* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
14664 	SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
14665 	SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
14666 	SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
14667 	SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
14668 	SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
14669 	/* FIXME: the below seems conflict */
14670 	/* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
14671 	SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
14672 	SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
14673 	{}
14674 };
14675 
14676 static struct alc_config_preset alc861_presets[] = {
14677 	[ALC861_3ST] = {
14678 		.mixers = { alc861_3ST_mixer },
14679 		.init_verbs = { alc861_threestack_init_verbs },
14680 		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
14681 		.dac_nids = alc861_dac_nids,
14682 		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14683 		.channel_mode = alc861_threestack_modes,
14684 		.need_dac_fix = 1,
14685 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14686 		.adc_nids = alc861_adc_nids,
14687 		.input_mux = &alc861_capture_source,
14688 	},
14689 	[ALC861_3ST_DIG] = {
14690 		.mixers = { alc861_base_mixer },
14691 		.init_verbs = { alc861_threestack_init_verbs },
14692 		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
14693 		.dac_nids = alc861_dac_nids,
14694 		.dig_out_nid = ALC861_DIGOUT_NID,
14695 		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14696 		.channel_mode = alc861_threestack_modes,
14697 		.need_dac_fix = 1,
14698 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14699 		.adc_nids = alc861_adc_nids,
14700 		.input_mux = &alc861_capture_source,
14701 	},
14702 	[ALC861_6ST_DIG] = {
14703 		.mixers = { alc861_base_mixer },
14704 		.init_verbs = { alc861_base_init_verbs },
14705 		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
14706 		.dac_nids = alc861_dac_nids,
14707 		.dig_out_nid = ALC861_DIGOUT_NID,
14708 		.num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
14709 		.channel_mode = alc861_8ch_modes,
14710 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14711 		.adc_nids = alc861_adc_nids,
14712 		.input_mux = &alc861_capture_source,
14713 	},
14714 	[ALC660_3ST] = {
14715 		.mixers = { alc861_3ST_mixer },
14716 		.init_verbs = { alc861_threestack_init_verbs },
14717 		.num_dacs = ARRAY_SIZE(alc660_dac_nids),
14718 		.dac_nids = alc660_dac_nids,
14719 		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14720 		.channel_mode = alc861_threestack_modes,
14721 		.need_dac_fix = 1,
14722 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14723 		.adc_nids = alc861_adc_nids,
14724 		.input_mux = &alc861_capture_source,
14725 	},
14726 	[ALC861_UNIWILL_M31] = {
14727 		.mixers = { alc861_uniwill_m31_mixer },
14728 		.init_verbs = { alc861_uniwill_m31_init_verbs },
14729 		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
14730 		.dac_nids = alc861_dac_nids,
14731 		.dig_out_nid = ALC861_DIGOUT_NID,
14732 		.num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
14733 		.channel_mode = alc861_uniwill_m31_modes,
14734 		.need_dac_fix = 1,
14735 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14736 		.adc_nids = alc861_adc_nids,
14737 		.input_mux = &alc861_capture_source,
14738 	},
14739 	[ALC861_TOSHIBA] = {
14740 		.mixers = { alc861_toshiba_mixer },
14741 		.init_verbs = { alc861_base_init_verbs,
14742 				alc861_toshiba_init_verbs },
14743 		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
14744 		.dac_nids = alc861_dac_nids,
14745 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
14746 		.channel_mode = alc883_3ST_2ch_modes,
14747 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14748 		.adc_nids = alc861_adc_nids,
14749 		.input_mux = &alc861_capture_source,
14750 		.unsol_event = alc861_toshiba_unsol_event,
14751 		.init_hook = alc861_toshiba_automute,
14752 	},
14753 	[ALC861_ASUS] = {
14754 		.mixers = { alc861_asus_mixer },
14755 		.init_verbs = { alc861_asus_init_verbs },
14756 		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
14757 		.dac_nids = alc861_dac_nids,
14758 		.dig_out_nid = ALC861_DIGOUT_NID,
14759 		.num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
14760 		.channel_mode = alc861_asus_modes,
14761 		.need_dac_fix = 1,
14762 		.hp_nid = 0x06,
14763 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14764 		.adc_nids = alc861_adc_nids,
14765 		.input_mux = &alc861_capture_source,
14766 	},
14767 	[ALC861_ASUS_LAPTOP] = {
14768 		.mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
14769 		.init_verbs = { alc861_asus_init_verbs,
14770 				alc861_asus_laptop_init_verbs },
14771 		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
14772 		.dac_nids = alc861_dac_nids,
14773 		.dig_out_nid = ALC861_DIGOUT_NID,
14774 		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
14775 		.channel_mode = alc883_3ST_2ch_modes,
14776 		.need_dac_fix = 1,
14777 		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14778 		.adc_nids = alc861_adc_nids,
14779 		.input_mux = &alc861_capture_source,
14780 	},
14781 };
14782 
14783 /* Pin config fixes */
14784 enum {
14785 	PINFIX_FSC_AMILO_PI1505,
14786 };
14787 
14788 static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = {
14789 	{ 0x0b, 0x0221101f }, /* HP */
14790 	{ 0x0f, 0x90170310 }, /* speaker */
14791 	{ }
14792 };
14793 
14794 static const struct alc_fixup alc861_fixups[] = {
14795 	[PINFIX_FSC_AMILO_PI1505] = {
14796 		.pins = alc861_fsc_amilo_pi1505_pinfix
14797 	},
14798 };
14799 
14800 static struct snd_pci_quirk alc861_fixup_tbl[] = {
14801 	SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
14802 	{}
14803 };
14804 
14805 static int patch_alc861(struct hda_codec *codec)
14806 {
14807 	struct alc_spec *spec;
14808 	int board_config;
14809 	int err;
14810 
14811 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14812 	if (spec == NULL)
14813 		return -ENOMEM;
14814 
14815 	codec->spec = spec;
14816 
14817         board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
14818 						  alc861_models,
14819 						  alc861_cfg_tbl);
14820 
14821 	if (board_config < 0) {
14822 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14823 		       codec->chip_name);
14824 		board_config = ALC861_AUTO;
14825 	}
14826 
14827 	alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups);
14828 
14829 	if (board_config == ALC861_AUTO) {
14830 		/* automatic parse from the BIOS config */
14831 		err = alc861_parse_auto_config(codec);
14832 		if (err < 0) {
14833 			alc_free(codec);
14834 			return err;
14835 		} else if (!err) {
14836 			printk(KERN_INFO
14837 			       "hda_codec: Cannot set up configuration "
14838 			       "from BIOS.  Using base mode...\n");
14839 		   board_config = ALC861_3ST_DIG;
14840 		}
14841 	}
14842 
14843 	err = snd_hda_attach_beep_device(codec, 0x23);
14844 	if (err < 0) {
14845 		alc_free(codec);
14846 		return err;
14847 	}
14848 
14849 	if (board_config != ALC861_AUTO)
14850 		setup_preset(codec, &alc861_presets[board_config]);
14851 
14852 	spec->stream_analog_playback = &alc861_pcm_analog_playback;
14853 	spec->stream_analog_capture = &alc861_pcm_analog_capture;
14854 
14855 	spec->stream_digital_playback = &alc861_pcm_digital_playback;
14856 	spec->stream_digital_capture = &alc861_pcm_digital_capture;
14857 
14858 	set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
14859 
14860 	spec->vmaster_nid = 0x03;
14861 
14862 	codec->patch_ops = alc_patch_ops;
14863 	if (board_config == ALC861_AUTO)
14864 		spec->init_hook = alc861_auto_init;
14865 #ifdef CONFIG_SND_HDA_POWER_SAVE
14866 	if (!spec->loopback.amplist)
14867 		spec->loopback.amplist = alc861_loopbacks;
14868 #endif
14869 	codec->proc_widget_hook = print_realtek_coef;
14870 
14871 	return 0;
14872 }
14873 
14874 /*
14875  * ALC861-VD support
14876  *
14877  * Based on ALC882
14878  *
14879  * In addition, an independent DAC
14880  */
14881 #define ALC861VD_DIGOUT_NID	0x06
14882 
14883 static hda_nid_t alc861vd_dac_nids[4] = {
14884 	/* front, surr, clfe, side surr */
14885 	0x02, 0x03, 0x04, 0x05
14886 };
14887 
14888 /* dac_nids for ALC660vd are in a different order - according to
14889  * Realtek's driver.
14890  * This should probably result in a different mixer for 6stack models
14891  * of ALC660vd codecs, but for now there is only 3stack mixer
14892  * - and it is the same as in 861vd.
14893  * adc_nids in ALC660vd are (is) the same as in 861vd
14894  */
14895 static hda_nid_t alc660vd_dac_nids[3] = {
14896 	/* front, rear, clfe, rear_surr */
14897 	0x02, 0x04, 0x03
14898 };
14899 
14900 static hda_nid_t alc861vd_adc_nids[1] = {
14901 	/* ADC0 */
14902 	0x09,
14903 };
14904 
14905 static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
14906 
14907 /* input MUX */
14908 /* FIXME: should be a matrix-type input source selection */
14909 static struct hda_input_mux alc861vd_capture_source = {
14910 	.num_items = 4,
14911 	.items = {
14912 		{ "Mic", 0x0 },
14913 		{ "Front Mic", 0x1 },
14914 		{ "Line", 0x2 },
14915 		{ "CD", 0x4 },
14916 	},
14917 };
14918 
14919 static struct hda_input_mux alc861vd_dallas_capture_source = {
14920 	.num_items = 2,
14921 	.items = {
14922 		{ "Ext Mic", 0x0 },
14923 		{ "Int Mic", 0x1 },
14924 	},
14925 };
14926 
14927 static struct hda_input_mux alc861vd_hp_capture_source = {
14928 	.num_items = 2,
14929 	.items = {
14930 		{ "Front Mic", 0x0 },
14931 		{ "ATAPI Mic", 0x1 },
14932 	},
14933 };
14934 
14935 /*
14936  * 2ch mode
14937  */
14938 static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
14939 	{ 2, NULL }
14940 };
14941 
14942 /*
14943  * 6ch mode
14944  */
14945 static struct hda_verb alc861vd_6stack_ch6_init[] = {
14946 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14947 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14948 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14949 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14950 	{ } /* end */
14951 };
14952 
14953 /*
14954  * 8ch mode
14955  */
14956 static struct hda_verb alc861vd_6stack_ch8_init[] = {
14957 	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14958 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14959 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14960 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14961 	{ } /* end */
14962 };
14963 
14964 static struct hda_channel_mode alc861vd_6stack_modes[2] = {
14965 	{ 6, alc861vd_6stack_ch6_init },
14966 	{ 8, alc861vd_6stack_ch8_init },
14967 };
14968 
14969 static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
14970 	{
14971 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14972 		.name = "Channel Mode",
14973 		.info = alc_ch_mode_info,
14974 		.get = alc_ch_mode_get,
14975 		.put = alc_ch_mode_put,
14976 	},
14977 	{ } /* end */
14978 };
14979 
14980 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
14981  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
14982  */
14983 static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
14984 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14985 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
14986 
14987 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
14988 	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
14989 
14990 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
14991 				HDA_OUTPUT),
14992 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
14993 				HDA_OUTPUT),
14994 	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
14995 	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
14996 
14997 	HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
14998 	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
14999 
15000 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15001 
15002 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15003 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15004 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15005 
15006 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15007 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15008 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15009 
15010 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15011 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15012 
15013 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15014 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15015 
15016 	{ } /* end */
15017 };
15018 
15019 static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
15020 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15021 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15022 
15023 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15024 
15025 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15026 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15027 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15028 
15029 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15030 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15031 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15032 
15033 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15034 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15035 
15036 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15037 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15038 
15039 	{ } /* end */
15040 };
15041 
15042 static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
15043 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15044 	/*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
15045 	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
15046 
15047 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15048 
15049 	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15050 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15051 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15052 
15053 	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15054 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15055 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15056 
15057 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15058 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15059 
15060 	{ } /* end */
15061 };
15062 
15063 /* Pin assignment: Speaker=0x14, HP = 0x15,
15064  *                 Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
15065  */
15066 static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
15067 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15068 	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
15069 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15070 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15071 	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
15072 	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15073 	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15074 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
15075 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15076 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15077 	{ } /* end */
15078 };
15079 
15080 /* Pin assignment: Speaker=0x14, Line-out = 0x15,
15081  *                 Front Mic=0x18, ATAPI Mic = 0x19,
15082  */
15083 static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
15084 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15085 	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15086 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15087 	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15088 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15089 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15090 	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15091 	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15092 
15093 	{ } /* end */
15094 };
15095 
15096 /*
15097  * generic initialization of ADC, input mixers and output mixers
15098  */
15099 static struct hda_verb alc861vd_volume_init_verbs[] = {
15100 	/*
15101 	 * Unmute ADC0 and set the default input to mic-in
15102 	 */
15103 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15104 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15105 
15106 	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
15107 	 * the analog-loopback mixer widget
15108 	 */
15109 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
15110 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15111 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15112 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15113 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15114 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15115 
15116 	/* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
15117 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15118 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15119 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15120 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
15121 
15122 	/*
15123 	 * Set up output mixers (0x02 - 0x05)
15124 	 */
15125 	/* set vol=0 to output mixers */
15126 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15127 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15128 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15129 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15130 
15131 	/* set up input amps for analog loopback */
15132 	/* Amp Indices: DAC = 0, mixer = 1 */
15133 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15134 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15135 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15136 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15137 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15138 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15139 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15140 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15141 
15142 	{ }
15143 };
15144 
15145 /*
15146  * 3-stack pin configuration:
15147  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
15148  */
15149 static struct hda_verb alc861vd_3stack_init_verbs[] = {
15150 	/*
15151 	 * Set pin mode and muting
15152 	 */
15153 	/* set front pin widgets 0x14 for output */
15154 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15155 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15156 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15157 
15158 	/* Mic (rear) pin: input vref at 80% */
15159 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15160 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15161 	/* Front Mic pin: input vref at 80% */
15162 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15163 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15164 	/* Line In pin: input */
15165 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15166 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15167 	/* Line-2 In: Headphone output (output 0 - 0x0c) */
15168 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15169 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15170 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15171 	/* CD pin widget for input */
15172 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15173 
15174 	{ }
15175 };
15176 
15177 /*
15178  * 6-stack pin configuration:
15179  */
15180 static struct hda_verb alc861vd_6stack_init_verbs[] = {
15181 	/*
15182 	 * Set pin mode and muting
15183 	 */
15184 	/* set front pin widgets 0x14 for output */
15185 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15186 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15187 	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15188 
15189 	/* Rear Pin: output 1 (0x0d) */
15190 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15191 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15192 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
15193 	/* CLFE Pin: output 2 (0x0e) */
15194 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15195 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15196 	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
15197 	/* Side Pin: output 3 (0x0f) */
15198 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15199 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15200 	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
15201 
15202 	/* Mic (rear) pin: input vref at 80% */
15203 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15204 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15205 	/* Front Mic pin: input vref at 80% */
15206 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15207 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15208 	/* Line In pin: input */
15209 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15210 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15211 	/* Line-2 In: Headphone output (output 0 - 0x0c) */
15212 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15213 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15214 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15215 	/* CD pin widget for input */
15216 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15217 
15218 	{ }
15219 };
15220 
15221 static struct hda_verb alc861vd_eapd_verbs[] = {
15222 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15223 	{ }
15224 };
15225 
15226 static struct hda_verb alc660vd_eapd_verbs[] = {
15227 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15228 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
15229 	{ }
15230 };
15231 
15232 static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
15233 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15234 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15235 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
15236 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15237 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
15238 	{}
15239 };
15240 
15241 static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
15242 {
15243 	unsigned int present;
15244 	unsigned char bits;
15245 
15246 	present = snd_hda_jack_detect(codec, 0x18);
15247 	bits = present ? HDA_AMP_MUTE : 0;
15248 
15249 	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
15250 				 HDA_AMP_MUTE, bits);
15251 }
15252 
15253 static void alc861vd_lenovo_setup(struct hda_codec *codec)
15254 {
15255 	struct alc_spec *spec = codec->spec;
15256 	spec->autocfg.hp_pins[0] = 0x1b;
15257 	spec->autocfg.speaker_pins[0] = 0x14;
15258 }
15259 
15260 static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
15261 {
15262 	alc_automute_amp(codec);
15263 	alc861vd_lenovo_mic_automute(codec);
15264 }
15265 
15266 static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
15267 					unsigned int res)
15268 {
15269 	switch (res >> 26) {
15270 	case ALC880_MIC_EVENT:
15271 		alc861vd_lenovo_mic_automute(codec);
15272 		break;
15273 	default:
15274 		alc_automute_amp_unsol_event(codec, res);
15275 		break;
15276 	}
15277 }
15278 
15279 static struct hda_verb alc861vd_dallas_verbs[] = {
15280 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15281 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15282 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15283 	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15284 
15285 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15286 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15287 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15288 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15289 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15290 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15291 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15292 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15293 
15294 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15295 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15296 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15297 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15298 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15299 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15300 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15301 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15302 
15303 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15304 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15305 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15306 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15307 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15308 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15309 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15310 	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15311 
15312 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15313 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15314 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15315 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15316 
15317 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15318 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15319 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15320 
15321 	{ } /* end */
15322 };
15323 
15324 /* toggle speaker-output according to the hp-jack state */
15325 static void alc861vd_dallas_setup(struct hda_codec *codec)
15326 {
15327 	struct alc_spec *spec = codec->spec;
15328 
15329 	spec->autocfg.hp_pins[0] = 0x15;
15330 	spec->autocfg.speaker_pins[0] = 0x14;
15331 }
15332 
15333 #ifdef CONFIG_SND_HDA_POWER_SAVE
15334 #define alc861vd_loopbacks	alc880_loopbacks
15335 #endif
15336 
15337 /* pcm configuration: identical with ALC880 */
15338 #define alc861vd_pcm_analog_playback	alc880_pcm_analog_playback
15339 #define alc861vd_pcm_analog_capture	alc880_pcm_analog_capture
15340 #define alc861vd_pcm_digital_playback	alc880_pcm_digital_playback
15341 #define alc861vd_pcm_digital_capture	alc880_pcm_digital_capture
15342 
15343 /*
15344  * configuration and preset
15345  */
15346 static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
15347 	[ALC660VD_3ST]		= "3stack-660",
15348 	[ALC660VD_3ST_DIG]	= "3stack-660-digout",
15349 	[ALC660VD_ASUS_V1S]	= "asus-v1s",
15350 	[ALC861VD_3ST]		= "3stack",
15351 	[ALC861VD_3ST_DIG]	= "3stack-digout",
15352 	[ALC861VD_6ST_DIG]	= "6stack-digout",
15353 	[ALC861VD_LENOVO]	= "lenovo",
15354 	[ALC861VD_DALLAS]	= "dallas",
15355 	[ALC861VD_HP]		= "hp",
15356 	[ALC861VD_AUTO]		= "auto",
15357 };
15358 
15359 static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
15360 	SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
15361 	SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
15362 	SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
15363 	/*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
15364 	SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
15365 	SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
15366 	SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
15367 	SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
15368 	/*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
15369 	SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
15370 	SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
15371 	SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
15372 	SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
15373 	SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
15374 	SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
15375 	{}
15376 };
15377 
15378 static struct alc_config_preset alc861vd_presets[] = {
15379 	[ALC660VD_3ST] = {
15380 		.mixers = { alc861vd_3st_mixer },
15381 		.init_verbs = { alc861vd_volume_init_verbs,
15382 				 alc861vd_3stack_init_verbs },
15383 		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15384 		.dac_nids = alc660vd_dac_nids,
15385 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15386 		.channel_mode = alc861vd_3stack_2ch_modes,
15387 		.input_mux = &alc861vd_capture_source,
15388 	},
15389 	[ALC660VD_3ST_DIG] = {
15390 		.mixers = { alc861vd_3st_mixer },
15391 		.init_verbs = { alc861vd_volume_init_verbs,
15392 				 alc861vd_3stack_init_verbs },
15393 		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15394 		.dac_nids = alc660vd_dac_nids,
15395 		.dig_out_nid = ALC861VD_DIGOUT_NID,
15396 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15397 		.channel_mode = alc861vd_3stack_2ch_modes,
15398 		.input_mux = &alc861vd_capture_source,
15399 	},
15400 	[ALC861VD_3ST] = {
15401 		.mixers = { alc861vd_3st_mixer },
15402 		.init_verbs = { alc861vd_volume_init_verbs,
15403 				 alc861vd_3stack_init_verbs },
15404 		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15405 		.dac_nids = alc861vd_dac_nids,
15406 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15407 		.channel_mode = alc861vd_3stack_2ch_modes,
15408 		.input_mux = &alc861vd_capture_source,
15409 	},
15410 	[ALC861VD_3ST_DIG] = {
15411 		.mixers = { alc861vd_3st_mixer },
15412 		.init_verbs = { alc861vd_volume_init_verbs,
15413 		 		 alc861vd_3stack_init_verbs },
15414 		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15415 		.dac_nids = alc861vd_dac_nids,
15416 		.dig_out_nid = ALC861VD_DIGOUT_NID,
15417 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15418 		.channel_mode = alc861vd_3stack_2ch_modes,
15419 		.input_mux = &alc861vd_capture_source,
15420 	},
15421 	[ALC861VD_6ST_DIG] = {
15422 		.mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
15423 		.init_verbs = { alc861vd_volume_init_verbs,
15424 				alc861vd_6stack_init_verbs },
15425 		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15426 		.dac_nids = alc861vd_dac_nids,
15427 		.dig_out_nid = ALC861VD_DIGOUT_NID,
15428 		.num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
15429 		.channel_mode = alc861vd_6stack_modes,
15430 		.input_mux = &alc861vd_capture_source,
15431 	},
15432 	[ALC861VD_LENOVO] = {
15433 		.mixers = { alc861vd_lenovo_mixer },
15434 		.init_verbs = { alc861vd_volume_init_verbs,
15435 				alc861vd_3stack_init_verbs,
15436 				alc861vd_eapd_verbs,
15437 				alc861vd_lenovo_unsol_verbs },
15438 		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15439 		.dac_nids = alc660vd_dac_nids,
15440 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15441 		.channel_mode = alc861vd_3stack_2ch_modes,
15442 		.input_mux = &alc861vd_capture_source,
15443 		.unsol_event = alc861vd_lenovo_unsol_event,
15444 		.setup = alc861vd_lenovo_setup,
15445 		.init_hook = alc861vd_lenovo_init_hook,
15446 	},
15447 	[ALC861VD_DALLAS] = {
15448 		.mixers = { alc861vd_dallas_mixer },
15449 		.init_verbs = { alc861vd_dallas_verbs },
15450 		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15451 		.dac_nids = alc861vd_dac_nids,
15452 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15453 		.channel_mode = alc861vd_3stack_2ch_modes,
15454 		.input_mux = &alc861vd_dallas_capture_source,
15455 		.unsol_event = alc_automute_amp_unsol_event,
15456 		.setup = alc861vd_dallas_setup,
15457 		.init_hook = alc_automute_amp,
15458 	},
15459 	[ALC861VD_HP] = {
15460 		.mixers = { alc861vd_hp_mixer },
15461 		.init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
15462 		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15463 		.dac_nids = alc861vd_dac_nids,
15464 		.dig_out_nid = ALC861VD_DIGOUT_NID,
15465 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15466 		.channel_mode = alc861vd_3stack_2ch_modes,
15467 		.input_mux = &alc861vd_hp_capture_source,
15468 		.unsol_event = alc_automute_amp_unsol_event,
15469 		.setup = alc861vd_dallas_setup,
15470 		.init_hook = alc_automute_amp,
15471 	},
15472 	[ALC660VD_ASUS_V1S] = {
15473 		.mixers = { alc861vd_lenovo_mixer },
15474 		.init_verbs = { alc861vd_volume_init_verbs,
15475 				alc861vd_3stack_init_verbs,
15476 				alc861vd_eapd_verbs,
15477 				alc861vd_lenovo_unsol_verbs },
15478 		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15479 		.dac_nids = alc660vd_dac_nids,
15480 		.dig_out_nid = ALC861VD_DIGOUT_NID,
15481 		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15482 		.channel_mode = alc861vd_3stack_2ch_modes,
15483 		.input_mux = &alc861vd_capture_source,
15484 		.unsol_event = alc861vd_lenovo_unsol_event,
15485 		.setup = alc861vd_lenovo_setup,
15486 		.init_hook = alc861vd_lenovo_init_hook,
15487 	},
15488 };
15489 
15490 /*
15491  * BIOS auto configuration
15492  */
15493 static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
15494 						const struct auto_pin_cfg *cfg)
15495 {
15496 	return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
15497 }
15498 
15499 
15500 static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
15501 				hda_nid_t nid, int pin_type, int dac_idx)
15502 {
15503 	alc_set_pin_output(codec, nid, pin_type);
15504 }
15505 
15506 static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
15507 {
15508 	struct alc_spec *spec = codec->spec;
15509 	int i;
15510 
15511 	for (i = 0; i <= HDA_SIDE; i++) {
15512 		hda_nid_t nid = spec->autocfg.line_out_pins[i];
15513 		int pin_type = get_pin_type(spec->autocfg.line_out_type);
15514 		if (nid)
15515 			alc861vd_auto_set_output_and_unmute(codec, nid,
15516 							    pin_type, i);
15517 	}
15518 }
15519 
15520 
15521 static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
15522 {
15523 	struct alc_spec *spec = codec->spec;
15524 	hda_nid_t pin;
15525 
15526 	pin = spec->autocfg.hp_pins[0];
15527 	if (pin) /* connect to front and use dac 0 */
15528 		alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
15529 	pin = spec->autocfg.speaker_pins[0];
15530 	if (pin)
15531 		alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
15532 }
15533 
15534 #define ALC861VD_PIN_CD_NID		ALC880_PIN_CD_NID
15535 
15536 static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
15537 {
15538 	struct alc_spec *spec = codec->spec;
15539 	int i;
15540 
15541 	for (i = 0; i < AUTO_PIN_LAST; i++) {
15542 		hda_nid_t nid = spec->autocfg.input_pins[i];
15543 		if (alc_is_input_pin(codec, nid)) {
15544 			alc_set_input_pin(codec, nid, i);
15545 			if (nid != ALC861VD_PIN_CD_NID &&
15546 			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
15547 				snd_hda_codec_write(codec, nid, 0,
15548 						AC_VERB_SET_AMP_GAIN_MUTE,
15549 						AMP_OUT_MUTE);
15550 		}
15551 	}
15552 }
15553 
15554 #define alc861vd_auto_init_input_src	alc882_auto_init_input_src
15555 
15556 #define alc861vd_idx_to_mixer_vol(nid)		((nid) + 0x02)
15557 #define alc861vd_idx_to_mixer_switch(nid)	((nid) + 0x0c)
15558 
15559 /* add playback controls from the parsed DAC table */
15560 /* Based on ALC880 version. But ALC861VD has separate,
15561  * different NIDs for mute/unmute switch and volume control */
15562 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
15563 					     const struct auto_pin_cfg *cfg)
15564 {
15565 	static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
15566 	hda_nid_t nid_v, nid_s;
15567 	int i, err;
15568 
15569 	for (i = 0; i < cfg->line_outs; i++) {
15570 		if (!spec->multiout.dac_nids[i])
15571 			continue;
15572 		nid_v = alc861vd_idx_to_mixer_vol(
15573 				alc880_dac_to_idx(
15574 					spec->multiout.dac_nids[i]));
15575 		nid_s = alc861vd_idx_to_mixer_switch(
15576 				alc880_dac_to_idx(
15577 					spec->multiout.dac_nids[i]));
15578 
15579 		if (i == 2) {
15580 			/* Center/LFE */
15581 			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
15582 					      "Center",
15583 					  HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
15584 							      HDA_OUTPUT));
15585 			if (err < 0)
15586 				return err;
15587 			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
15588 					      "LFE",
15589 					  HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
15590 							      HDA_OUTPUT));
15591 			if (err < 0)
15592 				return err;
15593 			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
15594 					     "Center",
15595 					  HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
15596 							      HDA_INPUT));
15597 			if (err < 0)
15598 				return err;
15599 			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
15600 					     "LFE",
15601 					  HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
15602 							      HDA_INPUT));
15603 			if (err < 0)
15604 				return err;
15605 		} else {
15606 			const char *pfx;
15607 			if (cfg->line_outs == 1 &&
15608 			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
15609 				if (!cfg->hp_pins)
15610 					pfx = "Speaker";
15611 				else
15612 					pfx = "PCM";
15613 			} else
15614 				pfx = chname[i];
15615 			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
15616 					  HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
15617 							      HDA_OUTPUT));
15618 			if (err < 0)
15619 				return err;
15620 			if (cfg->line_outs == 1 &&
15621 			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
15622 				pfx = "Speaker";
15623 			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
15624 					  HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
15625 							      HDA_INPUT));
15626 			if (err < 0)
15627 				return err;
15628 		}
15629 	}
15630 	return 0;
15631 }
15632 
15633 /* add playback controls for speaker and HP outputs */
15634 /* Based on ALC880 version. But ALC861VD has separate,
15635  * different NIDs for mute/unmute switch and volume control */
15636 static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
15637 					hda_nid_t pin, const char *pfx)
15638 {
15639 	hda_nid_t nid_v, nid_s;
15640 	int err;
15641 
15642 	if (!pin)
15643 		return 0;
15644 
15645 	if (alc880_is_fixed_pin(pin)) {
15646 		nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
15647 		/* specify the DAC as the extra output */
15648 		if (!spec->multiout.hp_nid)
15649 			spec->multiout.hp_nid = nid_v;
15650 		else
15651 			spec->multiout.extra_out_nid[0] = nid_v;
15652 		/* control HP volume/switch on the output mixer amp */
15653 		nid_v = alc861vd_idx_to_mixer_vol(
15654 				alc880_fixed_pin_idx(pin));
15655 		nid_s = alc861vd_idx_to_mixer_switch(
15656 				alc880_fixed_pin_idx(pin));
15657 
15658 		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
15659 				  HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
15660 		if (err < 0)
15661 			return err;
15662 		err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
15663 				  HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
15664 		if (err < 0)
15665 			return err;
15666 	} else if (alc880_is_multi_pin(pin)) {
15667 		/* set manual connection */
15668 		/* we have only a switch on HP-out PIN */
15669 		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
15670 				  HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
15671 		if (err < 0)
15672 			return err;
15673 	}
15674 	return 0;
15675 }
15676 
15677 /* parse the BIOS configuration and set up the alc_spec
15678  * return 1 if successful, 0 if the proper config is not found,
15679  * or a negative error code
15680  * Based on ALC880 version - had to change it to override
15681  * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
15682 static int alc861vd_parse_auto_config(struct hda_codec *codec)
15683 {
15684 	struct alc_spec *spec = codec->spec;
15685 	int err;
15686 	static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
15687 
15688 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15689 					   alc861vd_ignore);
15690 	if (err < 0)
15691 		return err;
15692 	if (!spec->autocfg.line_outs)
15693 		return 0; /* can't find valid BIOS pin config */
15694 
15695 	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
15696 	if (err < 0)
15697 		return err;
15698 	err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
15699 	if (err < 0)
15700 		return err;
15701 	err = alc861vd_auto_create_extra_out(spec,
15702 					     spec->autocfg.speaker_pins[0],
15703 					     "Speaker");
15704 	if (err < 0)
15705 		return err;
15706 	err = alc861vd_auto_create_extra_out(spec,
15707 					     spec->autocfg.hp_pins[0],
15708 					     "Headphone");
15709 	if (err < 0)
15710 		return err;
15711 	err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
15712 	if (err < 0)
15713 		return err;
15714 
15715 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15716 
15717 	if (spec->autocfg.dig_outs)
15718 		spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID;
15719 
15720 	if (spec->kctls.list)
15721 		add_mixer(spec, spec->kctls.list);
15722 
15723 	add_verb(spec, alc861vd_volume_init_verbs);
15724 
15725 	spec->num_mux_defs = 1;
15726 	spec->input_mux = &spec->private_imux[0];
15727 
15728 	err = alc_auto_add_mic_boost(codec);
15729 	if (err < 0)
15730 		return err;
15731 
15732 	alc_ssid_check(codec, 0x15, 0x1b, 0x14);
15733 
15734 	return 1;
15735 }
15736 
15737 /* additional initialization for auto-configuration model */
15738 static void alc861vd_auto_init(struct hda_codec *codec)
15739 {
15740 	struct alc_spec *spec = codec->spec;
15741 	alc861vd_auto_init_multi_out(codec);
15742 	alc861vd_auto_init_hp_out(codec);
15743 	alc861vd_auto_init_analog_input(codec);
15744 	alc861vd_auto_init_input_src(codec);
15745 	if (spec->unsol_event)
15746 		alc_inithook(codec);
15747 }
15748 
15749 enum {
15750 	ALC660VD_FIX_ASUS_GPIO1
15751 };
15752 
15753 /* reset GPIO1 */
15754 static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
15755 	{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
15756 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
15757 	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
15758 	{ }
15759 };
15760 
15761 static const struct alc_fixup alc861vd_fixups[] = {
15762 	[ALC660VD_FIX_ASUS_GPIO1] = {
15763 		.verbs = alc660vd_fix_asus_gpio1_verbs,
15764 	},
15765 };
15766 
15767 static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
15768 	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
15769 	{}
15770 };
15771 
15772 static int patch_alc861vd(struct hda_codec *codec)
15773 {
15774 	struct alc_spec *spec;
15775 	int err, board_config;
15776 
15777 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
15778 	if (spec == NULL)
15779 		return -ENOMEM;
15780 
15781 	codec->spec = spec;
15782 
15783 	board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
15784 						  alc861vd_models,
15785 						  alc861vd_cfg_tbl);
15786 
15787 	if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
15788 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15789 		       codec->chip_name);
15790 		board_config = ALC861VD_AUTO;
15791 	}
15792 
15793 	alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups);
15794 
15795 	if (board_config == ALC861VD_AUTO) {
15796 		/* automatic parse from the BIOS config */
15797 		err = alc861vd_parse_auto_config(codec);
15798 		if (err < 0) {
15799 			alc_free(codec);
15800 			return err;
15801 		} else if (!err) {
15802 			printk(KERN_INFO
15803 			       "hda_codec: Cannot set up configuration "
15804 			       "from BIOS.  Using base mode...\n");
15805 			board_config = ALC861VD_3ST;
15806 		}
15807 	}
15808 
15809 	err = snd_hda_attach_beep_device(codec, 0x23);
15810 	if (err < 0) {
15811 		alc_free(codec);
15812 		return err;
15813 	}
15814 
15815 	if (board_config != ALC861VD_AUTO)
15816 		setup_preset(codec, &alc861vd_presets[board_config]);
15817 
15818 	if (codec->vendor_id == 0x10ec0660) {
15819 		/* always turn on EAPD */
15820 		add_verb(spec, alc660vd_eapd_verbs);
15821 	}
15822 
15823 	spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
15824 	spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
15825 
15826 	spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
15827 	spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
15828 
15829 	if (!spec->adc_nids) {
15830 		spec->adc_nids = alc861vd_adc_nids;
15831 		spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
15832 	}
15833 	if (!spec->capsrc_nids)
15834 		spec->capsrc_nids = alc861vd_capsrc_nids;
15835 
15836 	set_capture_mixer(codec);
15837 	set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
15838 
15839 	spec->vmaster_nid = 0x02;
15840 
15841 	codec->patch_ops = alc_patch_ops;
15842 
15843 	if (board_config == ALC861VD_AUTO)
15844 		spec->init_hook = alc861vd_auto_init;
15845 #ifdef CONFIG_SND_HDA_POWER_SAVE
15846 	if (!spec->loopback.amplist)
15847 		spec->loopback.amplist = alc861vd_loopbacks;
15848 #endif
15849 	codec->proc_widget_hook = print_realtek_coef;
15850 
15851 	return 0;
15852 }
15853 
15854 /*
15855  * ALC662 support
15856  *
15857  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
15858  * configuration.  Each pin widget can choose any input DACs and a mixer.
15859  * Each ADC is connected from a mixer of all inputs.  This makes possible
15860  * 6-channel independent captures.
15861  *
15862  * In addition, an independent DAC for the multi-playback (not used in this
15863  * driver yet).
15864  */
15865 #define ALC662_DIGOUT_NID	0x06
15866 #define ALC662_DIGIN_NID	0x0a
15867 
15868 static hda_nid_t alc662_dac_nids[4] = {
15869 	/* front, rear, clfe, rear_surr */
15870 	0x02, 0x03, 0x04
15871 };
15872 
15873 static hda_nid_t alc272_dac_nids[2] = {
15874 	0x02, 0x03
15875 };
15876 
15877 static hda_nid_t alc662_adc_nids[2] = {
15878 	/* ADC1-2 */
15879 	0x09, 0x08
15880 };
15881 
15882 static hda_nid_t alc272_adc_nids[1] = {
15883 	/* ADC1-2 */
15884 	0x08,
15885 };
15886 
15887 static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
15888 static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
15889 
15890 
15891 /* input MUX */
15892 /* FIXME: should be a matrix-type input source selection */
15893 static struct hda_input_mux alc662_capture_source = {
15894 	.num_items = 4,
15895 	.items = {
15896 		{ "Mic", 0x0 },
15897 		{ "Front Mic", 0x1 },
15898 		{ "Line", 0x2 },
15899 		{ "CD", 0x4 },
15900 	},
15901 };
15902 
15903 static struct hda_input_mux alc662_lenovo_101e_capture_source = {
15904 	.num_items = 2,
15905 	.items = {
15906 		{ "Mic", 0x1 },
15907 		{ "Line", 0x2 },
15908 	},
15909 };
15910 
15911 static struct hda_input_mux alc663_capture_source = {
15912 	.num_items = 3,
15913 	.items = {
15914 		{ "Mic", 0x0 },
15915 		{ "Front Mic", 0x1 },
15916 		{ "Line", 0x2 },
15917 	},
15918 };
15919 
15920 #if 0 /* set to 1 for testing other input sources below */
15921 static struct hda_input_mux alc272_nc10_capture_source = {
15922 	.num_items = 16,
15923 	.items = {
15924 		{ "Autoselect Mic", 0x0 },
15925 		{ "Internal Mic", 0x1 },
15926 		{ "In-0x02", 0x2 },
15927 		{ "In-0x03", 0x3 },
15928 		{ "In-0x04", 0x4 },
15929 		{ "In-0x05", 0x5 },
15930 		{ "In-0x06", 0x6 },
15931 		{ "In-0x07", 0x7 },
15932 		{ "In-0x08", 0x8 },
15933 		{ "In-0x09", 0x9 },
15934 		{ "In-0x0a", 0x0a },
15935 		{ "In-0x0b", 0x0b },
15936 		{ "In-0x0c", 0x0c },
15937 		{ "In-0x0d", 0x0d },
15938 		{ "In-0x0e", 0x0e },
15939 		{ "In-0x0f", 0x0f },
15940 	},
15941 };
15942 #endif
15943 
15944 /*
15945  * 2ch mode
15946  */
15947 static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
15948 	{ 2, NULL }
15949 };
15950 
15951 /*
15952  * 2ch mode
15953  */
15954 static struct hda_verb alc662_3ST_ch2_init[] = {
15955 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
15956 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
15957 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
15958 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
15959 	{ } /* end */
15960 };
15961 
15962 /*
15963  * 6ch mode
15964  */
15965 static struct hda_verb alc662_3ST_ch6_init[] = {
15966 	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15967 	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
15968 	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
15969 	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15970 	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
15971 	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
15972 	{ } /* end */
15973 };
15974 
15975 static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
15976 	{ 2, alc662_3ST_ch2_init },
15977 	{ 6, alc662_3ST_ch6_init },
15978 };
15979 
15980 /*
15981  * 2ch mode
15982  */
15983 static struct hda_verb alc662_sixstack_ch6_init[] = {
15984 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15985 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15986 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15987 	{ } /* end */
15988 };
15989 
15990 /*
15991  * 6ch mode
15992  */
15993 static struct hda_verb alc662_sixstack_ch8_init[] = {
15994 	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15995 	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15996 	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15997 	{ } /* end */
15998 };
15999 
16000 static struct hda_channel_mode alc662_5stack_modes[2] = {
16001 	{ 2, alc662_sixstack_ch6_init },
16002 	{ 6, alc662_sixstack_ch8_init },
16003 };
16004 
16005 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
16006  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
16007  */
16008 
16009 static struct snd_kcontrol_new alc662_base_mixer[] = {
16010 	/* output mixer control */
16011 	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
16012 	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16013 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
16014 	HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16015 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16016 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16017 	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16018 	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16019 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16020 
16021 	/*Input mixer control */
16022 	HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
16023 	HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
16024 	HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
16025 	HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
16026 	HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
16027 	HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
16028 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
16029 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
16030 	{ } /* end */
16031 };
16032 
16033 static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
16034 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16035 	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16036 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16037 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16038 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16039 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16040 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16041 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16042 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16043 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16044 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16045 	{ } /* end */
16046 };
16047 
16048 static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
16049 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16050 	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16051 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16052 	HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16053 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16054 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16055 	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16056 	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16057 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16058 	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16059 	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16060 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16061 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16062 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16063 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16064 	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16065 	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16066 	{ } /* end */
16067 };
16068 
16069 static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
16070 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16071 	HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
16072 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16073 	HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
16074 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16075 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16076 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16077 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16078 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16079 	{ } /* end */
16080 };
16081 
16082 static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
16083 	HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16084 	ALC262_HIPPO_MASTER_SWITCH,
16085 
16086 	HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
16087 	HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16088 	HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16089 
16090 	HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
16091 	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16092 	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16093 	{ } /* end */
16094 };
16095 
16096 static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
16097 	ALC262_HIPPO_MASTER_SWITCH,
16098 	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16099 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16100 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16101 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16102 	HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
16103 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16104 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16105 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16106 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16107 	{ } /* end */
16108 };
16109 
16110 static struct hda_bind_ctls alc663_asus_bind_master_vol = {
16111 	.ops = &snd_hda_bind_vol,
16112 	.values = {
16113 		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16114 		HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
16115 		0
16116 	},
16117 };
16118 
16119 static struct hda_bind_ctls alc663_asus_one_bind_switch = {
16120 	.ops = &snd_hda_bind_sw,
16121 	.values = {
16122 		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16123 		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16124 		0
16125 	},
16126 };
16127 
16128 static struct snd_kcontrol_new alc663_m51va_mixer[] = {
16129 	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16130 	HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
16131 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16132 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16133 	{ } /* end */
16134 };
16135 
16136 static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
16137 	.ops = &snd_hda_bind_sw,
16138 	.values = {
16139 		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16140 		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16141 		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16142 		0
16143 	},
16144 };
16145 
16146 static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
16147 	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16148 	HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
16149 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16150 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16151 	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16152 	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16153 
16154 	{ } /* end */
16155 };
16156 
16157 static struct hda_bind_ctls alc663_asus_four_bind_switch = {
16158 	.ops = &snd_hda_bind_sw,
16159 	.values = {
16160 		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16161 		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16162 		HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16163 		0
16164 	},
16165 };
16166 
16167 static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
16168 	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16169 	HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
16170 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16171 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16172 	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16173 	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16174 	{ } /* end */
16175 };
16176 
16177 static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
16178 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16179 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16180 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16181 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16182 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16183 	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16184 	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16185 	{ } /* end */
16186 };
16187 
16188 static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
16189 	.ops = &snd_hda_bind_vol,
16190 	.values = {
16191 		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16192 		HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
16193 		0
16194 	},
16195 };
16196 
16197 static struct hda_bind_ctls alc663_asus_two_bind_switch = {
16198 	.ops = &snd_hda_bind_sw,
16199 	.values = {
16200 		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16201 		HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
16202 		0
16203 	},
16204 };
16205 
16206 static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
16207 	HDA_BIND_VOL("Master Playback Volume",
16208 				&alc663_asus_two_bind_master_vol),
16209 	HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16210 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16211 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16212 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16213 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16214 	{ } /* end */
16215 };
16216 
16217 static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
16218 	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16219 	HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16220 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16221 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16222 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16223 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16224 	{ } /* end */
16225 };
16226 
16227 static struct snd_kcontrol_new alc663_g71v_mixer[] = {
16228 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16229 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16230 	HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16231 	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16232 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16233 
16234 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16235 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16236 	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16237 	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16238 	{ } /* end */
16239 };
16240 
16241 static struct snd_kcontrol_new alc663_g50v_mixer[] = {
16242 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16243 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16244 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16245 
16246 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16247 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16248 	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16249 	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16250 	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16251 	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16252 	{ } /* end */
16253 };
16254 
16255 static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
16256 	.ops = &snd_hda_bind_sw,
16257 	.values = {
16258 		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16259 		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16260 		HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
16261 		HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16262 		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16263 		0
16264 	},
16265 };
16266 
16267 static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
16268 	.ops = &snd_hda_bind_sw,
16269 	.values = {
16270 		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16271 		HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
16272 		0
16273 	},
16274 };
16275 
16276 static struct snd_kcontrol_new alc663_mode7_mixer[] = {
16277 	HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
16278 	HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
16279 	HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
16280 	HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16281 	HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16282 	HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16283 	HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16284 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16285 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16286 	{ } /* end */
16287 };
16288 
16289 static struct snd_kcontrol_new alc663_mode8_mixer[] = {
16290 	HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
16291 	HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
16292 	HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
16293 	HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16294 	HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16295 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16296 	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16297 	{ } /* end */
16298 };
16299 
16300 
16301 static struct snd_kcontrol_new alc662_chmode_mixer[] = {
16302 	{
16303 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
16304 		.name = "Channel Mode",
16305 		.info = alc_ch_mode_info,
16306 		.get = alc_ch_mode_get,
16307 		.put = alc_ch_mode_put,
16308 	},
16309 	{ } /* end */
16310 };
16311 
16312 static struct hda_verb alc662_init_verbs[] = {
16313 	/* ADC: mute amp left and right */
16314 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16315 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16316 	/* Front mixer: unmute input/output amp left and right (volume = 0) */
16317 
16318 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16319 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16320 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16321 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16322 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16323 
16324 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16325 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16326 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16327 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16328 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16329 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16330 
16331 	/* Front Pin: output 0 (0x0c) */
16332 	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16333 	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16334 
16335 	/* Rear Pin: output 1 (0x0d) */
16336 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16337 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16338 
16339 	/* CLFE Pin: output 2 (0x0e) */
16340 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16341 	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16342 
16343 	/* Mic (rear) pin: input vref at 80% */
16344 	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16345 	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16346 	/* Front Mic pin: input vref at 80% */
16347 	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16348 	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16349 	/* Line In pin: input */
16350 	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16351 	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16352 	/* Line-2 In: Headphone output (output 0 - 0x0c) */
16353 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16354 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16355 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16356 	/* CD pin widget for input */
16357 	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16358 
16359 	/* FIXME: use matrix-type input source selection */
16360 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
16361 	/* Input mixer */
16362 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16363 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16364 
16365 	/* always trun on EAPD */
16366 	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16367 	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16368 
16369 	{ }
16370 };
16371 
16372 static struct hda_verb alc662_sue_init_verbs[] = {
16373 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16374 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
16375 	{}
16376 };
16377 
16378 static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
16379 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16380 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16381 	{}
16382 };
16383 
16384 /* Set Unsolicited Event*/
16385 static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
16386 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16387 	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16388 	{}
16389 };
16390 
16391 /*
16392  * generic initialization of ADC, input mixers and output mixers
16393  */
16394 static struct hda_verb alc662_auto_init_verbs[] = {
16395 	/*
16396 	 * Unmute ADC and set the default input to mic-in
16397 	 */
16398 	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16399 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16400 
16401 	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
16402 	 * mixer widget
16403 	 * Note: PASD motherboards uses the Line In 2 as the input for front
16404 	 * panel mic (mic 2)
16405 	 */
16406 	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
16407 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16408 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16409 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16410 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16411 	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16412 
16413 	/*
16414 	 * Set up output mixers (0x0c - 0x0f)
16415 	 */
16416 	/* set vol=0 to output mixers */
16417 	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16418 	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16419 	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16420 
16421 	/* set up input amps for analog loopback */
16422 	/* Amp Indices: DAC = 0, mixer = 1 */
16423 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16424 	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16425 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16426 	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16427 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16428 	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16429 
16430 
16431 	/* FIXME: use matrix-type input source selection */
16432 	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
16433 	/* Input mixer */
16434 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16435 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16436 	{ }
16437 };
16438 
16439 /* additional verbs for ALC663 */
16440 static struct hda_verb alc663_auto_init_verbs[] = {
16441 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16442 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16443 	{ }
16444 };
16445 
16446 static struct hda_verb alc663_m51va_init_verbs[] = {
16447 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16448 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16449 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16450 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16451 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16452 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16453 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16454 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16455 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16456 	{}
16457 };
16458 
16459 static struct hda_verb alc663_21jd_amic_init_verbs[] = {
16460 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16461 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16462 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16463 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16464 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16465 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16466 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16467 	{}
16468 };
16469 
16470 static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
16471 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16472 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16473 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16474 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
16475 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16476 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16477 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16478 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16479 	{}
16480 };
16481 
16482 static struct hda_verb alc663_15jd_amic_init_verbs[] = {
16483 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16484 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16485 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16486 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16487 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16488 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16489 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16490 	{}
16491 };
16492 
16493 static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
16494 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16495 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16496 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16497 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Headphone */
16498 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16499 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16500 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Headphone */
16501 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16502 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16503 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16504 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16505 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16506 	{}
16507 };
16508 
16509 static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
16510 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16511 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16512 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16513 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16514 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16515 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16516 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16517 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16518 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16519 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16520 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16521 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16522 	{}
16523 };
16524 
16525 static struct hda_verb alc663_g71v_init_verbs[] = {
16526 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16527 	/* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
16528 	/* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
16529 
16530 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16531 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16532 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
16533 
16534 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16535 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
16536 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
16537 	{}
16538 };
16539 
16540 static struct hda_verb alc663_g50v_init_verbs[] = {
16541 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16542 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16543 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
16544 
16545 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16546 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16547 	{}
16548 };
16549 
16550 static struct hda_verb alc662_ecs_init_verbs[] = {
16551 	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
16552 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16553 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16554 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16555 	{}
16556 };
16557 
16558 static struct hda_verb alc272_dell_zm1_init_verbs[] = {
16559 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16560 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16561 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16562 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16563 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16564 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16565 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16566 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16567 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16568 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16569 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16570 	{}
16571 };
16572 
16573 static struct hda_verb alc272_dell_init_verbs[] = {
16574 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16575 	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16576 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16577 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16578 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16579 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16580 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16581 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16582 	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16583 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16584 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16585 	{}
16586 };
16587 
16588 static struct hda_verb alc663_mode7_init_verbs[] = {
16589 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16590 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16591 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16592 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16593 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16594 	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16595 	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
16596 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16597 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16598 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16599 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16600 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16601 	{0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16602 	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16603 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16604 	{}
16605 };
16606 
16607 static struct hda_verb alc663_mode8_init_verbs[] = {
16608 	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16609 	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16610 	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16611 	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
16612 	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16613 	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16614 	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16615 	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16616 	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16617 	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16618 	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16619 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16620 	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16621 	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16622 	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16623 	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16624 	{}
16625 };
16626 
16627 static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
16628 	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
16629 	HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
16630 	{ } /* end */
16631 };
16632 
16633 static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
16634 	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
16635 	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
16636 	{ } /* end */
16637 };
16638 
16639 static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
16640 {
16641 	unsigned int present;
16642 	unsigned char bits;
16643 
16644 	present = snd_hda_jack_detect(codec, 0x14);
16645 	bits = present ? HDA_AMP_MUTE : 0;
16646 
16647 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16648 				 HDA_AMP_MUTE, bits);
16649 }
16650 
16651 static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
16652 {
16653 	unsigned int present;
16654 	unsigned char bits;
16655 
16656  	present = snd_hda_jack_detect(codec, 0x1b);
16657 	bits = present ? HDA_AMP_MUTE : 0;
16658 
16659 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16660 				 HDA_AMP_MUTE, bits);
16661 	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
16662 				 HDA_AMP_MUTE, bits);
16663 }
16664 
16665 static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
16666 					   unsigned int res)
16667 {
16668 	if ((res >> 26) == ALC880_HP_EVENT)
16669 		alc662_lenovo_101e_all_automute(codec);
16670 	if ((res >> 26) == ALC880_FRONT_EVENT)
16671 		alc662_lenovo_101e_ispeaker_automute(codec);
16672 }
16673 
16674 /* unsolicited event for HP jack sensing */
16675 static void alc662_eeepc_unsol_event(struct hda_codec *codec,
16676 				     unsigned int res)
16677 {
16678 	if ((res >> 26) == ALC880_MIC_EVENT)
16679 		alc_mic_automute(codec);
16680 	else
16681 		alc262_hippo_unsol_event(codec, res);
16682 }
16683 
16684 static void alc662_eeepc_setup(struct hda_codec *codec)
16685 {
16686 	struct alc_spec *spec = codec->spec;
16687 
16688 	alc262_hippo1_setup(codec);
16689 	spec->ext_mic.pin = 0x18;
16690 	spec->ext_mic.mux_idx = 0;
16691 	spec->int_mic.pin = 0x19;
16692 	spec->int_mic.mux_idx = 1;
16693 	spec->auto_mic = 1;
16694 }
16695 
16696 static void alc662_eeepc_inithook(struct hda_codec *codec)
16697 {
16698 	alc262_hippo_automute(codec);
16699 	alc_mic_automute(codec);
16700 }
16701 
16702 static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
16703 {
16704 	struct alc_spec *spec = codec->spec;
16705 
16706 	spec->autocfg.hp_pins[0] = 0x14;
16707 	spec->autocfg.speaker_pins[0] = 0x1b;
16708 }
16709 
16710 #define alc662_eeepc_ep20_inithook	alc262_hippo_master_update
16711 
16712 static void alc663_m51va_speaker_automute(struct hda_codec *codec)
16713 {
16714 	unsigned int present;
16715 	unsigned char bits;
16716 
16717 	present = snd_hda_jack_detect(codec, 0x21);
16718 	bits = present ? HDA_AMP_MUTE : 0;
16719 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16720 				AMP_IN_MUTE(0), bits);
16721 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16722 				AMP_IN_MUTE(0), bits);
16723 }
16724 
16725 static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
16726 {
16727 	unsigned int present;
16728 	unsigned char bits;
16729 
16730 	present = snd_hda_jack_detect(codec, 0x21);
16731 	bits = present ? HDA_AMP_MUTE : 0;
16732 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16733 				AMP_IN_MUTE(0), bits);
16734 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16735 				AMP_IN_MUTE(0), bits);
16736 	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
16737 				AMP_IN_MUTE(0), bits);
16738 	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
16739 				AMP_IN_MUTE(0), bits);
16740 }
16741 
16742 static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
16743 {
16744 	unsigned int present;
16745 	unsigned char bits;
16746 
16747 	present = snd_hda_jack_detect(codec, 0x15);
16748 	bits = present ? HDA_AMP_MUTE : 0;
16749 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16750 				AMP_IN_MUTE(0), bits);
16751 	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16752 				AMP_IN_MUTE(0), bits);
16753 	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
16754 				AMP_IN_MUTE(0), bits);
16755 	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
16756 				AMP_IN_MUTE(0), bits);
16757 }
16758 
16759 static void alc662_f5z_speaker_automute(struct hda_codec *codec)
16760 {
16761 	unsigned int present;
16762 	unsigned char bits;
16763 
16764 	present = snd_hda_jack_detect(codec, 0x1b);
16765 	bits = present ? 0 : PIN_OUT;
16766 	snd_hda_codec_write(codec, 0x14, 0,
16767 			 AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
16768 }
16769 
16770 static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
16771 {
16772 	unsigned int present1, present2;
16773 
16774 	present1 = snd_hda_jack_detect(codec, 0x21);
16775 	present2 = snd_hda_jack_detect(codec, 0x15);
16776 
16777 	if (present1 || present2) {
16778 		snd_hda_codec_write_cache(codec, 0x14, 0,
16779 			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
16780 	} else {
16781 		snd_hda_codec_write_cache(codec, 0x14, 0,
16782 			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
16783 	}
16784 }
16785 
16786 static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
16787 {
16788 	unsigned int present1, present2;
16789 
16790 	present1 = snd_hda_jack_detect(codec, 0x1b);
16791 	present2 = snd_hda_jack_detect(codec, 0x15);
16792 
16793 	if (present1 || present2) {
16794 		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16795 				AMP_IN_MUTE(0), AMP_IN_MUTE(0));
16796 		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16797 				AMP_IN_MUTE(0), AMP_IN_MUTE(0));
16798 	} else {
16799 		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16800 				AMP_IN_MUTE(0), 0);
16801 		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16802 				AMP_IN_MUTE(0), 0);
16803 	}
16804 }
16805 
16806 static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
16807 {
16808 	unsigned int present1, present2;
16809 
16810 	present1 = snd_hda_codec_read(codec, 0x1b, 0,
16811 			AC_VERB_GET_PIN_SENSE, 0)
16812 			& AC_PINSENSE_PRESENCE;
16813 	present2 = snd_hda_codec_read(codec, 0x21, 0,
16814 			AC_VERB_GET_PIN_SENSE, 0)
16815 			& AC_PINSENSE_PRESENCE;
16816 
16817 	if (present1 || present2) {
16818 		snd_hda_codec_write_cache(codec, 0x14, 0,
16819 			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
16820 		snd_hda_codec_write_cache(codec, 0x17, 0,
16821 			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
16822 	} else {
16823 		snd_hda_codec_write_cache(codec, 0x14, 0,
16824 			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
16825 		snd_hda_codec_write_cache(codec, 0x17, 0,
16826 			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
16827 	}
16828 }
16829 
16830 static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
16831 {
16832 	unsigned int present1, present2;
16833 
16834 	present1 = snd_hda_codec_read(codec, 0x21, 0,
16835 			AC_VERB_GET_PIN_SENSE, 0)
16836 			& AC_PINSENSE_PRESENCE;
16837 	present2 = snd_hda_codec_read(codec, 0x15, 0,
16838 			AC_VERB_GET_PIN_SENSE, 0)
16839 			& AC_PINSENSE_PRESENCE;
16840 
16841 	if (present1 || present2) {
16842 		snd_hda_codec_write_cache(codec, 0x14, 0,
16843 			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
16844 		snd_hda_codec_write_cache(codec, 0x17, 0,
16845 			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
16846 	} else {
16847 		snd_hda_codec_write_cache(codec, 0x14, 0,
16848 			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
16849 		snd_hda_codec_write_cache(codec, 0x17, 0,
16850 			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
16851 	}
16852 }
16853 
16854 static void alc663_m51va_unsol_event(struct hda_codec *codec,
16855 					   unsigned int res)
16856 {
16857 	switch (res >> 26) {
16858 	case ALC880_HP_EVENT:
16859 		alc663_m51va_speaker_automute(codec);
16860 		break;
16861 	case ALC880_MIC_EVENT:
16862 		alc_mic_automute(codec);
16863 		break;
16864 	}
16865 }
16866 
16867 static void alc663_m51va_setup(struct hda_codec *codec)
16868 {
16869 	struct alc_spec *spec = codec->spec;
16870 	spec->ext_mic.pin = 0x18;
16871 	spec->ext_mic.mux_idx = 0;
16872 	spec->int_mic.pin = 0x12;
16873 	spec->int_mic.mux_idx = 9;
16874 	spec->auto_mic = 1;
16875 }
16876 
16877 static void alc663_m51va_inithook(struct hda_codec *codec)
16878 {
16879 	alc663_m51va_speaker_automute(codec);
16880 	alc_mic_automute(codec);
16881 }
16882 
16883 /* ***************** Mode1 ******************************/
16884 #define alc663_mode1_unsol_event	alc663_m51va_unsol_event
16885 
16886 static void alc663_mode1_setup(struct hda_codec *codec)
16887 {
16888 	struct alc_spec *spec = codec->spec;
16889 	spec->ext_mic.pin = 0x18;
16890 	spec->ext_mic.mux_idx = 0;
16891 	spec->int_mic.pin = 0x19;
16892 	spec->int_mic.mux_idx = 1;
16893 	spec->auto_mic = 1;
16894 }
16895 
16896 #define alc663_mode1_inithook		alc663_m51va_inithook
16897 
16898 /* ***************** Mode2 ******************************/
16899 static void alc662_mode2_unsol_event(struct hda_codec *codec,
16900 					   unsigned int res)
16901 {
16902 	switch (res >> 26) {
16903 	case ALC880_HP_EVENT:
16904 		alc662_f5z_speaker_automute(codec);
16905 		break;
16906 	case ALC880_MIC_EVENT:
16907 		alc_mic_automute(codec);
16908 		break;
16909 	}
16910 }
16911 
16912 #define alc662_mode2_setup	alc663_mode1_setup
16913 
16914 static void alc662_mode2_inithook(struct hda_codec *codec)
16915 {
16916 	alc662_f5z_speaker_automute(codec);
16917 	alc_mic_automute(codec);
16918 }
16919 /* ***************** Mode3 ******************************/
16920 static void alc663_mode3_unsol_event(struct hda_codec *codec,
16921 					   unsigned int res)
16922 {
16923 	switch (res >> 26) {
16924 	case ALC880_HP_EVENT:
16925 		alc663_two_hp_m1_speaker_automute(codec);
16926 		break;
16927 	case ALC880_MIC_EVENT:
16928 		alc_mic_automute(codec);
16929 		break;
16930 	}
16931 }
16932 
16933 #define alc663_mode3_setup	alc663_mode1_setup
16934 
16935 static void alc663_mode3_inithook(struct hda_codec *codec)
16936 {
16937 	alc663_two_hp_m1_speaker_automute(codec);
16938 	alc_mic_automute(codec);
16939 }
16940 /* ***************** Mode4 ******************************/
16941 static void alc663_mode4_unsol_event(struct hda_codec *codec,
16942 					   unsigned int res)
16943 {
16944 	switch (res >> 26) {
16945 	case ALC880_HP_EVENT:
16946 		alc663_21jd_two_speaker_automute(codec);
16947 		break;
16948 	case ALC880_MIC_EVENT:
16949 		alc_mic_automute(codec);
16950 		break;
16951 	}
16952 }
16953 
16954 #define alc663_mode4_setup	alc663_mode1_setup
16955 
16956 static void alc663_mode4_inithook(struct hda_codec *codec)
16957 {
16958 	alc663_21jd_two_speaker_automute(codec);
16959 	alc_mic_automute(codec);
16960 }
16961 /* ***************** Mode5 ******************************/
16962 static void alc663_mode5_unsol_event(struct hda_codec *codec,
16963 					   unsigned int res)
16964 {
16965 	switch (res >> 26) {
16966 	case ALC880_HP_EVENT:
16967 		alc663_15jd_two_speaker_automute(codec);
16968 		break;
16969 	case ALC880_MIC_EVENT:
16970 		alc_mic_automute(codec);
16971 		break;
16972 	}
16973 }
16974 
16975 #define alc663_mode5_setup	alc663_mode1_setup
16976 
16977 static void alc663_mode5_inithook(struct hda_codec *codec)
16978 {
16979 	alc663_15jd_two_speaker_automute(codec);
16980 	alc_mic_automute(codec);
16981 }
16982 /* ***************** Mode6 ******************************/
16983 static void alc663_mode6_unsol_event(struct hda_codec *codec,
16984 					   unsigned int res)
16985 {
16986 	switch (res >> 26) {
16987 	case ALC880_HP_EVENT:
16988 		alc663_two_hp_m2_speaker_automute(codec);
16989 		break;
16990 	case ALC880_MIC_EVENT:
16991 		alc_mic_automute(codec);
16992 		break;
16993 	}
16994 }
16995 
16996 #define alc663_mode6_setup	alc663_mode1_setup
16997 
16998 static void alc663_mode6_inithook(struct hda_codec *codec)
16999 {
17000 	alc663_two_hp_m2_speaker_automute(codec);
17001 	alc_mic_automute(codec);
17002 }
17003 
17004 /* ***************** Mode7 ******************************/
17005 static void alc663_mode7_unsol_event(struct hda_codec *codec,
17006 					   unsigned int res)
17007 {
17008 	switch (res >> 26) {
17009 	case ALC880_HP_EVENT:
17010 		alc663_two_hp_m7_speaker_automute(codec);
17011 		break;
17012 	case ALC880_MIC_EVENT:
17013 		alc_mic_automute(codec);
17014 		break;
17015 	}
17016 }
17017 
17018 #define alc663_mode7_setup	alc663_mode1_setup
17019 
17020 static void alc663_mode7_inithook(struct hda_codec *codec)
17021 {
17022 	alc663_two_hp_m7_speaker_automute(codec);
17023 	alc_mic_automute(codec);
17024 }
17025 
17026 /* ***************** Mode8 ******************************/
17027 static void alc663_mode8_unsol_event(struct hda_codec *codec,
17028 					   unsigned int res)
17029 {
17030 	switch (res >> 26) {
17031 	case ALC880_HP_EVENT:
17032 		alc663_two_hp_m8_speaker_automute(codec);
17033 		break;
17034 	case ALC880_MIC_EVENT:
17035 		alc_mic_automute(codec);
17036 		break;
17037 	}
17038 }
17039 
17040 #define alc663_mode8_setup	alc663_m51va_setup
17041 
17042 static void alc663_mode8_inithook(struct hda_codec *codec)
17043 {
17044 	alc663_two_hp_m8_speaker_automute(codec);
17045 	alc_mic_automute(codec);
17046 }
17047 
17048 static void alc663_g71v_hp_automute(struct hda_codec *codec)
17049 {
17050 	unsigned int present;
17051 	unsigned char bits;
17052 
17053 	present = snd_hda_jack_detect(codec, 0x21);
17054 	bits = present ? HDA_AMP_MUTE : 0;
17055 	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17056 				 HDA_AMP_MUTE, bits);
17057 	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17058 				 HDA_AMP_MUTE, bits);
17059 }
17060 
17061 static void alc663_g71v_front_automute(struct hda_codec *codec)
17062 {
17063 	unsigned int present;
17064 	unsigned char bits;
17065 
17066 	present = snd_hda_jack_detect(codec, 0x15);
17067 	bits = present ? HDA_AMP_MUTE : 0;
17068 	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17069 				 HDA_AMP_MUTE, bits);
17070 }
17071 
17072 static void alc663_g71v_unsol_event(struct hda_codec *codec,
17073 					   unsigned int res)
17074 {
17075 	switch (res >> 26) {
17076 	case ALC880_HP_EVENT:
17077 		alc663_g71v_hp_automute(codec);
17078 		break;
17079 	case ALC880_FRONT_EVENT:
17080 		alc663_g71v_front_automute(codec);
17081 		break;
17082 	case ALC880_MIC_EVENT:
17083 		alc_mic_automute(codec);
17084 		break;
17085 	}
17086 }
17087 
17088 #define alc663_g71v_setup	alc663_m51va_setup
17089 
17090 static void alc663_g71v_inithook(struct hda_codec *codec)
17091 {
17092 	alc663_g71v_front_automute(codec);
17093 	alc663_g71v_hp_automute(codec);
17094 	alc_mic_automute(codec);
17095 }
17096 
17097 static void alc663_g50v_unsol_event(struct hda_codec *codec,
17098 					   unsigned int res)
17099 {
17100 	switch (res >> 26) {
17101 	case ALC880_HP_EVENT:
17102 		alc663_m51va_speaker_automute(codec);
17103 		break;
17104 	case ALC880_MIC_EVENT:
17105 		alc_mic_automute(codec);
17106 		break;
17107 	}
17108 }
17109 
17110 #define alc663_g50v_setup	alc663_m51va_setup
17111 
17112 static void alc663_g50v_inithook(struct hda_codec *codec)
17113 {
17114 	alc663_m51va_speaker_automute(codec);
17115 	alc_mic_automute(codec);
17116 }
17117 
17118 static struct snd_kcontrol_new alc662_ecs_mixer[] = {
17119 	HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17120 	ALC262_HIPPO_MASTER_SWITCH,
17121 
17122 	HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
17123 	HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
17124 	HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
17125 
17126 	HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
17127 	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17128 	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17129 	{ } /* end */
17130 };
17131 
17132 static struct snd_kcontrol_new alc272_nc10_mixer[] = {
17133 	/* Master Playback automatically created from Speaker and Headphone */
17134 	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17135 	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17136 	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17137 	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17138 
17139 	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17140 	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17141 	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
17142 
17143 	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17144 	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17145 	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
17146 	{ } /* end */
17147 };
17148 
17149 #ifdef CONFIG_SND_HDA_POWER_SAVE
17150 #define alc662_loopbacks	alc880_loopbacks
17151 #endif
17152 
17153 
17154 /* pcm configuration: identical with ALC880 */
17155 #define alc662_pcm_analog_playback	alc880_pcm_analog_playback
17156 #define alc662_pcm_analog_capture	alc880_pcm_analog_capture
17157 #define alc662_pcm_digital_playback	alc880_pcm_digital_playback
17158 #define alc662_pcm_digital_capture	alc880_pcm_digital_capture
17159 
17160 /*
17161  * configuration and preset
17162  */
17163 static const char *alc662_models[ALC662_MODEL_LAST] = {
17164 	[ALC662_3ST_2ch_DIG]	= "3stack-dig",
17165 	[ALC662_3ST_6ch_DIG]	= "3stack-6ch-dig",
17166 	[ALC662_3ST_6ch]	= "3stack-6ch",
17167 	[ALC662_5ST_DIG]	= "6stack-dig",
17168 	[ALC662_LENOVO_101E]	= "lenovo-101e",
17169 	[ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
17170 	[ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
17171 	[ALC662_ECS] = "ecs",
17172 	[ALC663_ASUS_M51VA] = "m51va",
17173 	[ALC663_ASUS_G71V] = "g71v",
17174 	[ALC663_ASUS_H13] = "h13",
17175 	[ALC663_ASUS_G50V] = "g50v",
17176 	[ALC663_ASUS_MODE1] = "asus-mode1",
17177 	[ALC662_ASUS_MODE2] = "asus-mode2",
17178 	[ALC663_ASUS_MODE3] = "asus-mode3",
17179 	[ALC663_ASUS_MODE4] = "asus-mode4",
17180 	[ALC663_ASUS_MODE5] = "asus-mode5",
17181 	[ALC663_ASUS_MODE6] = "asus-mode6",
17182 	[ALC663_ASUS_MODE7] = "asus-mode7",
17183 	[ALC663_ASUS_MODE8] = "asus-mode8",
17184 	[ALC272_DELL]		= "dell",
17185 	[ALC272_DELL_ZM1]	= "dell-zm1",
17186 	[ALC272_SAMSUNG_NC10]	= "samsung-nc10",
17187 	[ALC662_AUTO]		= "auto",
17188 };
17189 
17190 static struct snd_pci_quirk alc662_cfg_tbl[] = {
17191 	SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
17192 	SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
17193 	SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
17194 	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
17195 	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
17196 	SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
17197 	SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
17198 	SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
17199 	SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
17200 	SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
17201 	SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
17202 	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
17203 	SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
17204 	SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
17205 	SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
17206 	SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
17207 	SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
17208 	SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
17209 	SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
17210 	SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
17211 	SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
17212 	SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
17213 	SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
17214 	SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
17215 	SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
17216 	SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
17217 	SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
17218 	SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
17219 	SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
17220 	SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
17221 	SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
17222 	SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
17223 	SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
17224 	SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
17225 	SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
17226 	SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
17227 	/*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
17228 	SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
17229 	SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
17230 	SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
17231 	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
17232 	SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
17233 	SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
17234 	SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
17235 	SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
17236 	SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
17237 	SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
17238 	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
17239 	SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
17240 	SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
17241 	SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
17242 	/*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
17243 	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
17244 	SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
17245 	SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
17246 	SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
17247 	SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
17248 	SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
17249 	SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
17250 	SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
17251 	SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
17252 	SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
17253 		      ALC662_3ST_6ch_DIG),
17254 	SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB200", ALC663_ASUS_MODE4),
17255 	SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
17256 	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
17257 		      ALC662_3ST_6ch_DIG),
17258 	SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
17259 	SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
17260 	SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
17261 	SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
17262 					ALC662_3ST_6ch_DIG),
17263 	SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
17264 			   ALC663_ASUS_H13),
17265 	SND_PCI_QUIRK(0x8086, 0xd604, "Intel mobo", ALC662_3ST_2ch_DIG),
17266 	{}
17267 };
17268 
17269 static struct alc_config_preset alc662_presets[] = {
17270 	[ALC662_3ST_2ch_DIG] = {
17271 		.mixers = { alc662_3ST_2ch_mixer },
17272 		.init_verbs = { alc662_init_verbs },
17273 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17274 		.dac_nids = alc662_dac_nids,
17275 		.dig_out_nid = ALC662_DIGOUT_NID,
17276 		.dig_in_nid = ALC662_DIGIN_NID,
17277 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17278 		.channel_mode = alc662_3ST_2ch_modes,
17279 		.input_mux = &alc662_capture_source,
17280 	},
17281 	[ALC662_3ST_6ch_DIG] = {
17282 		.mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
17283 		.init_verbs = { alc662_init_verbs },
17284 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17285 		.dac_nids = alc662_dac_nids,
17286 		.dig_out_nid = ALC662_DIGOUT_NID,
17287 		.dig_in_nid = ALC662_DIGIN_NID,
17288 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17289 		.channel_mode = alc662_3ST_6ch_modes,
17290 		.need_dac_fix = 1,
17291 		.input_mux = &alc662_capture_source,
17292 	},
17293 	[ALC662_3ST_6ch] = {
17294 		.mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
17295 		.init_verbs = { alc662_init_verbs },
17296 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17297 		.dac_nids = alc662_dac_nids,
17298 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17299 		.channel_mode = alc662_3ST_6ch_modes,
17300 		.need_dac_fix = 1,
17301 		.input_mux = &alc662_capture_source,
17302 	},
17303 	[ALC662_5ST_DIG] = {
17304 		.mixers = { alc662_base_mixer, alc662_chmode_mixer },
17305 		.init_verbs = { alc662_init_verbs },
17306 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17307 		.dac_nids = alc662_dac_nids,
17308 		.dig_out_nid = ALC662_DIGOUT_NID,
17309 		.dig_in_nid = ALC662_DIGIN_NID,
17310 		.num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
17311 		.channel_mode = alc662_5stack_modes,
17312 		.input_mux = &alc662_capture_source,
17313 	},
17314 	[ALC662_LENOVO_101E] = {
17315 		.mixers = { alc662_lenovo_101e_mixer },
17316 		.init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
17317 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17318 		.dac_nids = alc662_dac_nids,
17319 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17320 		.channel_mode = alc662_3ST_2ch_modes,
17321 		.input_mux = &alc662_lenovo_101e_capture_source,
17322 		.unsol_event = alc662_lenovo_101e_unsol_event,
17323 		.init_hook = alc662_lenovo_101e_all_automute,
17324 	},
17325 	[ALC662_ASUS_EEEPC_P701] = {
17326 		.mixers = { alc662_eeepc_p701_mixer },
17327 		.init_verbs = { alc662_init_verbs,
17328 				alc662_eeepc_sue_init_verbs },
17329 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17330 		.dac_nids = alc662_dac_nids,
17331 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17332 		.channel_mode = alc662_3ST_2ch_modes,
17333 		.unsol_event = alc662_eeepc_unsol_event,
17334 		.setup = alc662_eeepc_setup,
17335 		.init_hook = alc662_eeepc_inithook,
17336 	},
17337 	[ALC662_ASUS_EEEPC_EP20] = {
17338 		.mixers = { alc662_eeepc_ep20_mixer,
17339 			    alc662_chmode_mixer },
17340 		.init_verbs = { alc662_init_verbs,
17341 				alc662_eeepc_ep20_sue_init_verbs },
17342 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17343 		.dac_nids = alc662_dac_nids,
17344 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17345 		.channel_mode = alc662_3ST_6ch_modes,
17346 		.input_mux = &alc662_lenovo_101e_capture_source,
17347 		.unsol_event = alc662_eeepc_unsol_event,
17348 		.setup = alc662_eeepc_ep20_setup,
17349 		.init_hook = alc662_eeepc_ep20_inithook,
17350 	},
17351 	[ALC662_ECS] = {
17352 		.mixers = { alc662_ecs_mixer },
17353 		.init_verbs = { alc662_init_verbs,
17354 				alc662_ecs_init_verbs },
17355 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17356 		.dac_nids = alc662_dac_nids,
17357 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17358 		.channel_mode = alc662_3ST_2ch_modes,
17359 		.unsol_event = alc662_eeepc_unsol_event,
17360 		.setup = alc662_eeepc_setup,
17361 		.init_hook = alc662_eeepc_inithook,
17362 	},
17363 	[ALC663_ASUS_M51VA] = {
17364 		.mixers = { alc663_m51va_mixer },
17365 		.init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
17366 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17367 		.dac_nids = alc662_dac_nids,
17368 		.dig_out_nid = ALC662_DIGOUT_NID,
17369 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17370 		.channel_mode = alc662_3ST_2ch_modes,
17371 		.unsol_event = alc663_m51va_unsol_event,
17372 		.setup = alc663_m51va_setup,
17373 		.init_hook = alc663_m51va_inithook,
17374 	},
17375 	[ALC663_ASUS_G71V] = {
17376 		.mixers = { alc663_g71v_mixer },
17377 		.init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
17378 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17379 		.dac_nids = alc662_dac_nids,
17380 		.dig_out_nid = ALC662_DIGOUT_NID,
17381 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17382 		.channel_mode = alc662_3ST_2ch_modes,
17383 		.unsol_event = alc663_g71v_unsol_event,
17384 		.setup = alc663_g71v_setup,
17385 		.init_hook = alc663_g71v_inithook,
17386 	},
17387 	[ALC663_ASUS_H13] = {
17388 		.mixers = { alc663_m51va_mixer },
17389 		.init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
17390 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17391 		.dac_nids = alc662_dac_nids,
17392 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17393 		.channel_mode = alc662_3ST_2ch_modes,
17394 		.unsol_event = alc663_m51va_unsol_event,
17395 		.init_hook = alc663_m51va_inithook,
17396 	},
17397 	[ALC663_ASUS_G50V] = {
17398 		.mixers = { alc663_g50v_mixer },
17399 		.init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
17400 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17401 		.dac_nids = alc662_dac_nids,
17402 		.dig_out_nid = ALC662_DIGOUT_NID,
17403 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17404 		.channel_mode = alc662_3ST_6ch_modes,
17405 		.input_mux = &alc663_capture_source,
17406 		.unsol_event = alc663_g50v_unsol_event,
17407 		.setup = alc663_g50v_setup,
17408 		.init_hook = alc663_g50v_inithook,
17409 	},
17410 	[ALC663_ASUS_MODE1] = {
17411 		.mixers = { alc663_m51va_mixer },
17412 		.cap_mixer = alc662_auto_capture_mixer,
17413 		.init_verbs = { alc662_init_verbs,
17414 				alc663_21jd_amic_init_verbs },
17415 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17416 		.hp_nid = 0x03,
17417 		.dac_nids = alc662_dac_nids,
17418 		.dig_out_nid = ALC662_DIGOUT_NID,
17419 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17420 		.channel_mode = alc662_3ST_2ch_modes,
17421 		.unsol_event = alc663_mode1_unsol_event,
17422 		.setup = alc663_mode1_setup,
17423 		.init_hook = alc663_mode1_inithook,
17424 	},
17425 	[ALC662_ASUS_MODE2] = {
17426 		.mixers = { alc662_1bjd_mixer },
17427 		.cap_mixer = alc662_auto_capture_mixer,
17428 		.init_verbs = { alc662_init_verbs,
17429 				alc662_1bjd_amic_init_verbs },
17430 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17431 		.dac_nids = alc662_dac_nids,
17432 		.dig_out_nid = ALC662_DIGOUT_NID,
17433 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17434 		.channel_mode = alc662_3ST_2ch_modes,
17435 		.unsol_event = alc662_mode2_unsol_event,
17436 		.setup = alc662_mode2_setup,
17437 		.init_hook = alc662_mode2_inithook,
17438 	},
17439 	[ALC663_ASUS_MODE3] = {
17440 		.mixers = { alc663_two_hp_m1_mixer },
17441 		.cap_mixer = alc662_auto_capture_mixer,
17442 		.init_verbs = { alc662_init_verbs,
17443 				alc663_two_hp_amic_m1_init_verbs },
17444 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17445 		.hp_nid = 0x03,
17446 		.dac_nids = alc662_dac_nids,
17447 		.dig_out_nid = ALC662_DIGOUT_NID,
17448 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17449 		.channel_mode = alc662_3ST_2ch_modes,
17450 		.unsol_event = alc663_mode3_unsol_event,
17451 		.setup = alc663_mode3_setup,
17452 		.init_hook = alc663_mode3_inithook,
17453 	},
17454 	[ALC663_ASUS_MODE4] = {
17455 		.mixers = { alc663_asus_21jd_clfe_mixer },
17456 		.cap_mixer = alc662_auto_capture_mixer,
17457 		.init_verbs = { alc662_init_verbs,
17458 				alc663_21jd_amic_init_verbs},
17459 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17460 		.hp_nid = 0x03,
17461 		.dac_nids = alc662_dac_nids,
17462 		.dig_out_nid = ALC662_DIGOUT_NID,
17463 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17464 		.channel_mode = alc662_3ST_2ch_modes,
17465 		.unsol_event = alc663_mode4_unsol_event,
17466 		.setup = alc663_mode4_setup,
17467 		.init_hook = alc663_mode4_inithook,
17468 	},
17469 	[ALC663_ASUS_MODE5] = {
17470 		.mixers = { alc663_asus_15jd_clfe_mixer },
17471 		.cap_mixer = alc662_auto_capture_mixer,
17472 		.init_verbs = { alc662_init_verbs,
17473 				alc663_15jd_amic_init_verbs },
17474 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17475 		.hp_nid = 0x03,
17476 		.dac_nids = alc662_dac_nids,
17477 		.dig_out_nid = ALC662_DIGOUT_NID,
17478 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17479 		.channel_mode = alc662_3ST_2ch_modes,
17480 		.unsol_event = alc663_mode5_unsol_event,
17481 		.setup = alc663_mode5_setup,
17482 		.init_hook = alc663_mode5_inithook,
17483 	},
17484 	[ALC663_ASUS_MODE6] = {
17485 		.mixers = { alc663_two_hp_m2_mixer },
17486 		.cap_mixer = alc662_auto_capture_mixer,
17487 		.init_verbs = { alc662_init_verbs,
17488 				alc663_two_hp_amic_m2_init_verbs },
17489 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17490 		.hp_nid = 0x03,
17491 		.dac_nids = alc662_dac_nids,
17492 		.dig_out_nid = ALC662_DIGOUT_NID,
17493 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17494 		.channel_mode = alc662_3ST_2ch_modes,
17495 		.unsol_event = alc663_mode6_unsol_event,
17496 		.setup = alc663_mode6_setup,
17497 		.init_hook = alc663_mode6_inithook,
17498 	},
17499 	[ALC663_ASUS_MODE7] = {
17500 		.mixers = { alc663_mode7_mixer },
17501 		.cap_mixer = alc662_auto_capture_mixer,
17502 		.init_verbs = { alc662_init_verbs,
17503 				alc663_mode7_init_verbs },
17504 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17505 		.hp_nid = 0x03,
17506 		.dac_nids = alc662_dac_nids,
17507 		.dig_out_nid = ALC662_DIGOUT_NID,
17508 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17509 		.channel_mode = alc662_3ST_2ch_modes,
17510 		.unsol_event = alc663_mode7_unsol_event,
17511 		.setup = alc663_mode7_setup,
17512 		.init_hook = alc663_mode7_inithook,
17513 	},
17514 	[ALC663_ASUS_MODE8] = {
17515 		.mixers = { alc663_mode8_mixer },
17516 		.cap_mixer = alc662_auto_capture_mixer,
17517 		.init_verbs = { alc662_init_verbs,
17518 				alc663_mode8_init_verbs },
17519 		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17520 		.hp_nid = 0x03,
17521 		.dac_nids = alc662_dac_nids,
17522 		.dig_out_nid = ALC662_DIGOUT_NID,
17523 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17524 		.channel_mode = alc662_3ST_2ch_modes,
17525 		.unsol_event = alc663_mode8_unsol_event,
17526 		.setup = alc663_mode8_setup,
17527 		.init_hook = alc663_mode8_inithook,
17528 	},
17529 	[ALC272_DELL] = {
17530 		.mixers = { alc663_m51va_mixer },
17531 		.cap_mixer = alc272_auto_capture_mixer,
17532 		.init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
17533 		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
17534 		.dac_nids = alc662_dac_nids,
17535 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17536 		.adc_nids = alc272_adc_nids,
17537 		.num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
17538 		.capsrc_nids = alc272_capsrc_nids,
17539 		.channel_mode = alc662_3ST_2ch_modes,
17540 		.unsol_event = alc663_m51va_unsol_event,
17541 		.setup = alc663_m51va_setup,
17542 		.init_hook = alc663_m51va_inithook,
17543 	},
17544 	[ALC272_DELL_ZM1] = {
17545 		.mixers = { alc663_m51va_mixer },
17546 		.cap_mixer = alc662_auto_capture_mixer,
17547 		.init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
17548 		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
17549 		.dac_nids = alc662_dac_nids,
17550 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17551 		.adc_nids = alc662_adc_nids,
17552 		.num_adc_nids = 1,
17553 		.capsrc_nids = alc662_capsrc_nids,
17554 		.channel_mode = alc662_3ST_2ch_modes,
17555 		.unsol_event = alc663_m51va_unsol_event,
17556 		.setup = alc663_m51va_setup,
17557 		.init_hook = alc663_m51va_inithook,
17558 	},
17559 	[ALC272_SAMSUNG_NC10] = {
17560 		.mixers = { alc272_nc10_mixer },
17561 		.init_verbs = { alc662_init_verbs,
17562 				alc663_21jd_amic_init_verbs },
17563 		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
17564 		.dac_nids = alc272_dac_nids,
17565 		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17566 		.channel_mode = alc662_3ST_2ch_modes,
17567 		/*.input_mux = &alc272_nc10_capture_source,*/
17568 		.unsol_event = alc663_mode4_unsol_event,
17569 		.setup = alc663_mode4_setup,
17570 		.init_hook = alc663_mode4_inithook,
17571 	},
17572 };
17573 
17574 
17575 /*
17576  * BIOS auto configuration
17577  */
17578 
17579 /* convert from MIX nid to DAC */
17580 static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
17581 {
17582 	if (nid == 0x0f)
17583 		return 0x02;
17584 	else if (nid >= 0x0c && nid <= 0x0e)
17585 		return nid - 0x0c + 0x02;
17586 	else
17587 		return 0;
17588 }
17589 
17590 /* get MIX nid connected to the given pin targeted to DAC */
17591 static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
17592 				   hda_nid_t dac)
17593 {
17594 	hda_nid_t mix[4];
17595 	int i, num;
17596 
17597 	num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
17598 	for (i = 0; i < num; i++) {
17599 		if (alc662_mix_to_dac(mix[i]) == dac)
17600 			return mix[i];
17601 	}
17602 	return 0;
17603 }
17604 
17605 /* look for an empty DAC slot */
17606 static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
17607 {
17608 	struct alc_spec *spec = codec->spec;
17609 	hda_nid_t srcs[5];
17610 	int i, j, num;
17611 
17612 	num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
17613 	if (num < 0)
17614 		return 0;
17615 	for (i = 0; i < num; i++) {
17616 		hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
17617 		if (!nid)
17618 			continue;
17619 		for (j = 0; j < spec->multiout.num_dacs; j++)
17620 			if (spec->multiout.dac_nids[j] == nid)
17621 				break;
17622 		if (j >= spec->multiout.num_dacs)
17623 			return nid;
17624 	}
17625 	return 0;
17626 }
17627 
17628 /* fill in the dac_nids table from the parsed pin configuration */
17629 static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
17630 				     const struct auto_pin_cfg *cfg)
17631 {
17632 	struct alc_spec *spec = codec->spec;
17633 	int i;
17634 	hda_nid_t dac;
17635 
17636 	spec->multiout.dac_nids = spec->private_dac_nids;
17637 	for (i = 0; i < cfg->line_outs; i++) {
17638 		dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
17639 		if (!dac)
17640 			continue;
17641 		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
17642 	}
17643 	return 0;
17644 }
17645 
17646 static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
17647 			      hda_nid_t nid, unsigned int chs)
17648 {
17649 	return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
17650 			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
17651 }
17652 
17653 static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
17654 			     hda_nid_t nid, unsigned int chs)
17655 {
17656 	return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
17657 			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
17658 }
17659 
17660 #define alc662_add_stereo_vol(spec, pfx, nid) \
17661 	alc662_add_vol_ctl(spec, pfx, nid, 3)
17662 #define alc662_add_stereo_sw(spec, pfx, nid) \
17663 	alc662_add_sw_ctl(spec, pfx, nid, 3)
17664 
17665 /* add playback controls from the parsed DAC table */
17666 static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
17667 					     const struct auto_pin_cfg *cfg)
17668 {
17669 	struct alc_spec *spec = codec->spec;
17670 	static const char *chname[4] = {
17671 		"Front", "Surround", NULL /*CLFE*/, "Side"
17672 	};
17673 	hda_nid_t nid, mix;
17674 	int i, err;
17675 
17676 	for (i = 0; i < cfg->line_outs; i++) {
17677 		nid = spec->multiout.dac_nids[i];
17678 		if (!nid)
17679 			continue;
17680 		mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
17681 		if (!mix)
17682 			continue;
17683 		if (i == 2) {
17684 			/* Center/LFE */
17685 			err = alc662_add_vol_ctl(spec, "Center", nid, 1);
17686 			if (err < 0)
17687 				return err;
17688 			err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
17689 			if (err < 0)
17690 				return err;
17691 			err = alc662_add_sw_ctl(spec, "Center", mix, 1);
17692 			if (err < 0)
17693 				return err;
17694 			err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
17695 			if (err < 0)
17696 				return err;
17697 		} else {
17698 			const char *pfx;
17699 			if (cfg->line_outs == 1 &&
17700 			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
17701 				if (cfg->hp_outs)
17702 					pfx = "Speaker";
17703 				else
17704 					pfx = "PCM";
17705 			} else
17706 				pfx = chname[i];
17707 			err = alc662_add_vol_ctl(spec, pfx, nid, 3);
17708 			if (err < 0)
17709 				return err;
17710 			if (cfg->line_outs == 1 &&
17711 			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
17712 				pfx = "Speaker";
17713 			err = alc662_add_sw_ctl(spec, pfx, mix, 3);
17714 			if (err < 0)
17715 				return err;
17716 		}
17717 	}
17718 	return 0;
17719 }
17720 
17721 /* add playback controls for speaker and HP outputs */
17722 /* return DAC nid if any new DAC is assigned */
17723 static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
17724 					const char *pfx)
17725 {
17726 	struct alc_spec *spec = codec->spec;
17727 	hda_nid_t nid, mix;
17728 	int err;
17729 
17730 	if (!pin)
17731 		return 0;
17732 	nid = alc662_look_for_dac(codec, pin);
17733 	if (!nid) {
17734 		/* the corresponding DAC is already occupied */
17735 		if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
17736 			return 0; /* no way */
17737 		/* create a switch only */
17738 		return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
17739 				   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
17740 	}
17741 
17742 	mix = alc662_dac_to_mix(codec, pin, nid);
17743 	if (!mix)
17744 		return 0;
17745 	err = alc662_add_vol_ctl(spec, pfx, nid, 3);
17746 	if (err < 0)
17747 		return err;
17748 	err = alc662_add_sw_ctl(spec, pfx, mix, 3);
17749 	if (err < 0)
17750 		return err;
17751 	return nid;
17752 }
17753 
17754 /* create playback/capture controls for input pins */
17755 #define alc662_auto_create_input_ctls \
17756 	alc882_auto_create_input_ctls
17757 
17758 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
17759 					      hda_nid_t nid, int pin_type,
17760 					      hda_nid_t dac)
17761 {
17762 	int i, num;
17763 	hda_nid_t srcs[4];
17764 
17765 	alc_set_pin_output(codec, nid, pin_type);
17766 	/* need the manual connection? */
17767 	num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
17768 	if (num <= 1)
17769 		return;
17770 	for (i = 0; i < num; i++) {
17771 		if (alc662_mix_to_dac(srcs[i]) != dac)
17772 			continue;
17773 		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
17774 		return;
17775 	}
17776 }
17777 
17778 static void alc662_auto_init_multi_out(struct hda_codec *codec)
17779 {
17780 	struct alc_spec *spec = codec->spec;
17781 	int pin_type = get_pin_type(spec->autocfg.line_out_type);
17782 	int i;
17783 
17784 	for (i = 0; i <= HDA_SIDE; i++) {
17785 		hda_nid_t nid = spec->autocfg.line_out_pins[i];
17786 		if (nid)
17787 			alc662_auto_set_output_and_unmute(codec, nid, pin_type,
17788 					spec->multiout.dac_nids[i]);
17789 	}
17790 }
17791 
17792 static void alc662_auto_init_hp_out(struct hda_codec *codec)
17793 {
17794 	struct alc_spec *spec = codec->spec;
17795 	hda_nid_t pin;
17796 
17797 	pin = spec->autocfg.hp_pins[0];
17798 	if (pin)
17799 		alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
17800 						  spec->multiout.hp_nid);
17801 	pin = spec->autocfg.speaker_pins[0];
17802 	if (pin)
17803 		alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
17804 					spec->multiout.extra_out_nid[0]);
17805 }
17806 
17807 #define ALC662_PIN_CD_NID		ALC880_PIN_CD_NID
17808 
17809 static void alc662_auto_init_analog_input(struct hda_codec *codec)
17810 {
17811 	struct alc_spec *spec = codec->spec;
17812 	int i;
17813 
17814 	for (i = 0; i < AUTO_PIN_LAST; i++) {
17815 		hda_nid_t nid = spec->autocfg.input_pins[i];
17816 		if (alc_is_input_pin(codec, nid)) {
17817 			alc_set_input_pin(codec, nid, i);
17818 			if (nid != ALC662_PIN_CD_NID &&
17819 			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
17820 				snd_hda_codec_write(codec, nid, 0,
17821 						    AC_VERB_SET_AMP_GAIN_MUTE,
17822 						    AMP_OUT_MUTE);
17823 		}
17824 	}
17825 }
17826 
17827 #define alc662_auto_init_input_src	alc882_auto_init_input_src
17828 
17829 static int alc662_parse_auto_config(struct hda_codec *codec)
17830 {
17831 	struct alc_spec *spec = codec->spec;
17832 	int err;
17833 	static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
17834 
17835 	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
17836 					   alc662_ignore);
17837 	if (err < 0)
17838 		return err;
17839 	if (!spec->autocfg.line_outs)
17840 		return 0; /* can't find valid BIOS pin config */
17841 
17842 	err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
17843 	if (err < 0)
17844 		return err;
17845 	err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
17846 	if (err < 0)
17847 		return err;
17848 	err = alc662_auto_create_extra_out(codec,
17849 					   spec->autocfg.speaker_pins[0],
17850 					   "Speaker");
17851 	if (err < 0)
17852 		return err;
17853 	if (err)
17854 		spec->multiout.extra_out_nid[0] = err;
17855 	err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
17856 					   "Headphone");
17857 	if (err < 0)
17858 		return err;
17859 	if (err)
17860 		spec->multiout.hp_nid = err;
17861 	err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
17862 	if (err < 0)
17863 		return err;
17864 
17865 	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
17866 
17867 	if (spec->autocfg.dig_outs)
17868 		spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
17869 
17870 	if (spec->kctls.list)
17871 		add_mixer(spec, spec->kctls.list);
17872 
17873 	spec->num_mux_defs = 1;
17874 	spec->input_mux = &spec->private_imux[0];
17875 
17876 	add_verb(spec, alc662_auto_init_verbs);
17877 	if (codec->vendor_id == 0x10ec0663)
17878 		add_verb(spec, alc663_auto_init_verbs);
17879 
17880 	err = alc_auto_add_mic_boost(codec);
17881 	if (err < 0)
17882 		return err;
17883 
17884 	alc_ssid_check(codec, 0x15, 0x1b, 0x14);
17885 
17886 	return 1;
17887 }
17888 
17889 /* additional initialization for auto-configuration model */
17890 static void alc662_auto_init(struct hda_codec *codec)
17891 {
17892 	struct alc_spec *spec = codec->spec;
17893 	alc662_auto_init_multi_out(codec);
17894 	alc662_auto_init_hp_out(codec);
17895 	alc662_auto_init_analog_input(codec);
17896 	alc662_auto_init_input_src(codec);
17897 	if (spec->unsol_event)
17898 		alc_inithook(codec);
17899 }
17900 
17901 static int patch_alc662(struct hda_codec *codec)
17902 {
17903 	struct alc_spec *spec;
17904 	int err, board_config;
17905 
17906 	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
17907 	if (!spec)
17908 		return -ENOMEM;
17909 
17910 	codec->spec = spec;
17911 
17912 	alc_fix_pll_init(codec, 0x20, 0x04, 15);
17913 
17914 	if (alc_read_coef_idx(codec, 0)==0x8020){
17915 		kfree(codec->chip_name);
17916 		codec->chip_name = kstrdup("ALC661", GFP_KERNEL);
17917 		if (!codec->chip_name) {
17918 			alc_free(codec);
17919 			return -ENOMEM;
17920 		}
17921 	}
17922 
17923 	board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
17924 						  alc662_models,
17925 			  	                  alc662_cfg_tbl);
17926 	if (board_config < 0) {
17927 		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
17928 		       codec->chip_name);
17929 		board_config = ALC662_AUTO;
17930 	}
17931 
17932 	if (board_config == ALC662_AUTO) {
17933 		/* automatic parse from the BIOS config */
17934 		err = alc662_parse_auto_config(codec);
17935 		if (err < 0) {
17936 			alc_free(codec);
17937 			return err;
17938 		} else if (!err) {
17939 			printk(KERN_INFO
17940 			       "hda_codec: Cannot set up configuration "
17941 			       "from BIOS.  Using base mode...\n");
17942 			board_config = ALC662_3ST_2ch_DIG;
17943 		}
17944 	}
17945 
17946 	err = snd_hda_attach_beep_device(codec, 0x1);
17947 	if (err < 0) {
17948 		alc_free(codec);
17949 		return err;
17950 	}
17951 
17952 	if (board_config != ALC662_AUTO)
17953 		setup_preset(codec, &alc662_presets[board_config]);
17954 
17955 	spec->stream_analog_playback = &alc662_pcm_analog_playback;
17956 	spec->stream_analog_capture = &alc662_pcm_analog_capture;
17957 
17958 	spec->stream_digital_playback = &alc662_pcm_digital_playback;
17959 	spec->stream_digital_capture = &alc662_pcm_digital_capture;
17960 
17961 	if (!spec->adc_nids) {
17962 		spec->adc_nids = alc662_adc_nids;
17963 		spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
17964 	}
17965 	if (!spec->capsrc_nids)
17966 		spec->capsrc_nids = alc662_capsrc_nids;
17967 
17968 	if (!spec->cap_mixer)
17969 		set_capture_mixer(codec);
17970 	if (codec->vendor_id == 0x10ec0662)
17971 		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
17972 	else
17973 		set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
17974 
17975 	spec->vmaster_nid = 0x02;
17976 
17977 	codec->patch_ops = alc_patch_ops;
17978 	if (board_config == ALC662_AUTO)
17979 		spec->init_hook = alc662_auto_init;
17980 #ifdef CONFIG_SND_HDA_POWER_SAVE
17981 	if (!spec->loopback.amplist)
17982 		spec->loopback.amplist = alc662_loopbacks;
17983 #endif
17984 	codec->proc_widget_hook = print_realtek_coef;
17985 
17986 	return 0;
17987 }
17988 
17989 static int patch_alc888(struct hda_codec *codec)
17990 {
17991 	if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
17992 		kfree(codec->chip_name);
17993 		codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
17994 		if (!codec->chip_name) {
17995 			alc_free(codec);
17996 			return -ENOMEM;
17997 		}
17998 		return patch_alc662(codec);
17999 	}
18000 	return patch_alc882(codec);
18001 }
18002 
18003 /*
18004  * patch entries
18005  */
18006 static struct hda_codec_preset snd_hda_preset_realtek[] = {
18007 	{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
18008 	{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
18009 	{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
18010 	{ .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
18011 	{ .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
18012 	{ .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
18013 	{ .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
18014 	{ .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
18015 	{ .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
18016 	  .patch = patch_alc861 },
18017 	{ .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
18018 	{ .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
18019 	{ .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
18020 	{ .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
18021 	  .patch = patch_alc882 },
18022 	{ .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
18023 	  .patch = patch_alc662 },
18024 	{ .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
18025 	{ .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
18026 	{ .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
18027 	{ .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
18028 	{ .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
18029 	  .patch = patch_alc882 },
18030 	{ .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
18031 	  .patch = patch_alc882 },
18032 	{ .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
18033 	{ .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
18034 	{ .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
18035 	  .patch = patch_alc882 },
18036 	{ .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
18037 	{ .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
18038 	{ .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
18039 	{} /* terminator */
18040 };
18041 
18042 MODULE_ALIAS("snd-hda-codec-id:10ec*");
18043 
18044 MODULE_LICENSE("GPL");
18045 MODULE_DESCRIPTION("Realtek HD-audio codec");
18046 
18047 static struct hda_codec_preset_list realtek_list = {
18048 	.preset = snd_hda_preset_realtek,
18049 	.owner = THIS_MODULE,
18050 };
18051 
18052 static int __init patch_realtek_init(void)
18053 {
18054 	return snd_hda_add_codec_preset(&realtek_list);
18055 }
18056 
18057 static void __exit patch_realtek_exit(void)
18058 {
18059 	snd_hda_delete_codec_preset(&realtek_list);
18060 }
18061 
18062 module_init(patch_realtek_init)
18063 module_exit(patch_realtek_exit)
18064