patch_realtek.c revision b99dba34dc9ec007a0c8be98c0333dd37463d2fd
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 */
41enum {
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 */
72enum {
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 */
90enum {
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 */
114enum {
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 */
131enum {
132	ALC269_BASIC,
133	ALC269_QUANTA_FL1,
134	ALC269_ASUS_EEEPC_P703,
135	ALC269_ASUS_EEEPC_P901,
136	ALC269_FUJITSU,
137	ALC269_LIFEBOOK,
138	ALC269_AUTO,
139	ALC269_MODEL_LAST /* last tag */
140};
141
142/* ALC861 models */
143enum {
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 */
157enum {
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 */
172enum {
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	ALC272_DELL,
192	ALC272_DELL_ZM1,
193	ALC272_SAMSUNG_NC10,
194	ALC662_AUTO,
195	ALC662_MODEL_LAST,
196};
197
198/* ALC882 models */
199enum {
200	ALC882_3ST_DIG,
201	ALC882_6ST_DIG,
202	ALC882_ARIMA,
203	ALC882_W2JC,
204	ALC882_TARGA,
205	ALC882_ASUS_A7J,
206	ALC882_ASUS_A7M,
207	ALC885_MACPRO,
208	ALC885_MBP3,
209	ALC885_MB5,
210	ALC885_IMAC24,
211	ALC883_3ST_2ch_DIG,
212	ALC883_3ST_6ch_DIG,
213	ALC883_3ST_6ch,
214	ALC883_6ST_DIG,
215	ALC883_TARGA_DIG,
216	ALC883_TARGA_2ch_DIG,
217	ALC883_TARGA_8ch_DIG,
218	ALC883_ACER,
219	ALC883_ACER_ASPIRE,
220	ALC888_ACER_ASPIRE_4930G,
221	ALC888_ACER_ASPIRE_6530G,
222	ALC888_ACER_ASPIRE_8930G,
223	ALC888_ACER_ASPIRE_7730G,
224	ALC883_MEDION,
225	ALC883_MEDION_MD2,
226	ALC883_LAPTOP_EAPD,
227	ALC883_LENOVO_101E_2ch,
228	ALC883_LENOVO_NB0763,
229	ALC888_LENOVO_MS7195_DIG,
230	ALC888_LENOVO_SKY,
231	ALC883_HAIER_W66,
232	ALC888_3ST_HP,
233	ALC888_6ST_DELL,
234	ALC883_MITAC,
235	ALC883_CLEVO_M540R,
236	ALC883_CLEVO_M720,
237	ALC883_FUJITSU_PI2515,
238	ALC888_FUJITSU_XA3530,
239	ALC883_3ST_6ch_INTEL,
240	ALC889A_INTEL,
241	ALC889_INTEL,
242	ALC888_ASUS_M90V,
243	ALC888_ASUS_EEE1601,
244	ALC889A_MB31,
245	ALC1200_ASUS_P5Q,
246	ALC883_SONY_VAIO_TT,
247	ALC882_AUTO,
248	ALC882_MODEL_LAST,
249};
250
251/* for GPIO Poll */
252#define GPIO_MASK	0x03
253
254/* extra amp-initialization sequence types */
255enum {
256	ALC_INIT_NONE,
257	ALC_INIT_DEFAULT,
258	ALC_INIT_GPIO1,
259	ALC_INIT_GPIO2,
260	ALC_INIT_GPIO3,
261};
262
263struct alc_mic_route {
264	hda_nid_t pin;
265	unsigned char mux_idx;
266	unsigned char amix_idx;
267};
268
269#define MUX_IDX_UNDEF	((unsigned char)-1)
270
271struct alc_spec {
272	/* codec parameterization */
273	struct snd_kcontrol_new *mixers[5];	/* mixer arrays */
274	unsigned int num_mixers;
275	struct snd_kcontrol_new *cap_mixer;	/* capture mixer */
276	unsigned int beep_amp;	/* beep amp value, set via set_beep_amp() */
277
278	const struct hda_verb *init_verbs[5];	/* initialization verbs
279						 * don't forget NULL
280						 * termination!
281						 */
282	unsigned int num_init_verbs;
283
284	char stream_name_analog[32];	/* analog PCM stream */
285	struct hda_pcm_stream *stream_analog_playback;
286	struct hda_pcm_stream *stream_analog_capture;
287	struct hda_pcm_stream *stream_analog_alt_playback;
288	struct hda_pcm_stream *stream_analog_alt_capture;
289
290	char stream_name_digital[32];	/* digital PCM stream */
291	struct hda_pcm_stream *stream_digital_playback;
292	struct hda_pcm_stream *stream_digital_capture;
293
294	/* playback */
295	struct hda_multi_out multiout;	/* playback set-up
296					 * max_channels, dacs must be set
297					 * dig_out_nid and hp_nid are optional
298					 */
299	hda_nid_t alt_dac_nid;
300	hda_nid_t slave_dig_outs[3];	/* optional - for auto-parsing */
301	int dig_out_type;
302
303	/* capture */
304	unsigned int num_adc_nids;
305	hda_nid_t *adc_nids;
306	hda_nid_t *capsrc_nids;
307	hda_nid_t dig_in_nid;		/* digital-in NID; optional */
308
309	/* capture source */
310	unsigned int num_mux_defs;
311	const struct hda_input_mux *input_mux;
312	unsigned int cur_mux[3];
313	struct alc_mic_route ext_mic;
314	struct alc_mic_route int_mic;
315
316	/* channel model */
317	const struct hda_channel_mode *channel_mode;
318	int num_channel_mode;
319	int need_dac_fix;
320	int const_channel_count;
321	int ext_channel_count;
322
323	/* PCM information */
324	struct hda_pcm pcm_rec[3];	/* used in alc_build_pcms() */
325
326	/* dynamic controls, init_verbs and input_mux */
327	struct auto_pin_cfg autocfg;
328	struct snd_array kctls;
329	struct hda_input_mux private_imux[3];
330	hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
331	hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
332	hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
333
334	/* hooks */
335	void (*init_hook)(struct hda_codec *codec);
336	void (*unsol_event)(struct hda_codec *codec, unsigned int res);
337
338	/* for pin sensing */
339	unsigned int sense_updated: 1;
340	unsigned int jack_present: 1;
341	unsigned int master_sw: 1;
342	unsigned int auto_mic:1;
343
344	/* other flags */
345	unsigned int no_analog :1; /* digital I/O only */
346	int init_amp;
347
348	/* for virtual master */
349	hda_nid_t vmaster_nid;
350#ifdef CONFIG_SND_HDA_POWER_SAVE
351	struct hda_loopback_check loopback;
352#endif
353
354	/* for PLL fix */
355	hda_nid_t pll_nid;
356	unsigned int pll_coef_idx, pll_coef_bit;
357};
358
359/*
360 * configuration template - to be copied to the spec instance
361 */
362struct alc_config_preset {
363	struct snd_kcontrol_new *mixers[5]; /* should be identical size
364					     * with spec
365					     */
366	struct snd_kcontrol_new *cap_mixer; /* capture mixer */
367	const struct hda_verb *init_verbs[5];
368	unsigned int num_dacs;
369	hda_nid_t *dac_nids;
370	hda_nid_t dig_out_nid;		/* optional */
371	hda_nid_t hp_nid;		/* optional */
372	hda_nid_t *slave_dig_outs;
373	unsigned int num_adc_nids;
374	hda_nid_t *adc_nids;
375	hda_nid_t *capsrc_nids;
376	hda_nid_t dig_in_nid;
377	unsigned int num_channel_mode;
378	const struct hda_channel_mode *channel_mode;
379	int need_dac_fix;
380	int const_channel_count;
381	unsigned int num_mux_defs;
382	const struct hda_input_mux *input_mux;
383	void (*unsol_event)(struct hda_codec *, unsigned int);
384	void (*setup)(struct hda_codec *);
385	void (*init_hook)(struct hda_codec *);
386#ifdef CONFIG_SND_HDA_POWER_SAVE
387	struct hda_amp_list *loopbacks;
388#endif
389};
390
391
392/*
393 * input MUX handling
394 */
395static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
396			     struct snd_ctl_elem_info *uinfo)
397{
398	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
399	struct alc_spec *spec = codec->spec;
400	unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
401	if (mux_idx >= spec->num_mux_defs)
402		mux_idx = 0;
403	return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
404}
405
406static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
407			    struct snd_ctl_elem_value *ucontrol)
408{
409	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
410	struct alc_spec *spec = codec->spec;
411	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
412
413	ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
414	return 0;
415}
416
417static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
418			    struct snd_ctl_elem_value *ucontrol)
419{
420	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
421	struct alc_spec *spec = codec->spec;
422	const struct hda_input_mux *imux;
423	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
424	unsigned int mux_idx;
425	hda_nid_t nid = spec->capsrc_nids ?
426		spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
427	unsigned int type;
428
429	mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
430	imux = &spec->input_mux[mux_idx];
431
432	type = get_wcaps_type(get_wcaps(codec, nid));
433	if (type == AC_WID_AUD_MIX) {
434		/* Matrix-mixer style (e.g. ALC882) */
435		unsigned int *cur_val = &spec->cur_mux[adc_idx];
436		unsigned int i, idx;
437
438		idx = ucontrol->value.enumerated.item[0];
439		if (idx >= imux->num_items)
440			idx = imux->num_items - 1;
441		if (*cur_val == idx)
442			return 0;
443		for (i = 0; i < imux->num_items; i++) {
444			unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
445			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
446						 imux->items[i].index,
447						 HDA_AMP_MUTE, v);
448		}
449		*cur_val = idx;
450		return 1;
451	} else {
452		/* MUX style (e.g. ALC880) */
453		return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
454					     &spec->cur_mux[adc_idx]);
455	}
456}
457
458/*
459 * channel mode setting
460 */
461static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
462			    struct snd_ctl_elem_info *uinfo)
463{
464	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
465	struct alc_spec *spec = codec->spec;
466	return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
467				    spec->num_channel_mode);
468}
469
470static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
471			   struct snd_ctl_elem_value *ucontrol)
472{
473	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
474	struct alc_spec *spec = codec->spec;
475	return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
476				   spec->num_channel_mode,
477				   spec->ext_channel_count);
478}
479
480static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
481			   struct snd_ctl_elem_value *ucontrol)
482{
483	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
484	struct alc_spec *spec = codec->spec;
485	int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
486				      spec->num_channel_mode,
487				      &spec->ext_channel_count);
488	if (err >= 0 && !spec->const_channel_count) {
489		spec->multiout.max_channels = spec->ext_channel_count;
490		if (spec->need_dac_fix)
491			spec->multiout.num_dacs = spec->multiout.max_channels / 2;
492	}
493	return err;
494}
495
496/*
497 * Control the mode of pin widget settings via the mixer.  "pc" is used
498 * instead of "%" to avoid consequences of accidently treating the % as
499 * being part of a format specifier.  Maximum allowed length of a value is
500 * 63 characters plus NULL terminator.
501 *
502 * Note: some retasking pin complexes seem to ignore requests for input
503 * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
504 * are requested.  Therefore order this list so that this behaviour will not
505 * cause problems when mixer clients move through the enum sequentially.
506 * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
507 * March 2006.
508 */
509static char *alc_pin_mode_names[] = {
510	"Mic 50pc bias", "Mic 80pc bias",
511	"Line in", "Line out", "Headphone out",
512};
513static unsigned char alc_pin_mode_values[] = {
514	PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
515};
516/* The control can present all 5 options, or it can limit the options based
517 * in the pin being assumed to be exclusively an input or an output pin.  In
518 * addition, "input" pins may or may not process the mic bias option
519 * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
520 * accept requests for bias as of chip versions up to March 2006) and/or
521 * wiring in the computer.
522 */
523#define ALC_PIN_DIR_IN              0x00
524#define ALC_PIN_DIR_OUT             0x01
525#define ALC_PIN_DIR_INOUT           0x02
526#define ALC_PIN_DIR_IN_NOMICBIAS    0x03
527#define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
528
529/* Info about the pin modes supported by the different pin direction modes.
530 * For each direction the minimum and maximum values are given.
531 */
532static signed char alc_pin_mode_dir_info[5][2] = {
533	{ 0, 2 },    /* ALC_PIN_DIR_IN */
534	{ 3, 4 },    /* ALC_PIN_DIR_OUT */
535	{ 0, 4 },    /* ALC_PIN_DIR_INOUT */
536	{ 2, 2 },    /* ALC_PIN_DIR_IN_NOMICBIAS */
537	{ 2, 4 },    /* ALC_PIN_DIR_INOUT_NOMICBIAS */
538};
539#define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
540#define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
541#define alc_pin_mode_n_items(_dir) \
542	(alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
543
544static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
545			     struct snd_ctl_elem_info *uinfo)
546{
547	unsigned int item_num = uinfo->value.enumerated.item;
548	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
549
550	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
551	uinfo->count = 1;
552	uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
553
554	if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
555		item_num = alc_pin_mode_min(dir);
556	strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
557	return 0;
558}
559
560static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
561			    struct snd_ctl_elem_value *ucontrol)
562{
563	unsigned int i;
564	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
565	hda_nid_t nid = kcontrol->private_value & 0xffff;
566	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
567	long *valp = ucontrol->value.integer.value;
568	unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
569						 AC_VERB_GET_PIN_WIDGET_CONTROL,
570						 0x00);
571
572	/* Find enumerated value for current pinctl setting */
573	i = alc_pin_mode_min(dir);
574	while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
575		i++;
576	*valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
577	return 0;
578}
579
580static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
581			    struct snd_ctl_elem_value *ucontrol)
582{
583	signed int change;
584	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
585	hda_nid_t nid = kcontrol->private_value & 0xffff;
586	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
587	long val = *ucontrol->value.integer.value;
588	unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
589						 AC_VERB_GET_PIN_WIDGET_CONTROL,
590						 0x00);
591
592	if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
593		val = alc_pin_mode_min(dir);
594
595	change = pinctl != alc_pin_mode_values[val];
596	if (change) {
597		/* Set pin mode to that requested */
598		snd_hda_codec_write_cache(codec, nid, 0,
599					  AC_VERB_SET_PIN_WIDGET_CONTROL,
600					  alc_pin_mode_values[val]);
601
602		/* Also enable the retasking pin's input/output as required
603		 * for the requested pin mode.  Enum values of 2 or less are
604		 * input modes.
605		 *
606		 * Dynamically switching the input/output buffers probably
607		 * reduces noise slightly (particularly on input) so we'll
608		 * do it.  However, having both input and output buffers
609		 * enabled simultaneously doesn't seem to be problematic if
610		 * this turns out to be necessary in the future.
611		 */
612		if (val <= 2) {
613			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
614						 HDA_AMP_MUTE, HDA_AMP_MUTE);
615			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
616						 HDA_AMP_MUTE, 0);
617		} else {
618			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
619						 HDA_AMP_MUTE, HDA_AMP_MUTE);
620			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
621						 HDA_AMP_MUTE, 0);
622		}
623	}
624	return change;
625}
626
627#define ALC_PIN_MODE(xname, nid, dir) \
628	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
629	  .info = alc_pin_mode_info, \
630	  .get = alc_pin_mode_get, \
631	  .put = alc_pin_mode_put, \
632	  .private_value = nid | (dir<<16) }
633
634/* A switch control for ALC260 GPIO pins.  Multiple GPIOs can be ganged
635 * together using a mask with more than one bit set.  This control is
636 * currently used only by the ALC260 test model.  At this stage they are not
637 * needed for any "production" models.
638 */
639#ifdef CONFIG_SND_DEBUG
640#define alc_gpio_data_info	snd_ctl_boolean_mono_info
641
642static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
643			     struct snd_ctl_elem_value *ucontrol)
644{
645	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
646	hda_nid_t nid = kcontrol->private_value & 0xffff;
647	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
648	long *valp = ucontrol->value.integer.value;
649	unsigned int val = snd_hda_codec_read(codec, nid, 0,
650					      AC_VERB_GET_GPIO_DATA, 0x00);
651
652	*valp = (val & mask) != 0;
653	return 0;
654}
655static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
656			     struct snd_ctl_elem_value *ucontrol)
657{
658	signed int change;
659	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
660	hda_nid_t nid = kcontrol->private_value & 0xffff;
661	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
662	long val = *ucontrol->value.integer.value;
663	unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
664						    AC_VERB_GET_GPIO_DATA,
665						    0x00);
666
667	/* Set/unset the masked GPIO bit(s) as needed */
668	change = (val == 0 ? 0 : mask) != (gpio_data & mask);
669	if (val == 0)
670		gpio_data &= ~mask;
671	else
672		gpio_data |= mask;
673	snd_hda_codec_write_cache(codec, nid, 0,
674				  AC_VERB_SET_GPIO_DATA, gpio_data);
675
676	return change;
677}
678#define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
679	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
680	  .info = alc_gpio_data_info, \
681	  .get = alc_gpio_data_get, \
682	  .put = alc_gpio_data_put, \
683	  .private_value = nid | (mask<<16) }
684#endif   /* CONFIG_SND_DEBUG */
685
686/* A switch control to allow the enabling of the digital IO pins on the
687 * ALC260.  This is incredibly simplistic; the intention of this control is
688 * to provide something in the test model allowing digital outputs to be
689 * identified if present.  If models are found which can utilise these
690 * outputs a more complete mixer control can be devised for those models if
691 * necessary.
692 */
693#ifdef CONFIG_SND_DEBUG
694#define alc_spdif_ctrl_info	snd_ctl_boolean_mono_info
695
696static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
697			      struct snd_ctl_elem_value *ucontrol)
698{
699	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
700	hda_nid_t nid = kcontrol->private_value & 0xffff;
701	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
702	long *valp = ucontrol->value.integer.value;
703	unsigned int val = snd_hda_codec_read(codec, nid, 0,
704					      AC_VERB_GET_DIGI_CONVERT_1, 0x00);
705
706	*valp = (val & mask) != 0;
707	return 0;
708}
709static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
710			      struct snd_ctl_elem_value *ucontrol)
711{
712	signed int change;
713	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
714	hda_nid_t nid = kcontrol->private_value & 0xffff;
715	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
716	long val = *ucontrol->value.integer.value;
717	unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
718						    AC_VERB_GET_DIGI_CONVERT_1,
719						    0x00);
720
721	/* Set/unset the masked control bit(s) as needed */
722	change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
723	if (val==0)
724		ctrl_data &= ~mask;
725	else
726		ctrl_data |= mask;
727	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
728				  ctrl_data);
729
730	return change;
731}
732#define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
733	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
734	  .info = alc_spdif_ctrl_info, \
735	  .get = alc_spdif_ctrl_get, \
736	  .put = alc_spdif_ctrl_put, \
737	  .private_value = nid | (mask<<16) }
738#endif   /* CONFIG_SND_DEBUG */
739
740/* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
741 * Again, this is only used in the ALC26x test models to help identify when
742 * the EAPD line must be asserted for features to work.
743 */
744#ifdef CONFIG_SND_DEBUG
745#define alc_eapd_ctrl_info	snd_ctl_boolean_mono_info
746
747static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
748			      struct snd_ctl_elem_value *ucontrol)
749{
750	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
751	hda_nid_t nid = kcontrol->private_value & 0xffff;
752	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
753	long *valp = ucontrol->value.integer.value;
754	unsigned int val = snd_hda_codec_read(codec, nid, 0,
755					      AC_VERB_GET_EAPD_BTLENABLE, 0x00);
756
757	*valp = (val & mask) != 0;
758	return 0;
759}
760
761static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
762			      struct snd_ctl_elem_value *ucontrol)
763{
764	int change;
765	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
766	hda_nid_t nid = kcontrol->private_value & 0xffff;
767	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
768	long val = *ucontrol->value.integer.value;
769	unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
770						    AC_VERB_GET_EAPD_BTLENABLE,
771						    0x00);
772
773	/* Set/unset the masked control bit(s) as needed */
774	change = (!val ? 0 : mask) != (ctrl_data & mask);
775	if (!val)
776		ctrl_data &= ~mask;
777	else
778		ctrl_data |= mask;
779	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
780				  ctrl_data);
781
782	return change;
783}
784
785#define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
786	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
787	  .info = alc_eapd_ctrl_info, \
788	  .get = alc_eapd_ctrl_get, \
789	  .put = alc_eapd_ctrl_put, \
790	  .private_value = nid | (mask<<16) }
791#endif   /* CONFIG_SND_DEBUG */
792
793/*
794 * set up the input pin config (depending on the given auto-pin type)
795 */
796static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
797			      int auto_pin_type)
798{
799	unsigned int val = PIN_IN;
800
801	if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
802		unsigned int pincap;
803		pincap = snd_hda_query_pin_caps(codec, nid);
804		pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
805		if (pincap & AC_PINCAP_VREF_80)
806			val = PIN_VREF80;
807		else if (pincap & AC_PINCAP_VREF_50)
808			val = PIN_VREF50;
809		else if (pincap & AC_PINCAP_VREF_100)
810			val = PIN_VREF100;
811		else if (pincap & AC_PINCAP_VREF_GRD)
812			val = PIN_VREFGRD;
813	}
814	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
815}
816
817/*
818 */
819static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
820{
821	if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
822		return;
823	spec->mixers[spec->num_mixers++] = mix;
824}
825
826static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
827{
828	if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
829		return;
830	spec->init_verbs[spec->num_init_verbs++] = verb;
831}
832
833#ifdef CONFIG_PROC_FS
834/*
835 * hook for proc
836 */
837static void print_realtek_coef(struct snd_info_buffer *buffer,
838			       struct hda_codec *codec, hda_nid_t nid)
839{
840	int coeff;
841
842	if (nid != 0x20)
843		return;
844	coeff = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
845	snd_iprintf(buffer, "  Processing Coefficient: 0x%02x\n", coeff);
846	coeff = snd_hda_codec_read(codec, nid, 0,
847				   AC_VERB_GET_COEF_INDEX, 0);
848	snd_iprintf(buffer, "  Coefficient Index: 0x%02x\n", coeff);
849}
850#else
851#define print_realtek_coef	NULL
852#endif
853
854/*
855 * set up from the preset table
856 */
857static void setup_preset(struct hda_codec *codec,
858			 const struct alc_config_preset *preset)
859{
860	struct alc_spec *spec = codec->spec;
861	int i;
862
863	for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
864		add_mixer(spec, preset->mixers[i]);
865	spec->cap_mixer = preset->cap_mixer;
866	for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
867	     i++)
868		add_verb(spec, preset->init_verbs[i]);
869
870	spec->channel_mode = preset->channel_mode;
871	spec->num_channel_mode = preset->num_channel_mode;
872	spec->need_dac_fix = preset->need_dac_fix;
873	spec->const_channel_count = preset->const_channel_count;
874
875	if (preset->const_channel_count)
876		spec->multiout.max_channels = preset->const_channel_count;
877	else
878		spec->multiout.max_channels = spec->channel_mode[0].channels;
879	spec->ext_channel_count = spec->channel_mode[0].channels;
880
881	spec->multiout.num_dacs = preset->num_dacs;
882	spec->multiout.dac_nids = preset->dac_nids;
883	spec->multiout.dig_out_nid = preset->dig_out_nid;
884	spec->multiout.slave_dig_outs = preset->slave_dig_outs;
885	spec->multiout.hp_nid = preset->hp_nid;
886
887	spec->num_mux_defs = preset->num_mux_defs;
888	if (!spec->num_mux_defs)
889		spec->num_mux_defs = 1;
890	spec->input_mux = preset->input_mux;
891
892	spec->num_adc_nids = preset->num_adc_nids;
893	spec->adc_nids = preset->adc_nids;
894	spec->capsrc_nids = preset->capsrc_nids;
895	spec->dig_in_nid = preset->dig_in_nid;
896
897	spec->unsol_event = preset->unsol_event;
898	spec->init_hook = preset->init_hook;
899#ifdef CONFIG_SND_HDA_POWER_SAVE
900	spec->loopback.amplist = preset->loopbacks;
901#endif
902
903	if (preset->setup)
904		preset->setup(codec);
905}
906
907/* Enable GPIO mask and set output */
908static struct hda_verb alc_gpio1_init_verbs[] = {
909	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
910	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
911	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
912	{ }
913};
914
915static struct hda_verb alc_gpio2_init_verbs[] = {
916	{0x01, AC_VERB_SET_GPIO_MASK, 0x02},
917	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
918	{0x01, AC_VERB_SET_GPIO_DATA, 0x02},
919	{ }
920};
921
922static struct hda_verb alc_gpio3_init_verbs[] = {
923	{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
924	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
925	{0x01, AC_VERB_SET_GPIO_DATA, 0x03},
926	{ }
927};
928
929/*
930 * Fix hardware PLL issue
931 * On some codecs, the analog PLL gating control must be off while
932 * the default value is 1.
933 */
934static void alc_fix_pll(struct hda_codec *codec)
935{
936	struct alc_spec *spec = codec->spec;
937	unsigned int val;
938
939	if (!spec->pll_nid)
940		return;
941	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
942			    spec->pll_coef_idx);
943	val = snd_hda_codec_read(codec, spec->pll_nid, 0,
944				 AC_VERB_GET_PROC_COEF, 0);
945	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
946			    spec->pll_coef_idx);
947	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
948			    val & ~(1 << spec->pll_coef_bit));
949}
950
951static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
952			     unsigned int coef_idx, unsigned int coef_bit)
953{
954	struct alc_spec *spec = codec->spec;
955	spec->pll_nid = nid;
956	spec->pll_coef_idx = coef_idx;
957	spec->pll_coef_bit = coef_bit;
958	alc_fix_pll(codec);
959}
960
961static void alc_automute_pin(struct hda_codec *codec)
962{
963	struct alc_spec *spec = codec->spec;
964	unsigned int present, pincap;
965	unsigned int nid = spec->autocfg.hp_pins[0];
966	int i;
967
968	pincap = snd_hda_query_pin_caps(codec, nid);
969	if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */
970		snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0);
971	present = snd_hda_codec_read(codec, nid, 0,
972				     AC_VERB_GET_PIN_SENSE, 0);
973	spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0;
974	for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
975		nid = spec->autocfg.speaker_pins[i];
976		if (!nid)
977			break;
978		snd_hda_codec_write(codec, nid, 0,
979				    AC_VERB_SET_PIN_WIDGET_CONTROL,
980				    spec->jack_present ? 0 : PIN_OUT);
981	}
982}
983
984static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
985				hda_nid_t nid)
986{
987	hda_nid_t conn[HDA_MAX_NUM_INPUTS];
988	int i, nums;
989
990	nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
991	for (i = 0; i < nums; i++)
992		if (conn[i] == nid)
993			return i;
994	return -1;
995}
996
997static void alc_mic_automute(struct hda_codec *codec)
998{
999	struct alc_spec *spec = codec->spec;
1000	struct alc_mic_route *dead, *alive;
1001	unsigned int present, type;
1002	hda_nid_t cap_nid;
1003
1004	if (!spec->auto_mic)
1005		return;
1006	if (!spec->int_mic.pin || !spec->ext_mic.pin)
1007		return;
1008	if (snd_BUG_ON(!spec->adc_nids))
1009		return;
1010
1011	cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1012
1013	present = snd_hda_codec_read(codec, spec->ext_mic.pin, 0,
1014				     AC_VERB_GET_PIN_SENSE, 0);
1015	present &= AC_PINSENSE_PRESENCE;
1016	if (present) {
1017		alive = &spec->ext_mic;
1018		dead = &spec->int_mic;
1019	} else {
1020		alive = &spec->int_mic;
1021		dead = &spec->ext_mic;
1022	}
1023
1024	type = get_wcaps_type(get_wcaps(codec, cap_nid));
1025	if (type == AC_WID_AUD_MIX) {
1026		/* Matrix-mixer style (e.g. ALC882) */
1027		snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1028					 alive->mux_idx,
1029					 HDA_AMP_MUTE, 0);
1030		snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1031					 dead->mux_idx,
1032					 HDA_AMP_MUTE, HDA_AMP_MUTE);
1033	} else {
1034		/* MUX style (e.g. ALC880) */
1035		snd_hda_codec_write_cache(codec, cap_nid, 0,
1036					  AC_VERB_SET_CONNECT_SEL,
1037					  alive->mux_idx);
1038	}
1039
1040	/* FIXME: analog mixer */
1041}
1042
1043/* unsolicited event for HP jack sensing */
1044static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1045{
1046	if (codec->vendor_id == 0x10ec0880)
1047		res >>= 28;
1048	else
1049		res >>= 26;
1050	switch (res) {
1051	case ALC880_HP_EVENT:
1052		alc_automute_pin(codec);
1053		break;
1054	case ALC880_MIC_EVENT:
1055		alc_mic_automute(codec);
1056		break;
1057	}
1058}
1059
1060static void alc_inithook(struct hda_codec *codec)
1061{
1062	alc_automute_pin(codec);
1063	alc_mic_automute(codec);
1064}
1065
1066/* additional initialization for ALC888 variants */
1067static void alc888_coef_init(struct hda_codec *codec)
1068{
1069	unsigned int tmp;
1070
1071	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1072	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1073	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1074	if ((tmp & 0xf0) == 0x20)
1075		/* alc888S-VC */
1076		snd_hda_codec_read(codec, 0x20, 0,
1077				   AC_VERB_SET_PROC_COEF, 0x830);
1078	 else
1079		 /* alc888-VB */
1080		 snd_hda_codec_read(codec, 0x20, 0,
1081				    AC_VERB_SET_PROC_COEF, 0x3030);
1082}
1083
1084static void alc889_coef_init(struct hda_codec *codec)
1085{
1086	unsigned int tmp;
1087
1088	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1089	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1090	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1091	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1092}
1093
1094static void alc_auto_init_amp(struct hda_codec *codec, int type)
1095{
1096	unsigned int tmp;
1097
1098	switch (type) {
1099	case ALC_INIT_GPIO1:
1100		snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1101		break;
1102	case ALC_INIT_GPIO2:
1103		snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1104		break;
1105	case ALC_INIT_GPIO3:
1106		snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1107		break;
1108	case ALC_INIT_DEFAULT:
1109		switch (codec->vendor_id) {
1110		case 0x10ec0260:
1111			snd_hda_codec_write(codec, 0x0f, 0,
1112					    AC_VERB_SET_EAPD_BTLENABLE, 2);
1113			snd_hda_codec_write(codec, 0x10, 0,
1114					    AC_VERB_SET_EAPD_BTLENABLE, 2);
1115			break;
1116		case 0x10ec0262:
1117		case 0x10ec0267:
1118		case 0x10ec0268:
1119		case 0x10ec0269:
1120		case 0x10ec0272:
1121		case 0x10ec0660:
1122		case 0x10ec0662:
1123		case 0x10ec0663:
1124		case 0x10ec0862:
1125		case 0x10ec0889:
1126			snd_hda_codec_write(codec, 0x14, 0,
1127					    AC_VERB_SET_EAPD_BTLENABLE, 2);
1128			snd_hda_codec_write(codec, 0x15, 0,
1129					    AC_VERB_SET_EAPD_BTLENABLE, 2);
1130			break;
1131		}
1132		switch (codec->vendor_id) {
1133		case 0x10ec0260:
1134			snd_hda_codec_write(codec, 0x1a, 0,
1135					    AC_VERB_SET_COEF_INDEX, 7);
1136			tmp = snd_hda_codec_read(codec, 0x1a, 0,
1137						 AC_VERB_GET_PROC_COEF, 0);
1138			snd_hda_codec_write(codec, 0x1a, 0,
1139					    AC_VERB_SET_COEF_INDEX, 7);
1140			snd_hda_codec_write(codec, 0x1a, 0,
1141					    AC_VERB_SET_PROC_COEF,
1142					    tmp | 0x2010);
1143			break;
1144		case 0x10ec0262:
1145		case 0x10ec0880:
1146		case 0x10ec0882:
1147		case 0x10ec0883:
1148		case 0x10ec0885:
1149		case 0x10ec0887:
1150		case 0x10ec0889:
1151			alc889_coef_init(codec);
1152			break;
1153		case 0x10ec0888:
1154			alc888_coef_init(codec);
1155			break;
1156		case 0x10ec0267:
1157		case 0x10ec0268:
1158			snd_hda_codec_write(codec, 0x20, 0,
1159					    AC_VERB_SET_COEF_INDEX, 7);
1160			tmp = snd_hda_codec_read(codec, 0x20, 0,
1161						 AC_VERB_GET_PROC_COEF, 0);
1162			snd_hda_codec_write(codec, 0x20, 0,
1163					    AC_VERB_SET_COEF_INDEX, 7);
1164			snd_hda_codec_write(codec, 0x20, 0,
1165					    AC_VERB_SET_PROC_COEF,
1166					    tmp | 0x3000);
1167			break;
1168		}
1169		break;
1170	}
1171}
1172
1173static void alc_init_auto_hp(struct hda_codec *codec)
1174{
1175	struct alc_spec *spec = codec->spec;
1176
1177	if (!spec->autocfg.hp_pins[0])
1178		return;
1179
1180	if (!spec->autocfg.speaker_pins[0]) {
1181		if (spec->autocfg.line_out_pins[0] &&
1182		    spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
1183			spec->autocfg.speaker_pins[0] =
1184				spec->autocfg.line_out_pins[0];
1185		else
1186			return;
1187	}
1188
1189	snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1190		    spec->autocfg.hp_pins[0]);
1191	snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1192				  AC_VERB_SET_UNSOLICITED_ENABLE,
1193				  AC_USRSP_EN | ALC880_HP_EVENT);
1194	spec->unsol_event = alc_sku_unsol_event;
1195}
1196
1197static void alc_init_auto_mic(struct hda_codec *codec)
1198{
1199	struct alc_spec *spec = codec->spec;
1200	struct auto_pin_cfg *cfg = &spec->autocfg;
1201	hda_nid_t fixed, ext;
1202	int i;
1203
1204	/* there must be only two mic inputs exclusively */
1205	for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1206		if (cfg->input_pins[i])
1207			return;
1208
1209	fixed = ext = 0;
1210	for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1211		hda_nid_t nid = cfg->input_pins[i];
1212		unsigned int defcfg;
1213		if (!nid)
1214			return;
1215		defcfg = snd_hda_codec_get_pincfg(codec, nid);
1216		switch (get_defcfg_connect(defcfg)) {
1217		case AC_JACK_PORT_FIXED:
1218			if (fixed)
1219				return; /* already occupied */
1220			fixed = nid;
1221			break;
1222		case AC_JACK_PORT_COMPLEX:
1223			if (ext)
1224				return; /* already occupied */
1225			ext = nid;
1226			break;
1227		default:
1228			return; /* invalid entry */
1229		}
1230	}
1231	if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1232		return; /* no unsol support */
1233	snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1234		    ext, fixed);
1235	spec->ext_mic.pin = ext;
1236	spec->int_mic.pin = fixed;
1237	spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1238	spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1239	spec->auto_mic = 1;
1240	snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1241				  AC_VERB_SET_UNSOLICITED_ENABLE,
1242				  AC_USRSP_EN | ALC880_MIC_EVENT);
1243	spec->unsol_event = alc_sku_unsol_event;
1244}
1245
1246/* check subsystem ID and set up device-specific initialization;
1247 * return 1 if initialized, 0 if invalid SSID
1248 */
1249/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1250 *	31 ~ 16 :	Manufacture ID
1251 *	15 ~ 8	:	SKU ID
1252 *	7  ~ 0	:	Assembly ID
1253 *	port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1254 */
1255static int alc_subsystem_id(struct hda_codec *codec,
1256			    hda_nid_t porta, hda_nid_t porte,
1257			    hda_nid_t portd)
1258{
1259	unsigned int ass, tmp, i;
1260	unsigned nid;
1261	struct alc_spec *spec = codec->spec;
1262
1263	ass = codec->subsystem_id & 0xffff;
1264	if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1265		goto do_sku;
1266
1267	/* invalid SSID, check the special NID pin defcfg instead */
1268	/*
1269	 * 31~30	: port connectivity
1270	 * 29~21	: reserve
1271	 * 20		: PCBEEP input
1272	 * 19~16	: Check sum (15:1)
1273	 * 15~1		: Custom
1274	 * 0		: override
1275	*/
1276	nid = 0x1d;
1277	if (codec->vendor_id == 0x10ec0260)
1278		nid = 0x17;
1279	ass = snd_hda_codec_get_pincfg(codec, nid);
1280	snd_printd("realtek: No valid SSID, "
1281		   "checking pincfg 0x%08x for NID 0x%x\n",
1282		   ass, nid);
1283	if (!(ass & 1) && !(ass & 0x100000))
1284		return 0;
1285	if ((ass >> 30) != 1)	/* no physical connection */
1286		return 0;
1287
1288	/* check sum */
1289	tmp = 0;
1290	for (i = 1; i < 16; i++) {
1291		if ((ass >> i) & 1)
1292			tmp++;
1293	}
1294	if (((ass >> 16) & 0xf) != tmp)
1295		return 0;
1296do_sku:
1297	snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1298		   ass & 0xffff, codec->vendor_id);
1299	/*
1300	 * 0 : override
1301	 * 1 :	Swap Jack
1302	 * 2 : 0 --> Desktop, 1 --> Laptop
1303	 * 3~5 : External Amplifier control
1304	 * 7~6 : Reserved
1305	*/
1306	tmp = (ass & 0x38) >> 3;	/* external Amp control */
1307	switch (tmp) {
1308	case 1:
1309		spec->init_amp = ALC_INIT_GPIO1;
1310		break;
1311	case 3:
1312		spec->init_amp = ALC_INIT_GPIO2;
1313		break;
1314	case 7:
1315		spec->init_amp = ALC_INIT_GPIO3;
1316		break;
1317	case 5:
1318		spec->init_amp = ALC_INIT_DEFAULT;
1319		break;
1320	}
1321
1322	/* is laptop or Desktop and enable the function "Mute internal speaker
1323	 * when the external headphone out jack is plugged"
1324	 */
1325	if (!(ass & 0x8000))
1326		return 1;
1327	/*
1328	 * 10~8 : Jack location
1329	 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1330	 * 14~13: Resvered
1331	 * 15   : 1 --> enable the function "Mute internal speaker
1332	 *	        when the external headphone out jack is plugged"
1333	 */
1334	if (!spec->autocfg.hp_pins[0]) {
1335		tmp = (ass >> 11) & 0x3;	/* HP to chassis */
1336		if (tmp == 0)
1337			spec->autocfg.hp_pins[0] = porta;
1338		else if (tmp == 1)
1339			spec->autocfg.hp_pins[0] = porte;
1340		else if (tmp == 2)
1341			spec->autocfg.hp_pins[0] = portd;
1342		else
1343			return 1;
1344	}
1345
1346	alc_init_auto_hp(codec);
1347	alc_init_auto_mic(codec);
1348	return 1;
1349}
1350
1351static void alc_ssid_check(struct hda_codec *codec,
1352			   hda_nid_t porta, hda_nid_t porte, hda_nid_t portd)
1353{
1354	if (!alc_subsystem_id(codec, porta, porte, portd)) {
1355		struct alc_spec *spec = codec->spec;
1356		snd_printd("realtek: "
1357			   "Enable default setup for auto mode as fallback\n");
1358		spec->init_amp = ALC_INIT_DEFAULT;
1359		alc_init_auto_hp(codec);
1360		alc_init_auto_mic(codec);
1361	}
1362}
1363
1364/*
1365 * Fix-up pin default configurations
1366 */
1367
1368struct alc_pincfg {
1369	hda_nid_t nid;
1370	u32 val;
1371};
1372
1373static void alc_fix_pincfg(struct hda_codec *codec,
1374			   const struct snd_pci_quirk *quirk,
1375			   const struct alc_pincfg **pinfix)
1376{
1377	const struct alc_pincfg *cfg;
1378
1379	quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1380	if (!quirk)
1381		return;
1382
1383	cfg = pinfix[quirk->value];
1384	for (; cfg->nid; cfg++)
1385		snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1386}
1387
1388/*
1389 * ALC888
1390 */
1391
1392/*
1393 * 2ch mode
1394 */
1395static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1396/* Mic-in jack as mic in */
1397	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1398	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1399/* Line-in jack as Line in */
1400	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1401	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1402/* Line-Out as Front */
1403	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1404	{ } /* end */
1405};
1406
1407/*
1408 * 4ch mode
1409 */
1410static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1411/* Mic-in jack as mic in */
1412	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1413	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1414/* Line-in jack as Surround */
1415	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1416	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1417/* Line-Out as Front */
1418	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1419	{ } /* end */
1420};
1421
1422/*
1423 * 6ch mode
1424 */
1425static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1426/* Mic-in jack as CLFE */
1427	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1428	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1429/* Line-in jack as Surround */
1430	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1431	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1432/* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1433	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1434	{ } /* end */
1435};
1436
1437/*
1438 * 8ch mode
1439 */
1440static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1441/* Mic-in jack as CLFE */
1442	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1443	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1444/* Line-in jack as Surround */
1445	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1446	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1447/* Line-Out as Side */
1448	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1449	{ } /* end */
1450};
1451
1452static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1453	{ 2, alc888_4ST_ch2_intel_init },
1454	{ 4, alc888_4ST_ch4_intel_init },
1455	{ 6, alc888_4ST_ch6_intel_init },
1456	{ 8, alc888_4ST_ch8_intel_init },
1457};
1458
1459/*
1460 * ALC888 Fujitsu Siemens Amillo xa3530
1461 */
1462
1463static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1464/* Front Mic: set to PIN_IN (empty by default) */
1465	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1466/* Connect Internal HP to Front */
1467	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1468	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1469	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1470/* Connect Bass HP to Front */
1471	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1472	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1473	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1474/* Connect Line-Out side jack (SPDIF) to Side */
1475	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1476	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1477	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1478/* Connect Mic jack to CLFE */
1479	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1480	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1481	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1482/* Connect Line-in jack to Surround */
1483	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1484	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1485	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1486/* Connect HP out jack to Front */
1487	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1488	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1489	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1490/* Enable unsolicited event for HP jack and Line-out jack */
1491	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1492	{0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1493	{}
1494};
1495
1496static void alc_automute_amp(struct hda_codec *codec)
1497{
1498	struct alc_spec *spec = codec->spec;
1499	unsigned int val, mute, pincap;
1500	hda_nid_t nid;
1501	int i;
1502
1503	spec->jack_present = 0;
1504	for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1505		nid = spec->autocfg.hp_pins[i];
1506		if (!nid)
1507			break;
1508		pincap = snd_hda_query_pin_caps(codec, nid);
1509		if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */
1510			snd_hda_codec_read(codec, nid, 0,
1511					   AC_VERB_SET_PIN_SENSE, 0);
1512		val = snd_hda_codec_read(codec, nid, 0,
1513					 AC_VERB_GET_PIN_SENSE, 0);
1514		if (val & AC_PINSENSE_PRESENCE) {
1515			spec->jack_present = 1;
1516			break;
1517		}
1518	}
1519
1520	mute = spec->jack_present ? HDA_AMP_MUTE : 0;
1521	/* Toggle internal speakers muting */
1522	for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1523		nid = spec->autocfg.speaker_pins[i];
1524		if (!nid)
1525			break;
1526		snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1527					 HDA_AMP_MUTE, mute);
1528	}
1529}
1530
1531static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1532					 unsigned int res)
1533{
1534	if (codec->vendor_id == 0x10ec0880)
1535		res >>= 28;
1536	else
1537		res >>= 26;
1538	if (res == ALC880_HP_EVENT)
1539		alc_automute_amp(codec);
1540}
1541
1542static void alc889_automute_setup(struct hda_codec *codec)
1543{
1544	struct alc_spec *spec = codec->spec;
1545
1546	spec->autocfg.hp_pins[0] = 0x15;
1547	spec->autocfg.speaker_pins[0] = 0x14;
1548	spec->autocfg.speaker_pins[1] = 0x16;
1549	spec->autocfg.speaker_pins[2] = 0x17;
1550	spec->autocfg.speaker_pins[3] = 0x19;
1551	spec->autocfg.speaker_pins[4] = 0x1a;
1552}
1553
1554static void alc889_intel_init_hook(struct hda_codec *codec)
1555{
1556	alc889_coef_init(codec);
1557	alc_automute_amp(codec);
1558}
1559
1560static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
1561{
1562	struct alc_spec *spec = codec->spec;
1563
1564	spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1565	spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1566	spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1567	spec->autocfg.speaker_pins[1] = 0x15; /* bass */
1568}
1569
1570/*
1571 * ALC888 Acer Aspire 4930G model
1572 */
1573
1574static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1575/* Front Mic: set to PIN_IN (empty by default) */
1576	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1577/* Unselect Front Mic by default in input mixer 3 */
1578	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1579/* Enable unsolicited event for HP jack */
1580	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1581/* Connect Internal HP to front */
1582	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1583	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1584	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1585/* Connect HP out to front */
1586	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1587	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1588	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1589	{ }
1590};
1591
1592/*
1593 * ALC888 Acer Aspire 6530G model
1594 */
1595
1596static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1597/* Bias voltage on for external mic port */
1598	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
1599/* Front Mic: set to PIN_IN (empty by default) */
1600	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1601/* Unselect Front Mic by default in input mixer 3 */
1602	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1603/* Enable unsolicited event for HP jack */
1604	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1605/* Enable speaker output */
1606	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1607	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1608/* Enable headphone output */
1609	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1610	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1611	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1612	{ }
1613};
1614
1615/*
1616 * ALC889 Acer Aspire 8930G model
1617 */
1618
1619static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
1620/* Front Mic: set to PIN_IN (empty by default) */
1621	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1622/* Unselect Front Mic by default in input mixer 3 */
1623	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1624/* Enable unsolicited event for HP jack */
1625	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1626/* Connect Internal Front to Front */
1627	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1628	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1629	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1630/* Connect Internal Rear to Rear */
1631	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1632	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1633	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1634/* Connect Internal CLFE to CLFE */
1635	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1636	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1637	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1638/* Connect HP out to Front */
1639	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1640	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1641	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1642/* Enable all DACs */
1643/*  DAC DISABLE/MUTE 1? */
1644/*  setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1645	{0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1646	{0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1647/*  DAC DISABLE/MUTE 2? */
1648/*  some bit here disables the other DACs. Init=0x4900 */
1649	{0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1650	{0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1651/* Enable amplifiers */
1652	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
1653	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
1654/* DMIC fix
1655 * This laptop has a stereo digital microphone. The mics are only 1cm apart
1656 * which makes the stereo useless. However, either the mic or the ALC889
1657 * makes the signal become a difference/sum signal instead of standard
1658 * stereo, which is annoying. So instead we flip this bit which makes the
1659 * codec replicate the sum signal to both channels, turning it into a
1660 * normal mono mic.
1661 */
1662/*  DMIC_CONTROL? Init value = 0x0001 */
1663	{0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1664	{0x20, AC_VERB_SET_PROC_COEF, 0x0003},
1665	{ }
1666};
1667
1668static struct hda_input_mux alc888_2_capture_sources[2] = {
1669	/* Front mic only available on one ADC */
1670	{
1671		.num_items = 4,
1672		.items = {
1673			{ "Mic", 0x0 },
1674			{ "Line", 0x2 },
1675			{ "CD", 0x4 },
1676			{ "Front Mic", 0xb },
1677		},
1678	},
1679	{
1680		.num_items = 3,
1681		.items = {
1682			{ "Mic", 0x0 },
1683			{ "Line", 0x2 },
1684			{ "CD", 0x4 },
1685		},
1686	}
1687};
1688
1689static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
1690	/* Interal mic only available on one ADC */
1691	{
1692		.num_items = 5,
1693		.items = {
1694			{ "Ext Mic", 0x0 },
1695			{ "Line In", 0x2 },
1696			{ "CD", 0x4 },
1697			{ "Input Mix", 0xa },
1698			{ "Int Mic", 0xb },
1699		},
1700	},
1701	{
1702		.num_items = 4,
1703		.items = {
1704			{ "Ext Mic", 0x0 },
1705			{ "Line In", 0x2 },
1706			{ "CD", 0x4 },
1707			{ "Input Mix", 0xa },
1708		},
1709	}
1710};
1711
1712static struct hda_input_mux alc889_capture_sources[3] = {
1713	/* Digital mic only available on first "ADC" */
1714	{
1715		.num_items = 5,
1716		.items = {
1717			{ "Mic", 0x0 },
1718			{ "Line", 0x2 },
1719			{ "CD", 0x4 },
1720			{ "Front Mic", 0xb },
1721			{ "Input Mix", 0xa },
1722		},
1723	},
1724	{
1725		.num_items = 4,
1726		.items = {
1727			{ "Mic", 0x0 },
1728			{ "Line", 0x2 },
1729			{ "CD", 0x4 },
1730			{ "Input Mix", 0xa },
1731		},
1732	},
1733	{
1734		.num_items = 4,
1735		.items = {
1736			{ "Mic", 0x0 },
1737			{ "Line", 0x2 },
1738			{ "CD", 0x4 },
1739			{ "Input Mix", 0xa },
1740		},
1741	}
1742};
1743
1744static struct snd_kcontrol_new alc888_base_mixer[] = {
1745	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1746	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1747	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1748	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1749	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1750		HDA_OUTPUT),
1751	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1752	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1753	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1754	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1755	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1756	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1757	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1758	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1759	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1760	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1761	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1762	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1763	{ } /* end */
1764};
1765
1766static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
1767{
1768	struct alc_spec *spec = codec->spec;
1769
1770	spec->autocfg.hp_pins[0] = 0x15;
1771	spec->autocfg.speaker_pins[0] = 0x14;
1772}
1773
1774static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
1775{
1776	struct alc_spec *spec = codec->spec;
1777
1778	spec->autocfg.hp_pins[0] = 0x15;
1779	spec->autocfg.speaker_pins[0] = 0x14;
1780	spec->autocfg.speaker_pins[1] = 0x16;
1781	spec->autocfg.speaker_pins[2] = 0x17;
1782}
1783
1784static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
1785{
1786	struct alc_spec *spec = codec->spec;
1787
1788	spec->autocfg.hp_pins[0] = 0x15;
1789	spec->autocfg.speaker_pins[0] = 0x14;
1790	spec->autocfg.speaker_pins[1] = 0x16;
1791	spec->autocfg.speaker_pins[2] = 0x1b;
1792}
1793
1794/*
1795 * ALC880 3-stack model
1796 *
1797 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
1798 * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
1799 *                 F-Mic = 0x1b, HP = 0x19
1800 */
1801
1802static hda_nid_t alc880_dac_nids[4] = {
1803	/* front, rear, clfe, rear_surr */
1804	0x02, 0x05, 0x04, 0x03
1805};
1806
1807static hda_nid_t alc880_adc_nids[3] = {
1808	/* ADC0-2 */
1809	0x07, 0x08, 0x09,
1810};
1811
1812/* The datasheet says the node 0x07 is connected from inputs,
1813 * but it shows zero connection in the real implementation on some devices.
1814 * Note: this is a 915GAV bug, fixed on 915GLV
1815 */
1816static hda_nid_t alc880_adc_nids_alt[2] = {
1817	/* ADC1-2 */
1818	0x08, 0x09,
1819};
1820
1821#define ALC880_DIGOUT_NID	0x06
1822#define ALC880_DIGIN_NID	0x0a
1823
1824static struct hda_input_mux alc880_capture_source = {
1825	.num_items = 4,
1826	.items = {
1827		{ "Mic", 0x0 },
1828		{ "Front Mic", 0x3 },
1829		{ "Line", 0x2 },
1830		{ "CD", 0x4 },
1831	},
1832};
1833
1834/* channel source setting (2/6 channel selection for 3-stack) */
1835/* 2ch mode */
1836static struct hda_verb alc880_threestack_ch2_init[] = {
1837	/* set line-in to input, mute it */
1838	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1839	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1840	/* set mic-in to input vref 80%, mute it */
1841	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1842	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1843	{ } /* end */
1844};
1845
1846/* 6ch mode */
1847static struct hda_verb alc880_threestack_ch6_init[] = {
1848	/* set line-in to output, unmute it */
1849	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1850	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1851	/* set mic-in to output, unmute it */
1852	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1853	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1854	{ } /* end */
1855};
1856
1857static struct hda_channel_mode alc880_threestack_modes[2] = {
1858	{ 2, alc880_threestack_ch2_init },
1859	{ 6, alc880_threestack_ch6_init },
1860};
1861
1862static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
1863	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1864	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1865	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1866	HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
1867	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1868	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1869	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1870	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1871	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1872	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1873	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1874	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1875	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1876	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1877	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
1878	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
1879	HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
1880	{
1881		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1882		.name = "Channel Mode",
1883		.info = alc_ch_mode_info,
1884		.get = alc_ch_mode_get,
1885		.put = alc_ch_mode_put,
1886	},
1887	{ } /* end */
1888};
1889
1890/* capture mixer elements */
1891static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
1892			    struct snd_ctl_elem_info *uinfo)
1893{
1894	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1895	struct alc_spec *spec = codec->spec;
1896	int err;
1897
1898	mutex_lock(&codec->control_mutex);
1899	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1900						      HDA_INPUT);
1901	err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
1902	mutex_unlock(&codec->control_mutex);
1903	return err;
1904}
1905
1906static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1907			   unsigned int size, unsigned int __user *tlv)
1908{
1909	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1910	struct alc_spec *spec = codec->spec;
1911	int err;
1912
1913	mutex_lock(&codec->control_mutex);
1914	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1915						      HDA_INPUT);
1916	err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
1917	mutex_unlock(&codec->control_mutex);
1918	return err;
1919}
1920
1921typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
1922			     struct snd_ctl_elem_value *ucontrol);
1923
1924static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
1925				 struct snd_ctl_elem_value *ucontrol,
1926				 getput_call_t func)
1927{
1928	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1929	struct alc_spec *spec = codec->spec;
1930	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1931	int err;
1932
1933	mutex_lock(&codec->control_mutex);
1934	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
1935						      3, 0, HDA_INPUT);
1936	err = func(kcontrol, ucontrol);
1937	mutex_unlock(&codec->control_mutex);
1938	return err;
1939}
1940
1941static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
1942			   struct snd_ctl_elem_value *ucontrol)
1943{
1944	return alc_cap_getput_caller(kcontrol, ucontrol,
1945				     snd_hda_mixer_amp_volume_get);
1946}
1947
1948static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
1949			   struct snd_ctl_elem_value *ucontrol)
1950{
1951	return alc_cap_getput_caller(kcontrol, ucontrol,
1952				     snd_hda_mixer_amp_volume_put);
1953}
1954
1955/* capture mixer elements */
1956#define alc_cap_sw_info		snd_ctl_boolean_stereo_info
1957
1958static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
1959			  struct snd_ctl_elem_value *ucontrol)
1960{
1961	return alc_cap_getput_caller(kcontrol, ucontrol,
1962				     snd_hda_mixer_amp_switch_get);
1963}
1964
1965static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
1966			  struct snd_ctl_elem_value *ucontrol)
1967{
1968	return alc_cap_getput_caller(kcontrol, ucontrol,
1969				     snd_hda_mixer_amp_switch_put);
1970}
1971
1972#define _DEFINE_CAPMIX(num) \
1973	{ \
1974		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1975		.name = "Capture Switch", \
1976		.access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
1977		.count = num, \
1978		.info = alc_cap_sw_info, \
1979		.get = alc_cap_sw_get, \
1980		.put = alc_cap_sw_put, \
1981	}, \
1982	{ \
1983		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1984		.name = "Capture Volume", \
1985		.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
1986			   SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
1987			   SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
1988		.count = num, \
1989		.info = alc_cap_vol_info, \
1990		.get = alc_cap_vol_get, \
1991		.put = alc_cap_vol_put, \
1992		.tlv = { .c = alc_cap_vol_tlv }, \
1993	}
1994
1995#define _DEFINE_CAPSRC(num) \
1996	{ \
1997		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1998		/* .name = "Capture Source", */ \
1999		.name = "Input Source", \
2000		.count = num, \
2001		.info = alc_mux_enum_info, \
2002		.get = alc_mux_enum_get, \
2003		.put = alc_mux_enum_put, \
2004	}
2005
2006#define DEFINE_CAPMIX(num) \
2007static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2008	_DEFINE_CAPMIX(num),				      \
2009	_DEFINE_CAPSRC(num),				      \
2010	{ } /* end */					      \
2011}
2012
2013#define DEFINE_CAPMIX_NOSRC(num) \
2014static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2015	_DEFINE_CAPMIX(num),					    \
2016	{ } /* end */						    \
2017}
2018
2019/* up to three ADCs */
2020DEFINE_CAPMIX(1);
2021DEFINE_CAPMIX(2);
2022DEFINE_CAPMIX(3);
2023DEFINE_CAPMIX_NOSRC(1);
2024DEFINE_CAPMIX_NOSRC(2);
2025DEFINE_CAPMIX_NOSRC(3);
2026
2027/*
2028 * ALC880 5-stack model
2029 *
2030 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2031 *      Side = 0x02 (0xd)
2032 * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2033 *                 Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2034 */
2035
2036/* additional mixers to alc880_three_stack_mixer */
2037static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2038	HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2039	HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2040	{ } /* end */
2041};
2042
2043/* channel source setting (6/8 channel selection for 5-stack) */
2044/* 6ch mode */
2045static struct hda_verb alc880_fivestack_ch6_init[] = {
2046	/* set line-in to input, mute it */
2047	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2048	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2049	{ } /* end */
2050};
2051
2052/* 8ch mode */
2053static struct hda_verb alc880_fivestack_ch8_init[] = {
2054	/* set line-in to output, unmute it */
2055	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2056	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2057	{ } /* end */
2058};
2059
2060static struct hda_channel_mode alc880_fivestack_modes[2] = {
2061	{ 6, alc880_fivestack_ch6_init },
2062	{ 8, alc880_fivestack_ch8_init },
2063};
2064
2065
2066/*
2067 * ALC880 6-stack model
2068 *
2069 * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2070 *      Side = 0x05 (0x0f)
2071 * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2072 *   Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2073 */
2074
2075static hda_nid_t alc880_6st_dac_nids[4] = {
2076	/* front, rear, clfe, rear_surr */
2077	0x02, 0x03, 0x04, 0x05
2078};
2079
2080static struct hda_input_mux alc880_6stack_capture_source = {
2081	.num_items = 4,
2082	.items = {
2083		{ "Mic", 0x0 },
2084		{ "Front Mic", 0x1 },
2085		{ "Line", 0x2 },
2086		{ "CD", 0x4 },
2087	},
2088};
2089
2090/* fixed 8-channels */
2091static struct hda_channel_mode alc880_sixstack_modes[1] = {
2092	{ 8, NULL },
2093};
2094
2095static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2096	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2097	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2098	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2099	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2100	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2101	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2102	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2103	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2104	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2105	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2106	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2107	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2108	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2109	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2110	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2111	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2112	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2113	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2114	{
2115		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2116		.name = "Channel Mode",
2117		.info = alc_ch_mode_info,
2118		.get = alc_ch_mode_get,
2119		.put = alc_ch_mode_put,
2120	},
2121	{ } /* end */
2122};
2123
2124
2125/*
2126 * ALC880 W810 model
2127 *
2128 * W810 has rear IO for:
2129 * Front (DAC 02)
2130 * Surround (DAC 03)
2131 * Center/LFE (DAC 04)
2132 * Digital out (06)
2133 *
2134 * The system also has a pair of internal speakers, and a headphone jack.
2135 * These are both connected to Line2 on the codec, hence to DAC 02.
2136 *
2137 * There is a variable resistor to control the speaker or headphone
2138 * volume. This is a hardware-only device without a software API.
2139 *
2140 * Plugging headphones in will disable the internal speakers. This is
2141 * implemented in hardware, not via the driver using jack sense. In
2142 * a similar fashion, plugging into the rear socket marked "front" will
2143 * disable both the speakers and headphones.
2144 *
2145 * For input, there's a microphone jack, and an "audio in" jack.
2146 * These may not do anything useful with this driver yet, because I
2147 * haven't setup any initialization verbs for these yet...
2148 */
2149
2150static hda_nid_t alc880_w810_dac_nids[3] = {
2151	/* front, rear/surround, clfe */
2152	0x02, 0x03, 0x04
2153};
2154
2155/* fixed 6 channels */
2156static struct hda_channel_mode alc880_w810_modes[1] = {
2157	{ 6, NULL }
2158};
2159
2160/* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2161static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2162	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2163	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2164	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2165	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2166	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2167	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2168	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2169	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2170	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2171	{ } /* end */
2172};
2173
2174
2175/*
2176 * Z710V model
2177 *
2178 * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
2179 * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2180 *                 Line = 0x1a
2181 */
2182
2183static hda_nid_t alc880_z71v_dac_nids[1] = {
2184	0x02
2185};
2186#define ALC880_Z71V_HP_DAC	0x03
2187
2188/* fixed 2 channels */
2189static struct hda_channel_mode alc880_2_jack_modes[1] = {
2190	{ 2, NULL }
2191};
2192
2193static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2194	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2195	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2196	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2197	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
2198	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2199	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2200	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2201	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2202	{ } /* end */
2203};
2204
2205
2206/*
2207 * ALC880 F1734 model
2208 *
2209 * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2210 * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2211 */
2212
2213static hda_nid_t alc880_f1734_dac_nids[1] = {
2214	0x03
2215};
2216#define ALC880_F1734_HP_DAC	0x02
2217
2218static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2219	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2220	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2221	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2222	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2223	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2224	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2225	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2226	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2227	{ } /* end */
2228};
2229
2230static struct hda_input_mux alc880_f1734_capture_source = {
2231	.num_items = 2,
2232	.items = {
2233		{ "Mic", 0x1 },
2234		{ "CD", 0x4 },
2235	},
2236};
2237
2238
2239/*
2240 * ALC880 ASUS model
2241 *
2242 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2243 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2244 *  Mic = 0x18, Line = 0x1a
2245 */
2246
2247#define alc880_asus_dac_nids	alc880_w810_dac_nids	/* identical with w810 */
2248#define alc880_asus_modes	alc880_threestack_modes	/* 2/6 channel mode */
2249
2250static struct snd_kcontrol_new alc880_asus_mixer[] = {
2251	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2252	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2253	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2254	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2255	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2256	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2257	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2258	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2259	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2260	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2261	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2262	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2263	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2264	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2265	{
2266		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2267		.name = "Channel Mode",
2268		.info = alc_ch_mode_info,
2269		.get = alc_ch_mode_get,
2270		.put = alc_ch_mode_put,
2271	},
2272	{ } /* end */
2273};
2274
2275/*
2276 * ALC880 ASUS W1V model
2277 *
2278 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2279 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2280 *  Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2281 */
2282
2283/* additional mixers to alc880_asus_mixer */
2284static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2285	HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2286	HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2287	{ } /* end */
2288};
2289
2290/* TCL S700 */
2291static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2292	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2293	HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2294	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2295	HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2296	HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2297	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2298	HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2299	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2300	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
2301	{ } /* end */
2302};
2303
2304/* Uniwill */
2305static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2306	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2307	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2308	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2309	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2310	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2311	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2312	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2313	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2314	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2315	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2316	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2317	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2318	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2319	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2320	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2321	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2322	{
2323		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2324		.name = "Channel Mode",
2325		.info = alc_ch_mode_info,
2326		.get = alc_ch_mode_get,
2327		.put = alc_ch_mode_put,
2328	},
2329	{ } /* end */
2330};
2331
2332static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2333	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2334	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2335	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2336	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2337	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2338	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2339	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2340	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2341	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2342	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2343	{ } /* end */
2344};
2345
2346static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2347	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2348	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2349	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2350	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2351	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2352	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2353	{ } /* end */
2354};
2355
2356/*
2357 * virtual master controls
2358 */
2359
2360/*
2361 * slave controls for virtual master
2362 */
2363static const char *alc_slave_vols[] = {
2364	"Front Playback Volume",
2365	"Surround Playback Volume",
2366	"Center Playback Volume",
2367	"LFE Playback Volume",
2368	"Side Playback Volume",
2369	"Headphone Playback Volume",
2370	"Speaker Playback Volume",
2371	"Mono Playback Volume",
2372	"Line-Out Playback Volume",
2373	"PCM Playback Volume",
2374	NULL,
2375};
2376
2377static const char *alc_slave_sws[] = {
2378	"Front Playback Switch",
2379	"Surround Playback Switch",
2380	"Center Playback Switch",
2381	"LFE Playback Switch",
2382	"Side Playback Switch",
2383	"Headphone Playback Switch",
2384	"Speaker Playback Switch",
2385	"Mono Playback Switch",
2386	"IEC958 Playback Switch",
2387	NULL,
2388};
2389
2390/*
2391 * build control elements
2392 */
2393
2394static void alc_free_kctls(struct hda_codec *codec);
2395
2396/* additional beep mixers; the actual parameters are overwritten at build */
2397static struct snd_kcontrol_new alc_beep_mixer[] = {
2398	HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2399	HDA_CODEC_MUTE("Beep Playback Switch", 0, 0, HDA_INPUT),
2400	{ } /* end */
2401};
2402
2403static int alc_build_controls(struct hda_codec *codec)
2404{
2405	struct alc_spec *spec = codec->spec;
2406	int err;
2407	int i;
2408
2409	for (i = 0; i < spec->num_mixers; i++) {
2410		err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2411		if (err < 0)
2412			return err;
2413	}
2414	if (spec->cap_mixer) {
2415		err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2416		if (err < 0)
2417			return err;
2418	}
2419	if (spec->multiout.dig_out_nid) {
2420		err = snd_hda_create_spdif_out_ctls(codec,
2421						    spec->multiout.dig_out_nid);
2422		if (err < 0)
2423			return err;
2424		if (!spec->no_analog) {
2425			err = snd_hda_create_spdif_share_sw(codec,
2426							    &spec->multiout);
2427			if (err < 0)
2428				return err;
2429			spec->multiout.share_spdif = 1;
2430		}
2431	}
2432	if (spec->dig_in_nid) {
2433		err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2434		if (err < 0)
2435			return err;
2436	}
2437
2438	/* create beep controls if needed */
2439	if (spec->beep_amp) {
2440		struct snd_kcontrol_new *knew;
2441		for (knew = alc_beep_mixer; knew->name; knew++) {
2442			struct snd_kcontrol *kctl;
2443			kctl = snd_ctl_new1(knew, codec);
2444			if (!kctl)
2445				return -ENOMEM;
2446			kctl->private_value = spec->beep_amp;
2447			err = snd_hda_ctl_add(codec, kctl);
2448			if (err < 0)
2449				return err;
2450		}
2451	}
2452
2453	/* if we have no master control, let's create it */
2454	if (!spec->no_analog &&
2455	    !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
2456		unsigned int vmaster_tlv[4];
2457		snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
2458					HDA_OUTPUT, vmaster_tlv);
2459		err = snd_hda_add_vmaster(codec, "Master Playback Volume",
2460					  vmaster_tlv, alc_slave_vols);
2461		if (err < 0)
2462			return err;
2463	}
2464	if (!spec->no_analog &&
2465	    !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2466		err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2467					  NULL, alc_slave_sws);
2468		if (err < 0)
2469			return err;
2470	}
2471
2472	alc_free_kctls(codec); /* no longer needed */
2473	return 0;
2474}
2475
2476
2477/*
2478 * initialize the codec volumes, etc
2479 */
2480
2481/*
2482 * generic initialization of ADC, input mixers and output mixers
2483 */
2484static struct hda_verb alc880_volume_init_verbs[] = {
2485	/*
2486	 * Unmute ADC0-2 and set the default input to mic-in
2487	 */
2488	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2489	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2490	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
2491	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2492	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
2493	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2494
2495	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2496	 * mixer widget
2497	 * Note: PASD motherboards uses the Line In 2 as the input for front
2498	 * panel mic (mic 2)
2499	 */
2500	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
2501	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2502	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2503	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2504	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2505	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2506	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2507	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2508
2509	/*
2510	 * Set up output mixers (0x0c - 0x0f)
2511	 */
2512	/* set vol=0 to output mixers */
2513	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2514	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2515	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2516	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2517	/* set up input amps for analog loopback */
2518	/* Amp Indices: DAC = 0, mixer = 1 */
2519	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2520	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2521	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2522	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2523	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2524	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2525	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2526	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2527
2528	{ }
2529};
2530
2531/*
2532 * 3-stack pin configuration:
2533 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2534 */
2535static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2536	/*
2537	 * preset connection lists of input pins
2538	 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2539	 */
2540	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2541	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2542	{0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2543
2544	/*
2545	 * Set pin mode and muting
2546	 */
2547	/* set front pin widgets 0x14 for output */
2548	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2549	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2550	/* Mic1 (rear panel) pin widget for input and vref at 80% */
2551	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2552	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2553	/* Mic2 (as headphone out) for HP output */
2554	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2555	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2556	/* Line In pin widget for input */
2557	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2558	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2559	/* Line2 (as front mic) pin widget for input and vref at 80% */
2560	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2561	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2562	/* CD pin widget for input */
2563	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2564
2565	{ }
2566};
2567
2568/*
2569 * 5-stack pin configuration:
2570 * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2571 * line-in/side = 0x1a, f-mic = 0x1b
2572 */
2573static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2574	/*
2575	 * preset connection lists of input pins
2576	 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2577	 */
2578	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2579	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
2580
2581	/*
2582	 * Set pin mode and muting
2583	 */
2584	/* set pin widgets 0x14-0x17 for output */
2585	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2586	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2587	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2588	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2589	/* unmute pins for output (no gain on this amp) */
2590	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2591	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2592	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2593	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2594
2595	/* Mic1 (rear panel) pin widget for input and vref at 80% */
2596	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2597	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2598	/* Mic2 (as headphone out) for HP output */
2599	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2600	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2601	/* Line In pin widget for input */
2602	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2603	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2604	/* Line2 (as front mic) pin widget for input and vref at 80% */
2605	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2606	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2607	/* CD pin widget for input */
2608	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2609
2610	{ }
2611};
2612
2613/*
2614 * W810 pin configuration:
2615 * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2616 */
2617static struct hda_verb alc880_pin_w810_init_verbs[] = {
2618	/* hphone/speaker input selector: front DAC */
2619	{0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
2620
2621	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2622	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2623	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2624	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2625	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2626	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2627
2628	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2629	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2630
2631	{ }
2632};
2633
2634/*
2635 * Z71V pin configuration:
2636 * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2637 */
2638static struct hda_verb alc880_pin_z71v_init_verbs[] = {
2639	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2640	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2641	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2642	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2643
2644	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2645	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2646	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2647	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2648
2649	{ }
2650};
2651
2652/*
2653 * 6-stack pin configuration:
2654 * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2655 * f-mic = 0x19, line = 0x1a, HP = 0x1b
2656 */
2657static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2658	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2659
2660	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2661	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2662	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2663	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2664	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2665	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2666	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2667	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2668
2669	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2670	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2671	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2672	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2673	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2674	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2675	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2676	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2677	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2678
2679	{ }
2680};
2681
2682/*
2683 * Uniwill pin configuration:
2684 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
2685 * line = 0x1a
2686 */
2687static struct hda_verb alc880_uniwill_init_verbs[] = {
2688	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2689
2690	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2691	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2692	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2693	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2694	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2695	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2696	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2697	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2698	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2699	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2700	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2701	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2702	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2703	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2704
2705	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2706	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2707	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2708	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2709	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2710	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2711	/* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
2712	/* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
2713	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2714
2715	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2716	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
2717
2718	{ }
2719};
2720
2721/*
2722* Uniwill P53
2723* HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
2724 */
2725static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
2726	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2727
2728	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2729	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2730	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2731	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2732	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2733	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2734	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2735	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2736	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2737	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2738	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2739	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2740
2741	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2742	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2743	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2744	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2745	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2746	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2747
2748	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2749	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
2750
2751	{ }
2752};
2753
2754static struct hda_verb alc880_beep_init_verbs[] = {
2755	{ 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
2756	{ }
2757};
2758
2759/* auto-toggle front mic */
2760static void alc880_uniwill_mic_automute(struct hda_codec *codec)
2761{
2762 	unsigned int present;
2763	unsigned char bits;
2764
2765	present = snd_hda_codec_read(codec, 0x18, 0,
2766				     AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
2767	bits = present ? HDA_AMP_MUTE : 0;
2768	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
2769}
2770
2771static void alc880_uniwill_setup(struct hda_codec *codec)
2772{
2773	struct alc_spec *spec = codec->spec;
2774
2775	spec->autocfg.hp_pins[0] = 0x14;
2776	spec->autocfg.speaker_pins[0] = 0x15;
2777	spec->autocfg.speaker_pins[0] = 0x16;
2778}
2779
2780static void alc880_uniwill_init_hook(struct hda_codec *codec)
2781{
2782	alc_automute_amp(codec);
2783	alc880_uniwill_mic_automute(codec);
2784}
2785
2786static void alc880_uniwill_unsol_event(struct hda_codec *codec,
2787				       unsigned int res)
2788{
2789	/* Looks like the unsol event is incompatible with the standard
2790	 * definition.  4bit tag is placed at 28 bit!
2791	 */
2792	switch (res >> 28) {
2793	case ALC880_MIC_EVENT:
2794		alc880_uniwill_mic_automute(codec);
2795		break;
2796	default:
2797		alc_automute_amp_unsol_event(codec, res);
2798		break;
2799	}
2800}
2801
2802static void alc880_uniwill_p53_setup(struct hda_codec *codec)
2803{
2804	struct alc_spec *spec = codec->spec;
2805
2806	spec->autocfg.hp_pins[0] = 0x14;
2807	spec->autocfg.speaker_pins[0] = 0x15;
2808}
2809
2810static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
2811{
2812	unsigned int present;
2813
2814	present = snd_hda_codec_read(codec, 0x21, 0,
2815				     AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
2816	present &= HDA_AMP_VOLMASK;
2817	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
2818				 HDA_AMP_VOLMASK, present);
2819	snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
2820				 HDA_AMP_VOLMASK, present);
2821}
2822
2823static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
2824					   unsigned int res)
2825{
2826	/* Looks like the unsol event is incompatible with the standard
2827	 * definition.  4bit tag is placed at 28 bit!
2828	 */
2829	if ((res >> 28) == ALC880_DCVOL_EVENT)
2830		alc880_uniwill_p53_dcvol_automute(codec);
2831	else
2832		alc_automute_amp_unsol_event(codec, res);
2833}
2834
2835/*
2836 * F1734 pin configuration:
2837 * HP = 0x14, speaker-out = 0x15, mic = 0x18
2838 */
2839static struct hda_verb alc880_pin_f1734_init_verbs[] = {
2840	{0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
2841	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2842	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2843	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2844	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2845
2846	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2847	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2848	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2849	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2850
2851	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2852	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2853	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
2854	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2855	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2856	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2857	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2858	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2859	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2860
2861	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
2862	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
2863
2864	{ }
2865};
2866
2867/*
2868 * ASUS pin configuration:
2869 * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
2870 */
2871static struct hda_verb alc880_pin_asus_init_verbs[] = {
2872	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2873	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2874	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2875	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2876
2877	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2878	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2879	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2880	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2881	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2882	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2883	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2884	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2885
2886	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2887	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2888	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2889	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2890	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2891	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2892	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2893	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2894	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2895
2896	{ }
2897};
2898
2899/* Enable GPIO mask and set output */
2900#define alc880_gpio1_init_verbs	alc_gpio1_init_verbs
2901#define alc880_gpio2_init_verbs	alc_gpio2_init_verbs
2902#define alc880_gpio3_init_verbs	alc_gpio3_init_verbs
2903
2904/* Clevo m520g init */
2905static struct hda_verb alc880_pin_clevo_init_verbs[] = {
2906	/* headphone output */
2907	{0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
2908	/* line-out */
2909	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2910	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2911	/* Line-in */
2912	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2913	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2914	/* CD */
2915	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2916	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2917	/* Mic1 (rear panel) */
2918	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2919	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2920	/* Mic2 (front panel) */
2921	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2922	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2923	/* headphone */
2924	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2925	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2926        /* change to EAPD mode */
2927	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
2928	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
2929
2930	{ }
2931};
2932
2933static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
2934	/* change to EAPD mode */
2935	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
2936	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
2937
2938	/* Headphone output */
2939	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2940	/* Front output*/
2941	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2942	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
2943
2944	/* Line In pin widget for input */
2945	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2946	/* CD pin widget for input */
2947	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2948	/* Mic1 (rear panel) pin widget for input and vref at 80% */
2949	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2950
2951	/* change to EAPD mode */
2952	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
2953	{0x20, AC_VERB_SET_PROC_COEF,  0x3070},
2954
2955	{ }
2956};
2957
2958/*
2959 * LG m1 express dual
2960 *
2961 * Pin assignment:
2962 *   Rear Line-In/Out (blue): 0x14
2963 *   Build-in Mic-In: 0x15
2964 *   Speaker-out: 0x17
2965 *   HP-Out (green): 0x1b
2966 *   Mic-In/Out (red): 0x19
2967 *   SPDIF-Out: 0x1e
2968 */
2969
2970/* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
2971static hda_nid_t alc880_lg_dac_nids[3] = {
2972	0x05, 0x02, 0x03
2973};
2974
2975/* seems analog CD is not working */
2976static struct hda_input_mux alc880_lg_capture_source = {
2977	.num_items = 3,
2978	.items = {
2979		{ "Mic", 0x1 },
2980		{ "Line", 0x5 },
2981		{ "Internal Mic", 0x6 },
2982	},
2983};
2984
2985/* 2,4,6 channel modes */
2986static struct hda_verb alc880_lg_ch2_init[] = {
2987	/* set line-in and mic-in to input */
2988	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2989	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
2990	{ }
2991};
2992
2993static struct hda_verb alc880_lg_ch4_init[] = {
2994	/* set line-in to out and mic-in to input */
2995	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
2996	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
2997	{ }
2998};
2999
3000static struct hda_verb alc880_lg_ch6_init[] = {
3001	/* set line-in and mic-in to output */
3002	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3003	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3004	{ }
3005};
3006
3007static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3008	{ 2, alc880_lg_ch2_init },
3009	{ 4, alc880_lg_ch4_init },
3010	{ 6, alc880_lg_ch6_init },
3011};
3012
3013static struct snd_kcontrol_new alc880_lg_mixer[] = {
3014	HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3015	HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3016	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3017	HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3018	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3019	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3020	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3021	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3022	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3023	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3024	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3025	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3026	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3027	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3028	{
3029		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3030		.name = "Channel Mode",
3031		.info = alc_ch_mode_info,
3032		.get = alc_ch_mode_get,
3033		.put = alc_ch_mode_put,
3034	},
3035	{ } /* end */
3036};
3037
3038static struct hda_verb alc880_lg_init_verbs[] = {
3039	/* set capture source to mic-in */
3040	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3041	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3042	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3043	/* mute all amp mixer inputs */
3044	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
3045	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3046	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3047	/* line-in to input */
3048	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3049	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3050	/* built-in mic */
3051	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3052	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3053	/* speaker-out */
3054	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3055	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3056	/* mic-in to input */
3057	{0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3058	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3059	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3060	/* HP-out */
3061	{0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3062	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3063	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3064	/* jack sense */
3065	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3066	{ }
3067};
3068
3069/* toggle speaker-output according to the hp-jack state */
3070static void alc880_lg_setup(struct hda_codec *codec)
3071{
3072	struct alc_spec *spec = codec->spec;
3073
3074	spec->autocfg.hp_pins[0] = 0x1b;
3075	spec->autocfg.speaker_pins[0] = 0x17;
3076}
3077
3078/*
3079 * LG LW20
3080 *
3081 * Pin assignment:
3082 *   Speaker-out: 0x14
3083 *   Mic-In: 0x18
3084 *   Built-in Mic-In: 0x19
3085 *   Line-In: 0x1b
3086 *   HP-Out: 0x1a
3087 *   SPDIF-Out: 0x1e
3088 */
3089
3090static struct hda_input_mux alc880_lg_lw_capture_source = {
3091	.num_items = 3,
3092	.items = {
3093		{ "Mic", 0x0 },
3094		{ "Internal Mic", 0x1 },
3095		{ "Line In", 0x2 },
3096	},
3097};
3098
3099#define alc880_lg_lw_modes alc880_threestack_modes
3100
3101static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3102	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3103	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3104	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3105	HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3106	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3107	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3108	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3109	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3110	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3111	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
3112	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3113	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3114	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3115	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
3116	{
3117		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3118		.name = "Channel Mode",
3119		.info = alc_ch_mode_info,
3120		.get = alc_ch_mode_get,
3121		.put = alc_ch_mode_put,
3122	},
3123	{ } /* end */
3124};
3125
3126static struct hda_verb alc880_lg_lw_init_verbs[] = {
3127	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3128	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3129	{0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3130
3131	/* set capture source to mic-in */
3132	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3133	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3134	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3135	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3136	/* speaker-out */
3137	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3138	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3139	/* HP-out */
3140	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3141	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3142	/* mic-in to input */
3143	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3144	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3145	/* built-in mic */
3146	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3147	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3148	/* jack sense */
3149	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3150	{ }
3151};
3152
3153/* toggle speaker-output according to the hp-jack state */
3154static void alc880_lg_lw_setup(struct hda_codec *codec)
3155{
3156	struct alc_spec *spec = codec->spec;
3157
3158	spec->autocfg.hp_pins[0] = 0x1b;
3159	spec->autocfg.speaker_pins[0] = 0x14;
3160}
3161
3162static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3163	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3164	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3165	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3166	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3167	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3168	HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3169	{ } /* end */
3170};
3171
3172static struct hda_input_mux alc880_medion_rim_capture_source = {
3173	.num_items = 2,
3174	.items = {
3175		{ "Mic", 0x0 },
3176		{ "Internal Mic", 0x1 },
3177	},
3178};
3179
3180static struct hda_verb alc880_medion_rim_init_verbs[] = {
3181	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3182
3183	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3184	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3185
3186	/* Mic1 (rear panel) pin widget for input and vref at 80% */
3187	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3188	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3189	/* Mic2 (as headphone out) for HP output */
3190	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3191	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3192	/* Internal Speaker */
3193	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3194	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3195
3196	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3197	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3198
3199	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3200	{ }
3201};
3202
3203/* toggle speaker-output according to the hp-jack state */
3204static void alc880_medion_rim_automute(struct hda_codec *codec)
3205{
3206	struct alc_spec *spec = codec->spec;
3207	alc_automute_amp(codec);
3208	/* toggle EAPD */
3209	if (spec->jack_present)
3210		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3211	else
3212		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3213}
3214
3215static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3216					  unsigned int res)
3217{
3218	/* Looks like the unsol event is incompatible with the standard
3219	 * definition.  4bit tag is placed at 28 bit!
3220	 */
3221	if ((res >> 28) == ALC880_HP_EVENT)
3222		alc880_medion_rim_automute(codec);
3223}
3224
3225static void alc880_medion_rim_setup(struct hda_codec *codec)
3226{
3227	struct alc_spec *spec = codec->spec;
3228
3229	spec->autocfg.hp_pins[0] = 0x14;
3230	spec->autocfg.speaker_pins[0] = 0x1b;
3231}
3232
3233#ifdef CONFIG_SND_HDA_POWER_SAVE
3234static struct hda_amp_list alc880_loopbacks[] = {
3235	{ 0x0b, HDA_INPUT, 0 },
3236	{ 0x0b, HDA_INPUT, 1 },
3237	{ 0x0b, HDA_INPUT, 2 },
3238	{ 0x0b, HDA_INPUT, 3 },
3239	{ 0x0b, HDA_INPUT, 4 },
3240	{ } /* end */
3241};
3242
3243static struct hda_amp_list alc880_lg_loopbacks[] = {
3244	{ 0x0b, HDA_INPUT, 1 },
3245	{ 0x0b, HDA_INPUT, 6 },
3246	{ 0x0b, HDA_INPUT, 7 },
3247	{ } /* end */
3248};
3249#endif
3250
3251/*
3252 * Common callbacks
3253 */
3254
3255static int alc_init(struct hda_codec *codec)
3256{
3257	struct alc_spec *spec = codec->spec;
3258	unsigned int i;
3259
3260	alc_fix_pll(codec);
3261	alc_auto_init_amp(codec, spec->init_amp);
3262
3263	for (i = 0; i < spec->num_init_verbs; i++)
3264		snd_hda_sequence_write(codec, spec->init_verbs[i]);
3265
3266	if (spec->init_hook)
3267		spec->init_hook(codec);
3268
3269	return 0;
3270}
3271
3272static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3273{
3274	struct alc_spec *spec = codec->spec;
3275
3276	if (spec->unsol_event)
3277		spec->unsol_event(codec, res);
3278}
3279
3280#ifdef CONFIG_SND_HDA_POWER_SAVE
3281static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3282{
3283	struct alc_spec *spec = codec->spec;
3284	return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3285}
3286#endif
3287
3288/*
3289 * Analog playback callbacks
3290 */
3291static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3292				    struct hda_codec *codec,
3293				    struct snd_pcm_substream *substream)
3294{
3295	struct alc_spec *spec = codec->spec;
3296	return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3297					     hinfo);
3298}
3299
3300static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3301				       struct hda_codec *codec,
3302				       unsigned int stream_tag,
3303				       unsigned int format,
3304				       struct snd_pcm_substream *substream)
3305{
3306	struct alc_spec *spec = codec->spec;
3307	return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3308						stream_tag, format, substream);
3309}
3310
3311static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3312				       struct hda_codec *codec,
3313				       struct snd_pcm_substream *substream)
3314{
3315	struct alc_spec *spec = codec->spec;
3316	return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3317}
3318
3319/*
3320 * Digital out
3321 */
3322static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3323					struct hda_codec *codec,
3324					struct snd_pcm_substream *substream)
3325{
3326	struct alc_spec *spec = codec->spec;
3327	return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3328}
3329
3330static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3331					   struct hda_codec *codec,
3332					   unsigned int stream_tag,
3333					   unsigned int format,
3334					   struct snd_pcm_substream *substream)
3335{
3336	struct alc_spec *spec = codec->spec;
3337	return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3338					     stream_tag, format, substream);
3339}
3340
3341static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3342					   struct hda_codec *codec,
3343					   struct snd_pcm_substream *substream)
3344{
3345	struct alc_spec *spec = codec->spec;
3346	return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3347}
3348
3349static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3350					 struct hda_codec *codec,
3351					 struct snd_pcm_substream *substream)
3352{
3353	struct alc_spec *spec = codec->spec;
3354	return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3355}
3356
3357/*
3358 * Analog capture
3359 */
3360static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3361				      struct hda_codec *codec,
3362				      unsigned int stream_tag,
3363				      unsigned int format,
3364				      struct snd_pcm_substream *substream)
3365{
3366	struct alc_spec *spec = codec->spec;
3367
3368	snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3369				   stream_tag, 0, format);
3370	return 0;
3371}
3372
3373static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3374				      struct hda_codec *codec,
3375				      struct snd_pcm_substream *substream)
3376{
3377	struct alc_spec *spec = codec->spec;
3378
3379	snd_hda_codec_cleanup_stream(codec,
3380				     spec->adc_nids[substream->number + 1]);
3381	return 0;
3382}
3383
3384
3385/*
3386 */
3387static struct hda_pcm_stream alc880_pcm_analog_playback = {
3388	.substreams = 1,
3389	.channels_min = 2,
3390	.channels_max = 8,
3391	/* NID is set in alc_build_pcms */
3392	.ops = {
3393		.open = alc880_playback_pcm_open,
3394		.prepare = alc880_playback_pcm_prepare,
3395		.cleanup = alc880_playback_pcm_cleanup
3396	},
3397};
3398
3399static struct hda_pcm_stream alc880_pcm_analog_capture = {
3400	.substreams = 1,
3401	.channels_min = 2,
3402	.channels_max = 2,
3403	/* NID is set in alc_build_pcms */
3404};
3405
3406static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3407	.substreams = 1,
3408	.channels_min = 2,
3409	.channels_max = 2,
3410	/* NID is set in alc_build_pcms */
3411};
3412
3413static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3414	.substreams = 2, /* can be overridden */
3415	.channels_min = 2,
3416	.channels_max = 2,
3417	/* NID is set in alc_build_pcms */
3418	.ops = {
3419		.prepare = alc880_alt_capture_pcm_prepare,
3420		.cleanup = alc880_alt_capture_pcm_cleanup
3421	},
3422};
3423
3424static struct hda_pcm_stream alc880_pcm_digital_playback = {
3425	.substreams = 1,
3426	.channels_min = 2,
3427	.channels_max = 2,
3428	/* NID is set in alc_build_pcms */
3429	.ops = {
3430		.open = alc880_dig_playback_pcm_open,
3431		.close = alc880_dig_playback_pcm_close,
3432		.prepare = alc880_dig_playback_pcm_prepare,
3433		.cleanup = alc880_dig_playback_pcm_cleanup
3434	},
3435};
3436
3437static struct hda_pcm_stream alc880_pcm_digital_capture = {
3438	.substreams = 1,
3439	.channels_min = 2,
3440	.channels_max = 2,
3441	/* NID is set in alc_build_pcms */
3442};
3443
3444/* Used by alc_build_pcms to flag that a PCM has no playback stream */
3445static struct hda_pcm_stream alc_pcm_null_stream = {
3446	.substreams = 0,
3447	.channels_min = 0,
3448	.channels_max = 0,
3449};
3450
3451static int alc_build_pcms(struct hda_codec *codec)
3452{
3453	struct alc_spec *spec = codec->spec;
3454	struct hda_pcm *info = spec->pcm_rec;
3455	int i;
3456
3457	codec->num_pcms = 1;
3458	codec->pcm_info = info;
3459
3460	if (spec->no_analog)
3461		goto skip_analog;
3462
3463	snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3464		 "%s Analog", codec->chip_name);
3465	info->name = spec->stream_name_analog;
3466
3467	if (spec->stream_analog_playback) {
3468		if (snd_BUG_ON(!spec->multiout.dac_nids))
3469			return -EINVAL;
3470		info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3471		info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3472	}
3473	if (spec->stream_analog_capture) {
3474		if (snd_BUG_ON(!spec->adc_nids))
3475			return -EINVAL;
3476		info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3477		info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3478	}
3479
3480	if (spec->channel_mode) {
3481		info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3482		for (i = 0; i < spec->num_channel_mode; i++) {
3483			if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3484				info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3485			}
3486		}
3487	}
3488
3489 skip_analog:
3490	/* SPDIF for stream index #1 */
3491	if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3492		snprintf(spec->stream_name_digital,
3493			 sizeof(spec->stream_name_digital),
3494			 "%s Digital", codec->chip_name);
3495		codec->num_pcms = 2;
3496	        codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3497		info = spec->pcm_rec + 1;
3498		info->name = spec->stream_name_digital;
3499		if (spec->dig_out_type)
3500			info->pcm_type = spec->dig_out_type;
3501		else
3502			info->pcm_type = HDA_PCM_TYPE_SPDIF;
3503		if (spec->multiout.dig_out_nid &&
3504		    spec->stream_digital_playback) {
3505			info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3506			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3507		}
3508		if (spec->dig_in_nid &&
3509		    spec->stream_digital_capture) {
3510			info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3511			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3512		}
3513		/* FIXME: do we need this for all Realtek codec models? */
3514		codec->spdif_status_reset = 1;
3515	}
3516
3517	if (spec->no_analog)
3518		return 0;
3519
3520	/* If the use of more than one ADC is requested for the current
3521	 * model, configure a second analog capture-only PCM.
3522	 */
3523	/* Additional Analaog capture for index #2 */
3524	if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3525	    (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
3526		codec->num_pcms = 3;
3527		info = spec->pcm_rec + 2;
3528		info->name = spec->stream_name_analog;
3529		if (spec->alt_dac_nid) {
3530			info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3531				*spec->stream_analog_alt_playback;
3532			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3533				spec->alt_dac_nid;
3534		} else {
3535			info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3536				alc_pcm_null_stream;
3537			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3538		}
3539		if (spec->num_adc_nids > 1) {
3540			info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3541				*spec->stream_analog_alt_capture;
3542			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3543				spec->adc_nids[1];
3544			info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3545				spec->num_adc_nids - 1;
3546		} else {
3547			info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3548				alc_pcm_null_stream;
3549			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3550		}
3551	}
3552
3553	return 0;
3554}
3555
3556static void alc_free_kctls(struct hda_codec *codec)
3557{
3558	struct alc_spec *spec = codec->spec;
3559
3560	if (spec->kctls.list) {
3561		struct snd_kcontrol_new *kctl = spec->kctls.list;
3562		int i;
3563		for (i = 0; i < spec->kctls.used; i++)
3564			kfree(kctl[i].name);
3565	}
3566	snd_array_free(&spec->kctls);
3567}
3568
3569static void alc_free(struct hda_codec *codec)
3570{
3571	struct alc_spec *spec = codec->spec;
3572
3573	if (!spec)
3574		return;
3575
3576	alc_free_kctls(codec);
3577	kfree(spec);
3578	snd_hda_detach_beep_device(codec);
3579}
3580
3581#ifdef SND_HDA_NEEDS_RESUME
3582static int alc_resume(struct hda_codec *codec)
3583{
3584	codec->patch_ops.init(codec);
3585	snd_hda_codec_resume_amp(codec);
3586	snd_hda_codec_resume_cache(codec);
3587	return 0;
3588}
3589#endif
3590
3591/*
3592 */
3593static struct hda_codec_ops alc_patch_ops = {
3594	.build_controls = alc_build_controls,
3595	.build_pcms = alc_build_pcms,
3596	.init = alc_init,
3597	.free = alc_free,
3598	.unsol_event = alc_unsol_event,
3599#ifdef SND_HDA_NEEDS_RESUME
3600	.resume = alc_resume,
3601#endif
3602#ifdef CONFIG_SND_HDA_POWER_SAVE
3603	.check_power_status = alc_check_power_status,
3604#endif
3605};
3606
3607
3608/*
3609 * Test configuration for debugging
3610 *
3611 * Almost all inputs/outputs are enabled.  I/O pins can be configured via
3612 * enum controls.
3613 */
3614#ifdef CONFIG_SND_DEBUG
3615static hda_nid_t alc880_test_dac_nids[4] = {
3616	0x02, 0x03, 0x04, 0x05
3617};
3618
3619static struct hda_input_mux alc880_test_capture_source = {
3620	.num_items = 7,
3621	.items = {
3622		{ "In-1", 0x0 },
3623		{ "In-2", 0x1 },
3624		{ "In-3", 0x2 },
3625		{ "In-4", 0x3 },
3626		{ "CD", 0x4 },
3627		{ "Front", 0x5 },
3628		{ "Surround", 0x6 },
3629	},
3630};
3631
3632static struct hda_channel_mode alc880_test_modes[4] = {
3633	{ 2, NULL },
3634	{ 4, NULL },
3635	{ 6, NULL },
3636	{ 8, NULL },
3637};
3638
3639static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
3640				 struct snd_ctl_elem_info *uinfo)
3641{
3642	static char *texts[] = {
3643		"N/A", "Line Out", "HP Out",
3644		"In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
3645	};
3646	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3647	uinfo->count = 1;
3648	uinfo->value.enumerated.items = 8;
3649	if (uinfo->value.enumerated.item >= 8)
3650		uinfo->value.enumerated.item = 7;
3651	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3652	return 0;
3653}
3654
3655static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
3656				struct snd_ctl_elem_value *ucontrol)
3657{
3658	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3659	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3660	unsigned int pin_ctl, item = 0;
3661
3662	pin_ctl = snd_hda_codec_read(codec, nid, 0,
3663				     AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3664	if (pin_ctl & AC_PINCTL_OUT_EN) {
3665		if (pin_ctl & AC_PINCTL_HP_EN)
3666			item = 2;
3667		else
3668			item = 1;
3669	} else if (pin_ctl & AC_PINCTL_IN_EN) {
3670		switch (pin_ctl & AC_PINCTL_VREFEN) {
3671		case AC_PINCTL_VREF_HIZ: item = 3; break;
3672		case AC_PINCTL_VREF_50:  item = 4; break;
3673		case AC_PINCTL_VREF_GRD: item = 5; break;
3674		case AC_PINCTL_VREF_80:  item = 6; break;
3675		case AC_PINCTL_VREF_100: item = 7; break;
3676		}
3677	}
3678	ucontrol->value.enumerated.item[0] = item;
3679	return 0;
3680}
3681
3682static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
3683				struct snd_ctl_elem_value *ucontrol)
3684{
3685	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3686	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3687	static unsigned int ctls[] = {
3688		0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
3689		AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
3690		AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
3691		AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
3692		AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
3693		AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
3694	};
3695	unsigned int old_ctl, new_ctl;
3696
3697	old_ctl = snd_hda_codec_read(codec, nid, 0,
3698				     AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3699	new_ctl = ctls[ucontrol->value.enumerated.item[0]];
3700	if (old_ctl != new_ctl) {
3701		int val;
3702		snd_hda_codec_write_cache(codec, nid, 0,
3703					  AC_VERB_SET_PIN_WIDGET_CONTROL,
3704					  new_ctl);
3705		val = ucontrol->value.enumerated.item[0] >= 3 ?
3706			HDA_AMP_MUTE : 0;
3707		snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3708					 HDA_AMP_MUTE, val);
3709		return 1;
3710	}
3711	return 0;
3712}
3713
3714static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
3715				 struct snd_ctl_elem_info *uinfo)
3716{
3717	static char *texts[] = {
3718		"Front", "Surround", "CLFE", "Side"
3719	};
3720	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3721	uinfo->count = 1;
3722	uinfo->value.enumerated.items = 4;
3723	if (uinfo->value.enumerated.item >= 4)
3724		uinfo->value.enumerated.item = 3;
3725	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3726	return 0;
3727}
3728
3729static int alc_test_pin_src_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 sel;
3735
3736	sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
3737	ucontrol->value.enumerated.item[0] = sel & 3;
3738	return 0;
3739}
3740
3741static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
3742				struct snd_ctl_elem_value *ucontrol)
3743{
3744	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3745	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3746	unsigned int sel;
3747
3748	sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
3749	if (ucontrol->value.enumerated.item[0] != sel) {
3750		sel = ucontrol->value.enumerated.item[0] & 3;
3751		snd_hda_codec_write_cache(codec, nid, 0,
3752					  AC_VERB_SET_CONNECT_SEL, sel);
3753		return 1;
3754	}
3755	return 0;
3756}
3757
3758#define PIN_CTL_TEST(xname,nid) {			\
3759		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	\
3760			.name = xname,		       \
3761			.info = alc_test_pin_ctl_info, \
3762			.get = alc_test_pin_ctl_get,   \
3763			.put = alc_test_pin_ctl_put,   \
3764			.private_value = nid	       \
3765			}
3766
3767#define PIN_SRC_TEST(xname,nid) {			\
3768		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	\
3769			.name = xname,		       \
3770			.info = alc_test_pin_src_info, \
3771			.get = alc_test_pin_src_get,   \
3772			.put = alc_test_pin_src_put,   \
3773			.private_value = nid	       \
3774			}
3775
3776static struct snd_kcontrol_new alc880_test_mixer[] = {
3777	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3778	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
3779	HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
3780	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3781	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3782	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
3783	HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
3784	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
3785	PIN_CTL_TEST("Front Pin Mode", 0x14),
3786	PIN_CTL_TEST("Surround Pin Mode", 0x15),
3787	PIN_CTL_TEST("CLFE Pin Mode", 0x16),
3788	PIN_CTL_TEST("Side Pin Mode", 0x17),
3789	PIN_CTL_TEST("In-1 Pin Mode", 0x18),
3790	PIN_CTL_TEST("In-2 Pin Mode", 0x19),
3791	PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
3792	PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
3793	PIN_SRC_TEST("In-1 Pin Source", 0x18),
3794	PIN_SRC_TEST("In-2 Pin Source", 0x19),
3795	PIN_SRC_TEST("In-3 Pin Source", 0x1a),
3796	PIN_SRC_TEST("In-4 Pin Source", 0x1b),
3797	HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
3798	HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
3799	HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
3800	HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
3801	HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
3802	HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
3803	HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
3804	HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
3805	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
3806	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
3807	{
3808		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3809		.name = "Channel Mode",
3810		.info = alc_ch_mode_info,
3811		.get = alc_ch_mode_get,
3812		.put = alc_ch_mode_put,
3813	},
3814	{ } /* end */
3815};
3816
3817static struct hda_verb alc880_test_init_verbs[] = {
3818	/* Unmute inputs of 0x0c - 0x0f */
3819	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3820	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3821	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3822	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3823	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3824	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3825	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3826	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3827	/* Vol output for 0x0c-0x0f */
3828	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3829	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3830	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3831	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3832	/* Set output pins 0x14-0x17 */
3833	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3834	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3835	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3836	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3837	/* Unmute output pins 0x14-0x17 */
3838	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3839	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3840	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3841	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3842	/* Set input pins 0x18-0x1c */
3843	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3844	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3845	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3846	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3847	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3848	/* Mute input pins 0x18-0x1b */
3849	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3850	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3851	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3852	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3853	/* ADC set up */
3854	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3855	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
3856	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3857	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
3858	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3859	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
3860	/* Analog input/passthru */
3861	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3862	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3863	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
3864	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
3865	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
3866	{ }
3867};
3868#endif
3869
3870/*
3871 */
3872
3873static const char *alc880_models[ALC880_MODEL_LAST] = {
3874	[ALC880_3ST]		= "3stack",
3875	[ALC880_TCL_S700]	= "tcl",
3876	[ALC880_3ST_DIG]	= "3stack-digout",
3877	[ALC880_CLEVO]		= "clevo",
3878	[ALC880_5ST]		= "5stack",
3879	[ALC880_5ST_DIG]	= "5stack-digout",
3880	[ALC880_W810]		= "w810",
3881	[ALC880_Z71V]		= "z71v",
3882	[ALC880_6ST]		= "6stack",
3883	[ALC880_6ST_DIG]	= "6stack-digout",
3884	[ALC880_ASUS]		= "asus",
3885	[ALC880_ASUS_W1V]	= "asus-w1v",
3886	[ALC880_ASUS_DIG]	= "asus-dig",
3887	[ALC880_ASUS_DIG2]	= "asus-dig2",
3888	[ALC880_UNIWILL_DIG]	= "uniwill",
3889	[ALC880_UNIWILL_P53]	= "uniwill-p53",
3890	[ALC880_FUJITSU]	= "fujitsu",
3891	[ALC880_F1734]		= "F1734",
3892	[ALC880_LG]		= "lg",
3893	[ALC880_LG_LW]		= "lg-lw",
3894	[ALC880_MEDION_RIM]	= "medion",
3895#ifdef CONFIG_SND_DEBUG
3896	[ALC880_TEST]		= "test",
3897#endif
3898	[ALC880_AUTO]		= "auto",
3899};
3900
3901static struct snd_pci_quirk alc880_cfg_tbl[] = {
3902	SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
3903	SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
3904	SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
3905	SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
3906	SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
3907	SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
3908	SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
3909	SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
3910	SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
3911	SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
3912	SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
3913	SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
3914	SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
3915	SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
3916	SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
3917	SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
3918	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
3919	SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
3920	/* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
3921	SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
3922	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
3923	SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
3924	SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
3925	SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
3926	SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
3927	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
3928	SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
3929	SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
3930	SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
3931	SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
3932	SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
3933	SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
3934	SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
3935	SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
3936	SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
3937	SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
3938	SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
3939	SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
3940	SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
3941	SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
3942	SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
3943	SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
3944	SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
3945	SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
3946	SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
3947	SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
3948	SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
3949	SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
3950	SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
3951	SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL),
3952	SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
3953	SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
3954	SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
3955	SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
3956	SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
3957	SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
3958	SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
3959	SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
3960	SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
3961	SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
3962	SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
3963	SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
3964	SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
3965	SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
3966	SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
3967	SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
3968	SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
3969	SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
3970	/* default Intel */
3971	SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
3972	SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
3973	SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
3974	{}
3975};
3976
3977/*
3978 * ALC880 codec presets
3979 */
3980static struct alc_config_preset alc880_presets[] = {
3981	[ALC880_3ST] = {
3982		.mixers = { alc880_three_stack_mixer },
3983		.init_verbs = { alc880_volume_init_verbs,
3984				alc880_pin_3stack_init_verbs },
3985		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
3986		.dac_nids = alc880_dac_nids,
3987		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
3988		.channel_mode = alc880_threestack_modes,
3989		.need_dac_fix = 1,
3990		.input_mux = &alc880_capture_source,
3991	},
3992	[ALC880_3ST_DIG] = {
3993		.mixers = { alc880_three_stack_mixer },
3994		.init_verbs = { alc880_volume_init_verbs,
3995				alc880_pin_3stack_init_verbs },
3996		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
3997		.dac_nids = alc880_dac_nids,
3998		.dig_out_nid = ALC880_DIGOUT_NID,
3999		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4000		.channel_mode = alc880_threestack_modes,
4001		.need_dac_fix = 1,
4002		.input_mux = &alc880_capture_source,
4003	},
4004	[ALC880_TCL_S700] = {
4005		.mixers = { alc880_tcl_s700_mixer },
4006		.init_verbs = { alc880_volume_init_verbs,
4007				alc880_pin_tcl_S700_init_verbs,
4008				alc880_gpio2_init_verbs },
4009		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4010		.dac_nids = alc880_dac_nids,
4011		.adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4012		.num_adc_nids = 1, /* single ADC */
4013		.hp_nid = 0x03,
4014		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4015		.channel_mode = alc880_2_jack_modes,
4016		.input_mux = &alc880_capture_source,
4017	},
4018	[ALC880_5ST] = {
4019		.mixers = { alc880_three_stack_mixer,
4020			    alc880_five_stack_mixer},
4021		.init_verbs = { alc880_volume_init_verbs,
4022				alc880_pin_5stack_init_verbs },
4023		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4024		.dac_nids = alc880_dac_nids,
4025		.num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4026		.channel_mode = alc880_fivestack_modes,
4027		.input_mux = &alc880_capture_source,
4028	},
4029	[ALC880_5ST_DIG] = {
4030		.mixers = { alc880_three_stack_mixer,
4031			    alc880_five_stack_mixer },
4032		.init_verbs = { alc880_volume_init_verbs,
4033				alc880_pin_5stack_init_verbs },
4034		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4035		.dac_nids = alc880_dac_nids,
4036		.dig_out_nid = ALC880_DIGOUT_NID,
4037		.num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4038		.channel_mode = alc880_fivestack_modes,
4039		.input_mux = &alc880_capture_source,
4040	},
4041	[ALC880_6ST] = {
4042		.mixers = { alc880_six_stack_mixer },
4043		.init_verbs = { alc880_volume_init_verbs,
4044				alc880_pin_6stack_init_verbs },
4045		.num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4046		.dac_nids = alc880_6st_dac_nids,
4047		.num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4048		.channel_mode = alc880_sixstack_modes,
4049		.input_mux = &alc880_6stack_capture_source,
4050	},
4051	[ALC880_6ST_DIG] = {
4052		.mixers = { alc880_six_stack_mixer },
4053		.init_verbs = { alc880_volume_init_verbs,
4054				alc880_pin_6stack_init_verbs },
4055		.num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4056		.dac_nids = alc880_6st_dac_nids,
4057		.dig_out_nid = ALC880_DIGOUT_NID,
4058		.num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4059		.channel_mode = alc880_sixstack_modes,
4060		.input_mux = &alc880_6stack_capture_source,
4061	},
4062	[ALC880_W810] = {
4063		.mixers = { alc880_w810_base_mixer },
4064		.init_verbs = { alc880_volume_init_verbs,
4065				alc880_pin_w810_init_verbs,
4066				alc880_gpio2_init_verbs },
4067		.num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4068		.dac_nids = alc880_w810_dac_nids,
4069		.dig_out_nid = ALC880_DIGOUT_NID,
4070		.num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4071		.channel_mode = alc880_w810_modes,
4072		.input_mux = &alc880_capture_source,
4073	},
4074	[ALC880_Z71V] = {
4075		.mixers = { alc880_z71v_mixer },
4076		.init_verbs = { alc880_volume_init_verbs,
4077				alc880_pin_z71v_init_verbs },
4078		.num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4079		.dac_nids = alc880_z71v_dac_nids,
4080		.dig_out_nid = ALC880_DIGOUT_NID,
4081		.hp_nid = 0x03,
4082		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4083		.channel_mode = alc880_2_jack_modes,
4084		.input_mux = &alc880_capture_source,
4085	},
4086	[ALC880_F1734] = {
4087		.mixers = { alc880_f1734_mixer },
4088		.init_verbs = { alc880_volume_init_verbs,
4089				alc880_pin_f1734_init_verbs },
4090		.num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4091		.dac_nids = alc880_f1734_dac_nids,
4092		.hp_nid = 0x02,
4093		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4094		.channel_mode = alc880_2_jack_modes,
4095		.input_mux = &alc880_f1734_capture_source,
4096		.unsol_event = alc880_uniwill_p53_unsol_event,
4097		.setup = alc880_uniwill_p53_setup,
4098		.init_hook = alc_automute_amp,
4099	},
4100	[ALC880_ASUS] = {
4101		.mixers = { alc880_asus_mixer },
4102		.init_verbs = { alc880_volume_init_verbs,
4103				alc880_pin_asus_init_verbs,
4104				alc880_gpio1_init_verbs },
4105		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4106		.dac_nids = alc880_asus_dac_nids,
4107		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4108		.channel_mode = alc880_asus_modes,
4109		.need_dac_fix = 1,
4110		.input_mux = &alc880_capture_source,
4111	},
4112	[ALC880_ASUS_DIG] = {
4113		.mixers = { alc880_asus_mixer },
4114		.init_verbs = { alc880_volume_init_verbs,
4115				alc880_pin_asus_init_verbs,
4116				alc880_gpio1_init_verbs },
4117		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4118		.dac_nids = alc880_asus_dac_nids,
4119		.dig_out_nid = ALC880_DIGOUT_NID,
4120		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4121		.channel_mode = alc880_asus_modes,
4122		.need_dac_fix = 1,
4123		.input_mux = &alc880_capture_source,
4124	},
4125	[ALC880_ASUS_DIG2] = {
4126		.mixers = { alc880_asus_mixer },
4127		.init_verbs = { alc880_volume_init_verbs,
4128				alc880_pin_asus_init_verbs,
4129				alc880_gpio2_init_verbs }, /* use GPIO2 */
4130		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4131		.dac_nids = alc880_asus_dac_nids,
4132		.dig_out_nid = ALC880_DIGOUT_NID,
4133		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4134		.channel_mode = alc880_asus_modes,
4135		.need_dac_fix = 1,
4136		.input_mux = &alc880_capture_source,
4137	},
4138	[ALC880_ASUS_W1V] = {
4139		.mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
4140		.init_verbs = { alc880_volume_init_verbs,
4141				alc880_pin_asus_init_verbs,
4142				alc880_gpio1_init_verbs },
4143		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4144		.dac_nids = alc880_asus_dac_nids,
4145		.dig_out_nid = ALC880_DIGOUT_NID,
4146		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4147		.channel_mode = alc880_asus_modes,
4148		.need_dac_fix = 1,
4149		.input_mux = &alc880_capture_source,
4150	},
4151	[ALC880_UNIWILL_DIG] = {
4152		.mixers = { alc880_asus_mixer },
4153		.init_verbs = { alc880_volume_init_verbs,
4154				alc880_pin_asus_init_verbs },
4155		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4156		.dac_nids = alc880_asus_dac_nids,
4157		.dig_out_nid = ALC880_DIGOUT_NID,
4158		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4159		.channel_mode = alc880_asus_modes,
4160		.need_dac_fix = 1,
4161		.input_mux = &alc880_capture_source,
4162	},
4163	[ALC880_UNIWILL] = {
4164		.mixers = { alc880_uniwill_mixer },
4165		.init_verbs = { alc880_volume_init_verbs,
4166				alc880_uniwill_init_verbs },
4167		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4168		.dac_nids = alc880_asus_dac_nids,
4169		.dig_out_nid = ALC880_DIGOUT_NID,
4170		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4171		.channel_mode = alc880_threestack_modes,
4172		.need_dac_fix = 1,
4173		.input_mux = &alc880_capture_source,
4174		.unsol_event = alc880_uniwill_unsol_event,
4175		.setup = alc880_uniwill_setup,
4176		.init_hook = alc880_uniwill_init_hook,
4177	},
4178	[ALC880_UNIWILL_P53] = {
4179		.mixers = { alc880_uniwill_p53_mixer },
4180		.init_verbs = { alc880_volume_init_verbs,
4181				alc880_uniwill_p53_init_verbs },
4182		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4183		.dac_nids = alc880_asus_dac_nids,
4184		.num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4185		.channel_mode = alc880_threestack_modes,
4186		.input_mux = &alc880_capture_source,
4187		.unsol_event = alc880_uniwill_p53_unsol_event,
4188		.setup = alc880_uniwill_p53_setup,
4189		.init_hook = alc_automute_amp,
4190	},
4191	[ALC880_FUJITSU] = {
4192		.mixers = { alc880_fujitsu_mixer },
4193		.init_verbs = { alc880_volume_init_verbs,
4194				alc880_uniwill_p53_init_verbs,
4195	       			alc880_beep_init_verbs },
4196		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4197		.dac_nids = alc880_dac_nids,
4198		.dig_out_nid = ALC880_DIGOUT_NID,
4199		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4200		.channel_mode = alc880_2_jack_modes,
4201		.input_mux = &alc880_capture_source,
4202		.unsol_event = alc880_uniwill_p53_unsol_event,
4203		.setup = alc880_uniwill_p53_setup,
4204		.init_hook = alc_automute_amp,
4205	},
4206	[ALC880_CLEVO] = {
4207		.mixers = { alc880_three_stack_mixer },
4208		.init_verbs = { alc880_volume_init_verbs,
4209				alc880_pin_clevo_init_verbs },
4210		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4211		.dac_nids = alc880_dac_nids,
4212		.hp_nid = 0x03,
4213		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4214		.channel_mode = alc880_threestack_modes,
4215		.need_dac_fix = 1,
4216		.input_mux = &alc880_capture_source,
4217	},
4218	[ALC880_LG] = {
4219		.mixers = { alc880_lg_mixer },
4220		.init_verbs = { alc880_volume_init_verbs,
4221				alc880_lg_init_verbs },
4222		.num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4223		.dac_nids = alc880_lg_dac_nids,
4224		.dig_out_nid = ALC880_DIGOUT_NID,
4225		.num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4226		.channel_mode = alc880_lg_ch_modes,
4227		.need_dac_fix = 1,
4228		.input_mux = &alc880_lg_capture_source,
4229		.unsol_event = alc_automute_amp_unsol_event,
4230		.setup = alc880_lg_setup,
4231		.init_hook = alc_automute_amp,
4232#ifdef CONFIG_SND_HDA_POWER_SAVE
4233		.loopbacks = alc880_lg_loopbacks,
4234#endif
4235	},
4236	[ALC880_LG_LW] = {
4237		.mixers = { alc880_lg_lw_mixer },
4238		.init_verbs = { alc880_volume_init_verbs,
4239				alc880_lg_lw_init_verbs },
4240		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4241		.dac_nids = alc880_dac_nids,
4242		.dig_out_nid = ALC880_DIGOUT_NID,
4243		.num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4244		.channel_mode = alc880_lg_lw_modes,
4245		.input_mux = &alc880_lg_lw_capture_source,
4246		.unsol_event = alc_automute_amp_unsol_event,
4247		.setup = alc880_lg_lw_setup,
4248		.init_hook = alc_automute_amp,
4249	},
4250	[ALC880_MEDION_RIM] = {
4251		.mixers = { alc880_medion_rim_mixer },
4252		.init_verbs = { alc880_volume_init_verbs,
4253				alc880_medion_rim_init_verbs,
4254				alc_gpio2_init_verbs },
4255		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4256		.dac_nids = alc880_dac_nids,
4257		.dig_out_nid = ALC880_DIGOUT_NID,
4258		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4259		.channel_mode = alc880_2_jack_modes,
4260		.input_mux = &alc880_medion_rim_capture_source,
4261		.unsol_event = alc880_medion_rim_unsol_event,
4262		.setup = alc880_medion_rim_setup,
4263		.init_hook = alc880_medion_rim_automute,
4264	},
4265#ifdef CONFIG_SND_DEBUG
4266	[ALC880_TEST] = {
4267		.mixers = { alc880_test_mixer },
4268		.init_verbs = { alc880_test_init_verbs },
4269		.num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4270		.dac_nids = alc880_test_dac_nids,
4271		.dig_out_nid = ALC880_DIGOUT_NID,
4272		.num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4273		.channel_mode = alc880_test_modes,
4274		.input_mux = &alc880_test_capture_source,
4275	},
4276#endif
4277};
4278
4279/*
4280 * Automatic parse of I/O pins from the BIOS configuration
4281 */
4282
4283enum {
4284	ALC_CTL_WIDGET_VOL,
4285	ALC_CTL_WIDGET_MUTE,
4286	ALC_CTL_BIND_MUTE,
4287};
4288static struct snd_kcontrol_new alc880_control_templates[] = {
4289	HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4290	HDA_CODEC_MUTE(NULL, 0, 0, 0),
4291	HDA_BIND_MUTE(NULL, 0, 0, 0),
4292};
4293
4294/* add dynamic controls */
4295static int add_control(struct alc_spec *spec, int type, const char *name,
4296		       unsigned long val)
4297{
4298	struct snd_kcontrol_new *knew;
4299
4300	snd_array_init(&spec->kctls, sizeof(*knew), 32);
4301	knew = snd_array_new(&spec->kctls);
4302	if (!knew)
4303		return -ENOMEM;
4304	*knew = alc880_control_templates[type];
4305	knew->name = kstrdup(name, GFP_KERNEL);
4306	if (!knew->name)
4307		return -ENOMEM;
4308	knew->private_value = val;
4309	return 0;
4310}
4311
4312#define alc880_is_fixed_pin(nid)	((nid) >= 0x14 && (nid) <= 0x17)
4313#define alc880_fixed_pin_idx(nid)	((nid) - 0x14)
4314#define alc880_is_multi_pin(nid)	((nid) >= 0x18)
4315#define alc880_multi_pin_idx(nid)	((nid) - 0x18)
4316#define alc880_idx_to_dac(nid)		((nid) + 0x02)
4317#define alc880_dac_to_idx(nid)		((nid) - 0x02)
4318#define alc880_idx_to_mixer(nid)	((nid) + 0x0c)
4319#define alc880_idx_to_selector(nid)	((nid) + 0x10)
4320#define ALC880_PIN_CD_NID		0x1c
4321
4322/* fill in the dac_nids table from the parsed pin configuration */
4323static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4324				     const struct auto_pin_cfg *cfg)
4325{
4326	hda_nid_t nid;
4327	int assigned[4];
4328	int i, j;
4329
4330	memset(assigned, 0, sizeof(assigned));
4331	spec->multiout.dac_nids = spec->private_dac_nids;
4332
4333	/* check the pins hardwired to audio widget */
4334	for (i = 0; i < cfg->line_outs; i++) {
4335		nid = cfg->line_out_pins[i];
4336		if (alc880_is_fixed_pin(nid)) {
4337			int idx = alc880_fixed_pin_idx(nid);
4338			spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
4339			assigned[idx] = 1;
4340		}
4341	}
4342	/* left pins can be connect to any audio widget */
4343	for (i = 0; i < cfg->line_outs; i++) {
4344		nid = cfg->line_out_pins[i];
4345		if (alc880_is_fixed_pin(nid))
4346			continue;
4347		/* search for an empty channel */
4348		for (j = 0; j < cfg->line_outs; j++) {
4349			if (!assigned[j]) {
4350				spec->multiout.dac_nids[i] =
4351					alc880_idx_to_dac(j);
4352				assigned[j] = 1;
4353				break;
4354			}
4355		}
4356	}
4357	spec->multiout.num_dacs = cfg->line_outs;
4358	return 0;
4359}
4360
4361/* add playback controls from the parsed DAC table */
4362static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4363					     const struct auto_pin_cfg *cfg)
4364{
4365	char name[32];
4366	static const char *chname[4] = {
4367		"Front", "Surround", NULL /*CLFE*/, "Side"
4368	};
4369	hda_nid_t nid;
4370	int i, err;
4371
4372	for (i = 0; i < cfg->line_outs; i++) {
4373		if (!spec->multiout.dac_nids[i])
4374			continue;
4375		nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4376		if (i == 2) {
4377			/* Center/LFE */
4378			err = add_control(spec, ALC_CTL_WIDGET_VOL,
4379					  "Center Playback Volume",
4380					  HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4381							      HDA_OUTPUT));
4382			if (err < 0)
4383				return err;
4384			err = add_control(spec, ALC_CTL_WIDGET_VOL,
4385					  "LFE Playback Volume",
4386					  HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4387							      HDA_OUTPUT));
4388			if (err < 0)
4389				return err;
4390			err = add_control(spec, ALC_CTL_BIND_MUTE,
4391					  "Center Playback Switch",
4392					  HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4393							      HDA_INPUT));
4394			if (err < 0)
4395				return err;
4396			err = add_control(spec, ALC_CTL_BIND_MUTE,
4397					  "LFE Playback Switch",
4398					  HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4399							      HDA_INPUT));
4400			if (err < 0)
4401				return err;
4402		} else {
4403			const char *pfx;
4404			if (cfg->line_outs == 1 &&
4405			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4406				pfx = "Speaker";
4407			else
4408				pfx = chname[i];
4409			sprintf(name, "%s Playback Volume", pfx);
4410			err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
4411					  HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4412							      HDA_OUTPUT));
4413			if (err < 0)
4414				return err;
4415			sprintf(name, "%s Playback Switch", pfx);
4416			err = add_control(spec, ALC_CTL_BIND_MUTE, name,
4417					  HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4418							      HDA_INPUT));
4419			if (err < 0)
4420				return err;
4421		}
4422	}
4423	return 0;
4424}
4425
4426/* add playback controls for speaker and HP outputs */
4427static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4428					const char *pfx)
4429{
4430	hda_nid_t nid;
4431	int err;
4432	char name[32];
4433
4434	if (!pin)
4435		return 0;
4436
4437	if (alc880_is_fixed_pin(pin)) {
4438		nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
4439		/* specify the DAC as the extra output */
4440		if (!spec->multiout.hp_nid)
4441			spec->multiout.hp_nid = nid;
4442		else
4443			spec->multiout.extra_out_nid[0] = nid;
4444		/* control HP volume/switch on the output mixer amp */
4445		nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
4446		sprintf(name, "%s Playback Volume", pfx);
4447		err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
4448				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4449		if (err < 0)
4450			return err;
4451		sprintf(name, "%s Playback Switch", pfx);
4452		err = add_control(spec, ALC_CTL_BIND_MUTE, name,
4453				  HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4454		if (err < 0)
4455			return err;
4456	} else if (alc880_is_multi_pin(pin)) {
4457		/* set manual connection */
4458		/* we have only a switch on HP-out PIN */
4459		sprintf(name, "%s Playback Switch", pfx);
4460		err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
4461				  HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4462		if (err < 0)
4463			return err;
4464	}
4465	return 0;
4466}
4467
4468/* create input playback/capture controls for the given pin */
4469static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4470			    const char *ctlname,
4471			    int idx, hda_nid_t mix_nid)
4472{
4473	char name[32];
4474	int err;
4475
4476	sprintf(name, "%s Playback Volume", ctlname);
4477	err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
4478			  HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4479	if (err < 0)
4480		return err;
4481	sprintf(name, "%s Playback Switch", ctlname);
4482	err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
4483			  HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4484	if (err < 0)
4485		return err;
4486	return 0;
4487}
4488
4489static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4490{
4491	unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4492	return (pincap & AC_PINCAP_IN) != 0;
4493}
4494
4495/* create playback/capture controls for input pins */
4496static int alc_auto_create_input_ctls(struct hda_codec *codec,
4497				      const struct auto_pin_cfg *cfg,
4498				      hda_nid_t mixer,
4499				      hda_nid_t cap1, hda_nid_t cap2)
4500{
4501	struct alc_spec *spec = codec->spec;
4502	struct hda_input_mux *imux = &spec->private_imux[0];
4503	int i, err, idx;
4504
4505	for (i = 0; i < AUTO_PIN_LAST; i++) {
4506		hda_nid_t pin;
4507
4508		pin = cfg->input_pins[i];
4509		if (!alc_is_input_pin(codec, pin))
4510			continue;
4511
4512		if (mixer) {
4513			idx = get_connection_index(codec, mixer, pin);
4514			if (idx >= 0) {
4515				err = new_analog_input(spec, pin,
4516						       auto_pin_cfg_labels[i],
4517						       idx, mixer);
4518				if (err < 0)
4519					return err;
4520			}
4521		}
4522
4523		if (!cap1)
4524			continue;
4525		idx = get_connection_index(codec, cap1, pin);
4526		if (idx < 0 && cap2)
4527			idx = get_connection_index(codec, cap2, pin);
4528		if (idx >= 0) {
4529			imux->items[imux->num_items].label =
4530				auto_pin_cfg_labels[i];
4531			imux->items[imux->num_items].index = idx;
4532			imux->num_items++;
4533		}
4534	}
4535	return 0;
4536}
4537
4538static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4539						const struct auto_pin_cfg *cfg)
4540{
4541	return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4542}
4543
4544static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4545			       unsigned int pin_type)
4546{
4547	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4548			    pin_type);
4549	/* unmute pin */
4550	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4551			    AMP_OUT_UNMUTE);
4552}
4553
4554static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4555					      hda_nid_t nid, int pin_type,
4556					      int dac_idx)
4557{
4558	alc_set_pin_output(codec, nid, pin_type);
4559	/* need the manual connection? */
4560	if (alc880_is_multi_pin(nid)) {
4561		struct alc_spec *spec = codec->spec;
4562		int idx = alc880_multi_pin_idx(nid);
4563		snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4564				    AC_VERB_SET_CONNECT_SEL,
4565				    alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
4566	}
4567}
4568
4569static int get_pin_type(int line_out_type)
4570{
4571	if (line_out_type == AUTO_PIN_HP_OUT)
4572		return PIN_HP;
4573	else
4574		return PIN_OUT;
4575}
4576
4577static void alc880_auto_init_multi_out(struct hda_codec *codec)
4578{
4579	struct alc_spec *spec = codec->spec;
4580	int i;
4581
4582	for (i = 0; i < spec->autocfg.line_outs; i++) {
4583		hda_nid_t nid = spec->autocfg.line_out_pins[i];
4584		int pin_type = get_pin_type(spec->autocfg.line_out_type);
4585		alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
4586	}
4587}
4588
4589static void alc880_auto_init_extra_out(struct hda_codec *codec)
4590{
4591	struct alc_spec *spec = codec->spec;
4592	hda_nid_t pin;
4593
4594	pin = spec->autocfg.speaker_pins[0];
4595	if (pin) /* connect to front */
4596		alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
4597	pin = spec->autocfg.hp_pins[0];
4598	if (pin) /* connect to front */
4599		alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
4600}
4601
4602static void alc880_auto_init_analog_input(struct hda_codec *codec)
4603{
4604	struct alc_spec *spec = codec->spec;
4605	int i;
4606
4607	for (i = 0; i < AUTO_PIN_LAST; i++) {
4608		hda_nid_t nid = spec->autocfg.input_pins[i];
4609		if (alc_is_input_pin(codec, nid)) {
4610			alc_set_input_pin(codec, nid, i);
4611			if (nid != ALC880_PIN_CD_NID &&
4612			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
4613				snd_hda_codec_write(codec, nid, 0,
4614						    AC_VERB_SET_AMP_GAIN_MUTE,
4615						    AMP_OUT_MUTE);
4616		}
4617	}
4618}
4619
4620/* parse the BIOS configuration and set up the alc_spec */
4621/* return 1 if successful, 0 if the proper config is not found,
4622 * or a negative error code
4623 */
4624static int alc880_parse_auto_config(struct hda_codec *codec)
4625{
4626	struct alc_spec *spec = codec->spec;
4627	int i, err;
4628	static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
4629
4630	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4631					   alc880_ignore);
4632	if (err < 0)
4633		return err;
4634	if (!spec->autocfg.line_outs)
4635		return 0; /* can't find valid BIOS pin config */
4636
4637	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
4638	if (err < 0)
4639		return err;
4640	err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
4641	if (err < 0)
4642		return err;
4643	err = alc880_auto_create_extra_out(spec,
4644					   spec->autocfg.speaker_pins[0],
4645					   "Speaker");
4646	if (err < 0)
4647		return err;
4648	err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
4649					   "Headphone");
4650	if (err < 0)
4651		return err;
4652	err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
4653	if (err < 0)
4654		return err;
4655
4656	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4657
4658	/* check multiple SPDIF-out (for recent codecs) */
4659	for (i = 0; i < spec->autocfg.dig_outs; i++) {
4660		hda_nid_t dig_nid;
4661		err = snd_hda_get_connections(codec,
4662					      spec->autocfg.dig_out_pins[i],
4663					      &dig_nid, 1);
4664		if (err < 0)
4665			continue;
4666		if (!i)
4667			spec->multiout.dig_out_nid = dig_nid;
4668		else {
4669			spec->multiout.slave_dig_outs = spec->slave_dig_outs;
4670			spec->slave_dig_outs[i - 1] = dig_nid;
4671			if (i == ARRAY_SIZE(spec->slave_dig_outs) - 1)
4672				break;
4673		}
4674	}
4675	if (spec->autocfg.dig_in_pin)
4676		spec->dig_in_nid = ALC880_DIGIN_NID;
4677
4678	if (spec->kctls.list)
4679		add_mixer(spec, spec->kctls.list);
4680
4681	add_verb(spec, alc880_volume_init_verbs);
4682
4683	spec->num_mux_defs = 1;
4684	spec->input_mux = &spec->private_imux[0];
4685
4686	alc_ssid_check(codec, 0x15, 0x1b, 0x14);
4687
4688	return 1;
4689}
4690
4691/* additional initialization for auto-configuration model */
4692static void alc880_auto_init(struct hda_codec *codec)
4693{
4694	struct alc_spec *spec = codec->spec;
4695	alc880_auto_init_multi_out(codec);
4696	alc880_auto_init_extra_out(codec);
4697	alc880_auto_init_analog_input(codec);
4698	if (spec->unsol_event)
4699		alc_inithook(codec);
4700}
4701
4702/* check the ADC/MUX contains all input pins; some ADC/MUX contains only
4703 * one of two digital mic pins, e.g. on ALC272
4704 */
4705static void fixup_automic_adc(struct hda_codec *codec)
4706{
4707	struct alc_spec *spec = codec->spec;
4708	int i;
4709
4710	for (i = 0; i < spec->num_adc_nids; i++) {
4711		hda_nid_t cap = spec->capsrc_nids ?
4712			spec->capsrc_nids[i] : spec->adc_nids[i];
4713		int iidx, eidx;
4714
4715		iidx = get_connection_index(codec, cap, spec->int_mic.pin);
4716		if (iidx < 0)
4717			continue;
4718		eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
4719		if (eidx < 0)
4720			continue;
4721		spec->int_mic.mux_idx = iidx;
4722		spec->ext_mic.mux_idx = eidx;
4723		if (spec->capsrc_nids)
4724			spec->capsrc_nids += i;
4725		spec->adc_nids += i;
4726		spec->num_adc_nids = 1;
4727		return;
4728	}
4729	snd_printd(KERN_INFO "hda_codec: %s: "
4730		   "No ADC/MUX containing both 0x%x and 0x%x pins\n",
4731		   codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
4732	spec->auto_mic = 0; /* disable auto-mic to be sure */
4733}
4734
4735static void set_capture_mixer(struct hda_codec *codec)
4736{
4737	struct alc_spec *spec = codec->spec;
4738	static struct snd_kcontrol_new *caps[2][3] = {
4739		{ alc_capture_mixer_nosrc1,
4740		  alc_capture_mixer_nosrc2,
4741		  alc_capture_mixer_nosrc3 },
4742		{ alc_capture_mixer1,
4743		  alc_capture_mixer2,
4744		  alc_capture_mixer3 },
4745	};
4746	if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
4747		int mux;
4748		if (spec->auto_mic) {
4749			mux = 0;
4750			fixup_automic_adc(codec);
4751		} else if (spec->input_mux && spec->input_mux->num_items > 1)
4752			mux = 1;
4753		else
4754			mux = 0;
4755		spec->cap_mixer = caps[mux][spec->num_adc_nids - 1];
4756	}
4757}
4758
4759#define set_beep_amp(spec, nid, idx, dir) \
4760	((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
4761
4762/*
4763 * OK, here we have finally the patch for ALC880
4764 */
4765
4766static int patch_alc880(struct hda_codec *codec)
4767{
4768	struct alc_spec *spec;
4769	int board_config;
4770	int err;
4771
4772	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4773	if (spec == NULL)
4774		return -ENOMEM;
4775
4776	codec->spec = spec;
4777
4778	board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
4779						  alc880_models,
4780						  alc880_cfg_tbl);
4781	if (board_config < 0) {
4782		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4783		       codec->chip_name);
4784		board_config = ALC880_AUTO;
4785	}
4786
4787	if (board_config == ALC880_AUTO) {
4788		/* automatic parse from the BIOS config */
4789		err = alc880_parse_auto_config(codec);
4790		if (err < 0) {
4791			alc_free(codec);
4792			return err;
4793		} else if (!err) {
4794			printk(KERN_INFO
4795			       "hda_codec: Cannot set up configuration "
4796			       "from BIOS.  Using 3-stack mode...\n");
4797			board_config = ALC880_3ST;
4798		}
4799	}
4800
4801	err = snd_hda_attach_beep_device(codec, 0x1);
4802	if (err < 0) {
4803		alc_free(codec);
4804		return err;
4805	}
4806
4807	if (board_config != ALC880_AUTO)
4808		setup_preset(codec, &alc880_presets[board_config]);
4809
4810	spec->stream_analog_playback = &alc880_pcm_analog_playback;
4811	spec->stream_analog_capture = &alc880_pcm_analog_capture;
4812	spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
4813
4814	spec->stream_digital_playback = &alc880_pcm_digital_playback;
4815	spec->stream_digital_capture = &alc880_pcm_digital_capture;
4816
4817	if (!spec->adc_nids && spec->input_mux) {
4818		/* check whether NID 0x07 is valid */
4819		unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
4820		/* get type */
4821		wcap = get_wcaps_type(wcap);
4822		if (wcap != AC_WID_AUD_IN) {
4823			spec->adc_nids = alc880_adc_nids_alt;
4824			spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
4825		} else {
4826			spec->adc_nids = alc880_adc_nids;
4827			spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
4828		}
4829	}
4830	set_capture_mixer(codec);
4831	set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
4832
4833	spec->vmaster_nid = 0x0c;
4834
4835	codec->patch_ops = alc_patch_ops;
4836	if (board_config == ALC880_AUTO)
4837		spec->init_hook = alc880_auto_init;
4838#ifdef CONFIG_SND_HDA_POWER_SAVE
4839	if (!spec->loopback.amplist)
4840		spec->loopback.amplist = alc880_loopbacks;
4841#endif
4842	codec->proc_widget_hook = print_realtek_coef;
4843
4844	return 0;
4845}
4846
4847
4848/*
4849 * ALC260 support
4850 */
4851
4852static hda_nid_t alc260_dac_nids[1] = {
4853	/* front */
4854	0x02,
4855};
4856
4857static hda_nid_t alc260_adc_nids[1] = {
4858	/* ADC0 */
4859	0x04,
4860};
4861
4862static hda_nid_t alc260_adc_nids_alt[1] = {
4863	/* ADC1 */
4864	0x05,
4865};
4866
4867/* NIDs used when simultaneous access to both ADCs makes sense.  Note that
4868 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
4869 */
4870static hda_nid_t alc260_dual_adc_nids[2] = {
4871	/* ADC0, ADC1 */
4872	0x04, 0x05
4873};
4874
4875#define ALC260_DIGOUT_NID	0x03
4876#define ALC260_DIGIN_NID	0x06
4877
4878static struct hda_input_mux alc260_capture_source = {
4879	.num_items = 4,
4880	.items = {
4881		{ "Mic", 0x0 },
4882		{ "Front Mic", 0x1 },
4883		{ "Line", 0x2 },
4884		{ "CD", 0x4 },
4885	},
4886};
4887
4888/* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
4889 * headphone jack and the internal CD lines since these are the only pins at
4890 * which audio can appear.  For flexibility, also allow the option of
4891 * recording the mixer output on the second ADC (ADC0 doesn't have a
4892 * connection to the mixer output).
4893 */
4894static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
4895	{
4896		.num_items = 3,
4897		.items = {
4898			{ "Mic/Line", 0x0 },
4899			{ "CD", 0x4 },
4900			{ "Headphone", 0x2 },
4901		},
4902	},
4903	{
4904		.num_items = 4,
4905		.items = {
4906			{ "Mic/Line", 0x0 },
4907			{ "CD", 0x4 },
4908			{ "Headphone", 0x2 },
4909			{ "Mixer", 0x5 },
4910		},
4911	},
4912
4913};
4914
4915/* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
4916 * the Fujitsu S702x, but jacks are marked differently.
4917 */
4918static struct hda_input_mux alc260_acer_capture_sources[2] = {
4919	{
4920		.num_items = 4,
4921		.items = {
4922			{ "Mic", 0x0 },
4923			{ "Line", 0x2 },
4924			{ "CD", 0x4 },
4925			{ "Headphone", 0x5 },
4926		},
4927	},
4928	{
4929		.num_items = 5,
4930		.items = {
4931			{ "Mic", 0x0 },
4932			{ "Line", 0x2 },
4933			{ "CD", 0x4 },
4934			{ "Headphone", 0x6 },
4935			{ "Mixer", 0x5 },
4936		},
4937	},
4938};
4939
4940/* Maxdata Favorit 100XS */
4941static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
4942	{
4943		.num_items = 2,
4944		.items = {
4945			{ "Line/Mic", 0x0 },
4946			{ "CD", 0x4 },
4947		},
4948	},
4949	{
4950		.num_items = 3,
4951		.items = {
4952			{ "Line/Mic", 0x0 },
4953			{ "CD", 0x4 },
4954			{ "Mixer", 0x5 },
4955		},
4956	},
4957};
4958
4959/*
4960 * This is just place-holder, so there's something for alc_build_pcms to look
4961 * at when it calculates the maximum number of channels. ALC260 has no mixer
4962 * element which allows changing the channel mode, so the verb list is
4963 * never used.
4964 */
4965static struct hda_channel_mode alc260_modes[1] = {
4966	{ 2, NULL },
4967};
4968
4969
4970/* Mixer combinations
4971 *
4972 * basic: base_output + input + pc_beep + capture
4973 * HP: base_output + input + capture_alt
4974 * HP_3013: hp_3013 + input + capture
4975 * fujitsu: fujitsu + capture
4976 * acer: acer + capture
4977 */
4978
4979static struct snd_kcontrol_new alc260_base_output_mixer[] = {
4980	HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
4981	HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
4982	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
4983	HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
4984	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
4985	HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
4986	{ } /* end */
4987};
4988
4989static struct snd_kcontrol_new alc260_input_mixer[] = {
4990	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
4991	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
4992	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
4993	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
4994	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
4995	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
4996	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
4997	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
4998	{ } /* end */
4999};
5000
5001/* update HP, line and mono out pins according to the master switch */
5002static void alc260_hp_master_update(struct hda_codec *codec,
5003				    hda_nid_t hp, hda_nid_t line,
5004				    hda_nid_t mono)
5005{
5006	struct alc_spec *spec = codec->spec;
5007	unsigned int val = spec->master_sw ? PIN_HP : 0;
5008	/* change HP and line-out pins */
5009	snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5010			    val);
5011	snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5012			    val);
5013	/* mono (speaker) depending on the HP jack sense */
5014	val = (val && !spec->jack_present) ? PIN_OUT : 0;
5015	snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5016			    val);
5017}
5018
5019static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5020				   struct snd_ctl_elem_value *ucontrol)
5021{
5022	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5023	struct alc_spec *spec = codec->spec;
5024	*ucontrol->value.integer.value = spec->master_sw;
5025	return 0;
5026}
5027
5028static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5029				   struct snd_ctl_elem_value *ucontrol)
5030{
5031	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5032	struct alc_spec *spec = codec->spec;
5033	int val = !!*ucontrol->value.integer.value;
5034	hda_nid_t hp, line, mono;
5035
5036	if (val == spec->master_sw)
5037		return 0;
5038	spec->master_sw = val;
5039	hp = (kcontrol->private_value >> 16) & 0xff;
5040	line = (kcontrol->private_value >> 8) & 0xff;
5041	mono = kcontrol->private_value & 0xff;
5042	alc260_hp_master_update(codec, hp, line, mono);
5043	return 1;
5044}
5045
5046static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5047	{
5048		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5049		.name = "Master Playback Switch",
5050		.info = snd_ctl_boolean_mono_info,
5051		.get = alc260_hp_master_sw_get,
5052		.put = alc260_hp_master_sw_put,
5053		.private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5054	},
5055	HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5056	HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5057	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5058	HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5059	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5060			      HDA_OUTPUT),
5061	HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5062	{ } /* end */
5063};
5064
5065static struct hda_verb alc260_hp_unsol_verbs[] = {
5066	{0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5067	{},
5068};
5069
5070static void alc260_hp_automute(struct hda_codec *codec)
5071{
5072	struct alc_spec *spec = codec->spec;
5073	unsigned int present;
5074
5075	present = snd_hda_codec_read(codec, 0x10, 0,
5076				     AC_VERB_GET_PIN_SENSE, 0);
5077	spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0;
5078	alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5079}
5080
5081static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5082{
5083	if ((res >> 26) == ALC880_HP_EVENT)
5084		alc260_hp_automute(codec);
5085}
5086
5087static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5088	{
5089		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5090		.name = "Master Playback Switch",
5091		.info = snd_ctl_boolean_mono_info,
5092		.get = alc260_hp_master_sw_get,
5093		.put = alc260_hp_master_sw_put,
5094		.private_value = (0x15 << 16) | (0x10 << 8) | 0x11
5095	},
5096	HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5097	HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5098	HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5099	HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5100	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5101	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
5102	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5103	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
5104	{ } /* end */
5105};
5106
5107static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5108	.ops = &snd_hda_bind_vol,
5109	.values = {
5110		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5111		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5112		HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5113		0
5114	},
5115};
5116
5117static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5118	.ops = &snd_hda_bind_sw,
5119	.values = {
5120		HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5121		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5122		0
5123	},
5124};
5125
5126static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5127	HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5128	HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5129	HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5130	HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5131	{ } /* end */
5132};
5133
5134static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5135	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5136	{},
5137};
5138
5139static void alc260_hp_3013_automute(struct hda_codec *codec)
5140{
5141	struct alc_spec *spec = codec->spec;
5142	unsigned int present;
5143
5144	present = snd_hda_codec_read(codec, 0x15, 0,
5145				     AC_VERB_GET_PIN_SENSE, 0);
5146	spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0;
5147	alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
5148}
5149
5150static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5151				       unsigned int res)
5152{
5153	if ((res >> 26) == ALC880_HP_EVENT)
5154		alc260_hp_3013_automute(codec);
5155}
5156
5157static void alc260_hp_3012_automute(struct hda_codec *codec)
5158{
5159	unsigned int present, bits;
5160
5161	present = snd_hda_codec_read(codec, 0x10, 0,
5162			AC_VERB_GET_PIN_SENSE, 0) & AC_PINSENSE_PRESENCE;
5163
5164	bits = present ? 0 : PIN_OUT;
5165	snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5166			    bits);
5167	snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5168			    bits);
5169	snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5170			    bits);
5171}
5172
5173static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5174				       unsigned int res)
5175{
5176	if ((res >> 26) == ALC880_HP_EVENT)
5177		alc260_hp_3012_automute(codec);
5178}
5179
5180/* Fujitsu S702x series laptops.  ALC260 pin usage: Mic/Line jack = 0x12,
5181 * HP jack = 0x14, CD audio =  0x16, internal speaker = 0x10.
5182 */
5183static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
5184	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5185	HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
5186	ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5187	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5188	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5189	HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5190	HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
5191	ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
5192	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5193	HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
5194	{ } /* end */
5195};
5196
5197/* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks.  Note that current
5198 * versions of the ALC260 don't act on requests to enable mic bias from NID
5199 * 0x0f (used to drive the headphone jack in these laptops).  The ALC260
5200 * datasheet doesn't mention this restriction.  At this stage it's not clear
5201 * whether this behaviour is intentional or is a hardware bug in chip
5202 * revisions available in early 2006.  Therefore for now allow the
5203 * "Headphone Jack Mode" control to span all choices, but if it turns out
5204 * that the lack of mic bias for this NID is intentional we could change the
5205 * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5206 *
5207 * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5208 * don't appear to make the mic bias available from the "line" jack, even
5209 * though the NID used for this jack (0x14) can supply it.  The theory is
5210 * that perhaps Acer have included blocking capacitors between the ALC260
5211 * and the output jack.  If this turns out to be the case for all such
5212 * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5213 * to ALC_PIN_DIR_INOUT_NOMICBIAS.
5214 *
5215 * The C20x Tablet series have a mono internal speaker which is controlled
5216 * via the chip's Mono sum widget and pin complex, so include the necessary
5217 * controls for such models.  On models without a "mono speaker" the control
5218 * won't do anything.
5219 */
5220static struct snd_kcontrol_new alc260_acer_mixer[] = {
5221	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5222	HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5223	ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5224	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5225			      HDA_OUTPUT),
5226	HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
5227			   HDA_INPUT),
5228	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5229	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5230	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5231	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5232	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5233	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5234	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5235	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5236	{ } /* end */
5237};
5238
5239/* Maxdata Favorit 100XS: one output and one input (0x12) jack
5240 */
5241static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5242	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5243	HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5244	ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5245	HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5246	HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5247	ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5248	{ } /* end */
5249};
5250
5251/* Packard bell V7900  ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5252 * Line In jack = 0x14, CD audio =  0x16, pc beep = 0x17.
5253 */
5254static struct snd_kcontrol_new alc260_will_mixer[] = {
5255	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5256	HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5257	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5258	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5259	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5260	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5261	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5262	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5263	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5264	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5265	{ } /* end */
5266};
5267
5268/* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5269 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5270 */
5271static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5272	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5273	HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5274	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5275	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5276	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5277	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5278	HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5279	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5280	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5281	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5282	{ } /* end */
5283};
5284
5285/*
5286 * initialization verbs
5287 */
5288static struct hda_verb alc260_init_verbs[] = {
5289	/* Line In pin widget for input */
5290	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5291	/* CD pin widget for input */
5292	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5293	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5294	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5295	/* Mic2 (front panel) pin widget for input and vref at 80% */
5296	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5297	/* LINE-2 is used for line-out in rear */
5298	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5299	/* select line-out */
5300	{0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
5301	/* LINE-OUT pin */
5302	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5303	/* enable HP */
5304	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5305	/* enable Mono */
5306	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5307	/* mute capture amp left and right */
5308	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5309	/* set connection select to line in (default select for this ADC) */
5310	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5311	/* mute capture amp left and right */
5312	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5313	/* set connection select to line in (default select for this ADC) */
5314	{0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
5315	/* set vol=0 Line-Out mixer amp left and right */
5316	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5317	/* unmute pin widget amp left and right (no gain on this amp) */
5318	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5319	/* set vol=0 HP mixer amp left and right */
5320	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5321	/* unmute pin widget amp left and right (no gain on this amp) */
5322	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5323	/* set vol=0 Mono mixer amp left and right */
5324	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5325	/* unmute pin widget amp left and right (no gain on this amp) */
5326	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5327	/* unmute LINE-2 out pin */
5328	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5329	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5330	 * Line In 2 = 0x03
5331	 */
5332	/* mute analog inputs */
5333	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5334	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5335	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5336	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5337	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5338	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5339	/* mute Front out path */
5340	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5341	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5342	/* mute Headphone out path */
5343	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5344	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5345	/* mute Mono out path */
5346	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5347	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5348	{ }
5349};
5350
5351#if 0 /* should be identical with alc260_init_verbs? */
5352static struct hda_verb alc260_hp_init_verbs[] = {
5353	/* Headphone and output */
5354	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5355	/* mono output */
5356	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5357	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5358	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5359	/* Mic2 (front panel) pin widget for input and vref at 80% */
5360	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5361	/* Line In pin widget for input */
5362	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5363	/* Line-2 pin widget for output */
5364	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5365	/* CD pin widget for input */
5366	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5367	/* unmute amp left and right */
5368	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5369	/* set connection select to line in (default select for this ADC) */
5370	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5371	/* unmute Line-Out mixer amp left and right (volume = 0) */
5372	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5373	/* mute pin widget amp left and right (no gain on this amp) */
5374	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5375	/* unmute HP mixer amp left and right (volume = 0) */
5376	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5377	/* mute pin widget amp left and right (no gain on this amp) */
5378	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5379	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5380	 * Line In 2 = 0x03
5381	 */
5382	/* mute analog inputs */
5383	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5384	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5385	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5386	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5387	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5388	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5389	/* Unmute Front out path */
5390	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5391	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5392	/* Unmute Headphone out path */
5393	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5394	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5395	/* Unmute Mono out path */
5396	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5397	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5398	{ }
5399};
5400#endif
5401
5402static struct hda_verb alc260_hp_3013_init_verbs[] = {
5403	/* Line out and output */
5404	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5405	/* mono output */
5406	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5407	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5408	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5409	/* Mic2 (front panel) pin widget for input and vref at 80% */
5410	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5411	/* Line In pin widget for input */
5412	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5413	/* Headphone pin widget for output */
5414	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5415	/* CD pin widget for input */
5416	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5417	/* unmute amp left and right */
5418	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5419	/* set connection select to line in (default select for this ADC) */
5420	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5421	/* unmute Line-Out mixer amp left and right (volume = 0) */
5422	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5423	/* mute pin widget amp left and right (no gain on this amp) */
5424	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5425	/* unmute HP mixer amp left and right (volume = 0) */
5426	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5427	/* mute pin widget amp left and right (no gain on this amp) */
5428	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5429	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5430	 * Line In 2 = 0x03
5431	 */
5432	/* mute analog inputs */
5433	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5434	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5435	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5436	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5437	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5438	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5439	/* Unmute Front out path */
5440	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5441	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5442	/* Unmute Headphone out path */
5443	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5444	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5445	/* Unmute Mono out path */
5446	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5447	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5448	{ }
5449};
5450
5451/* Initialisation sequence for ALC260 as configured in Fujitsu S702x
5452 * laptops.  ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
5453 * audio = 0x16, internal speaker = 0x10.
5454 */
5455static struct hda_verb alc260_fujitsu_init_verbs[] = {
5456	/* Disable all GPIOs */
5457	{0x01, AC_VERB_SET_GPIO_MASK, 0},
5458	/* Internal speaker is connected to headphone pin */
5459	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5460	/* Headphone/Line-out jack connects to Line1 pin; make it an output */
5461	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5462	/* Mic/Line-in jack is connected to mic1 pin, so make it an input */
5463	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5464	/* Ensure all other unused pins are disabled and muted. */
5465	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5466	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5467	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5468	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5469	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5470	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5471	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5472	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5473
5474	/* Disable digital (SPDIF) pins */
5475	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5476	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5477
5478	/* Ensure Line1 pin widget takes its input from the OUT1 sum bus
5479	 * when acting as an output.
5480	 */
5481	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5482
5483	/* Start with output sum widgets muted and their output gains at min */
5484	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5485	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5486	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5487	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5488	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5489	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5490	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5491	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5492	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5493
5494	/* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
5495	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5496	/* Unmute Line1 pin widget output buffer since it starts as an output.
5497	 * If the pin mode is changed by the user the pin mode control will
5498	 * take care of enabling the pin's input/output buffers as needed.
5499	 * Therefore there's no need to enable the input buffer at this
5500	 * stage.
5501	 */
5502	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5503	/* Unmute input buffer of pin widget used for Line-in (no equiv
5504	 * mixer ctrl)
5505	 */
5506	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5507
5508	/* Mute capture amp left and right */
5509	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5510	/* Set ADC connection select to match default mixer setting - line
5511	 * in (on mic1 pin)
5512	 */
5513	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5514
5515	/* Do the same for the second ADC: mute capture input amp and
5516	 * set ADC connection to line in (on mic1 pin)
5517	 */
5518	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5519	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5520
5521	/* Mute all inputs to mixer widget (even unconnected ones) */
5522	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5523	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5524	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5525	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5526	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5527	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5528	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5529	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5530
5531	{ }
5532};
5533
5534/* Initialisation sequence for ALC260 as configured in Acer TravelMate and
5535 * similar laptops (adapted from Fujitsu init verbs).
5536 */
5537static struct hda_verb alc260_acer_init_verbs[] = {
5538	/* On TravelMate laptops, GPIO 0 enables the internal speaker and
5539	 * the headphone jack.  Turn this on and rely on the standard mute
5540	 * methods whenever the user wants to turn these outputs off.
5541	 */
5542	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5543	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5544	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5545	/* Internal speaker/Headphone jack is connected to Line-out pin */
5546	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5547	/* Internal microphone/Mic jack is connected to Mic1 pin */
5548	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5549	/* Line In jack is connected to Line1 pin */
5550	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5551	/* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
5552	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5553	/* Ensure all other unused pins are disabled and muted. */
5554	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5555	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5556	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5557	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5558	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5559	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5560	/* Disable digital (SPDIF) pins */
5561	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5562	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5563
5564	/* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5565	 * bus when acting as outputs.
5566	 */
5567	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5568	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5569
5570	/* Start with output sum widgets muted and their output gains at min */
5571	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5572	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5573	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5574	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5575	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5576	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5577	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5578	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5579	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5580
5581	/* Unmute Line-out pin widget amp left and right
5582	 * (no equiv mixer ctrl)
5583	 */
5584	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5585	/* Unmute mono pin widget amp output (no equiv mixer ctrl) */
5586	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5587	/* Unmute Mic1 and Line1 pin widget input buffers since they start as
5588	 * inputs. If the pin mode is changed by the user the pin mode control
5589	 * will take care of enabling the pin's input/output buffers as needed.
5590	 * Therefore there's no need to enable the input buffer at this
5591	 * stage.
5592	 */
5593	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5594	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5595
5596	/* Mute capture amp left and right */
5597	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5598	/* Set ADC connection select to match default mixer setting - mic
5599	 * (on mic1 pin)
5600	 */
5601	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5602
5603	/* Do similar with the second ADC: mute capture input amp and
5604	 * set ADC connection to mic to match ALSA's default state.
5605	 */
5606	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5607	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5608
5609	/* Mute all inputs to mixer widget (even unconnected ones) */
5610	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5611	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5612	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5613	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5614	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5615	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5616	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5617	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5618
5619	{ }
5620};
5621
5622/* Initialisation sequence for Maxdata Favorit 100XS
5623 * (adapted from Acer init verbs).
5624 */
5625static struct hda_verb alc260_favorit100_init_verbs[] = {
5626	/* GPIO 0 enables the output jack.
5627	 * Turn this on and rely on the standard mute
5628	 * methods whenever the user wants to turn these outputs off.
5629	 */
5630	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5631	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5632	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5633	/* Line/Mic input jack is connected to Mic1 pin */
5634	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5635	/* Ensure all other unused pins are disabled and muted. */
5636	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5637	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5638	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5639	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5640	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5641	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5642	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5643	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5644	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5645	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5646	/* Disable digital (SPDIF) pins */
5647	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5648	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5649
5650	/* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5651	 * bus when acting as outputs.
5652	 */
5653	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5654	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5655
5656	/* Start with output sum widgets muted and their output gains at min */
5657	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5658	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5659	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5660	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5661	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5662	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5663	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5664	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5665	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5666
5667	/* Unmute Line-out pin widget amp left and right
5668	 * (no equiv mixer ctrl)
5669	 */
5670	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5671	/* Unmute Mic1 and Line1 pin widget input buffers since they start as
5672	 * inputs. If the pin mode is changed by the user the pin mode control
5673	 * will take care of enabling the pin's input/output buffers as needed.
5674	 * Therefore there's no need to enable the input buffer at this
5675	 * stage.
5676	 */
5677	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5678
5679	/* Mute capture amp left and right */
5680	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5681	/* Set ADC connection select to match default mixer setting - mic
5682	 * (on mic1 pin)
5683	 */
5684	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5685
5686	/* Do similar with the second ADC: mute capture input amp and
5687	 * set ADC connection to mic to match ALSA's default state.
5688	 */
5689	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5690	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5691
5692	/* Mute all inputs to mixer widget (even unconnected ones) */
5693	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5694	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5695	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5696	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5697	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5698	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5699	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5700	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5701
5702	{ }
5703};
5704
5705static struct hda_verb alc260_will_verbs[] = {
5706	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5707	{0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
5708	{0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
5709	{0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5710	{0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5711	{0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
5712	{}
5713};
5714
5715static struct hda_verb alc260_replacer_672v_verbs[] = {
5716	{0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5717	{0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5718	{0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
5719
5720	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5721	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5722	{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5723
5724	{0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5725	{}
5726};
5727
5728/* toggle speaker-output according to the hp-jack state */
5729static void alc260_replacer_672v_automute(struct hda_codec *codec)
5730{
5731        unsigned int present;
5732
5733	/* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
5734        present = snd_hda_codec_read(codec, 0x0f, 0,
5735                                     AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
5736	if (present) {
5737		snd_hda_codec_write_cache(codec, 0x01, 0,
5738					  AC_VERB_SET_GPIO_DATA, 1);
5739		snd_hda_codec_write_cache(codec, 0x0f, 0,
5740					  AC_VERB_SET_PIN_WIDGET_CONTROL,
5741					  PIN_HP);
5742	} else {
5743		snd_hda_codec_write_cache(codec, 0x01, 0,
5744					  AC_VERB_SET_GPIO_DATA, 0);
5745		snd_hda_codec_write_cache(codec, 0x0f, 0,
5746					  AC_VERB_SET_PIN_WIDGET_CONTROL,
5747					  PIN_OUT);
5748	}
5749}
5750
5751static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
5752                                       unsigned int res)
5753{
5754        if ((res >> 26) == ALC880_HP_EVENT)
5755                alc260_replacer_672v_automute(codec);
5756}
5757
5758static struct hda_verb alc260_hp_dc7600_verbs[] = {
5759	{0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
5760	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
5761	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5762	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5763	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5764	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5765	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5766	{0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5767	{0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5768	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5769	{}
5770};
5771
5772/* Test configuration for debugging, modelled after the ALC880 test
5773 * configuration.
5774 */
5775#ifdef CONFIG_SND_DEBUG
5776static hda_nid_t alc260_test_dac_nids[1] = {
5777	0x02,
5778};
5779static hda_nid_t alc260_test_adc_nids[2] = {
5780	0x04, 0x05,
5781};
5782/* For testing the ALC260, each input MUX needs its own definition since
5783 * the signal assignments are different.  This assumes that the first ADC
5784 * is NID 0x04.
5785 */
5786static struct hda_input_mux alc260_test_capture_sources[2] = {
5787	{
5788		.num_items = 7,
5789		.items = {
5790			{ "MIC1 pin", 0x0 },
5791			{ "MIC2 pin", 0x1 },
5792			{ "LINE1 pin", 0x2 },
5793			{ "LINE2 pin", 0x3 },
5794			{ "CD pin", 0x4 },
5795			{ "LINE-OUT pin", 0x5 },
5796			{ "HP-OUT pin", 0x6 },
5797		},
5798        },
5799	{
5800		.num_items = 8,
5801		.items = {
5802			{ "MIC1 pin", 0x0 },
5803			{ "MIC2 pin", 0x1 },
5804			{ "LINE1 pin", 0x2 },
5805			{ "LINE2 pin", 0x3 },
5806			{ "CD pin", 0x4 },
5807			{ "Mixer", 0x5 },
5808			{ "LINE-OUT pin", 0x6 },
5809			{ "HP-OUT pin", 0x7 },
5810		},
5811        },
5812};
5813static struct snd_kcontrol_new alc260_test_mixer[] = {
5814	/* Output driver widgets */
5815	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5816	HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5817	HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5818	HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
5819	HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5820	HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
5821
5822	/* Modes for retasking pin widgets
5823	 * Note: the ALC260 doesn't seem to act on requests to enable mic
5824         * bias from NIDs 0x0f and 0x10.  The ALC260 datasheet doesn't
5825         * mention this restriction.  At this stage it's not clear whether
5826         * this behaviour is intentional or is a hardware bug in chip
5827         * revisions available at least up until early 2006.  Therefore for
5828         * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
5829         * choices, but if it turns out that the lack of mic bias for these
5830         * NIDs is intentional we could change their modes from
5831         * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5832	 */
5833	ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
5834	ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
5835	ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
5836	ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
5837	ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
5838	ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
5839
5840	/* Loopback mixer controls */
5841	HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
5842	HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
5843	HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
5844	HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
5845	HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
5846	HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
5847	HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
5848	HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
5849	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5850	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5851	HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
5852	HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
5853	HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
5854	HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
5855
5856	/* Controls for GPIO pins, assuming they are configured as outputs */
5857	ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
5858	ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
5859	ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
5860	ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
5861
5862	/* Switches to allow the digital IO pins to be enabled.  The datasheet
5863	 * is ambigious as to which NID is which; testing on laptops which
5864	 * make this output available should provide clarification.
5865	 */
5866	ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
5867	ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
5868
5869	/* A switch allowing EAPD to be enabled.  Some laptops seem to use
5870	 * this output to turn on an external amplifier.
5871	 */
5872	ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
5873	ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
5874
5875	{ } /* end */
5876};
5877static struct hda_verb alc260_test_init_verbs[] = {
5878	/* Enable all GPIOs as outputs with an initial value of 0 */
5879	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
5880	{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5881	{0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
5882
5883	/* Enable retasking pins as output, initially without power amp */
5884	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5885	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5886	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5887	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5888	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5889	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5890
5891	/* Disable digital (SPDIF) pins initially, but users can enable
5892	 * them via a mixer switch.  In the case of SPDIF-out, this initverb
5893	 * payload also sets the generation to 0, output to be in "consumer"
5894	 * PCM format, copyright asserted, no pre-emphasis and no validity
5895	 * control.
5896	 */
5897	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5898	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5899
5900	/* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
5901	 * OUT1 sum bus when acting as an output.
5902	 */
5903	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5904	{0x0c, AC_VERB_SET_CONNECT_SEL, 0},
5905	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5906	{0x0e, AC_VERB_SET_CONNECT_SEL, 0},
5907
5908	/* Start with output sum widgets muted and their output gains at min */
5909	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5910	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5911	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5912	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5913	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5914	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5915	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5916	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5917	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5918
5919	/* Unmute retasking pin widget output buffers since the default
5920	 * state appears to be output.  As the pin mode is changed by the
5921	 * user the pin mode control will take care of enabling the pin's
5922	 * input/output buffers as needed.
5923	 */
5924	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5925	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5926	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5927	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5928	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5929	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5930	/* Also unmute the mono-out pin widget */
5931	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5932
5933	/* Mute capture amp left and right */
5934	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5935	/* Set ADC connection select to match default mixer setting (mic1
5936	 * pin)
5937	 */
5938	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5939
5940	/* Do the same for the second ADC: mute capture input amp and
5941	 * set ADC connection to mic1 pin
5942	 */
5943	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5944	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5945
5946	/* Mute all inputs to mixer widget (even unconnected ones) */
5947	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5948	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5949	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5950	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5951	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5952	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5953	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5954	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5955
5956	{ }
5957};
5958#endif
5959
5960#define alc260_pcm_analog_playback	alc880_pcm_analog_alt_playback
5961#define alc260_pcm_analog_capture	alc880_pcm_analog_capture
5962
5963#define alc260_pcm_digital_playback	alc880_pcm_digital_playback
5964#define alc260_pcm_digital_capture	alc880_pcm_digital_capture
5965
5966/*
5967 * for BIOS auto-configuration
5968 */
5969
5970static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
5971					const char *pfx, int *vol_bits)
5972{
5973	hda_nid_t nid_vol;
5974	unsigned long vol_val, sw_val;
5975	char name[32];
5976	int err;
5977
5978	if (nid >= 0x0f && nid < 0x11) {
5979		nid_vol = nid - 0x7;
5980		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
5981		sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
5982	} else if (nid == 0x11) {
5983		nid_vol = nid - 0x7;
5984		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
5985		sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
5986	} else if (nid >= 0x12 && nid <= 0x15) {
5987		nid_vol = 0x08;
5988		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
5989		sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
5990	} else
5991		return 0; /* N/A */
5992
5993	if (!(*vol_bits & (1 << nid_vol))) {
5994		/* first control for the volume widget */
5995		snprintf(name, sizeof(name), "%s Playback Volume", pfx);
5996		err = add_control(spec, ALC_CTL_WIDGET_VOL, name, vol_val);
5997		if (err < 0)
5998			return err;
5999		*vol_bits |= (1 << nid_vol);
6000	}
6001	snprintf(name, sizeof(name), "%s Playback Switch", pfx);
6002	err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, sw_val);
6003	if (err < 0)
6004		return err;
6005	return 1;
6006}
6007
6008/* add playback controls from the parsed DAC table */
6009static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6010					     const struct auto_pin_cfg *cfg)
6011{
6012	hda_nid_t nid;
6013	int err;
6014	int vols = 0;
6015
6016	spec->multiout.num_dacs = 1;
6017	spec->multiout.dac_nids = spec->private_dac_nids;
6018	spec->multiout.dac_nids[0] = 0x02;
6019
6020	nid = cfg->line_out_pins[0];
6021	if (nid) {
6022		const char *pfx;
6023		if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6024			pfx = "Master";
6025		else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6026			pfx = "Speaker";
6027		else
6028			pfx = "Front";
6029		err = alc260_add_playback_controls(spec, nid, pfx, &vols);
6030		if (err < 0)
6031			return err;
6032	}
6033
6034	nid = cfg->speaker_pins[0];
6035	if (nid) {
6036		err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
6037		if (err < 0)
6038			return err;
6039	}
6040
6041	nid = cfg->hp_pins[0];
6042	if (nid) {
6043		err = alc260_add_playback_controls(spec, nid, "Headphone",
6044						   &vols);
6045		if (err < 0)
6046			return err;
6047	}
6048	return 0;
6049}
6050
6051/* create playback/capture controls for input pins */
6052static int alc260_auto_create_input_ctls(struct hda_codec *codec,
6053						const struct auto_pin_cfg *cfg)
6054{
6055	return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
6056}
6057
6058static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6059					      hda_nid_t nid, int pin_type,
6060					      int sel_idx)
6061{
6062	alc_set_pin_output(codec, nid, pin_type);
6063	/* need the manual connection? */
6064	if (nid >= 0x12) {
6065		int idx = nid - 0x12;
6066		snd_hda_codec_write(codec, idx + 0x0b, 0,
6067				    AC_VERB_SET_CONNECT_SEL, sel_idx);
6068	}
6069}
6070
6071static void alc260_auto_init_multi_out(struct hda_codec *codec)
6072{
6073	struct alc_spec *spec = codec->spec;
6074	hda_nid_t nid;
6075
6076	nid = spec->autocfg.line_out_pins[0];
6077	if (nid) {
6078		int pin_type = get_pin_type(spec->autocfg.line_out_type);
6079		alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6080	}
6081
6082	nid = spec->autocfg.speaker_pins[0];
6083	if (nid)
6084		alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6085
6086	nid = spec->autocfg.hp_pins[0];
6087	if (nid)
6088		alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
6089}
6090
6091#define ALC260_PIN_CD_NID		0x16
6092static void alc260_auto_init_analog_input(struct hda_codec *codec)
6093{
6094	struct alc_spec *spec = codec->spec;
6095	int i;
6096
6097	for (i = 0; i < AUTO_PIN_LAST; i++) {
6098		hda_nid_t nid = spec->autocfg.input_pins[i];
6099		if (nid >= 0x12) {
6100			alc_set_input_pin(codec, nid, i);
6101			if (nid != ALC260_PIN_CD_NID &&
6102			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
6103				snd_hda_codec_write(codec, nid, 0,
6104						    AC_VERB_SET_AMP_GAIN_MUTE,
6105						    AMP_OUT_MUTE);
6106		}
6107	}
6108}
6109
6110/*
6111 * generic initialization of ADC, input mixers and output mixers
6112 */
6113static struct hda_verb alc260_volume_init_verbs[] = {
6114	/*
6115	 * Unmute ADC0-1 and set the default input to mic-in
6116	 */
6117	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6118	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6119	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6120	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6121
6122	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6123	 * mixer widget
6124	 * Note: PASD motherboards uses the Line In 2 as the input for
6125	 * front panel mic (mic 2)
6126	 */
6127	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
6128	/* mute analog inputs */
6129	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6130	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6131	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6132	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6133	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6134
6135	/*
6136	 * Set up output mixers (0x08 - 0x0a)
6137	 */
6138	/* set vol=0 to output mixers */
6139	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6140	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6141	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6142	/* set up input amps for analog loopback */
6143	/* Amp Indices: DAC = 0, mixer = 1 */
6144	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6145	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6146	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6147	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6148	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6149	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6150
6151	{ }
6152};
6153
6154static int alc260_parse_auto_config(struct hda_codec *codec)
6155{
6156	struct alc_spec *spec = codec->spec;
6157	int err;
6158	static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6159
6160	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6161					   alc260_ignore);
6162	if (err < 0)
6163		return err;
6164	err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6165	if (err < 0)
6166		return err;
6167	if (!spec->kctls.list)
6168		return 0; /* can't find valid BIOS pin config */
6169	err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
6170	if (err < 0)
6171		return err;
6172
6173	spec->multiout.max_channels = 2;
6174
6175	if (spec->autocfg.dig_outs)
6176		spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
6177	if (spec->kctls.list)
6178		add_mixer(spec, spec->kctls.list);
6179
6180	add_verb(spec, alc260_volume_init_verbs);
6181
6182	spec->num_mux_defs = 1;
6183	spec->input_mux = &spec->private_imux[0];
6184
6185	alc_ssid_check(codec, 0x10, 0x15, 0x0f);
6186
6187	return 1;
6188}
6189
6190/* additional initialization for auto-configuration model */
6191static void alc260_auto_init(struct hda_codec *codec)
6192{
6193	struct alc_spec *spec = codec->spec;
6194	alc260_auto_init_multi_out(codec);
6195	alc260_auto_init_analog_input(codec);
6196	if (spec->unsol_event)
6197		alc_inithook(codec);
6198}
6199
6200#ifdef CONFIG_SND_HDA_POWER_SAVE
6201static struct hda_amp_list alc260_loopbacks[] = {
6202	{ 0x07, HDA_INPUT, 0 },
6203	{ 0x07, HDA_INPUT, 1 },
6204	{ 0x07, HDA_INPUT, 2 },
6205	{ 0x07, HDA_INPUT, 3 },
6206	{ 0x07, HDA_INPUT, 4 },
6207	{ } /* end */
6208};
6209#endif
6210
6211/*
6212 * ALC260 configurations
6213 */
6214static const char *alc260_models[ALC260_MODEL_LAST] = {
6215	[ALC260_BASIC]		= "basic",
6216	[ALC260_HP]		= "hp",
6217	[ALC260_HP_3013]	= "hp-3013",
6218	[ALC260_HP_DC7600]	= "hp-dc7600",
6219	[ALC260_FUJITSU_S702X]	= "fujitsu",
6220	[ALC260_ACER]		= "acer",
6221	[ALC260_WILL]		= "will",
6222	[ALC260_REPLACER_672V]	= "replacer",
6223	[ALC260_FAVORIT100]	= "favorit100",
6224#ifdef CONFIG_SND_DEBUG
6225	[ALC260_TEST]		= "test",
6226#endif
6227	[ALC260_AUTO]		= "auto",
6228};
6229
6230static struct snd_pci_quirk alc260_cfg_tbl[] = {
6231	SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
6232	SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
6233	SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
6234	SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
6235	SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_HP_3013),
6236	SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
6237	SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
6238	SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
6239	SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6240	SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6241	SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6242	SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6243	SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6244	SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6245	SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6246	SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6247	SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
6248	SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
6249	SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
6250	{}
6251};
6252
6253static struct alc_config_preset alc260_presets[] = {
6254	[ALC260_BASIC] = {
6255		.mixers = { alc260_base_output_mixer,
6256			    alc260_input_mixer },
6257		.init_verbs = { alc260_init_verbs },
6258		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6259		.dac_nids = alc260_dac_nids,
6260		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6261		.adc_nids = alc260_adc_nids,
6262		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6263		.channel_mode = alc260_modes,
6264		.input_mux = &alc260_capture_source,
6265	},
6266	[ALC260_HP] = {
6267		.mixers = { alc260_hp_output_mixer,
6268			    alc260_input_mixer },
6269		.init_verbs = { alc260_init_verbs,
6270				alc260_hp_unsol_verbs },
6271		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6272		.dac_nids = alc260_dac_nids,
6273		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6274		.adc_nids = alc260_adc_nids_alt,
6275		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6276		.channel_mode = alc260_modes,
6277		.input_mux = &alc260_capture_source,
6278		.unsol_event = alc260_hp_unsol_event,
6279		.init_hook = alc260_hp_automute,
6280	},
6281	[ALC260_HP_DC7600] = {
6282		.mixers = { alc260_hp_dc7600_mixer,
6283			    alc260_input_mixer },
6284		.init_verbs = { alc260_init_verbs,
6285				alc260_hp_dc7600_verbs },
6286		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6287		.dac_nids = alc260_dac_nids,
6288		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6289		.adc_nids = alc260_adc_nids_alt,
6290		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6291		.channel_mode = alc260_modes,
6292		.input_mux = &alc260_capture_source,
6293		.unsol_event = alc260_hp_3012_unsol_event,
6294		.init_hook = alc260_hp_3012_automute,
6295	},
6296	[ALC260_HP_3013] = {
6297		.mixers = { alc260_hp_3013_mixer,
6298			    alc260_input_mixer },
6299		.init_verbs = { alc260_hp_3013_init_verbs,
6300				alc260_hp_3013_unsol_verbs },
6301		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6302		.dac_nids = alc260_dac_nids,
6303		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6304		.adc_nids = alc260_adc_nids_alt,
6305		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6306		.channel_mode = alc260_modes,
6307		.input_mux = &alc260_capture_source,
6308		.unsol_event = alc260_hp_3013_unsol_event,
6309		.init_hook = alc260_hp_3013_automute,
6310	},
6311	[ALC260_FUJITSU_S702X] = {
6312		.mixers = { alc260_fujitsu_mixer },
6313		.init_verbs = { alc260_fujitsu_init_verbs },
6314		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6315		.dac_nids = alc260_dac_nids,
6316		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6317		.adc_nids = alc260_dual_adc_nids,
6318		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6319		.channel_mode = alc260_modes,
6320		.num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6321		.input_mux = alc260_fujitsu_capture_sources,
6322	},
6323	[ALC260_ACER] = {
6324		.mixers = { alc260_acer_mixer },
6325		.init_verbs = { alc260_acer_init_verbs },
6326		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6327		.dac_nids = alc260_dac_nids,
6328		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6329		.adc_nids = alc260_dual_adc_nids,
6330		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6331		.channel_mode = alc260_modes,
6332		.num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6333		.input_mux = alc260_acer_capture_sources,
6334	},
6335	[ALC260_FAVORIT100] = {
6336		.mixers = { alc260_favorit100_mixer },
6337		.init_verbs = { alc260_favorit100_init_verbs },
6338		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6339		.dac_nids = alc260_dac_nids,
6340		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6341		.adc_nids = alc260_dual_adc_nids,
6342		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6343		.channel_mode = alc260_modes,
6344		.num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6345		.input_mux = alc260_favorit100_capture_sources,
6346	},
6347	[ALC260_WILL] = {
6348		.mixers = { alc260_will_mixer },
6349		.init_verbs = { alc260_init_verbs, alc260_will_verbs },
6350		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6351		.dac_nids = alc260_dac_nids,
6352		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6353		.adc_nids = alc260_adc_nids,
6354		.dig_out_nid = ALC260_DIGOUT_NID,
6355		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6356		.channel_mode = alc260_modes,
6357		.input_mux = &alc260_capture_source,
6358	},
6359	[ALC260_REPLACER_672V] = {
6360		.mixers = { alc260_replacer_672v_mixer },
6361		.init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6362		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6363		.dac_nids = alc260_dac_nids,
6364		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6365		.adc_nids = alc260_adc_nids,
6366		.dig_out_nid = ALC260_DIGOUT_NID,
6367		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6368		.channel_mode = alc260_modes,
6369		.input_mux = &alc260_capture_source,
6370		.unsol_event = alc260_replacer_672v_unsol_event,
6371		.init_hook = alc260_replacer_672v_automute,
6372	},
6373#ifdef CONFIG_SND_DEBUG
6374	[ALC260_TEST] = {
6375		.mixers = { alc260_test_mixer },
6376		.init_verbs = { alc260_test_init_verbs },
6377		.num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6378		.dac_nids = alc260_test_dac_nids,
6379		.num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6380		.adc_nids = alc260_test_adc_nids,
6381		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6382		.channel_mode = alc260_modes,
6383		.num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6384		.input_mux = alc260_test_capture_sources,
6385	},
6386#endif
6387};
6388
6389static int patch_alc260(struct hda_codec *codec)
6390{
6391	struct alc_spec *spec;
6392	int err, board_config;
6393
6394	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6395	if (spec == NULL)
6396		return -ENOMEM;
6397
6398	codec->spec = spec;
6399
6400	board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
6401						  alc260_models,
6402						  alc260_cfg_tbl);
6403	if (board_config < 0) {
6404		snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6405			   codec->chip_name);
6406		board_config = ALC260_AUTO;
6407	}
6408
6409	if (board_config == ALC260_AUTO) {
6410		/* automatic parse from the BIOS config */
6411		err = alc260_parse_auto_config(codec);
6412		if (err < 0) {
6413			alc_free(codec);
6414			return err;
6415		} else if (!err) {
6416			printk(KERN_INFO
6417			       "hda_codec: Cannot set up configuration "
6418			       "from BIOS.  Using base mode...\n");
6419			board_config = ALC260_BASIC;
6420		}
6421	}
6422
6423	err = snd_hda_attach_beep_device(codec, 0x1);
6424	if (err < 0) {
6425		alc_free(codec);
6426		return err;
6427	}
6428
6429	if (board_config != ALC260_AUTO)
6430		setup_preset(codec, &alc260_presets[board_config]);
6431
6432	spec->stream_analog_playback = &alc260_pcm_analog_playback;
6433	spec->stream_analog_capture = &alc260_pcm_analog_capture;
6434
6435	spec->stream_digital_playback = &alc260_pcm_digital_playback;
6436	spec->stream_digital_capture = &alc260_pcm_digital_capture;
6437
6438	if (!spec->adc_nids && spec->input_mux) {
6439		/* check whether NID 0x04 is valid */
6440		unsigned int wcap = get_wcaps(codec, 0x04);
6441		wcap = get_wcaps_type(wcap);
6442		/* get type */
6443		if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
6444			spec->adc_nids = alc260_adc_nids_alt;
6445			spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
6446		} else {
6447			spec->adc_nids = alc260_adc_nids;
6448			spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
6449		}
6450	}
6451	set_capture_mixer(codec);
6452	set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
6453
6454	spec->vmaster_nid = 0x08;
6455
6456	codec->patch_ops = alc_patch_ops;
6457	if (board_config == ALC260_AUTO)
6458		spec->init_hook = alc260_auto_init;
6459#ifdef CONFIG_SND_HDA_POWER_SAVE
6460	if (!spec->loopback.amplist)
6461		spec->loopback.amplist = alc260_loopbacks;
6462#endif
6463	codec->proc_widget_hook = print_realtek_coef;
6464
6465	return 0;
6466}
6467
6468
6469/*
6470 * ALC882/883/885/888/889 support
6471 *
6472 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
6473 * configuration.  Each pin widget can choose any input DACs and a mixer.
6474 * Each ADC is connected from a mixer of all inputs.  This makes possible
6475 * 6-channel independent captures.
6476 *
6477 * In addition, an independent DAC for the multi-playback (not used in this
6478 * driver yet).
6479 */
6480#define ALC882_DIGOUT_NID	0x06
6481#define ALC882_DIGIN_NID	0x0a
6482#define ALC883_DIGOUT_NID	ALC882_DIGOUT_NID
6483#define ALC883_DIGIN_NID	ALC882_DIGIN_NID
6484#define ALC1200_DIGOUT_NID	0x10
6485
6486
6487static struct hda_channel_mode alc882_ch_modes[1] = {
6488	{ 8, NULL }
6489};
6490
6491/* DACs */
6492static hda_nid_t alc882_dac_nids[4] = {
6493	/* front, rear, clfe, rear_surr */
6494	0x02, 0x03, 0x04, 0x05
6495};
6496#define alc883_dac_nids		alc882_dac_nids
6497
6498/* ADCs */
6499#define alc882_adc_nids		alc880_adc_nids
6500#define alc882_adc_nids_alt	alc880_adc_nids_alt
6501#define alc883_adc_nids		alc882_adc_nids_alt
6502static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
6503static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
6504#define alc889_adc_nids		alc880_adc_nids
6505
6506static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
6507static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
6508#define alc883_capsrc_nids	alc882_capsrc_nids_alt
6509static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
6510#define alc889_capsrc_nids	alc882_capsrc_nids
6511
6512/* input MUX */
6513/* FIXME: should be a matrix-type input source selection */
6514
6515static struct hda_input_mux alc882_capture_source = {
6516	.num_items = 4,
6517	.items = {
6518		{ "Mic", 0x0 },
6519		{ "Front Mic", 0x1 },
6520		{ "Line", 0x2 },
6521		{ "CD", 0x4 },
6522	},
6523};
6524
6525#define alc883_capture_source	alc882_capture_source
6526
6527static struct hda_input_mux alc889_capture_source = {
6528	.num_items = 3,
6529	.items = {
6530		{ "Front Mic", 0x0 },
6531		{ "Mic", 0x3 },
6532		{ "Line", 0x2 },
6533	},
6534};
6535
6536static struct hda_input_mux mb5_capture_source = {
6537	.num_items = 3,
6538	.items = {
6539		{ "Mic", 0x1 },
6540		{ "Line", 0x2 },
6541		{ "CD", 0x4 },
6542	},
6543};
6544
6545static struct hda_input_mux alc883_3stack_6ch_intel = {
6546	.num_items = 4,
6547	.items = {
6548		{ "Mic", 0x1 },
6549		{ "Front Mic", 0x0 },
6550		{ "Line", 0x2 },
6551		{ "CD", 0x4 },
6552	},
6553};
6554
6555static struct hda_input_mux alc883_lenovo_101e_capture_source = {
6556	.num_items = 2,
6557	.items = {
6558		{ "Mic", 0x1 },
6559		{ "Line", 0x2 },
6560	},
6561};
6562
6563static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
6564	.num_items = 4,
6565	.items = {
6566		{ "Mic", 0x0 },
6567		{ "iMic", 0x1 },
6568		{ "Line", 0x2 },
6569		{ "CD", 0x4 },
6570	},
6571};
6572
6573static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
6574	.num_items = 2,
6575	.items = {
6576		{ "Mic", 0x0 },
6577		{ "Int Mic", 0x1 },
6578	},
6579};
6580
6581static struct hda_input_mux alc883_lenovo_sky_capture_source = {
6582	.num_items = 3,
6583	.items = {
6584		{ "Mic", 0x0 },
6585		{ "Front Mic", 0x1 },
6586		{ "Line", 0x4 },
6587	},
6588};
6589
6590static struct hda_input_mux alc883_asus_eee1601_capture_source = {
6591	.num_items = 2,
6592	.items = {
6593		{ "Mic", 0x0 },
6594		{ "Line", 0x2 },
6595	},
6596};
6597
6598static struct hda_input_mux alc889A_mb31_capture_source = {
6599	.num_items = 2,
6600	.items = {
6601		{ "Mic", 0x0 },
6602		/* Front Mic (0x01) unused */
6603		{ "Line", 0x2 },
6604		/* Line 2 (0x03) unused */
6605		/* CD (0x04) unsused? */
6606	},
6607};
6608
6609/*
6610 * 2ch mode
6611 */
6612static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
6613	{ 2, NULL }
6614};
6615
6616/*
6617 * 2ch mode
6618 */
6619static struct hda_verb alc882_3ST_ch2_init[] = {
6620	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6621	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6622	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6623	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6624	{ } /* end */
6625};
6626
6627/*
6628 * 4ch mode
6629 */
6630static struct hda_verb alc882_3ST_ch4_init[] = {
6631	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6632	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6633	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6634	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6635	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6636	{ } /* end */
6637};
6638
6639/*
6640 * 6ch mode
6641 */
6642static struct hda_verb alc882_3ST_ch6_init[] = {
6643	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6644	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6645	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6646	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6647	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6648	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6649	{ } /* end */
6650};
6651
6652static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
6653	{ 2, alc882_3ST_ch2_init },
6654	{ 4, alc882_3ST_ch4_init },
6655	{ 6, alc882_3ST_ch6_init },
6656};
6657
6658#define alc883_3ST_6ch_modes	alc882_3ST_6ch_modes
6659
6660/*
6661 * 2ch mode
6662 */
6663static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
6664	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
6665	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6666	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6667	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6668	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6669	{ } /* end */
6670};
6671
6672/*
6673 * 4ch mode
6674 */
6675static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
6676	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6677	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6678	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6679	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6680	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6681	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6682	{ } /* end */
6683};
6684
6685/*
6686 * 6ch mode
6687 */
6688static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
6689	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6690	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6691	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6692	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6693	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6694	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6695	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6696	{ } /* end */
6697};
6698
6699static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
6700	{ 2, alc883_3ST_ch2_clevo_init },
6701	{ 4, alc883_3ST_ch4_clevo_init },
6702	{ 6, alc883_3ST_ch6_clevo_init },
6703};
6704
6705
6706/*
6707 * 6ch mode
6708 */
6709static struct hda_verb alc882_sixstack_ch6_init[] = {
6710	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
6711	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6712	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6713	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6714	{ } /* end */
6715};
6716
6717/*
6718 * 8ch mode
6719 */
6720static struct hda_verb alc882_sixstack_ch8_init[] = {
6721	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6722	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6723	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6724	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6725	{ } /* end */
6726};
6727
6728static struct hda_channel_mode alc882_sixstack_modes[2] = {
6729	{ 6, alc882_sixstack_ch6_init },
6730	{ 8, alc882_sixstack_ch8_init },
6731};
6732
6733/*
6734 * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
6735 */
6736
6737/*
6738 * 2ch mode
6739 */
6740static struct hda_verb alc885_mbp_ch2_init[] = {
6741	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6742	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6743	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6744	{ } /* end */
6745};
6746
6747/*
6748 * 4ch mode
6749 */
6750static struct hda_verb alc885_mbp_ch4_init[] = {
6751	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6752	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6753	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6754	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6755	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6756	{ } /* end */
6757};
6758
6759static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
6760	{ 2, alc885_mbp_ch2_init },
6761	{ 4, alc885_mbp_ch4_init },
6762};
6763
6764/*
6765 * 2ch
6766 * Speakers/Woofer/HP = Front
6767 * LineIn = Input
6768 */
6769static struct hda_verb alc885_mb5_ch2_init[] = {
6770	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6771	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
6772	{ } /* end */
6773};
6774
6775/*
6776 * 6ch mode
6777 * Speakers/HP = Front
6778 * Woofer = LFE
6779 * LineIn = Surround
6780 */
6781static struct hda_verb alc885_mb5_ch6_init[] = {
6782	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6783	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6784	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6785	{ } /* end */
6786};
6787
6788static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
6789	{ 2, alc885_mb5_ch2_init },
6790	{ 6, alc885_mb5_ch6_init },
6791};
6792
6793
6794/*
6795 * 2ch mode
6796 */
6797static struct hda_verb alc883_4ST_ch2_init[] = {
6798	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6799	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6800	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6801	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6802	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6803	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6804	{ } /* end */
6805};
6806
6807/*
6808 * 4ch mode
6809 */
6810static struct hda_verb alc883_4ST_ch4_init[] = {
6811	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6812	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6813	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6814	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6815	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6816	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6817	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6818	{ } /* end */
6819};
6820
6821/*
6822 * 6ch mode
6823 */
6824static struct hda_verb alc883_4ST_ch6_init[] = {
6825	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6826	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6827	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6828	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6829	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6830	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6831	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6832	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6833	{ } /* end */
6834};
6835
6836/*
6837 * 8ch mode
6838 */
6839static struct hda_verb alc883_4ST_ch8_init[] = {
6840	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6841	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6842	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
6843	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6844	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6845	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6846	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6847	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6848	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6849	{ } /* end */
6850};
6851
6852static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
6853	{ 2, alc883_4ST_ch2_init },
6854	{ 4, alc883_4ST_ch4_init },
6855	{ 6, alc883_4ST_ch6_init },
6856	{ 8, alc883_4ST_ch8_init },
6857};
6858
6859
6860/*
6861 * 2ch mode
6862 */
6863static struct hda_verb alc883_3ST_ch2_intel_init[] = {
6864	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6865	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6866	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6867	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6868	{ } /* end */
6869};
6870
6871/*
6872 * 4ch mode
6873 */
6874static struct hda_verb alc883_3ST_ch4_intel_init[] = {
6875	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6876	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6877	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6878	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6879	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6880	{ } /* end */
6881};
6882
6883/*
6884 * 6ch mode
6885 */
6886static struct hda_verb alc883_3ST_ch6_intel_init[] = {
6887	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6888	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6889	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
6890	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6891	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6892	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6893	{ } /* end */
6894};
6895
6896static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
6897	{ 2, alc883_3ST_ch2_intel_init },
6898	{ 4, alc883_3ST_ch4_intel_init },
6899	{ 6, alc883_3ST_ch6_intel_init },
6900};
6901
6902/*
6903 * 2ch mode
6904 */
6905static struct hda_verb alc889_ch2_intel_init[] = {
6906	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
6907	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
6908	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
6909	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
6910	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6911	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6912	{ } /* end */
6913};
6914
6915/*
6916 * 6ch mode
6917 */
6918static struct hda_verb alc889_ch6_intel_init[] = {
6919	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
6920	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
6921	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
6922	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
6923	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6924	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6925	{ } /* end */
6926};
6927
6928/*
6929 * 8ch mode
6930 */
6931static struct hda_verb alc889_ch8_intel_init[] = {
6932	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
6933	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
6934	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
6935	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
6936	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
6937	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6938	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6939	{ } /* end */
6940};
6941
6942static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
6943	{ 2, alc889_ch2_intel_init },
6944	{ 6, alc889_ch6_intel_init },
6945	{ 8, alc889_ch8_intel_init },
6946};
6947
6948/*
6949 * 6ch mode
6950 */
6951static struct hda_verb alc883_sixstack_ch6_init[] = {
6952	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
6953	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6954	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6955	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6956	{ } /* end */
6957};
6958
6959/*
6960 * 8ch mode
6961 */
6962static struct hda_verb alc883_sixstack_ch8_init[] = {
6963	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6964	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6965	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6966	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6967	{ } /* end */
6968};
6969
6970static struct hda_channel_mode alc883_sixstack_modes[2] = {
6971	{ 6, alc883_sixstack_ch6_init },
6972	{ 8, alc883_sixstack_ch8_init },
6973};
6974
6975
6976/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
6977 *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
6978 */
6979static struct snd_kcontrol_new alc882_base_mixer[] = {
6980	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
6981	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
6982	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
6983	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
6984	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
6985	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
6986	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
6987	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
6988	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
6989	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
6990	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
6991	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
6992	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
6993	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
6994	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
6995	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
6996	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
6997	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
6998	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
6999	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7000	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7001	{ } /* end */
7002};
7003
7004static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7005	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7006	HDA_BIND_MUTE   ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7007	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7008	HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7009	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7010	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7011	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7012	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7013	HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7014	HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
7015	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7016	{ } /* end */
7017};
7018
7019static struct snd_kcontrol_new alc885_mb5_mixer[] = {
7020	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7021	HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7022	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7023	HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7024	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7025	HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7026	HDA_CODEC_VOLUME("HP Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7027	HDA_BIND_MUTE   ("HP Playback Switch", 0x0f, 0x02, HDA_INPUT),
7028	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7029	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7030	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7031	HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7032	HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7033	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7034	{ } /* end */
7035};
7036
7037static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7038	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7039	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7040	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7041	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7042	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7043	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7044	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7045	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7046	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7047	{ } /* end */
7048};
7049
7050static struct snd_kcontrol_new alc882_targa_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_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7054	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7055	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7056	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7057	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7058	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7059	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7060	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7061	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7062	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7063	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7064	{ } /* end */
7065};
7066
7067/* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7068 *                 Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7069 */
7070static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7071	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7072	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7073	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7074	HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7075	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7076	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7077	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7078	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7079	HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7080	HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7081	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7082	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7083	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7084	{ } /* end */
7085};
7086
7087static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7088	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7089	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7090	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7091	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7092	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7093	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7094	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7095	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7096	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7097	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7098	{ } /* end */
7099};
7100
7101static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7102	{
7103		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7104		.name = "Channel Mode",
7105		.info = alc_ch_mode_info,
7106		.get = alc_ch_mode_get,
7107		.put = alc_ch_mode_put,
7108	},
7109	{ } /* end */
7110};
7111
7112static struct hda_verb alc882_base_init_verbs[] = {
7113	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7114	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7115	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7116	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7117	/* Rear mixer */
7118	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7119	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7120	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7121	/* CLFE mixer */
7122	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7123	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7124	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7125	/* Side mixer */
7126	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7127	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7128	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7129
7130	/* mute analog input loopbacks */
7131	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7132	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7133	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7134	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7135	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7136
7137	/* Front Pin: output 0 (0x0c) */
7138	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7139	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7140	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7141	/* Rear Pin: output 1 (0x0d) */
7142	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7143	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7144	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7145	/* CLFE Pin: output 2 (0x0e) */
7146	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7147	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7148	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7149	/* Side Pin: output 3 (0x0f) */
7150	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7151	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7152	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7153	/* Mic (rear) pin: input vref at 80% */
7154	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7155	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7156	/* Front Mic pin: input vref at 80% */
7157	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7158	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7159	/* Line In pin: input */
7160	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7161	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7162	/* Line-2 In: Headphone output (output 0 - 0x0c) */
7163	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7164	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7165	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
7166	/* CD pin widget for input */
7167	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7168
7169	/* FIXME: use matrix-type input source selection */
7170	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7171	/* Input mixer2 */
7172	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7173	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7174	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7175	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7176	/* Input mixer3 */
7177	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7178	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7179	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7180	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7181	/* ADC2: mute amp left and right */
7182	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7183	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7184	/* ADC3: mute amp left and right */
7185	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7186	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7187
7188	{ }
7189};
7190
7191static struct hda_verb alc882_adc1_init_verbs[] = {
7192	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7193	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7194	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7195	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7196	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7197	/* ADC1: mute amp left and right */
7198	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7199	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7200	{ }
7201};
7202
7203static struct hda_verb alc882_eapd_verbs[] = {
7204	/* change to EAPD mode */
7205	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7206	{0x20, AC_VERB_SET_PROC_COEF, 0x3060},
7207	{ }
7208};
7209
7210static struct hda_verb alc889_eapd_verbs[] = {
7211	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7212	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7213	{ }
7214};
7215
7216static struct hda_verb alc_hp15_unsol_verbs[] = {
7217	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7218	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7219	{}
7220};
7221
7222static struct hda_verb alc885_init_verbs[] = {
7223	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7224	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7225	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7226	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7227	/* Rear mixer */
7228	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7229	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7230	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7231	/* CLFE mixer */
7232	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7233	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7234	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7235	/* Side mixer */
7236	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7237	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7238	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7239
7240	/* mute analog input loopbacks */
7241	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7242	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7243	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7244
7245	/* Front HP Pin: output 0 (0x0c) */
7246	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7247	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7248	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7249	/* Front Pin: output 0 (0x0c) */
7250	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7251	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7252	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7253	/* Rear Pin: output 1 (0x0d) */
7254	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7255	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7256	{0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7257	/* CLFE Pin: output 2 (0x0e) */
7258	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7259	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7260	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7261	/* Side Pin: output 3 (0x0f) */
7262	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7263	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7264	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7265	/* Mic (rear) pin: input vref at 80% */
7266	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7267	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7268	/* Front Mic pin: input vref at 80% */
7269	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7270	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7271	/* Line In pin: input */
7272	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7273	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7274
7275	/* Mixer elements: 0x18, , 0x1a, 0x1b */
7276	/* Input mixer1 */
7277	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7278	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7279	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7280	/* Input mixer2 */
7281	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7282	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7283	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7284	/* Input mixer3 */
7285	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7286	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7287	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7288	/* ADC2: mute amp left and right */
7289	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7290	/* ADC3: mute amp left and right */
7291	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7292
7293	{ }
7294};
7295
7296static struct hda_verb alc885_init_input_verbs[] = {
7297	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7298	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7299	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7300	{ }
7301};
7302
7303
7304/* Unmute Selector 24h and set the default input to front mic */
7305static struct hda_verb alc889_init_input_verbs[] = {
7306	{0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7307	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7308	{ }
7309};
7310
7311
7312#define alc883_init_verbs	alc882_base_init_verbs
7313
7314/* Mac Pro test */
7315static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7316	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7317	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7318	HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7319	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7320	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
7321	/* FIXME: this looks suspicious...
7322	HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x02, HDA_INPUT),
7323	HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x02, HDA_INPUT),
7324	*/
7325	{ } /* end */
7326};
7327
7328static struct hda_verb alc882_macpro_init_verbs[] = {
7329	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7330	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7331	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7332	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7333	/* Front Pin: output 0 (0x0c) */
7334	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7335	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7336	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7337	/* Front Mic pin: input vref at 80% */
7338	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7339	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7340	/* Speaker:  output */
7341	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7342	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7343	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7344	/* Headphone output (output 0 - 0x0c) */
7345	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7346	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7347	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7348
7349	/* FIXME: use matrix-type input source selection */
7350	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7351	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7352	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7353	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7354	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7355	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7356	/* Input mixer2 */
7357	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7358	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7359	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7360	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7361	/* Input mixer3 */
7362	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7363	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7364	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7365	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7366	/* ADC1: mute amp left and right */
7367	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7368	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7369	/* ADC2: mute amp left and right */
7370	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7371	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7372	/* ADC3: mute amp left and right */
7373	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7374	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7375
7376	{ }
7377};
7378
7379/* Macbook 5,1 */
7380static struct hda_verb alc885_mb5_init_verbs[] = {
7381	/* DACs */
7382	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7383	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7384	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7385	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7386	/* Front mixer */
7387	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7388	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7389	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7390	/* Surround mixer */
7391	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7392	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7393	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7394	/* LFE mixer */
7395	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7396	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7397	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7398	/* HP mixer */
7399	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7400	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7401	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7402	/* Front Pin (0x0c) */
7403	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7404	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7405	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7406	/* LFE Pin (0x0e) */
7407	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7408	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7409	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7410	/* HP Pin (0x0f) */
7411	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7412	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7413	{0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7414	/* Front Mic pin: input vref at 80% */
7415	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7416	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7417	/* Line In pin */
7418	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7419	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7420
7421	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7422	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7423	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7424	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7425	{ }
7426};
7427
7428/* Macbook Pro rev3 */
7429static struct hda_verb alc885_mbp3_init_verbs[] = {
7430	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7431	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7432	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7433	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7434	/* Rear mixer */
7435	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7436	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7437	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7438	/* HP mixer */
7439	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7440	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7441	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7442	/* Front Pin: output 0 (0x0c) */
7443	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7444	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7445	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7446	/* HP Pin: output 0 (0x0e) */
7447	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7448	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7449	{0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
7450	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7451	/* Mic (rear) pin: input vref at 80% */
7452	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7453	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7454	/* Front Mic pin: input vref at 80% */
7455	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7456	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7457	/* Line In pin: use output 1 when in LineOut mode */
7458	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7459	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7460	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7461
7462	/* FIXME: use matrix-type input source selection */
7463	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7464	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7465	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7466	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7467	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7468	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7469	/* Input mixer2 */
7470	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7471	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7472	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7473	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7474	/* Input mixer3 */
7475	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7476	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7477	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7478	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7479	/* ADC1: mute amp left and right */
7480	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7481	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7482	/* ADC2: mute amp left and right */
7483	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7484	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7485	/* ADC3: mute amp left and right */
7486	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7487	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7488
7489	{ }
7490};
7491
7492/* iMac 24 mixer. */
7493static struct snd_kcontrol_new alc885_imac24_mixer[] = {
7494	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7495	HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
7496	{ } /* end */
7497};
7498
7499/* iMac 24 init verbs. */
7500static struct hda_verb alc885_imac24_init_verbs[] = {
7501	/* Internal speakers: output 0 (0x0c) */
7502	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7503	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7504	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7505	/* Internal speakers: output 0 (0x0c) */
7506	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7507	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7508	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
7509	/* Headphone: output 0 (0x0c) */
7510	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7511	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7512	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7513	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7514	/* Front Mic: input vref at 80% */
7515	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7516	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7517	{ }
7518};
7519
7520/* Toggle speaker-output according to the hp-jack state */
7521static void alc885_imac24_setup(struct hda_codec *codec)
7522{
7523	struct alc_spec *spec = codec->spec;
7524
7525	spec->autocfg.hp_pins[0] = 0x14;
7526	spec->autocfg.speaker_pins[0] = 0x18;
7527	spec->autocfg.speaker_pins[1] = 0x1a;
7528}
7529
7530static void alc885_mbp3_setup(struct hda_codec *codec)
7531{
7532	struct alc_spec *spec = codec->spec;
7533
7534	spec->autocfg.hp_pins[0] = 0x15;
7535	spec->autocfg.speaker_pins[0] = 0x14;
7536}
7537
7538
7539static struct hda_verb alc882_targa_verbs[] = {
7540	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7541	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7542
7543	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7544	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7545
7546	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7547	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7548	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7549
7550	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7551	{ } /* end */
7552};
7553
7554/* toggle speaker-output according to the hp-jack state */
7555static void alc882_targa_automute(struct hda_codec *codec)
7556{
7557	struct alc_spec *spec = codec->spec;
7558	alc_automute_amp(codec);
7559	snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
7560				  spec->jack_present ? 1 : 3);
7561}
7562
7563static void alc882_targa_setup(struct hda_codec *codec)
7564{
7565	struct alc_spec *spec = codec->spec;
7566
7567	spec->autocfg.hp_pins[0] = 0x14;
7568	spec->autocfg.speaker_pins[0] = 0x1b;
7569}
7570
7571static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
7572{
7573	if ((res >> 26) == ALC880_HP_EVENT)
7574		alc882_targa_automute(codec);
7575}
7576
7577static struct hda_verb alc882_asus_a7j_verbs[] = {
7578	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7579	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7580
7581	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7582	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7583	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7584
7585	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7586	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7587	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7588
7589	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7590	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7591	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7592	{ } /* end */
7593};
7594
7595static struct hda_verb alc882_asus_a7m_verbs[] = {
7596	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7597	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7598
7599	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7600	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7601	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7602
7603	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7604	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7605	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7606
7607	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7608	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7609	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7610 	{ } /* end */
7611};
7612
7613static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
7614{
7615	unsigned int gpiostate, gpiomask, gpiodir;
7616
7617	gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
7618				       AC_VERB_GET_GPIO_DATA, 0);
7619
7620	if (!muted)
7621		gpiostate |= (1 << pin);
7622	else
7623		gpiostate &= ~(1 << pin);
7624
7625	gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
7626				      AC_VERB_GET_GPIO_MASK, 0);
7627	gpiomask |= (1 << pin);
7628
7629	gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
7630				     AC_VERB_GET_GPIO_DIRECTION, 0);
7631	gpiodir |= (1 << pin);
7632
7633
7634	snd_hda_codec_write(codec, codec->afg, 0,
7635			    AC_VERB_SET_GPIO_MASK, gpiomask);
7636	snd_hda_codec_write(codec, codec->afg, 0,
7637			    AC_VERB_SET_GPIO_DIRECTION, gpiodir);
7638
7639	msleep(1);
7640
7641	snd_hda_codec_write(codec, codec->afg, 0,
7642			    AC_VERB_SET_GPIO_DATA, gpiostate);
7643}
7644
7645/* set up GPIO at initialization */
7646static void alc885_macpro_init_hook(struct hda_codec *codec)
7647{
7648	alc882_gpio_mute(codec, 0, 0);
7649	alc882_gpio_mute(codec, 1, 0);
7650}
7651
7652/* set up GPIO and update auto-muting at initialization */
7653static void alc885_imac24_init_hook(struct hda_codec *codec)
7654{
7655	alc885_macpro_init_hook(codec);
7656	alc_automute_amp(codec);
7657}
7658
7659/*
7660 * generic initialization of ADC, input mixers and output mixers
7661 */
7662static struct hda_verb alc883_auto_init_verbs[] = {
7663	/*
7664	 * Unmute ADC0-2 and set the default input to mic-in
7665	 */
7666	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7667	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7668	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7669	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7670
7671	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
7672	 * mixer widget
7673	 * Note: PASD motherboards uses the Line In 2 as the input for
7674	 * front panel mic (mic 2)
7675	 */
7676	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
7677	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7678	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7679	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7680	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7681	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7682
7683	/*
7684	 * Set up output mixers (0x0c - 0x0f)
7685	 */
7686	/* set vol=0 to output mixers */
7687	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7688	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7689	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7690	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7691	/* set up input amps for analog loopback */
7692	/* Amp Indices: DAC = 0, mixer = 1 */
7693	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7694	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7695	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7696	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7697	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7698	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7699	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7700	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7701	{0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7702	{0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7703
7704	/* FIXME: use matrix-type input source selection */
7705	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7706	/* Input mixer2 */
7707	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
7708	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
7709	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
7710	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
7711	/* Input mixer3 */
7712	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
7713	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
7714	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
7715	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
7716
7717	{ }
7718};
7719
7720/* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
7721static struct hda_verb alc889A_mb31_ch2_init[] = {
7722	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
7723	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7724	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
7725	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
7726	{ } /* end */
7727};
7728
7729/* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
7730static struct hda_verb alc889A_mb31_ch4_init[] = {
7731	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
7732	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7733	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
7734	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
7735	{ } /* end */
7736};
7737
7738/* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
7739static struct hda_verb alc889A_mb31_ch5_init[] = {
7740	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as rear */
7741	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7742	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
7743	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
7744	{ } /* end */
7745};
7746
7747/* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
7748static struct hda_verb alc889A_mb31_ch6_init[] = {
7749	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as front */
7750	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Subwoofer off */
7751	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
7752	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
7753	{ } /* end */
7754};
7755
7756static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
7757	{ 2, alc889A_mb31_ch2_init },
7758	{ 4, alc889A_mb31_ch4_init },
7759	{ 5, alc889A_mb31_ch5_init },
7760	{ 6, alc889A_mb31_ch6_init },
7761};
7762
7763static struct hda_verb alc883_medion_eapd_verbs[] = {
7764        /* eanable EAPD on medion laptop */
7765	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7766	{0x20, AC_VERB_SET_PROC_COEF, 0x3070},
7767	{ }
7768};
7769
7770#define alc883_base_mixer	alc882_base_mixer
7771
7772static struct snd_kcontrol_new alc883_mitac_mixer[] = {
7773	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7774	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7775	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7776	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7777	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7778	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7779	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7780	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7781	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7782	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7783	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7784	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7785	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7786	{ } /* end */
7787};
7788
7789static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
7790	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7791	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
7792	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7793	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
7794	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7795	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7796	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7797	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7798	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
7799	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7800	{ } /* end */
7801};
7802
7803static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
7804	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7805	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
7806	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7807	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
7808	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7809	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7810	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7811	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7812	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
7813	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7814	{ } /* end */
7815};
7816
7817static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
7818	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7819	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7820	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7821	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7822	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7823	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7824	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7825	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7826	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7827	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7828	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7829	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7830	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7831	{ } /* end */
7832};
7833
7834static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
7835	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7836	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7837	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7838	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7839	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7840	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7841	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7842	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7843	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7844	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7845	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7846	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7847	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7848	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7849	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7850	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7851	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7852	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7853	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7854	{ } /* end */
7855};
7856
7857static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
7858	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7859	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7860	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7861	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7862	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
7863			      HDA_OUTPUT),
7864	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7865	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7866	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7867	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7868	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7869	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7870	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7871	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7872	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7873	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
7874	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7875	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7876	HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
7877	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7878	{ } /* end */
7879};
7880
7881static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
7882	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7883	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7884	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7885	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7886	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
7887			      HDA_OUTPUT),
7888	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7889	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7890	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7891	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7892	HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
7893	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7894	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7895	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7896	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
7897	HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
7898	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
7899	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7900	HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
7901	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7902	{ } /* end */
7903};
7904
7905static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
7906	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7907	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7908	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7909	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7910	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7911	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7912	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7913	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7914	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7915	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7916	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7917	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7918	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7919	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7920	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7921	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7922	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7923	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7924	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7925	{ } /* end */
7926};
7927
7928static struct snd_kcontrol_new alc883_targa_mixer[] = {
7929	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7930	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7931	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7932	HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7933	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7934	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7935	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7936	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7937	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7938	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7939	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7940	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7941	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7942	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7943	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7944	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7945	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7946	{ } /* end */
7947};
7948
7949static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
7950	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7951	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7952	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7953	HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7954	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7955	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7956	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7957	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7958	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7959	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7960	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
7961	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7962	{ } /* end */
7963};
7964
7965static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
7966	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7967	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7968	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7969	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
7970	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7971	{ } /* end */
7972};
7973
7974static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
7975	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7976	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7977	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7978	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
7979	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7980	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7981	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7982	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7983	{ } /* end */
7984};
7985
7986static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
7987	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7988	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
7989	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7990	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7991	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7992	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7993	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7994	HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7995	HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7996	{ } /* end */
7997};
7998
7999static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8000	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8001	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8002	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8003	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8004	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8005	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8006	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8007	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8008	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8009	{ } /* end */
8010};
8011
8012static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
8013	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8014	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8015	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8016	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8017	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8018	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8019	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8020	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8021	{ } /* end */
8022};
8023
8024static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8025	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8026	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8027	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8028	HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, HDA_INPUT),
8029	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8030	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8031	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8032	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8033	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8034	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8035	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8036	{ } /* end */
8037};
8038
8039static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8040	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8041	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8042	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8043	HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8044	HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8045						0x0d, 1, 0x0, HDA_OUTPUT),
8046	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8047	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8048	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8049	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8050	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8051	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8052	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8053	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8054	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8055	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8056	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8057	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8058	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8059	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8060	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8061	{ } /* end */
8062};
8063
8064static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8065	/* Output mixers */
8066	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8067	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8068	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8069	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8070	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8071		HDA_OUTPUT),
8072	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8073	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8074	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8075	/* Output switches */
8076	HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8077	HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8078	HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8079	/* Boost mixers */
8080	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8081	HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8082	/* Input mixers */
8083	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8084	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8085	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8086	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8087	{ } /* end */
8088};
8089
8090static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8091	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8092	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8093	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8094	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8095	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8096	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8097	{ } /* end */
8098};
8099
8100static struct hda_bind_ctls alc883_bind_cap_vol = {
8101	.ops = &snd_hda_bind_vol,
8102	.values = {
8103		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8104		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8105		0
8106	},
8107};
8108
8109static struct hda_bind_ctls alc883_bind_cap_switch = {
8110	.ops = &snd_hda_bind_sw,
8111	.values = {
8112		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8113		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8114		0
8115	},
8116};
8117
8118static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8119	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8120	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8121	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8122	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8123	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8124	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8125	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8126	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8127	{ } /* end */
8128};
8129
8130static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8131	HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8132	HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8133	{
8134		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8135		/* .name = "Capture Source", */
8136		.name = "Input Source",
8137		.count = 1,
8138		.info = alc_mux_enum_info,
8139		.get = alc_mux_enum_get,
8140		.put = alc_mux_enum_put,
8141	},
8142	{ } /* end */
8143};
8144
8145static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8146	{
8147		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8148		.name = "Channel Mode",
8149		.info = alc_ch_mode_info,
8150		.get = alc_ch_mode_get,
8151		.put = alc_ch_mode_put,
8152	},
8153	{ } /* end */
8154};
8155
8156/* toggle speaker-output according to the hp-jack state */
8157static void alc883_mitac_setup(struct hda_codec *codec)
8158{
8159	struct alc_spec *spec = codec->spec;
8160
8161	spec->autocfg.hp_pins[0] = 0x15;
8162	spec->autocfg.speaker_pins[0] = 0x14;
8163	spec->autocfg.speaker_pins[1] = 0x17;
8164}
8165
8166/* auto-toggle front mic */
8167/*
8168static void alc883_mitac_mic_automute(struct hda_codec *codec)
8169{
8170	unsigned int present;
8171	unsigned char bits;
8172
8173	present = snd_hda_codec_read(codec, 0x18, 0,
8174				     AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
8175	bits = present ? HDA_AMP_MUTE : 0;
8176	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8177}
8178*/
8179
8180static struct hda_verb alc883_mitac_verbs[] = {
8181	/* HP */
8182	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8183	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8184	/* Subwoofer */
8185	{0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8186	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8187
8188	/* enable unsolicited event */
8189	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8190	/* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8191
8192	{ } /* end */
8193};
8194
8195static struct hda_verb alc883_clevo_m540r_verbs[] = {
8196	/* HP */
8197	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8198	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8199	/* Int speaker */
8200	/*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8201
8202	/* enable unsolicited event */
8203	/*
8204	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8205	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8206	*/
8207
8208	{ } /* end */
8209};
8210
8211static struct hda_verb alc883_clevo_m720_verbs[] = {
8212	/* HP */
8213	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8214	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8215	/* Int speaker */
8216	{0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
8217	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8218
8219	/* enable unsolicited event */
8220	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8221	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8222
8223	{ } /* end */
8224};
8225
8226static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
8227	/* HP */
8228	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8229	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8230	/* Subwoofer */
8231	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8232	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8233
8234	/* enable unsolicited event */
8235	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8236
8237	{ } /* end */
8238};
8239
8240static struct hda_verb alc883_targa_verbs[] = {
8241	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8242	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8243
8244	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8245	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8246
8247/* Connect Line-Out side jack (SPDIF) to Side */
8248	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8249	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8250	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8251/* Connect Mic jack to CLFE */
8252	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8253	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8254	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
8255/* Connect Line-in jack to Surround */
8256	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8257	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8258	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8259/* Connect HP out jack to Front */
8260	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8261	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8262	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8263
8264	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8265
8266	{ } /* end */
8267};
8268
8269static struct hda_verb alc883_lenovo_101e_verbs[] = {
8270	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8271	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
8272        {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
8273	{ } /* end */
8274};
8275
8276static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
8277        {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8278	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8279        {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8280        {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8281	{ } /* end */
8282};
8283
8284static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
8285	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8286	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8287	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8288	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
8289	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT    | AC_USRSP_EN},
8290	{ } /* end */
8291};
8292
8293static struct hda_verb alc883_haier_w66_verbs[] = {
8294	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8295	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8296
8297	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8298
8299	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8300	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8301	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8302	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8303	{ } /* end */
8304};
8305
8306static struct hda_verb alc888_lenovo_sky_verbs[] = {
8307	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8308	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8309	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8310	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8311	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8312	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8313	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8314	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8315	{ } /* end */
8316};
8317
8318static struct hda_verb alc888_6st_dell_verbs[] = {
8319	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8320	{ }
8321};
8322
8323static struct hda_verb alc883_vaiott_verbs[] = {
8324	/* HP */
8325	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8326	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8327
8328	/* enable unsolicited event */
8329	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8330
8331	{ } /* end */
8332};
8333
8334static void alc888_3st_hp_setup(struct hda_codec *codec)
8335{
8336	struct alc_spec *spec = codec->spec;
8337
8338	spec->autocfg.hp_pins[0] = 0x1b;
8339	spec->autocfg.speaker_pins[0] = 0x14;
8340	spec->autocfg.speaker_pins[1] = 0x16;
8341	spec->autocfg.speaker_pins[2] = 0x18;
8342}
8343
8344static struct hda_verb alc888_3st_hp_verbs[] = {
8345	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Front: output 0 (0x0c) */
8346	{0x16, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Rear : output 1 (0x0d) */
8347	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},	/* CLFE : output 2 (0x0e) */
8348	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8349	{ } /* end */
8350};
8351
8352/*
8353 * 2ch mode
8354 */
8355static struct hda_verb alc888_3st_hp_2ch_init[] = {
8356	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8357	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8358	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
8359	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8360	{ } /* end */
8361};
8362
8363/*
8364 * 4ch mode
8365 */
8366static struct hda_verb alc888_3st_hp_4ch_init[] = {
8367	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8368	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8369	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8370	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8371	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8372	{ } /* end */
8373};
8374
8375/*
8376 * 6ch mode
8377 */
8378static struct hda_verb alc888_3st_hp_6ch_init[] = {
8379	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8380	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8381	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
8382	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8383	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8384	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8385	{ } /* end */
8386};
8387
8388static struct hda_channel_mode alc888_3st_hp_modes[3] = {
8389	{ 2, alc888_3st_hp_2ch_init },
8390	{ 4, alc888_3st_hp_4ch_init },
8391	{ 6, alc888_3st_hp_6ch_init },
8392};
8393
8394/* toggle front-jack and RCA according to the hp-jack state */
8395static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
8396{
8397 	unsigned int present;
8398
8399 	present = snd_hda_codec_read(codec, 0x1b, 0,
8400				     AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
8401	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8402				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8403	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8404				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8405}
8406
8407/* toggle RCA according to the front-jack state */
8408static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
8409{
8410 	unsigned int present;
8411
8412 	present = snd_hda_codec_read(codec, 0x14, 0,
8413				     AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
8414	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8415				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8416}
8417
8418static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
8419					     unsigned int res)
8420{
8421	if ((res >> 26) == ALC880_HP_EVENT)
8422		alc888_lenovo_ms7195_front_automute(codec);
8423	if ((res >> 26) == ALC880_FRONT_EVENT)
8424		alc888_lenovo_ms7195_rca_automute(codec);
8425}
8426
8427static struct hda_verb alc883_medion_md2_verbs[] = {
8428	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8429	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8430
8431	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8432
8433	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8434	{ } /* end */
8435};
8436
8437/* toggle speaker-output according to the hp-jack state */
8438static void alc883_medion_md2_setup(struct hda_codec *codec)
8439{
8440	struct alc_spec *spec = codec->spec;
8441
8442	spec->autocfg.hp_pins[0] = 0x14;
8443	spec->autocfg.speaker_pins[0] = 0x15;
8444}
8445
8446/* toggle speaker-output according to the hp-jack state */
8447#define alc883_targa_init_hook		alc882_targa_init_hook
8448#define alc883_targa_unsol_event	alc882_targa_unsol_event
8449
8450static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
8451{
8452	unsigned int present;
8453
8454	present = snd_hda_codec_read(codec, 0x18, 0,
8455				     AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
8456	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
8457				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8458}
8459
8460static void alc883_clevo_m720_setup(struct hda_codec *codec)
8461{
8462	struct alc_spec *spec = codec->spec;
8463
8464	spec->autocfg.hp_pins[0] = 0x15;
8465	spec->autocfg.speaker_pins[0] = 0x14;
8466}
8467
8468static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
8469{
8470	alc_automute_amp(codec);
8471	alc883_clevo_m720_mic_automute(codec);
8472}
8473
8474static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
8475					   unsigned int res)
8476{
8477	switch (res >> 26) {
8478	case ALC880_MIC_EVENT:
8479		alc883_clevo_m720_mic_automute(codec);
8480		break;
8481	default:
8482		alc_automute_amp_unsol_event(codec, res);
8483		break;
8484	}
8485}
8486
8487/* toggle speaker-output according to the hp-jack state */
8488static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
8489{
8490	struct alc_spec *spec = codec->spec;
8491
8492	spec->autocfg.hp_pins[0] = 0x14;
8493	spec->autocfg.speaker_pins[0] = 0x15;
8494}
8495
8496static void alc883_haier_w66_setup(struct hda_codec *codec)
8497{
8498	struct alc_spec *spec = codec->spec;
8499
8500	spec->autocfg.hp_pins[0] = 0x1b;
8501	spec->autocfg.speaker_pins[0] = 0x14;
8502}
8503
8504static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
8505{
8506 	unsigned int present;
8507	unsigned char bits;
8508
8509	present = snd_hda_codec_read(codec, 0x14, 0, AC_VERB_GET_PIN_SENSE, 0)
8510		& AC_PINSENSE_PRESENCE;
8511	bits = present ? HDA_AMP_MUTE : 0;
8512	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8513				 HDA_AMP_MUTE, bits);
8514}
8515
8516static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
8517{
8518 	unsigned int present;
8519	unsigned char bits;
8520
8521 	present = snd_hda_codec_read(codec, 0x1b, 0,
8522				     AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
8523	bits = present ? HDA_AMP_MUTE : 0;
8524	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8525				 HDA_AMP_MUTE, bits);
8526	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8527				 HDA_AMP_MUTE, bits);
8528}
8529
8530static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
8531					   unsigned int res)
8532{
8533	if ((res >> 26) == ALC880_HP_EVENT)
8534		alc883_lenovo_101e_all_automute(codec);
8535	if ((res >> 26) == ALC880_FRONT_EVENT)
8536		alc883_lenovo_101e_ispeaker_automute(codec);
8537}
8538
8539/* toggle speaker-output according to the hp-jack state */
8540static void alc883_acer_aspire_setup(struct hda_codec *codec)
8541{
8542	struct alc_spec *spec = codec->spec;
8543
8544	spec->autocfg.hp_pins[0] = 0x14;
8545	spec->autocfg.speaker_pins[0] = 0x15;
8546	spec->autocfg.speaker_pins[1] = 0x16;
8547}
8548
8549static struct hda_verb alc883_acer_eapd_verbs[] = {
8550	/* HP Pin: output 0 (0x0c) */
8551	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8552	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8553	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8554	/* Front Pin: output 0 (0x0c) */
8555	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8556	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8557	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8558	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
8559        /* eanable EAPD on medion laptop */
8560	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8561	{0x20, AC_VERB_SET_PROC_COEF, 0x3050},
8562	/* enable unsolicited event */
8563	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8564	{ }
8565};
8566
8567static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
8568	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8569	{0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8570	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8571	{ } /* end */
8572};
8573
8574static void alc888_6st_dell_setup(struct hda_codec *codec)
8575{
8576	struct alc_spec *spec = codec->spec;
8577
8578	spec->autocfg.hp_pins[0] = 0x1b;
8579	spec->autocfg.speaker_pins[0] = 0x14;
8580	spec->autocfg.speaker_pins[1] = 0x15;
8581	spec->autocfg.speaker_pins[2] = 0x16;
8582	spec->autocfg.speaker_pins[3] = 0x17;
8583}
8584
8585static void alc888_lenovo_sky_setup(struct hda_codec *codec)
8586{
8587	struct alc_spec *spec = codec->spec;
8588
8589	spec->autocfg.hp_pins[0] = 0x1b;
8590	spec->autocfg.speaker_pins[0] = 0x14;
8591	spec->autocfg.speaker_pins[1] = 0x15;
8592	spec->autocfg.speaker_pins[2] = 0x16;
8593	spec->autocfg.speaker_pins[3] = 0x17;
8594	spec->autocfg.speaker_pins[4] = 0x1a;
8595}
8596
8597static void alc883_vaiott_setup(struct hda_codec *codec)
8598{
8599	struct alc_spec *spec = codec->spec;
8600
8601	spec->autocfg.hp_pins[0] = 0x15;
8602	spec->autocfg.speaker_pins[0] = 0x14;
8603	spec->autocfg.speaker_pins[1] = 0x17;
8604}
8605
8606static struct hda_verb alc888_asus_m90v_verbs[] = {
8607	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8608	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8609	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8610	/* enable unsolicited event */
8611	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8612	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8613	{ } /* end */
8614};
8615
8616static void alc883_mode2_setup(struct hda_codec *codec)
8617{
8618	struct alc_spec *spec = codec->spec;
8619
8620	spec->autocfg.hp_pins[0] = 0x1b;
8621	spec->autocfg.speaker_pins[0] = 0x14;
8622	spec->autocfg.speaker_pins[1] = 0x15;
8623	spec->autocfg.speaker_pins[2] = 0x16;
8624	spec->ext_mic.pin = 0x18;
8625	spec->int_mic.pin = 0x19;
8626	spec->ext_mic.mux_idx = 0;
8627	spec->int_mic.mux_idx = 1;
8628	spec->auto_mic = 1;
8629}
8630
8631static struct hda_verb alc888_asus_eee1601_verbs[] = {
8632	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8633	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8634	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8635	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8636	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8637	{0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
8638	{0x20, AC_VERB_SET_PROC_COEF,  0x0838},
8639	/* enable unsolicited event */
8640	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8641	{ } /* end */
8642};
8643
8644static void alc883_eee1601_inithook(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] = 0x1b;
8650	alc_automute_pin(codec);
8651}
8652
8653static struct hda_verb alc889A_mb31_verbs[] = {
8654	/* Init rear pin (used as headphone output) */
8655	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},    /* Apple Headphones */
8656	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},           /* Connect to front */
8657	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8658	/* Init line pin (used as output in 4ch and 6ch mode) */
8659	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},           /* Connect to CLFE */
8660	/* Init line 2 pin (used as headphone out by default) */
8661	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},  /* Use as input */
8662	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
8663	{ } /* end */
8664};
8665
8666/* Mute speakers according to the headphone jack state */
8667static void alc889A_mb31_automute(struct hda_codec *codec)
8668{
8669	unsigned int present;
8670
8671	/* Mute only in 2ch or 4ch mode */
8672	if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
8673	    == 0x00) {
8674		present = snd_hda_codec_read(codec, 0x15, 0,
8675			AC_VERB_GET_PIN_SENSE, 0) & AC_PINSENSE_PRESENCE;
8676		snd_hda_codec_amp_stereo(codec, 0x14,  HDA_OUTPUT, 0,
8677			HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8678		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
8679			HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8680	}
8681}
8682
8683static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
8684{
8685	if ((res >> 26) == ALC880_HP_EVENT)
8686		alc889A_mb31_automute(codec);
8687}
8688
8689
8690#ifdef CONFIG_SND_HDA_POWER_SAVE
8691#define alc882_loopbacks	alc880_loopbacks
8692#endif
8693
8694/* pcm configuration: identical with ALC880 */
8695#define alc882_pcm_analog_playback	alc880_pcm_analog_playback
8696#define alc882_pcm_analog_capture	alc880_pcm_analog_capture
8697#define alc882_pcm_digital_playback	alc880_pcm_digital_playback
8698#define alc882_pcm_digital_capture	alc880_pcm_digital_capture
8699
8700static hda_nid_t alc883_slave_dig_outs[] = {
8701	ALC1200_DIGOUT_NID, 0,
8702};
8703
8704static hda_nid_t alc1200_slave_dig_outs[] = {
8705	ALC883_DIGOUT_NID, 0,
8706};
8707
8708/*
8709 * configuration and preset
8710 */
8711static const char *alc882_models[ALC882_MODEL_LAST] = {
8712	[ALC882_3ST_DIG]	= "3stack-dig",
8713	[ALC882_6ST_DIG]	= "6stack-dig",
8714	[ALC882_ARIMA]		= "arima",
8715	[ALC882_W2JC]		= "w2jc",
8716	[ALC882_TARGA]		= "targa",
8717	[ALC882_ASUS_A7J]	= "asus-a7j",
8718	[ALC882_ASUS_A7M]	= "asus-a7m",
8719	[ALC885_MACPRO]		= "macpro",
8720	[ALC885_MB5]		= "mb5",
8721	[ALC885_MBP3]		= "mbp3",
8722	[ALC885_IMAC24]		= "imac24",
8723	[ALC883_3ST_2ch_DIG]	= "3stack-2ch-dig",
8724	[ALC883_3ST_6ch_DIG]	= "3stack-6ch-dig",
8725	[ALC883_3ST_6ch]	= "3stack-6ch",
8726	[ALC883_6ST_DIG]	= "alc883-6stack-dig",
8727	[ALC883_TARGA_DIG]	= "targa-dig",
8728	[ALC883_TARGA_2ch_DIG]	= "targa-2ch-dig",
8729	[ALC883_TARGA_8ch_DIG]	= "targa-8ch-dig",
8730	[ALC883_ACER]		= "acer",
8731	[ALC883_ACER_ASPIRE]	= "acer-aspire",
8732	[ALC888_ACER_ASPIRE_4930G]	= "acer-aspire-4930g",
8733	[ALC888_ACER_ASPIRE_6530G]	= "acer-aspire-6530g",
8734	[ALC888_ACER_ASPIRE_8930G]	= "acer-aspire-8930g",
8735	[ALC888_ACER_ASPIRE_7730G]	= "acer-aspire-7730g",
8736	[ALC883_MEDION]		= "medion",
8737	[ALC883_MEDION_MD2]	= "medion-md2",
8738	[ALC883_LAPTOP_EAPD]	= "laptop-eapd",
8739	[ALC883_LENOVO_101E_2ch] = "lenovo-101e",
8740	[ALC883_LENOVO_NB0763]	= "lenovo-nb0763",
8741	[ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
8742	[ALC888_LENOVO_SKY] = "lenovo-sky",
8743	[ALC883_HAIER_W66] 	= "haier-w66",
8744	[ALC888_3ST_HP]		= "3stack-hp",
8745	[ALC888_6ST_DELL]	= "6stack-dell",
8746	[ALC883_MITAC]		= "mitac",
8747	[ALC883_CLEVO_M540R]	= "clevo-m540r",
8748	[ALC883_CLEVO_M720]	= "clevo-m720",
8749	[ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
8750	[ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
8751	[ALC883_3ST_6ch_INTEL]	= "3stack-6ch-intel",
8752	[ALC889A_INTEL]		= "intel-alc889a",
8753	[ALC889_INTEL]		= "intel-x58",
8754	[ALC1200_ASUS_P5Q]	= "asus-p5q",
8755	[ALC889A_MB31]		= "mb31",
8756	[ALC883_SONY_VAIO_TT]	= "sony-vaio-tt",
8757	[ALC882_AUTO]		= "auto",
8758};
8759
8760static struct snd_pci_quirk alc882_cfg_tbl[] = {
8761	SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
8762
8763	SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
8764	SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
8765	SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
8766	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
8767	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
8768	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
8769	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
8770		ALC888_ACER_ASPIRE_4930G),
8771	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
8772		ALC888_ACER_ASPIRE_4930G),
8773	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
8774		ALC888_ACER_ASPIRE_8930G),
8775	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
8776		ALC888_ACER_ASPIRE_8930G),
8777	SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
8778	SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
8779	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
8780		ALC888_ACER_ASPIRE_6530G),
8781	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
8782		ALC888_ACER_ASPIRE_6530G),
8783	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
8784		ALC888_ACER_ASPIRE_7730G),
8785	/* default Acer -- disabled as it causes more problems.
8786	 *    model=auto should work fine now
8787	 */
8788	/* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
8789
8790	SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
8791
8792	SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
8793	SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
8794	SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
8795	SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
8796	SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
8797	SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
8798
8799	SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
8800	SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
8801	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
8802	SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
8803	SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
8804	SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
8805	SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
8806	SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
8807	SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
8808	SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
8809	SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
8810
8811	SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
8812	SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
8813	SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
8814	SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
8815	SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
8816	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
8817	SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
8818	SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
8819	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
8820
8821	SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
8822	SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
8823	SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
8824	SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */
8825	SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC883_TARGA_2ch_DIG),
8826	SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
8827	SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
8828	SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
8829	SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
8830	SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
8831	SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
8832	SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
8833	SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
8834	SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
8835	SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
8836	SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
8837	SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
8838	SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
8839	SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
8840	SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
8841	SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
8842	SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
8843	SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
8844	SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
8845	SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
8846	SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
8847	SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
8848	SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
8849	SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
8850
8851	SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
8852	SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
8853	SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
8854	SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
8855	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
8856	SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
8857	/* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
8858	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
8859	SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
8860		      ALC883_FUJITSU_PI2515),
8861	SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
8862		ALC888_FUJITSU_XA3530),
8863	SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
8864	SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
8865	SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
8866	SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
8867	SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
8868	SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
8869	SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
8870	SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
8871	SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
8872
8873	SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
8874	SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
8875	SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
8876	SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
8877	SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
8878	SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
8879	SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch),
8880
8881	{}
8882};
8883
8884/* codec SSID table for Intel Mac */
8885static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
8886	SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
8887	SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
8888	SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
8889	SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
8890	SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
8891	SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
8892	SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
8893	SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
8894	SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
8895	SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
8896	SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
8897	/* FIXME: HP jack sense seems not working for MBP 5,1, so apparently
8898	 * no perfect solution yet
8899	 */
8900	SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
8901	{} /* terminator */
8902};
8903
8904static struct alc_config_preset alc882_presets[] = {
8905	[ALC882_3ST_DIG] = {
8906		.mixers = { alc882_base_mixer },
8907		.init_verbs = { alc882_base_init_verbs,
8908				alc882_adc1_init_verbs },
8909		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
8910		.dac_nids = alc882_dac_nids,
8911		.dig_out_nid = ALC882_DIGOUT_NID,
8912		.dig_in_nid = ALC882_DIGIN_NID,
8913		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
8914		.channel_mode = alc882_ch_modes,
8915		.need_dac_fix = 1,
8916		.input_mux = &alc882_capture_source,
8917	},
8918	[ALC882_6ST_DIG] = {
8919		.mixers = { alc882_base_mixer, alc882_chmode_mixer },
8920		.init_verbs = { alc882_base_init_verbs,
8921				alc882_adc1_init_verbs },
8922		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
8923		.dac_nids = alc882_dac_nids,
8924		.dig_out_nid = ALC882_DIGOUT_NID,
8925		.dig_in_nid = ALC882_DIGIN_NID,
8926		.num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
8927		.channel_mode = alc882_sixstack_modes,
8928		.input_mux = &alc882_capture_source,
8929	},
8930	[ALC882_ARIMA] = {
8931		.mixers = { alc882_base_mixer, alc882_chmode_mixer },
8932		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
8933				alc882_eapd_verbs },
8934		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
8935		.dac_nids = alc882_dac_nids,
8936		.num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
8937		.channel_mode = alc882_sixstack_modes,
8938		.input_mux = &alc882_capture_source,
8939	},
8940	[ALC882_W2JC] = {
8941		.mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
8942		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
8943				alc882_eapd_verbs, alc880_gpio1_init_verbs },
8944		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
8945		.dac_nids = alc882_dac_nids,
8946		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
8947		.channel_mode = alc880_threestack_modes,
8948		.need_dac_fix = 1,
8949		.input_mux = &alc882_capture_source,
8950		.dig_out_nid = ALC882_DIGOUT_NID,
8951	},
8952	[ALC885_MBP3] = {
8953		.mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
8954		.init_verbs = { alc885_mbp3_init_verbs,
8955				alc880_gpio1_init_verbs },
8956		.num_dacs = 2,
8957		.dac_nids = alc882_dac_nids,
8958		.hp_nid = 0x04,
8959		.channel_mode = alc885_mbp_4ch_modes,
8960		.num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
8961		.input_mux = &alc882_capture_source,
8962		.dig_out_nid = ALC882_DIGOUT_NID,
8963		.dig_in_nid = ALC882_DIGIN_NID,
8964		.unsol_event = alc_automute_amp_unsol_event,
8965		.setup = alc885_mbp3_setup,
8966		.init_hook = alc_automute_amp,
8967	},
8968	[ALC885_MB5] = {
8969		.mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
8970		.init_verbs = { alc885_mb5_init_verbs,
8971				alc880_gpio1_init_verbs },
8972		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
8973		.dac_nids = alc882_dac_nids,
8974		.channel_mode = alc885_mb5_6ch_modes,
8975		.num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
8976		.input_mux = &mb5_capture_source,
8977		.dig_out_nid = ALC882_DIGOUT_NID,
8978		.dig_in_nid = ALC882_DIGIN_NID,
8979	},
8980	[ALC885_MACPRO] = {
8981		.mixers = { alc882_macpro_mixer },
8982		.init_verbs = { alc882_macpro_init_verbs },
8983		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
8984		.dac_nids = alc882_dac_nids,
8985		.dig_out_nid = ALC882_DIGOUT_NID,
8986		.dig_in_nid = ALC882_DIGIN_NID,
8987		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
8988		.channel_mode = alc882_ch_modes,
8989		.input_mux = &alc882_capture_source,
8990		.init_hook = alc885_macpro_init_hook,
8991	},
8992	[ALC885_IMAC24] = {
8993		.mixers = { alc885_imac24_mixer },
8994		.init_verbs = { alc885_imac24_init_verbs },
8995		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
8996		.dac_nids = alc882_dac_nids,
8997		.dig_out_nid = ALC882_DIGOUT_NID,
8998		.dig_in_nid = ALC882_DIGIN_NID,
8999		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9000		.channel_mode = alc882_ch_modes,
9001		.input_mux = &alc882_capture_source,
9002		.unsol_event = alc_automute_amp_unsol_event,
9003		.setup = alc885_imac24_setup,
9004		.init_hook = alc885_imac24_init_hook,
9005	},
9006	[ALC882_TARGA] = {
9007		.mixers = { alc882_targa_mixer, alc882_chmode_mixer },
9008		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9009				alc880_gpio3_init_verbs, alc882_targa_verbs},
9010		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9011		.dac_nids = alc882_dac_nids,
9012		.dig_out_nid = ALC882_DIGOUT_NID,
9013		.num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9014		.adc_nids = alc882_adc_nids,
9015		.capsrc_nids = alc882_capsrc_nids,
9016		.num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9017		.channel_mode = alc882_3ST_6ch_modes,
9018		.need_dac_fix = 1,
9019		.input_mux = &alc882_capture_source,
9020		.unsol_event = alc882_targa_unsol_event,
9021		.setup = alc882_targa_setup,
9022		.init_hook = alc882_targa_automute,
9023	},
9024	[ALC882_ASUS_A7J] = {
9025		.mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
9026		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9027				alc882_asus_a7j_verbs},
9028		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9029		.dac_nids = alc882_dac_nids,
9030		.dig_out_nid = ALC882_DIGOUT_NID,
9031		.num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9032		.adc_nids = alc882_adc_nids,
9033		.capsrc_nids = alc882_capsrc_nids,
9034		.num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9035		.channel_mode = alc882_3ST_6ch_modes,
9036		.need_dac_fix = 1,
9037		.input_mux = &alc882_capture_source,
9038	},
9039	[ALC882_ASUS_A7M] = {
9040		.mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
9041		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9042				alc882_eapd_verbs, alc880_gpio1_init_verbs,
9043				alc882_asus_a7m_verbs },
9044		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9045		.dac_nids = alc882_dac_nids,
9046		.dig_out_nid = ALC882_DIGOUT_NID,
9047		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9048		.channel_mode = alc880_threestack_modes,
9049		.need_dac_fix = 1,
9050		.input_mux = &alc882_capture_source,
9051	},
9052	[ALC883_3ST_2ch_DIG] = {
9053		.mixers = { alc883_3ST_2ch_mixer },
9054		.init_verbs = { alc883_init_verbs },
9055		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9056		.dac_nids = alc883_dac_nids,
9057		.dig_out_nid = ALC883_DIGOUT_NID,
9058		.dig_in_nid = ALC883_DIGIN_NID,
9059		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9060		.channel_mode = alc883_3ST_2ch_modes,
9061		.input_mux = &alc883_capture_source,
9062	},
9063	[ALC883_3ST_6ch_DIG] = {
9064		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9065		.init_verbs = { alc883_init_verbs },
9066		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9067		.dac_nids = alc883_dac_nids,
9068		.dig_out_nid = ALC883_DIGOUT_NID,
9069		.dig_in_nid = ALC883_DIGIN_NID,
9070		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9071		.channel_mode = alc883_3ST_6ch_modes,
9072		.need_dac_fix = 1,
9073		.input_mux = &alc883_capture_source,
9074	},
9075	[ALC883_3ST_6ch] = {
9076		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9077		.init_verbs = { alc883_init_verbs },
9078		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9079		.dac_nids = alc883_dac_nids,
9080		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9081		.channel_mode = alc883_3ST_6ch_modes,
9082		.need_dac_fix = 1,
9083		.input_mux = &alc883_capture_source,
9084	},
9085	[ALC883_3ST_6ch_INTEL] = {
9086		.mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9087		.init_verbs = { alc883_init_verbs },
9088		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9089		.dac_nids = alc883_dac_nids,
9090		.dig_out_nid = ALC883_DIGOUT_NID,
9091		.dig_in_nid = ALC883_DIGIN_NID,
9092		.slave_dig_outs = alc883_slave_dig_outs,
9093		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9094		.channel_mode = alc883_3ST_6ch_intel_modes,
9095		.need_dac_fix = 1,
9096		.input_mux = &alc883_3stack_6ch_intel,
9097	},
9098	[ALC889A_INTEL] = {
9099		.mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9100		.init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9101				alc_hp15_unsol_verbs },
9102		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9103		.dac_nids = alc883_dac_nids,
9104		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9105		.adc_nids = alc889_adc_nids,
9106		.dig_out_nid = ALC883_DIGOUT_NID,
9107		.dig_in_nid = ALC883_DIGIN_NID,
9108		.slave_dig_outs = alc883_slave_dig_outs,
9109		.num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9110		.channel_mode = alc889_8ch_intel_modes,
9111		.capsrc_nids = alc889_capsrc_nids,
9112		.input_mux = &alc889_capture_source,
9113		.setup = alc889_automute_setup,
9114		.init_hook = alc_automute_amp,
9115		.unsol_event = alc_automute_amp_unsol_event,
9116		.need_dac_fix = 1,
9117	},
9118	[ALC889_INTEL] = {
9119		.mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9120		.init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
9121				alc889_eapd_verbs, alc_hp15_unsol_verbs},
9122		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9123		.dac_nids = alc883_dac_nids,
9124		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9125		.adc_nids = alc889_adc_nids,
9126		.dig_out_nid = ALC883_DIGOUT_NID,
9127		.dig_in_nid = ALC883_DIGIN_NID,
9128		.slave_dig_outs = alc883_slave_dig_outs,
9129		.num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9130		.channel_mode = alc889_8ch_intel_modes,
9131		.capsrc_nids = alc889_capsrc_nids,
9132		.input_mux = &alc889_capture_source,
9133		.setup = alc889_automute_setup,
9134		.init_hook = alc889_intel_init_hook,
9135		.unsol_event = alc_automute_amp_unsol_event,
9136		.need_dac_fix = 1,
9137	},
9138	[ALC883_6ST_DIG] = {
9139		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
9140		.init_verbs = { alc883_init_verbs },
9141		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9142		.dac_nids = alc883_dac_nids,
9143		.dig_out_nid = ALC883_DIGOUT_NID,
9144		.dig_in_nid = ALC883_DIGIN_NID,
9145		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9146		.channel_mode = alc883_sixstack_modes,
9147		.input_mux = &alc883_capture_source,
9148	},
9149	[ALC883_TARGA_DIG] = {
9150		.mixers = { alc883_targa_mixer, alc883_chmode_mixer },
9151		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9152				alc883_targa_verbs},
9153		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9154		.dac_nids = alc883_dac_nids,
9155		.dig_out_nid = ALC883_DIGOUT_NID,
9156		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9157		.channel_mode = alc883_3ST_6ch_modes,
9158		.need_dac_fix = 1,
9159		.input_mux = &alc883_capture_source,
9160		.unsol_event = alc883_targa_unsol_event,
9161		.setup = alc882_targa_setup,
9162		.init_hook = alc882_targa_automute,
9163	},
9164	[ALC883_TARGA_2ch_DIG] = {
9165		.mixers = { alc883_targa_2ch_mixer},
9166		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9167				alc883_targa_verbs},
9168		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9169		.dac_nids = alc883_dac_nids,
9170		.adc_nids = alc883_adc_nids_alt,
9171		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9172		.dig_out_nid = ALC883_DIGOUT_NID,
9173		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9174		.channel_mode = alc883_3ST_2ch_modes,
9175		.input_mux = &alc883_capture_source,
9176		.unsol_event = alc883_targa_unsol_event,
9177		.setup = alc882_targa_setup,
9178		.init_hook = alc882_targa_automute,
9179	},
9180	[ALC883_TARGA_8ch_DIG] = {
9181		.mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
9182			    alc883_chmode_mixer },
9183		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9184				alc883_targa_verbs },
9185		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9186		.dac_nids = alc883_dac_nids,
9187		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9188		.adc_nids = alc883_adc_nids_rev,
9189		.capsrc_nids = alc883_capsrc_nids_rev,
9190		.dig_out_nid = ALC883_DIGOUT_NID,
9191		.dig_in_nid = ALC883_DIGIN_NID,
9192		.num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
9193		.channel_mode = alc883_4ST_8ch_modes,
9194		.need_dac_fix = 1,
9195		.input_mux = &alc883_capture_source,
9196		.unsol_event = alc883_targa_unsol_event,
9197		.setup = alc882_targa_setup,
9198		.init_hook = alc882_targa_automute,
9199	},
9200	[ALC883_ACER] = {
9201		.mixers = { alc883_base_mixer },
9202		/* On TravelMate laptops, GPIO 0 enables the internal speaker
9203		 * and the headphone jack.  Turn this on and rely on the
9204		 * standard mute methods whenever the user wants to turn
9205		 * these outputs off.
9206		 */
9207		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
9208		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9209		.dac_nids = alc883_dac_nids,
9210		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9211		.channel_mode = alc883_3ST_2ch_modes,
9212		.input_mux = &alc883_capture_source,
9213	},
9214	[ALC883_ACER_ASPIRE] = {
9215		.mixers = { alc883_acer_aspire_mixer },
9216		.init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
9217		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9218		.dac_nids = alc883_dac_nids,
9219		.dig_out_nid = ALC883_DIGOUT_NID,
9220		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9221		.channel_mode = alc883_3ST_2ch_modes,
9222		.input_mux = &alc883_capture_source,
9223		.unsol_event = alc_automute_amp_unsol_event,
9224		.setup = alc883_acer_aspire_setup,
9225		.init_hook = alc_automute_amp,
9226	},
9227	[ALC888_ACER_ASPIRE_4930G] = {
9228		.mixers = { alc888_base_mixer,
9229				alc883_chmode_mixer },
9230		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9231				alc888_acer_aspire_4930g_verbs },
9232		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9233		.dac_nids = alc883_dac_nids,
9234		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9235		.adc_nids = alc883_adc_nids_rev,
9236		.capsrc_nids = alc883_capsrc_nids_rev,
9237		.dig_out_nid = ALC883_DIGOUT_NID,
9238		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9239		.channel_mode = alc883_3ST_6ch_modes,
9240		.need_dac_fix = 1,
9241		.num_mux_defs =
9242			ARRAY_SIZE(alc888_2_capture_sources),
9243		.input_mux = alc888_2_capture_sources,
9244		.unsol_event = alc_automute_amp_unsol_event,
9245		.setup = alc888_acer_aspire_4930g_setup,
9246		.init_hook = alc_automute_amp,
9247	},
9248	[ALC888_ACER_ASPIRE_6530G] = {
9249		.mixers = { alc888_acer_aspire_6530_mixer },
9250		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9251				alc888_acer_aspire_6530g_verbs },
9252		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9253		.dac_nids = alc883_dac_nids,
9254		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9255		.adc_nids = alc883_adc_nids_rev,
9256		.capsrc_nids = alc883_capsrc_nids_rev,
9257		.dig_out_nid = ALC883_DIGOUT_NID,
9258		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9259		.channel_mode = alc883_3ST_2ch_modes,
9260		.num_mux_defs =
9261			ARRAY_SIZE(alc888_2_capture_sources),
9262		.input_mux = alc888_acer_aspire_6530_sources,
9263		.unsol_event = alc_automute_amp_unsol_event,
9264		.setup = alc888_acer_aspire_6530g_setup,
9265		.init_hook = alc_automute_amp,
9266	},
9267	[ALC888_ACER_ASPIRE_8930G] = {
9268		.mixers = { alc888_base_mixer,
9269				alc883_chmode_mixer },
9270		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9271				alc889_acer_aspire_8930g_verbs },
9272		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9273		.dac_nids = alc883_dac_nids,
9274		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9275		.adc_nids = alc889_adc_nids,
9276		.capsrc_nids = alc889_capsrc_nids,
9277		.dig_out_nid = ALC883_DIGOUT_NID,
9278		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9279		.channel_mode = alc883_3ST_6ch_modes,
9280		.need_dac_fix = 1,
9281		.const_channel_count = 6,
9282		.num_mux_defs =
9283			ARRAY_SIZE(alc889_capture_sources),
9284		.input_mux = alc889_capture_sources,
9285		.unsol_event = alc_automute_amp_unsol_event,
9286		.setup = alc889_acer_aspire_8930g_setup,
9287		.init_hook = alc_automute_amp,
9288	},
9289	[ALC888_ACER_ASPIRE_7730G] = {
9290		.mixers = { alc883_3ST_6ch_mixer,
9291				alc883_chmode_mixer },
9292		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9293				alc888_acer_aspire_7730G_verbs },
9294		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9295		.dac_nids = alc883_dac_nids,
9296		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9297		.adc_nids = alc883_adc_nids_rev,
9298		.capsrc_nids = alc883_capsrc_nids_rev,
9299		.dig_out_nid = ALC883_DIGOUT_NID,
9300		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9301		.channel_mode = alc883_3ST_6ch_modes,
9302		.need_dac_fix = 1,
9303		.const_channel_count = 6,
9304		.input_mux = &alc883_capture_source,
9305		.unsol_event = alc_automute_amp_unsol_event,
9306		.setup = alc888_acer_aspire_6530g_setup,
9307		.init_hook = alc_automute_amp,
9308	},
9309	[ALC883_MEDION] = {
9310		.mixers = { alc883_fivestack_mixer,
9311			    alc883_chmode_mixer },
9312		.init_verbs = { alc883_init_verbs,
9313				alc883_medion_eapd_verbs },
9314		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9315		.dac_nids = alc883_dac_nids,
9316		.adc_nids = alc883_adc_nids_alt,
9317		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9318		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9319		.channel_mode = alc883_sixstack_modes,
9320		.input_mux = &alc883_capture_source,
9321	},
9322	[ALC883_MEDION_MD2] = {
9323		.mixers = { alc883_medion_md2_mixer},
9324		.init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
9325		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9326		.dac_nids = alc883_dac_nids,
9327		.dig_out_nid = ALC883_DIGOUT_NID,
9328		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9329		.channel_mode = alc883_3ST_2ch_modes,
9330		.input_mux = &alc883_capture_source,
9331		.unsol_event = alc_automute_amp_unsol_event,
9332		.setup = alc883_medion_md2_setup,
9333		.init_hook = alc_automute_amp,
9334	},
9335	[ALC883_LAPTOP_EAPD] = {
9336		.mixers = { alc883_base_mixer },
9337		.init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
9338		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9339		.dac_nids = alc883_dac_nids,
9340		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9341		.channel_mode = alc883_3ST_2ch_modes,
9342		.input_mux = &alc883_capture_source,
9343	},
9344	[ALC883_CLEVO_M540R] = {
9345		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9346		.init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
9347		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9348		.dac_nids = alc883_dac_nids,
9349		.dig_out_nid = ALC883_DIGOUT_NID,
9350		.dig_in_nid = ALC883_DIGIN_NID,
9351		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
9352		.channel_mode = alc883_3ST_6ch_clevo_modes,
9353		.need_dac_fix = 1,
9354		.input_mux = &alc883_capture_source,
9355		/* This machine has the hardware HP auto-muting, thus
9356		 * we need no software mute via unsol event
9357		 */
9358	},
9359	[ALC883_CLEVO_M720] = {
9360		.mixers = { alc883_clevo_m720_mixer },
9361		.init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
9362		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9363		.dac_nids = alc883_dac_nids,
9364		.dig_out_nid = ALC883_DIGOUT_NID,
9365		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9366		.channel_mode = alc883_3ST_2ch_modes,
9367		.input_mux = &alc883_capture_source,
9368		.unsol_event = alc883_clevo_m720_unsol_event,
9369		.setup = alc883_clevo_m720_setup,
9370		.init_hook = alc883_clevo_m720_init_hook,
9371	},
9372	[ALC883_LENOVO_101E_2ch] = {
9373		.mixers = { alc883_lenovo_101e_2ch_mixer},
9374		.init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
9375		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9376		.dac_nids = alc883_dac_nids,
9377		.adc_nids = alc883_adc_nids_alt,
9378		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9379		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9380		.channel_mode = alc883_3ST_2ch_modes,
9381		.input_mux = &alc883_lenovo_101e_capture_source,
9382		.unsol_event = alc883_lenovo_101e_unsol_event,
9383		.init_hook = alc883_lenovo_101e_all_automute,
9384	},
9385	[ALC883_LENOVO_NB0763] = {
9386		.mixers = { alc883_lenovo_nb0763_mixer },
9387		.init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
9388		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9389		.dac_nids = alc883_dac_nids,
9390		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9391		.channel_mode = alc883_3ST_2ch_modes,
9392		.need_dac_fix = 1,
9393		.input_mux = &alc883_lenovo_nb0763_capture_source,
9394		.unsol_event = alc_automute_amp_unsol_event,
9395		.setup = alc883_medion_md2_setup,
9396		.init_hook = alc_automute_amp,
9397	},
9398	[ALC888_LENOVO_MS7195_DIG] = {
9399		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9400		.init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
9401		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9402		.dac_nids = alc883_dac_nids,
9403		.dig_out_nid = ALC883_DIGOUT_NID,
9404		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9405		.channel_mode = alc883_3ST_6ch_modes,
9406		.need_dac_fix = 1,
9407		.input_mux = &alc883_capture_source,
9408		.unsol_event = alc883_lenovo_ms7195_unsol_event,
9409		.init_hook = alc888_lenovo_ms7195_front_automute,
9410	},
9411	[ALC883_HAIER_W66] = {
9412		.mixers = { alc883_targa_2ch_mixer},
9413		.init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
9414		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9415		.dac_nids = alc883_dac_nids,
9416		.dig_out_nid = ALC883_DIGOUT_NID,
9417		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9418		.channel_mode = alc883_3ST_2ch_modes,
9419		.input_mux = &alc883_capture_source,
9420		.unsol_event = alc_automute_amp_unsol_event,
9421		.setup = alc883_haier_w66_setup,
9422		.init_hook = alc_automute_amp,
9423	},
9424	[ALC888_3ST_HP] = {
9425		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9426		.init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
9427		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9428		.dac_nids = alc883_dac_nids,
9429		.num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
9430		.channel_mode = alc888_3st_hp_modes,
9431		.need_dac_fix = 1,
9432		.input_mux = &alc883_capture_source,
9433		.unsol_event = alc_automute_amp_unsol_event,
9434		.setup = alc888_3st_hp_setup,
9435		.init_hook = alc_automute_amp,
9436	},
9437	[ALC888_6ST_DELL] = {
9438		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
9439		.init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
9440		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9441		.dac_nids = alc883_dac_nids,
9442		.dig_out_nid = ALC883_DIGOUT_NID,
9443		.dig_in_nid = ALC883_DIGIN_NID,
9444		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9445		.channel_mode = alc883_sixstack_modes,
9446		.input_mux = &alc883_capture_source,
9447		.unsol_event = alc_automute_amp_unsol_event,
9448		.setup = alc888_6st_dell_setup,
9449		.init_hook = alc_automute_amp,
9450	},
9451	[ALC883_MITAC] = {
9452		.mixers = { alc883_mitac_mixer },
9453		.init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
9454		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9455		.dac_nids = alc883_dac_nids,
9456		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9457		.channel_mode = alc883_3ST_2ch_modes,
9458		.input_mux = &alc883_capture_source,
9459		.unsol_event = alc_automute_amp_unsol_event,
9460		.setup = alc883_mitac_setup,
9461		.init_hook = alc_automute_amp,
9462	},
9463	[ALC883_FUJITSU_PI2515] = {
9464		.mixers = { alc883_2ch_fujitsu_pi2515_mixer },
9465		.init_verbs = { alc883_init_verbs,
9466				alc883_2ch_fujitsu_pi2515_verbs},
9467		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9468		.dac_nids = alc883_dac_nids,
9469		.dig_out_nid = ALC883_DIGOUT_NID,
9470		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9471		.channel_mode = alc883_3ST_2ch_modes,
9472		.input_mux = &alc883_fujitsu_pi2515_capture_source,
9473		.unsol_event = alc_automute_amp_unsol_event,
9474		.setup = alc883_2ch_fujitsu_pi2515_setup,
9475		.init_hook = alc_automute_amp,
9476	},
9477	[ALC888_FUJITSU_XA3530] = {
9478		.mixers = { alc888_base_mixer, alc883_chmode_mixer },
9479		.init_verbs = { alc883_init_verbs,
9480			alc888_fujitsu_xa3530_verbs },
9481		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9482		.dac_nids = alc883_dac_nids,
9483		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9484		.adc_nids = alc883_adc_nids_rev,
9485		.capsrc_nids = alc883_capsrc_nids_rev,
9486		.dig_out_nid = ALC883_DIGOUT_NID,
9487		.num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
9488		.channel_mode = alc888_4ST_8ch_intel_modes,
9489		.num_mux_defs =
9490			ARRAY_SIZE(alc888_2_capture_sources),
9491		.input_mux = alc888_2_capture_sources,
9492		.unsol_event = alc_automute_amp_unsol_event,
9493		.setup = alc888_fujitsu_xa3530_setup,
9494		.init_hook = alc_automute_amp,
9495	},
9496	[ALC888_LENOVO_SKY] = {
9497		.mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
9498		.init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
9499		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9500		.dac_nids = alc883_dac_nids,
9501		.dig_out_nid = ALC883_DIGOUT_NID,
9502		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9503		.channel_mode = alc883_sixstack_modes,
9504		.need_dac_fix = 1,
9505		.input_mux = &alc883_lenovo_sky_capture_source,
9506		.unsol_event = alc_automute_amp_unsol_event,
9507		.setup = alc888_lenovo_sky_setup,
9508		.init_hook = alc_automute_amp,
9509	},
9510	[ALC888_ASUS_M90V] = {
9511		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9512		.init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
9513		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9514		.dac_nids = alc883_dac_nids,
9515		.dig_out_nid = ALC883_DIGOUT_NID,
9516		.dig_in_nid = ALC883_DIGIN_NID,
9517		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9518		.channel_mode = alc883_3ST_6ch_modes,
9519		.need_dac_fix = 1,
9520		.input_mux = &alc883_fujitsu_pi2515_capture_source,
9521		.unsol_event = alc_sku_unsol_event,
9522		.setup = alc883_mode2_setup,
9523		.init_hook = alc_inithook,
9524	},
9525	[ALC888_ASUS_EEE1601] = {
9526		.mixers = { alc883_asus_eee1601_mixer },
9527		.cap_mixer = alc883_asus_eee1601_cap_mixer,
9528		.init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
9529		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9530		.dac_nids = alc883_dac_nids,
9531		.dig_out_nid = ALC883_DIGOUT_NID,
9532		.dig_in_nid = ALC883_DIGIN_NID,
9533		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9534		.channel_mode = alc883_3ST_2ch_modes,
9535		.need_dac_fix = 1,
9536		.input_mux = &alc883_asus_eee1601_capture_source,
9537		.unsol_event = alc_sku_unsol_event,
9538		.init_hook = alc883_eee1601_inithook,
9539	},
9540	[ALC1200_ASUS_P5Q] = {
9541		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
9542		.init_verbs = { alc883_init_verbs },
9543		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9544		.dac_nids = alc883_dac_nids,
9545		.dig_out_nid = ALC1200_DIGOUT_NID,
9546		.dig_in_nid = ALC883_DIGIN_NID,
9547		.slave_dig_outs = alc1200_slave_dig_outs,
9548		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9549		.channel_mode = alc883_sixstack_modes,
9550		.input_mux = &alc883_capture_source,
9551	},
9552	[ALC889A_MB31] = {
9553		.mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
9554		.init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
9555			alc880_gpio1_init_verbs },
9556		.adc_nids = alc883_adc_nids,
9557		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
9558		.dac_nids = alc883_dac_nids,
9559		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9560		.channel_mode = alc889A_mb31_6ch_modes,
9561		.num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
9562		.input_mux = &alc889A_mb31_capture_source,
9563		.dig_out_nid = ALC883_DIGOUT_NID,
9564		.unsol_event = alc889A_mb31_unsol_event,
9565		.init_hook = alc889A_mb31_automute,
9566	},
9567	[ALC883_SONY_VAIO_TT] = {
9568		.mixers = { alc883_vaiott_mixer },
9569		.init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
9570		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9571		.dac_nids = alc883_dac_nids,
9572		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9573		.channel_mode = alc883_3ST_2ch_modes,
9574		.input_mux = &alc883_capture_source,
9575		.unsol_event = alc_automute_amp_unsol_event,
9576		.setup = alc883_vaiott_setup,
9577		.init_hook = alc_automute_amp,
9578	},
9579};
9580
9581
9582/*
9583 * Pin config fixes
9584 */
9585enum {
9586	PINFIX_ABIT_AW9D_MAX
9587};
9588
9589static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
9590	{ 0x15, 0x01080104 }, /* side */
9591	{ 0x16, 0x01011012 }, /* rear */
9592	{ 0x17, 0x01016011 }, /* clfe */
9593	{ }
9594};
9595
9596static const struct alc_pincfg *alc882_pin_fixes[] = {
9597	[PINFIX_ABIT_AW9D_MAX] = alc882_abit_aw9d_pinfix,
9598};
9599
9600static struct snd_pci_quirk alc882_pinfix_tbl[] = {
9601	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
9602	{}
9603};
9604
9605/*
9606 * BIOS auto configuration
9607 */
9608static int alc882_auto_create_input_ctls(struct hda_codec *codec,
9609						const struct auto_pin_cfg *cfg)
9610{
9611	return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
9612}
9613
9614static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
9615					      hda_nid_t nid, int pin_type,
9616					      int dac_idx)
9617{
9618	/* set as output */
9619	struct alc_spec *spec = codec->spec;
9620	int idx;
9621
9622	alc_set_pin_output(codec, nid, pin_type);
9623	if (spec->multiout.dac_nids[dac_idx] == 0x25)
9624		idx = 4;
9625	else
9626		idx = spec->multiout.dac_nids[dac_idx] - 2;
9627	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
9628
9629}
9630
9631static void alc882_auto_init_multi_out(struct hda_codec *codec)
9632{
9633	struct alc_spec *spec = codec->spec;
9634	int i;
9635
9636	for (i = 0; i <= HDA_SIDE; i++) {
9637		hda_nid_t nid = spec->autocfg.line_out_pins[i];
9638		int pin_type = get_pin_type(spec->autocfg.line_out_type);
9639		if (nid)
9640			alc882_auto_set_output_and_unmute(codec, nid, pin_type,
9641							  i);
9642	}
9643}
9644
9645static void alc882_auto_init_hp_out(struct hda_codec *codec)
9646{
9647	struct alc_spec *spec = codec->spec;
9648	hda_nid_t pin;
9649
9650	pin = spec->autocfg.hp_pins[0];
9651	if (pin) /* connect to front */
9652		/* use dac 0 */
9653		alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
9654	pin = spec->autocfg.speaker_pins[0];
9655	if (pin)
9656		alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
9657}
9658
9659static void alc882_auto_init_analog_input(struct hda_codec *codec)
9660{
9661	struct alc_spec *spec = codec->spec;
9662	int i;
9663
9664	for (i = 0; i < AUTO_PIN_LAST; i++) {
9665		hda_nid_t nid = spec->autocfg.input_pins[i];
9666		if (!nid)
9667			continue;
9668		alc_set_input_pin(codec, nid, i);
9669		if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
9670			snd_hda_codec_write(codec, nid, 0,
9671					    AC_VERB_SET_AMP_GAIN_MUTE,
9672					    AMP_OUT_MUTE);
9673	}
9674}
9675
9676static void alc882_auto_init_input_src(struct hda_codec *codec)
9677{
9678	struct alc_spec *spec = codec->spec;
9679	int c;
9680
9681	for (c = 0; c < spec->num_adc_nids; c++) {
9682		hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
9683		hda_nid_t nid = spec->capsrc_nids[c];
9684		unsigned int mux_idx;
9685		const struct hda_input_mux *imux;
9686		int conns, mute, idx, item;
9687
9688		conns = snd_hda_get_connections(codec, nid, conn_list,
9689						ARRAY_SIZE(conn_list));
9690		if (conns < 0)
9691			continue;
9692		mux_idx = c >= spec->num_mux_defs ? 0 : c;
9693		imux = &spec->input_mux[mux_idx];
9694		for (idx = 0; idx < conns; idx++) {
9695			/* if the current connection is the selected one,
9696			 * unmute it as default - otherwise mute it
9697			 */
9698			mute = AMP_IN_MUTE(idx);
9699			for (item = 0; item < imux->num_items; item++) {
9700				if (imux->items[item].index == idx) {
9701					if (spec->cur_mux[c] == item)
9702						mute = AMP_IN_UNMUTE(idx);
9703					break;
9704				}
9705			}
9706			/* check if we have a selector or mixer
9707			 * we could check for the widget type instead, but
9708			 * just check for Amp-In presence (in case of mixer
9709			 * without amp-in there is something wrong, this
9710			 * function shouldn't be used or capsrc nid is wrong)
9711			 */
9712			if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
9713				snd_hda_codec_write(codec, nid, 0,
9714						    AC_VERB_SET_AMP_GAIN_MUTE,
9715						    mute);
9716			else if (mute != AMP_IN_MUTE(idx))
9717				snd_hda_codec_write(codec, nid, 0,
9718						    AC_VERB_SET_CONNECT_SEL,
9719						    idx);
9720		}
9721	}
9722}
9723
9724/* add mic boosts if needed */
9725static int alc_auto_add_mic_boost(struct hda_codec *codec)
9726{
9727	struct alc_spec *spec = codec->spec;
9728	int err;
9729	hda_nid_t nid;
9730
9731	nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
9732	if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
9733		err = add_control(spec, ALC_CTL_WIDGET_VOL,
9734				  "Mic Boost",
9735				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
9736		if (err < 0)
9737			return err;
9738	}
9739	nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
9740	if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
9741		err = add_control(spec, ALC_CTL_WIDGET_VOL,
9742				  "Front Mic Boost",
9743				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
9744		if (err < 0)
9745			return err;
9746	}
9747	return 0;
9748}
9749
9750/* almost identical with ALC880 parser... */
9751static int alc882_parse_auto_config(struct hda_codec *codec)
9752{
9753	struct alc_spec *spec = codec->spec;
9754	static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
9755	int i, err;
9756
9757	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
9758					   alc882_ignore);
9759	if (err < 0)
9760		return err;
9761	if (!spec->autocfg.line_outs)
9762		return 0; /* can't find valid BIOS pin config */
9763
9764	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
9765	if (err < 0)
9766		return err;
9767	err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
9768	if (err < 0)
9769		return err;
9770	err = alc880_auto_create_extra_out(spec,
9771					   spec->autocfg.speaker_pins[0],
9772					   "Speaker");
9773	if (err < 0)
9774		return err;
9775	err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
9776					   "Headphone");
9777	if (err < 0)
9778		return err;
9779	err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
9780	if (err < 0)
9781		return err;
9782
9783	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
9784
9785	/* check multiple SPDIF-out (for recent codecs) */
9786	for (i = 0; i < spec->autocfg.dig_outs; i++) {
9787		hda_nid_t dig_nid;
9788		err = snd_hda_get_connections(codec,
9789					      spec->autocfg.dig_out_pins[i],
9790					      &dig_nid, 1);
9791		if (err < 0)
9792			continue;
9793		if (!i)
9794			spec->multiout.dig_out_nid = dig_nid;
9795		else {
9796			spec->multiout.slave_dig_outs = spec->slave_dig_outs;
9797			spec->slave_dig_outs[i - 1] = dig_nid;
9798			if (i == ARRAY_SIZE(spec->slave_dig_outs) - 1)
9799				break;
9800		}
9801	}
9802	if (spec->autocfg.dig_in_pin)
9803		spec->dig_in_nid = ALC880_DIGIN_NID;
9804
9805	if (spec->kctls.list)
9806		add_mixer(spec, spec->kctls.list);
9807
9808	add_verb(spec, alc883_auto_init_verbs);
9809	/* if ADC 0x07 is available, initialize it, too */
9810	if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
9811		add_verb(spec, alc882_adc1_init_verbs);
9812
9813	spec->num_mux_defs = 1;
9814	spec->input_mux = &spec->private_imux[0];
9815
9816	alc_ssid_check(codec, 0x15, 0x1b, 0x14);
9817
9818	err = alc_auto_add_mic_boost(codec);
9819	if (err < 0)
9820		return err;
9821
9822	return 1; /* config found */
9823}
9824
9825/* additional initialization for auto-configuration model */
9826static void alc882_auto_init(struct hda_codec *codec)
9827{
9828	struct alc_spec *spec = codec->spec;
9829	alc882_auto_init_multi_out(codec);
9830	alc882_auto_init_hp_out(codec);
9831	alc882_auto_init_analog_input(codec);
9832	alc882_auto_init_input_src(codec);
9833	if (spec->unsol_event)
9834		alc_inithook(codec);
9835}
9836
9837static int patch_alc882(struct hda_codec *codec)
9838{
9839	struct alc_spec *spec;
9840	int err, board_config;
9841
9842	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
9843	if (spec == NULL)
9844		return -ENOMEM;
9845
9846	codec->spec = spec;
9847
9848	switch (codec->vendor_id) {
9849	case 0x10ec0882:
9850	case 0x10ec0885:
9851		break;
9852	default:
9853		/* ALC883 and variants */
9854		alc_fix_pll_init(codec, 0x20, 0x0a, 10);
9855		break;
9856	}
9857
9858	board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
9859						  alc882_models,
9860						  alc882_cfg_tbl);
9861
9862	if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
9863		board_config = snd_hda_check_board_codec_sid_config(codec,
9864			ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
9865
9866	if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
9867		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
9868		       codec->chip_name);
9869		board_config = ALC882_AUTO;
9870	}
9871
9872	alc_fix_pincfg(codec, alc882_pinfix_tbl, alc882_pin_fixes);
9873
9874	if (board_config == ALC882_AUTO) {
9875		/* automatic parse from the BIOS config */
9876		err = alc882_parse_auto_config(codec);
9877		if (err < 0) {
9878			alc_free(codec);
9879			return err;
9880		} else if (!err) {
9881			printk(KERN_INFO
9882			       "hda_codec: Cannot set up configuration "
9883			       "from BIOS.  Using base mode...\n");
9884			board_config = ALC882_3ST_DIG;
9885		}
9886	}
9887
9888	err = snd_hda_attach_beep_device(codec, 0x1);
9889	if (err < 0) {
9890		alc_free(codec);
9891		return err;
9892	}
9893
9894	if (board_config != ALC882_AUTO)
9895		setup_preset(codec, &alc882_presets[board_config]);
9896
9897	spec->stream_analog_playback = &alc882_pcm_analog_playback;
9898	spec->stream_analog_capture = &alc882_pcm_analog_capture;
9899	/* FIXME: setup DAC5 */
9900	/*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
9901	spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
9902
9903	spec->stream_digital_playback = &alc882_pcm_digital_playback;
9904	spec->stream_digital_capture = &alc882_pcm_digital_capture;
9905
9906	if (codec->vendor_id == 0x10ec0888)
9907		spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */
9908
9909	if (!spec->adc_nids && spec->input_mux) {
9910		int i;
9911		spec->num_adc_nids = 0;
9912		for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
9913			hda_nid_t cap;
9914			hda_nid_t nid = alc882_adc_nids[i];
9915			unsigned int wcap = get_wcaps(codec, nid);
9916			/* get type */
9917			wcap = get_wcaps_type(wcap);
9918			if (wcap != AC_WID_AUD_IN)
9919				continue;
9920			spec->private_adc_nids[spec->num_adc_nids] = nid;
9921			err = snd_hda_get_connections(codec, nid, &cap, 1);
9922			if (err < 0)
9923				continue;
9924			spec->private_capsrc_nids[spec->num_adc_nids] = cap;
9925			spec->num_adc_nids++;
9926		}
9927		spec->adc_nids = spec->private_adc_nids;
9928		spec->capsrc_nids = spec->private_capsrc_nids;
9929	}
9930
9931	set_capture_mixer(codec);
9932	set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
9933
9934	spec->vmaster_nid = 0x0c;
9935
9936	codec->patch_ops = alc_patch_ops;
9937	if (board_config == ALC882_AUTO)
9938		spec->init_hook = alc882_auto_init;
9939#ifdef CONFIG_SND_HDA_POWER_SAVE
9940	if (!spec->loopback.amplist)
9941		spec->loopback.amplist = alc882_loopbacks;
9942#endif
9943	codec->proc_widget_hook = print_realtek_coef;
9944
9945	return 0;
9946}
9947
9948
9949/*
9950 * ALC262 support
9951 */
9952
9953#define ALC262_DIGOUT_NID	ALC880_DIGOUT_NID
9954#define ALC262_DIGIN_NID	ALC880_DIGIN_NID
9955
9956#define alc262_dac_nids		alc260_dac_nids
9957#define alc262_adc_nids		alc882_adc_nids
9958#define alc262_adc_nids_alt	alc882_adc_nids_alt
9959#define alc262_capsrc_nids	alc882_capsrc_nids
9960#define alc262_capsrc_nids_alt	alc882_capsrc_nids_alt
9961
9962#define alc262_modes		alc260_modes
9963#define alc262_capture_source	alc882_capture_source
9964
9965static hda_nid_t alc262_dmic_adc_nids[1] = {
9966	/* ADC0 */
9967	0x09
9968};
9969
9970static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
9971
9972static struct snd_kcontrol_new alc262_base_mixer[] = {
9973	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9974	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
9975	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
9976	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
9977	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
9978	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
9979	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
9980	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
9981	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9982	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
9983	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
9984	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
9985	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
9986	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
9987	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
9988	HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
9989	{ } /* end */
9990};
9991
9992/* update HP, line and mono-out pins according to the master switch */
9993static void alc262_hp_master_update(struct hda_codec *codec)
9994{
9995	struct alc_spec *spec = codec->spec;
9996	int val = spec->master_sw;
9997
9998	/* HP & line-out */
9999	snd_hda_codec_write_cache(codec, 0x1b, 0,
10000				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10001				  val ? PIN_HP : 0);
10002	snd_hda_codec_write_cache(codec, 0x15, 0,
10003				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10004				  val ? PIN_HP : 0);
10005	/* mono (speaker) depending on the HP jack sense */
10006	val = val && !spec->jack_present;
10007	snd_hda_codec_write_cache(codec, 0x16, 0,
10008				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10009				  val ? PIN_OUT : 0);
10010}
10011
10012static void alc262_hp_bpc_automute(struct hda_codec *codec)
10013{
10014	struct alc_spec *spec = codec->spec;
10015	unsigned int presence;
10016	presence = snd_hda_codec_read(codec, 0x1b, 0,
10017				      AC_VERB_GET_PIN_SENSE, 0);
10018	spec->jack_present = !!(presence & AC_PINSENSE_PRESENCE);
10019	alc262_hp_master_update(codec);
10020}
10021
10022static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10023{
10024	if ((res >> 26) != ALC880_HP_EVENT)
10025		return;
10026	alc262_hp_bpc_automute(codec);
10027}
10028
10029static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10030{
10031	struct alc_spec *spec = codec->spec;
10032	unsigned int presence;
10033	presence = snd_hda_codec_read(codec, 0x15, 0,
10034				      AC_VERB_GET_PIN_SENSE, 0);
10035	spec->jack_present = !!(presence & AC_PINSENSE_PRESENCE);
10036	alc262_hp_master_update(codec);
10037}
10038
10039static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10040					   unsigned int res)
10041{
10042	if ((res >> 26) != ALC880_HP_EVENT)
10043		return;
10044	alc262_hp_wildwest_automute(codec);
10045}
10046
10047#define alc262_hp_master_sw_get		alc260_hp_master_sw_get
10048
10049static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10050				   struct snd_ctl_elem_value *ucontrol)
10051{
10052	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10053	struct alc_spec *spec = codec->spec;
10054	int val = !!*ucontrol->value.integer.value;
10055
10056	if (val == spec->master_sw)
10057		return 0;
10058	spec->master_sw = val;
10059	alc262_hp_master_update(codec);
10060	return 1;
10061}
10062
10063#define ALC262_HP_MASTER_SWITCH					\
10064	{							\
10065		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		\
10066		.name = "Master Playback Switch",		\
10067		.info = snd_ctl_boolean_mono_info,		\
10068		.get = alc262_hp_master_sw_get,			\
10069		.put = alc262_hp_master_sw_put,			\
10070	}
10071
10072static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
10073	ALC262_HP_MASTER_SWITCH,
10074	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10075	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10076	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10077	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10078			      HDA_OUTPUT),
10079	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10080			    HDA_OUTPUT),
10081	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10082	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10083	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10084	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10085	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10086	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10087	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10088	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10089	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10090	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10091	HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10092	HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10093	{ } /* end */
10094};
10095
10096static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
10097	ALC262_HP_MASTER_SWITCH,
10098	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10099	HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10100	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10101	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10102	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10103			      HDA_OUTPUT),
10104	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10105			    HDA_OUTPUT),
10106	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10107	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
10108	HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
10109	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10110	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10111	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10112	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10113	{ } /* end */
10114};
10115
10116static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
10117	HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10118	HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10119	HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
10120	{ } /* end */
10121};
10122
10123/* mute/unmute internal speaker according to the hp jack and mute state */
10124static void alc262_hp_t5735_setup(struct hda_codec *codec)
10125{
10126	struct alc_spec *spec = codec->spec;
10127
10128	spec->autocfg.hp_pins[0] = 0x15;
10129	spec->autocfg.speaker_pins[0] = 0x0c; /* HACK: not actually a pin */
10130}
10131
10132static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
10133	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10134	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10135	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10136	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10137	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10138	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10139	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10140	{ } /* end */
10141};
10142
10143static struct hda_verb alc262_hp_t5735_verbs[] = {
10144	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10145	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10146
10147	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
10148	{ }
10149};
10150
10151static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
10152	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10153	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10154	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
10155	HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
10156	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10157	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10158	{ } /* end */
10159};
10160
10161static struct hda_verb alc262_hp_rp5700_verbs[] = {
10162	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10163	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10164	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10165	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10166	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10167	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10168	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10169	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10170	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10171	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10172	{}
10173};
10174
10175static struct hda_input_mux alc262_hp_rp5700_capture_source = {
10176	.num_items = 1,
10177	.items = {
10178		{ "Line", 0x1 },
10179	},
10180};
10181
10182/* bind hp and internal speaker mute (with plug check) as master switch */
10183static void alc262_hippo_master_update(struct hda_codec *codec)
10184{
10185	struct alc_spec *spec = codec->spec;
10186	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10187	hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
10188	hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
10189	unsigned int mute;
10190
10191	/* HP */
10192	mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
10193	snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
10194				 HDA_AMP_MUTE, mute);
10195	/* mute internal speaker per jack sense */
10196	if (spec->jack_present)
10197		mute = HDA_AMP_MUTE;
10198	if (line_nid)
10199		snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
10200					 HDA_AMP_MUTE, mute);
10201	if (speaker_nid && speaker_nid != line_nid)
10202		snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
10203					 HDA_AMP_MUTE, mute);
10204}
10205
10206#define alc262_hippo_master_sw_get	alc262_hp_master_sw_get
10207
10208static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
10209				      struct snd_ctl_elem_value *ucontrol)
10210{
10211	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10212	struct alc_spec *spec = codec->spec;
10213	int val = !!*ucontrol->value.integer.value;
10214
10215	if (val == spec->master_sw)
10216		return 0;
10217	spec->master_sw = val;
10218	alc262_hippo_master_update(codec);
10219	return 1;
10220}
10221
10222#define ALC262_HIPPO_MASTER_SWITCH				\
10223	{							\
10224		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		\
10225		.name = "Master Playback Switch",		\
10226		.info = snd_ctl_boolean_mono_info,		\
10227		.get = alc262_hippo_master_sw_get,		\
10228		.put = alc262_hippo_master_sw_put,		\
10229	}
10230
10231static struct snd_kcontrol_new alc262_hippo_mixer[] = {
10232	ALC262_HIPPO_MASTER_SWITCH,
10233	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10234	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10235	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10236	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10237	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10238	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10239	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10240	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10241	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10242	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10243	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10244	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10245	{ } /* end */
10246};
10247
10248static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
10249	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10250	ALC262_HIPPO_MASTER_SWITCH,
10251	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10252	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10253	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10254	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10255	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10256	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10257	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10258	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10259	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10260	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10261	{ } /* end */
10262};
10263
10264/* mute/unmute internal speaker according to the hp jack and mute state */
10265static void alc262_hippo_automute(struct hda_codec *codec)
10266{
10267	struct alc_spec *spec = codec->spec;
10268	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10269	unsigned int present;
10270
10271	/* need to execute and sync at first */
10272	snd_hda_codec_read(codec, hp_nid, 0, AC_VERB_SET_PIN_SENSE, 0);
10273	present = snd_hda_codec_read(codec, hp_nid, 0,
10274				     AC_VERB_GET_PIN_SENSE, 0);
10275	spec->jack_present = (present & 0x80000000) != 0;
10276	alc262_hippo_master_update(codec);
10277}
10278
10279static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
10280{
10281	if ((res >> 26) != ALC880_HP_EVENT)
10282		return;
10283	alc262_hippo_automute(codec);
10284}
10285
10286static void alc262_hippo_setup(struct hda_codec *codec)
10287{
10288	struct alc_spec *spec = codec->spec;
10289
10290	spec->autocfg.hp_pins[0] = 0x15;
10291	spec->autocfg.speaker_pins[0] = 0x14;
10292}
10293
10294static void alc262_hippo1_setup(struct hda_codec *codec)
10295{
10296	struct alc_spec *spec = codec->spec;
10297
10298	spec->autocfg.hp_pins[0] = 0x1b;
10299	spec->autocfg.speaker_pins[0] = 0x14;
10300}
10301
10302
10303static struct snd_kcontrol_new alc262_sony_mixer[] = {
10304	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10305	ALC262_HIPPO_MASTER_SWITCH,
10306	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10307	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10308	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10309	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10310	{ } /* end */
10311};
10312
10313static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
10314	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10315	ALC262_HIPPO_MASTER_SWITCH,
10316	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10317	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10318	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10319	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10320	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10321	{ } /* end */
10322};
10323
10324static struct snd_kcontrol_new alc262_tyan_mixer[] = {
10325	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10326	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
10327	HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
10328	HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
10329	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10330	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10331	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10332	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10333	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10334	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10335	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10336	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10337	{ } /* end */
10338};
10339
10340static struct hda_verb alc262_tyan_verbs[] = {
10341	/* Headphone automute */
10342	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10343	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10344	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10345
10346	/* P11 AUX_IN, white 4-pin connector */
10347	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10348	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
10349	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
10350	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
10351
10352	{}
10353};
10354
10355/* unsolicited event for HP jack sensing */
10356static void alc262_tyan_setup(struct hda_codec *codec)
10357{
10358	struct alc_spec *spec = codec->spec;
10359
10360	spec->autocfg.hp_pins[0] = 0x1b;
10361	spec->autocfg.speaker_pins[0] = 0x15;
10362}
10363
10364
10365#define alc262_capture_mixer		alc882_capture_mixer
10366#define alc262_capture_alt_mixer	alc882_capture_alt_mixer
10367
10368/*
10369 * generic initialization of ADC, input mixers and output mixers
10370 */
10371static struct hda_verb alc262_init_verbs[] = {
10372	/*
10373	 * Unmute ADC0-2 and set the default input to mic-in
10374	 */
10375	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
10376	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10377	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
10378	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10379	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
10380	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10381
10382	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
10383	 * mixer widget
10384	 * Note: PASD motherboards uses the Line In 2 as the input for
10385	 * front panel mic (mic 2)
10386	 */
10387	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
10388	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10389	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10390	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
10391	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
10392	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
10393
10394	/*
10395	 * Set up output mixers (0x0c - 0x0e)
10396	 */
10397	/* set vol=0 to output mixers */
10398	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10399	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10400	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10401	/* set up input amps for analog loopback */
10402	/* Amp Indices: DAC = 0, mixer = 1 */
10403	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10404	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10405	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10406	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10407	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10408	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10409
10410	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10411	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10412	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10413	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10414	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10415	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10416
10417	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10418	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10419	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10420	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10421	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10422
10423	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
10424	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
10425
10426	/* FIXME: use matrix-type input source selection */
10427	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
10428	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
10429	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10430	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10431	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10432	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10433	/* Input mixer2 */
10434	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10435	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10436	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10437	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10438	/* Input mixer3 */
10439	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10440	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10441	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10442	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10443
10444	{ }
10445};
10446
10447static struct hda_verb alc262_eapd_verbs[] = {
10448	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
10449	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
10450	{ }
10451};
10452
10453static struct hda_verb alc262_hippo1_unsol_verbs[] = {
10454	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10455	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10456	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10457
10458	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10459	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10460	{}
10461};
10462
10463static struct hda_verb alc262_sony_unsol_verbs[] = {
10464	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10465	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10466	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},	// Front Mic
10467
10468	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10469	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10470	{}
10471};
10472
10473static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
10474	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10475	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10476	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10477	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10478	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10479	{ } /* end */
10480};
10481
10482static struct hda_verb alc262_toshiba_s06_verbs[] = {
10483	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10484	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10485	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10486	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10487	{0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
10488	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10489	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
10490	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10491	{}
10492};
10493
10494static void alc262_toshiba_s06_setup(struct hda_codec *codec)
10495{
10496	struct alc_spec *spec = codec->spec;
10497
10498	spec->autocfg.hp_pins[0] = 0x15;
10499	spec->autocfg.speaker_pins[0] = 0x14;
10500	spec->ext_mic.pin = 0x18;
10501	spec->ext_mic.mux_idx = 0;
10502	spec->int_mic.pin = 0x12;
10503	spec->int_mic.mux_idx = 9;
10504	spec->auto_mic = 1;
10505}
10506
10507/*
10508 * nec model
10509 *  0x15 = headphone
10510 *  0x16 = internal speaker
10511 *  0x18 = external mic
10512 */
10513
10514static struct snd_kcontrol_new alc262_nec_mixer[] = {
10515	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
10516	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
10517
10518	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10519	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10520	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10521
10522	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10523	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10524	{ } /* end */
10525};
10526
10527static struct hda_verb alc262_nec_verbs[] = {
10528	/* Unmute Speaker */
10529	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10530
10531	/* Headphone */
10532	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10533	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10534
10535	/* External mic to headphone */
10536	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10537	/* External mic to speaker */
10538	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10539	{}
10540};
10541
10542/*
10543 * fujitsu model
10544 *  0x14 = headphone/spdif-out, 0x15 = internal speaker,
10545 *  0x1b = port replicator headphone out
10546 */
10547
10548#define ALC_HP_EVENT	0x37
10549
10550static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
10551	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10552	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10553	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10554	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10555	{}
10556};
10557
10558static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
10559	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10560	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10561	{}
10562};
10563
10564static struct hda_input_mux alc262_fujitsu_capture_source = {
10565	.num_items = 3,
10566	.items = {
10567		{ "Mic", 0x0 },
10568		{ "Int Mic", 0x1 },
10569		{ "CD", 0x4 },
10570	},
10571};
10572
10573static struct hda_input_mux alc262_HP_capture_source = {
10574	.num_items = 5,
10575	.items = {
10576		{ "Mic", 0x0 },
10577		{ "Front Mic", 0x1 },
10578		{ "Line", 0x2 },
10579		{ "CD", 0x4 },
10580		{ "AUX IN", 0x6 },
10581	},
10582};
10583
10584static struct hda_input_mux alc262_HP_D7000_capture_source = {
10585	.num_items = 4,
10586	.items = {
10587		{ "Mic", 0x0 },
10588		{ "Front Mic", 0x2 },
10589		{ "Line", 0x1 },
10590		{ "CD", 0x4 },
10591	},
10592};
10593
10594/* mute/unmute internal speaker according to the hp jacks and mute state */
10595static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
10596{
10597	struct alc_spec *spec = codec->spec;
10598	unsigned int mute;
10599
10600	if (force || !spec->sense_updated) {
10601		unsigned int present;
10602		/* need to execute and sync at first */
10603		snd_hda_codec_read(codec, 0x14, 0, AC_VERB_SET_PIN_SENSE, 0);
10604		/* check laptop HP jack */
10605		present = snd_hda_codec_read(codec, 0x14, 0,
10606					     AC_VERB_GET_PIN_SENSE, 0);
10607		/* need to execute and sync at first */
10608		snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0);
10609		/* check docking HP jack */
10610		present |= snd_hda_codec_read(codec, 0x1b, 0,
10611					      AC_VERB_GET_PIN_SENSE, 0);
10612		if (present & AC_PINSENSE_PRESENCE)
10613			spec->jack_present = 1;
10614		else
10615			spec->jack_present = 0;
10616		spec->sense_updated = 1;
10617	}
10618	/* unmute internal speaker only if both HPs are unplugged and
10619	 * master switch is on
10620	 */
10621	if (spec->jack_present)
10622		mute = HDA_AMP_MUTE;
10623	else
10624		mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
10625	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
10626				 HDA_AMP_MUTE, mute);
10627}
10628
10629/* unsolicited event for HP jack sensing */
10630static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
10631				       unsigned int res)
10632{
10633	if ((res >> 26) != ALC_HP_EVENT)
10634		return;
10635	alc262_fujitsu_automute(codec, 1);
10636}
10637
10638static void alc262_fujitsu_init_hook(struct hda_codec *codec)
10639{
10640	alc262_fujitsu_automute(codec, 1);
10641}
10642
10643/* bind volumes of both NID 0x0c and 0x0d */
10644static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
10645	.ops = &snd_hda_bind_vol,
10646	.values = {
10647		HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
10648		HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
10649		0
10650	},
10651};
10652
10653/* mute/unmute internal speaker according to the hp jack and mute state */
10654static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
10655{
10656	struct alc_spec *spec = codec->spec;
10657	unsigned int mute;
10658
10659	if (force || !spec->sense_updated) {
10660		unsigned int present_int_hp;
10661		/* need to execute and sync at first */
10662		snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0);
10663		present_int_hp = snd_hda_codec_read(codec, 0x1b, 0,
10664					AC_VERB_GET_PIN_SENSE, 0);
10665		spec->jack_present = (present_int_hp & 0x80000000) != 0;
10666		spec->sense_updated = 1;
10667	}
10668	if (spec->jack_present) {
10669		/* mute internal speaker */
10670		snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10671					 HDA_AMP_MUTE, HDA_AMP_MUTE);
10672		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
10673					 HDA_AMP_MUTE, HDA_AMP_MUTE);
10674	} else {
10675		/* unmute internal speaker if necessary */
10676		mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
10677		snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10678					 HDA_AMP_MUTE, mute);
10679		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
10680					 HDA_AMP_MUTE, mute);
10681	}
10682}
10683
10684/* unsolicited event for HP jack sensing */
10685static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
10686				       unsigned int res)
10687{
10688	if ((res >> 26) != ALC_HP_EVENT)
10689		return;
10690	alc262_lenovo_3000_automute(codec, 1);
10691}
10692
10693static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
10694				  int dir, int idx, long *valp)
10695{
10696	int i, change = 0;
10697
10698	for (i = 0; i < 2; i++, valp++)
10699		change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
10700						   HDA_AMP_MUTE,
10701						   *valp ? 0 : HDA_AMP_MUTE);
10702	return change;
10703}
10704
10705/* bind hp and internal speaker mute (with plug check) */
10706static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
10707					 struct snd_ctl_elem_value *ucontrol)
10708{
10709	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10710	long *valp = ucontrol->value.integer.value;
10711	int change;
10712
10713	change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
10714	change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
10715	if (change)
10716		alc262_fujitsu_automute(codec, 0);
10717	return change;
10718}
10719
10720static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
10721	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
10722	{
10723		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
10724		.name = "Master Playback Switch",
10725		.info = snd_hda_mixer_amp_switch_info,
10726		.get = snd_hda_mixer_amp_switch_get,
10727		.put = alc262_fujitsu_master_sw_put,
10728		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
10729	},
10730	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10731	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10732	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10733	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10734	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10735	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
10736	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
10737	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
10738	{ } /* end */
10739};
10740
10741/* bind hp and internal speaker mute (with plug check) */
10742static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
10743					 struct snd_ctl_elem_value *ucontrol)
10744{
10745	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10746	long *valp = ucontrol->value.integer.value;
10747	int change;
10748
10749	change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
10750	if (change)
10751		alc262_lenovo_3000_automute(codec, 0);
10752	return change;
10753}
10754
10755static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
10756	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
10757	{
10758		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
10759		.name = "Master Playback Switch",
10760		.info = snd_hda_mixer_amp_switch_info,
10761		.get = snd_hda_mixer_amp_switch_get,
10762		.put = alc262_lenovo_3000_master_sw_put,
10763		.private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
10764	},
10765	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10766	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10767	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10768	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10769	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10770	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
10771	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
10772	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
10773	{ } /* end */
10774};
10775
10776static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
10777	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
10778	ALC262_HIPPO_MASTER_SWITCH,
10779	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10780	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10781	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10782	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10783	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10784	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10785	{ } /* end */
10786};
10787
10788/* additional init verbs for Benq laptops */
10789static struct hda_verb alc262_EAPD_verbs[] = {
10790	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
10791	{0x20, AC_VERB_SET_PROC_COEF,  0x3070},
10792	{}
10793};
10794
10795static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
10796	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10797	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10798
10799	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
10800	{0x20, AC_VERB_SET_PROC_COEF,  0x3050},
10801	{}
10802};
10803
10804/* Samsung Q1 Ultra Vista model setup */
10805static struct snd_kcontrol_new alc262_ultra_mixer[] = {
10806	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10807	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
10808	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10809	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10810	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
10811	HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
10812	{ } /* end */
10813};
10814
10815static struct hda_verb alc262_ultra_verbs[] = {
10816	/* output mixer */
10817	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10818	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10819	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10820	/* speaker */
10821	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10822	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
10823	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10824	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
10825	/* HP */
10826	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10827	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
10828	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10829	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10830	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10831	/* internal mic */
10832	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
10833	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10834	/* ADC, choose mic */
10835	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10836	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10837	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10838	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
10839	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
10840	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
10841	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
10842	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
10843	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
10844	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
10845	{}
10846};
10847
10848/* mute/unmute internal speaker according to the hp jack and mute state */
10849static void alc262_ultra_automute(struct hda_codec *codec)
10850{
10851	struct alc_spec *spec = codec->spec;
10852	unsigned int mute;
10853
10854	mute = 0;
10855	/* auto-mute only when HP is used as HP */
10856	if (!spec->cur_mux[0]) {
10857		unsigned int present;
10858		/* need to execute and sync at first */
10859		snd_hda_codec_read(codec, 0x15, 0, AC_VERB_SET_PIN_SENSE, 0);
10860		present = snd_hda_codec_read(codec, 0x15, 0,
10861					     AC_VERB_GET_PIN_SENSE, 0);
10862		spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0;
10863		if (spec->jack_present)
10864			mute = HDA_AMP_MUTE;
10865	}
10866	/* mute/unmute internal speaker */
10867	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10868				 HDA_AMP_MUTE, mute);
10869	/* mute/unmute HP */
10870	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
10871				 HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
10872}
10873
10874/* unsolicited event for HP jack sensing */
10875static void alc262_ultra_unsol_event(struct hda_codec *codec,
10876				       unsigned int res)
10877{
10878	if ((res >> 26) != ALC880_HP_EVENT)
10879		return;
10880	alc262_ultra_automute(codec);
10881}
10882
10883static struct hda_input_mux alc262_ultra_capture_source = {
10884	.num_items = 2,
10885	.items = {
10886		{ "Mic", 0x1 },
10887		{ "Headphone", 0x7 },
10888	},
10889};
10890
10891static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
10892				     struct snd_ctl_elem_value *ucontrol)
10893{
10894	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10895	struct alc_spec *spec = codec->spec;
10896	int ret;
10897
10898	ret = alc_mux_enum_put(kcontrol, ucontrol);
10899	if (!ret)
10900		return 0;
10901	/* reprogram the HP pin as mic or HP according to the input source */
10902	snd_hda_codec_write_cache(codec, 0x15, 0,
10903				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10904				  spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
10905	alc262_ultra_automute(codec); /* mute/unmute HP */
10906	return ret;
10907}
10908
10909static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
10910	HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
10911	HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
10912	{
10913		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
10914		.name = "Capture Source",
10915		.info = alc_mux_enum_info,
10916		.get = alc_mux_enum_get,
10917		.put = alc262_ultra_mux_enum_put,
10918	},
10919	{ } /* end */
10920};
10921
10922/* We use two mixers depending on the output pin; 0x16 is a mono output
10923 * and thus it's bound with a different mixer.
10924 * This function returns which mixer amp should be used.
10925 */
10926static int alc262_check_volbit(hda_nid_t nid)
10927{
10928	if (!nid)
10929		return 0;
10930	else if (nid == 0x16)
10931		return 2;
10932	else
10933		return 1;
10934}
10935
10936static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
10937				  const char *pfx, int *vbits)
10938{
10939	char name[32];
10940	unsigned long val;
10941	int vbit;
10942
10943	vbit = alc262_check_volbit(nid);
10944	if (!vbit)
10945		return 0;
10946	if (*vbits & vbit) /* a volume control for this mixer already there */
10947		return 0;
10948	*vbits |= vbit;
10949	snprintf(name, sizeof(name), "%s Playback Volume", pfx);
10950	if (vbit == 2)
10951		val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
10952	else
10953		val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
10954	return add_control(spec, ALC_CTL_WIDGET_VOL, name, val);
10955}
10956
10957static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
10958				 const char *pfx)
10959{
10960	char name[32];
10961	unsigned long val;
10962
10963	if (!nid)
10964		return 0;
10965	snprintf(name, sizeof(name), "%s Playback Switch", pfx);
10966	if (nid == 0x16)
10967		val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
10968	else
10969		val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
10970	return add_control(spec, ALC_CTL_WIDGET_MUTE, name, val);
10971}
10972
10973/* add playback controls from the parsed DAC table */
10974static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
10975					     const struct auto_pin_cfg *cfg)
10976{
10977	const char *pfx;
10978	int vbits;
10979	int err;
10980
10981	spec->multiout.num_dacs = 1;	/* only use one dac */
10982	spec->multiout.dac_nids = spec->private_dac_nids;
10983	spec->multiout.dac_nids[0] = 2;
10984
10985	if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
10986		pfx = "Master";
10987	else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
10988		pfx = "Speaker";
10989	else
10990		pfx = "Front";
10991	err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
10992	if (err < 0)
10993		return err;
10994	err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
10995	if (err < 0)
10996		return err;
10997	err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
10998	if (err < 0)
10999		return err;
11000
11001	vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
11002		alc262_check_volbit(cfg->speaker_pins[0]) |
11003		alc262_check_volbit(cfg->hp_pins[0]);
11004	if (vbits == 1 || vbits == 2)
11005		pfx = "Master"; /* only one mixer is used */
11006	else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11007		pfx = "Speaker";
11008	else
11009		pfx = "Front";
11010	vbits = 0;
11011	err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
11012	if (err < 0)
11013		return err;
11014	err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
11015				     &vbits);
11016	if (err < 0)
11017		return err;
11018	err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
11019				     &vbits);
11020	if (err < 0)
11021		return err;
11022	return 0;
11023}
11024
11025#define alc262_auto_create_input_ctls \
11026	alc880_auto_create_input_ctls
11027
11028/*
11029 * generic initialization of ADC, input mixers and output mixers
11030 */
11031static struct hda_verb alc262_volume_init_verbs[] = {
11032	/*
11033	 * Unmute ADC0-2 and set the default input to mic-in
11034	 */
11035	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11036	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11037	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11038	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11039	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11040	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11041
11042	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11043	 * mixer widget
11044	 * Note: PASD motherboards uses the Line In 2 as the input for
11045	 * front panel mic (mic 2)
11046	 */
11047	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11048	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11049	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11050	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11051	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11052	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11053
11054	/*
11055	 * Set up output mixers (0x0c - 0x0f)
11056	 */
11057	/* set vol=0 to output mixers */
11058	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11059	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11060	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11061
11062	/* set up input amps for analog loopback */
11063	/* Amp Indices: DAC = 0, mixer = 1 */
11064	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11065	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11066	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11067	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11068	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11069	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11070
11071	/* FIXME: use matrix-type input source selection */
11072	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11073	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11074	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11075	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11076	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11077	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11078	/* Input mixer2 */
11079	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11080	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11081	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11082	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11083	/* Input mixer3 */
11084	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11085	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11086	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11087	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11088
11089	{ }
11090};
11091
11092static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11093	/*
11094	 * Unmute ADC0-2 and set the default input to mic-in
11095	 */
11096	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11097	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11098	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11099	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11100	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11101	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11102
11103	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11104	 * mixer widget
11105	 * Note: PASD motherboards uses the Line In 2 as the input for
11106	 * front panel mic (mic 2)
11107	 */
11108	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11109	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11110	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11111	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11112	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11113	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11114	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11115        {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11116
11117	/*
11118	 * Set up output mixers (0x0c - 0x0e)
11119	 */
11120	/* set vol=0 to output mixers */
11121	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11122	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11123	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11124
11125	/* set up input amps for analog loopback */
11126	/* Amp Indices: DAC = 0, mixer = 1 */
11127	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11128	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11129	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11130	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11131	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11132	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11133
11134	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11135	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11136	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11137
11138	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11139	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11140
11141	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11142	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11143
11144	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11145	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11146        {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11147	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11148	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11149
11150	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11151	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11152        {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11153	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11154	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11155	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11156
11157
11158	/* FIXME: use matrix-type input source selection */
11159	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
11160	/* Input mixer1: only unmute Mic */
11161	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11162	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11163	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11164	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11165	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11166	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11167	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11168	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11169	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11170	/* Input mixer2 */
11171	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11172	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11173	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11174	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11175	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11176	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11177	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11178	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11179	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11180	/* Input mixer3 */
11181	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11182	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11183	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11184	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11185	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11186	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11187	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11188	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11189	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11190
11191	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11192
11193	{ }
11194};
11195
11196static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
11197	/*
11198	 * Unmute ADC0-2 and set the default input to mic-in
11199	 */
11200	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11201	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11202	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11203	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11204	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11205	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11206
11207	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11208	 * mixer widget
11209	 * Note: PASD motherboards uses the Line In 2 as the input for front
11210	 * panel mic (mic 2)
11211	 */
11212	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11213	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11214	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11215	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11216	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11217	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11218	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11219	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11220	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11221	/*
11222	 * Set up output mixers (0x0c - 0x0e)
11223	 */
11224	/* set vol=0 to output mixers */
11225	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11226	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11227	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11228
11229	/* set up input amps for analog loopback */
11230	/* Amp Indices: DAC = 0, mixer = 1 */
11231	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11232	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11233	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11234	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11235	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11236	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11237
11238
11239	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* HP */
11240	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Mono */
11241	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* rear MIC */
11242	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* Line in */
11243	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* Front MIC */
11244	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Line out */
11245	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* CD in */
11246
11247	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11248	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11249
11250	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11251	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11252
11253	/* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
11254	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11255	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11256	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
11257	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11258	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11259
11260	/* FIXME: use matrix-type input source selection */
11261	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11262	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11263	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
11264	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
11265	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
11266	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
11267	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
11268        /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))},  */
11269	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
11270	/* Input mixer2 */
11271	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11272	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11273	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11274	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11275	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11276        /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11277	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11278	/* Input mixer3 */
11279	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11280	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11281	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11282	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11283	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11284        /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11285	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11286
11287	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11288
11289	{ }
11290};
11291
11292static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
11293
11294	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Front Speaker */
11295	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11296	{0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
11297
11298	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* MIC jack */
11299	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* Front MIC */
11300	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11301	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11302
11303	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* HP  jack */
11304	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11305	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11306	{}
11307};
11308
11309
11310#ifdef CONFIG_SND_HDA_POWER_SAVE
11311#define alc262_loopbacks	alc880_loopbacks
11312#endif
11313
11314/* pcm configuration: identical with ALC880 */
11315#define alc262_pcm_analog_playback	alc880_pcm_analog_playback
11316#define alc262_pcm_analog_capture	alc880_pcm_analog_capture
11317#define alc262_pcm_digital_playback	alc880_pcm_digital_playback
11318#define alc262_pcm_digital_capture	alc880_pcm_digital_capture
11319
11320/*
11321 * BIOS auto configuration
11322 */
11323static int alc262_parse_auto_config(struct hda_codec *codec)
11324{
11325	struct alc_spec *spec = codec->spec;
11326	int err;
11327	static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
11328
11329	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
11330					   alc262_ignore);
11331	if (err < 0)
11332		return err;
11333	if (!spec->autocfg.line_outs) {
11334		if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
11335			spec->multiout.max_channels = 2;
11336			spec->no_analog = 1;
11337			goto dig_only;
11338		}
11339		return 0; /* can't find valid BIOS pin config */
11340	}
11341	err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
11342	if (err < 0)
11343		return err;
11344	err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
11345	if (err < 0)
11346		return err;
11347
11348	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
11349
11350 dig_only:
11351	if (spec->autocfg.dig_outs) {
11352		spec->multiout.dig_out_nid = ALC262_DIGOUT_NID;
11353		spec->dig_out_type = spec->autocfg.dig_out_type[0];
11354	}
11355	if (spec->autocfg.dig_in_pin)
11356		spec->dig_in_nid = ALC262_DIGIN_NID;
11357
11358	if (spec->kctls.list)
11359		add_mixer(spec, spec->kctls.list);
11360
11361	add_verb(spec, alc262_volume_init_verbs);
11362	spec->num_mux_defs = 1;
11363	spec->input_mux = &spec->private_imux[0];
11364
11365	err = alc_auto_add_mic_boost(codec);
11366	if (err < 0)
11367		return err;
11368
11369	alc_ssid_check(codec, 0x15, 0x14, 0x1b);
11370
11371	return 1;
11372}
11373
11374#define alc262_auto_init_multi_out	alc882_auto_init_multi_out
11375#define alc262_auto_init_hp_out		alc882_auto_init_hp_out
11376#define alc262_auto_init_analog_input	alc882_auto_init_analog_input
11377#define alc262_auto_init_input_src	alc882_auto_init_input_src
11378
11379
11380/* init callback for auto-configuration model -- overriding the default init */
11381static void alc262_auto_init(struct hda_codec *codec)
11382{
11383	struct alc_spec *spec = codec->spec;
11384	alc262_auto_init_multi_out(codec);
11385	alc262_auto_init_hp_out(codec);
11386	alc262_auto_init_analog_input(codec);
11387	alc262_auto_init_input_src(codec);
11388	if (spec->unsol_event)
11389		alc_inithook(codec);
11390}
11391
11392/*
11393 * configuration and preset
11394 */
11395static const char *alc262_models[ALC262_MODEL_LAST] = {
11396	[ALC262_BASIC]		= "basic",
11397	[ALC262_HIPPO]		= "hippo",
11398	[ALC262_HIPPO_1]	= "hippo_1",
11399	[ALC262_FUJITSU]	= "fujitsu",
11400	[ALC262_HP_BPC]		= "hp-bpc",
11401	[ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
11402	[ALC262_HP_TC_T5735]	= "hp-tc-t5735",
11403	[ALC262_HP_RP5700]	= "hp-rp5700",
11404	[ALC262_BENQ_ED8]	= "benq",
11405	[ALC262_BENQ_T31]	= "benq-t31",
11406	[ALC262_SONY_ASSAMD]	= "sony-assamd",
11407	[ALC262_TOSHIBA_S06]	= "toshiba-s06",
11408	[ALC262_TOSHIBA_RX1]	= "toshiba-rx1",
11409	[ALC262_ULTRA]		= "ultra",
11410	[ALC262_LENOVO_3000]	= "lenovo-3000",
11411	[ALC262_NEC]		= "nec",
11412	[ALC262_TYAN]		= "tyan",
11413	[ALC262_AUTO]		= "auto",
11414};
11415
11416static struct snd_pci_quirk alc262_cfg_tbl[] = {
11417	SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
11418	SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
11419	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
11420			   ALC262_HP_BPC),
11421	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
11422			   ALC262_HP_BPC),
11423	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
11424			   ALC262_HP_BPC),
11425	SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
11426	SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
11427	SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
11428	SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
11429	SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
11430	SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
11431	SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
11432	SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
11433	SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
11434	SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
11435	SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
11436	SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
11437		      ALC262_HP_TC_T5735),
11438	SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
11439	SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11440	SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
11441	SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11442	SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
11443	SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
11444	SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
11445			   ALC262_SONY_ASSAMD),
11446	SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
11447		      ALC262_TOSHIBA_RX1),
11448	SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
11449	SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
11450	SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
11451	SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
11452	SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
11453			   ALC262_ULTRA),
11454	SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
11455	SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
11456	SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
11457	SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
11458	SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
11459	{}
11460};
11461
11462static struct alc_config_preset alc262_presets[] = {
11463	[ALC262_BASIC] = {
11464		.mixers = { alc262_base_mixer },
11465		.init_verbs = { alc262_init_verbs },
11466		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11467		.dac_nids = alc262_dac_nids,
11468		.hp_nid = 0x03,
11469		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11470		.channel_mode = alc262_modes,
11471		.input_mux = &alc262_capture_source,
11472	},
11473	[ALC262_HIPPO] = {
11474		.mixers = { alc262_hippo_mixer },
11475		.init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
11476		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11477		.dac_nids = alc262_dac_nids,
11478		.hp_nid = 0x03,
11479		.dig_out_nid = ALC262_DIGOUT_NID,
11480		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11481		.channel_mode = alc262_modes,
11482		.input_mux = &alc262_capture_source,
11483		.unsol_event = alc262_hippo_unsol_event,
11484		.setup = alc262_hippo_setup,
11485		.init_hook = alc262_hippo_automute,
11486	},
11487	[ALC262_HIPPO_1] = {
11488		.mixers = { alc262_hippo1_mixer },
11489		.init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
11490		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11491		.dac_nids = alc262_dac_nids,
11492		.hp_nid = 0x02,
11493		.dig_out_nid = ALC262_DIGOUT_NID,
11494		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11495		.channel_mode = alc262_modes,
11496		.input_mux = &alc262_capture_source,
11497		.unsol_event = alc262_hippo_unsol_event,
11498		.setup = alc262_hippo1_setup,
11499		.init_hook = alc262_hippo_automute,
11500	},
11501	[ALC262_FUJITSU] = {
11502		.mixers = { alc262_fujitsu_mixer },
11503		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
11504				alc262_fujitsu_unsol_verbs },
11505		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11506		.dac_nids = alc262_dac_nids,
11507		.hp_nid = 0x03,
11508		.dig_out_nid = ALC262_DIGOUT_NID,
11509		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11510		.channel_mode = alc262_modes,
11511		.input_mux = &alc262_fujitsu_capture_source,
11512		.unsol_event = alc262_fujitsu_unsol_event,
11513		.init_hook = alc262_fujitsu_init_hook,
11514	},
11515	[ALC262_HP_BPC] = {
11516		.mixers = { alc262_HP_BPC_mixer },
11517		.init_verbs = { alc262_HP_BPC_init_verbs },
11518		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11519		.dac_nids = alc262_dac_nids,
11520		.hp_nid = 0x03,
11521		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11522		.channel_mode = alc262_modes,
11523		.input_mux = &alc262_HP_capture_source,
11524		.unsol_event = alc262_hp_bpc_unsol_event,
11525		.init_hook = alc262_hp_bpc_automute,
11526	},
11527	[ALC262_HP_BPC_D7000_WF] = {
11528		.mixers = { alc262_HP_BPC_WildWest_mixer },
11529		.init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
11530		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11531		.dac_nids = alc262_dac_nids,
11532		.hp_nid = 0x03,
11533		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11534		.channel_mode = alc262_modes,
11535		.input_mux = &alc262_HP_D7000_capture_source,
11536		.unsol_event = alc262_hp_wildwest_unsol_event,
11537		.init_hook = alc262_hp_wildwest_automute,
11538	},
11539	[ALC262_HP_BPC_D7000_WL] = {
11540		.mixers = { alc262_HP_BPC_WildWest_mixer,
11541			    alc262_HP_BPC_WildWest_option_mixer },
11542		.init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
11543		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11544		.dac_nids = alc262_dac_nids,
11545		.hp_nid = 0x03,
11546		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11547		.channel_mode = alc262_modes,
11548		.input_mux = &alc262_HP_D7000_capture_source,
11549		.unsol_event = alc262_hp_wildwest_unsol_event,
11550		.init_hook = alc262_hp_wildwest_automute,
11551	},
11552	[ALC262_HP_TC_T5735] = {
11553		.mixers = { alc262_hp_t5735_mixer },
11554		.init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
11555		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11556		.dac_nids = alc262_dac_nids,
11557		.hp_nid = 0x03,
11558		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11559		.channel_mode = alc262_modes,
11560		.input_mux = &alc262_capture_source,
11561		.unsol_event = alc_automute_amp_unsol_event,
11562		.setup = alc262_hp_t5735_setup,
11563		.init_hook = alc_automute_amp,
11564	},
11565	[ALC262_HP_RP5700] = {
11566		.mixers = { alc262_hp_rp5700_mixer },
11567		.init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
11568		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11569		.dac_nids = alc262_dac_nids,
11570		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11571		.channel_mode = alc262_modes,
11572		.input_mux = &alc262_hp_rp5700_capture_source,
11573        },
11574	[ALC262_BENQ_ED8] = {
11575		.mixers = { alc262_base_mixer },
11576		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
11577		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11578		.dac_nids = alc262_dac_nids,
11579		.hp_nid = 0x03,
11580		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11581		.channel_mode = alc262_modes,
11582		.input_mux = &alc262_capture_source,
11583	},
11584	[ALC262_SONY_ASSAMD] = {
11585		.mixers = { alc262_sony_mixer },
11586		.init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
11587		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11588		.dac_nids = alc262_dac_nids,
11589		.hp_nid = 0x02,
11590		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11591		.channel_mode = alc262_modes,
11592		.input_mux = &alc262_capture_source,
11593		.unsol_event = alc262_hippo_unsol_event,
11594		.setup = alc262_hippo_setup,
11595		.init_hook = alc262_hippo_automute,
11596	},
11597	[ALC262_BENQ_T31] = {
11598		.mixers = { alc262_benq_t31_mixer },
11599		.init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
11600				alc_hp15_unsol_verbs },
11601		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11602		.dac_nids = alc262_dac_nids,
11603		.hp_nid = 0x03,
11604		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11605		.channel_mode = alc262_modes,
11606		.input_mux = &alc262_capture_source,
11607		.unsol_event = alc262_hippo_unsol_event,
11608		.setup = alc262_hippo_setup,
11609		.init_hook = alc262_hippo_automute,
11610	},
11611	[ALC262_ULTRA] = {
11612		.mixers = { alc262_ultra_mixer },
11613		.cap_mixer = alc262_ultra_capture_mixer,
11614		.init_verbs = { alc262_ultra_verbs },
11615		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11616		.dac_nids = alc262_dac_nids,
11617		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11618		.channel_mode = alc262_modes,
11619		.input_mux = &alc262_ultra_capture_source,
11620		.adc_nids = alc262_adc_nids, /* ADC0 */
11621		.capsrc_nids = alc262_capsrc_nids,
11622		.num_adc_nids = 1, /* single ADC */
11623		.unsol_event = alc262_ultra_unsol_event,
11624		.init_hook = alc262_ultra_automute,
11625	},
11626	[ALC262_LENOVO_3000] = {
11627		.mixers = { alc262_lenovo_3000_mixer },
11628		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
11629				alc262_lenovo_3000_unsol_verbs },
11630		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11631		.dac_nids = alc262_dac_nids,
11632		.hp_nid = 0x03,
11633		.dig_out_nid = ALC262_DIGOUT_NID,
11634		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11635		.channel_mode = alc262_modes,
11636		.input_mux = &alc262_fujitsu_capture_source,
11637		.unsol_event = alc262_lenovo_3000_unsol_event,
11638	},
11639	[ALC262_NEC] = {
11640		.mixers = { alc262_nec_mixer },
11641		.init_verbs = { alc262_nec_verbs },
11642		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11643		.dac_nids = alc262_dac_nids,
11644		.hp_nid = 0x03,
11645		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11646		.channel_mode = alc262_modes,
11647		.input_mux = &alc262_capture_source,
11648	},
11649	[ALC262_TOSHIBA_S06] = {
11650		.mixers = { alc262_toshiba_s06_mixer },
11651		.init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
11652							alc262_eapd_verbs },
11653		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11654		.capsrc_nids = alc262_dmic_capsrc_nids,
11655		.dac_nids = alc262_dac_nids,
11656		.adc_nids = alc262_dmic_adc_nids, /* ADC0 */
11657		.num_adc_nids = 1, /* single ADC */
11658		.dig_out_nid = ALC262_DIGOUT_NID,
11659		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11660		.channel_mode = alc262_modes,
11661		.unsol_event = alc_sku_unsol_event,
11662		.setup = alc262_toshiba_s06_setup,
11663		.init_hook = alc_inithook,
11664	},
11665	[ALC262_TOSHIBA_RX1] = {
11666		.mixers = { alc262_toshiba_rx1_mixer },
11667		.init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
11668		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11669		.dac_nids = alc262_dac_nids,
11670		.hp_nid = 0x03,
11671		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11672		.channel_mode = alc262_modes,
11673		.input_mux = &alc262_capture_source,
11674		.unsol_event = alc262_hippo_unsol_event,
11675		.setup = alc262_hippo_setup,
11676		.init_hook = alc262_hippo_automute,
11677	},
11678	[ALC262_TYAN] = {
11679		.mixers = { alc262_tyan_mixer },
11680		.init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
11681		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
11682		.dac_nids = alc262_dac_nids,
11683		.hp_nid = 0x02,
11684		.dig_out_nid = ALC262_DIGOUT_NID,
11685		.num_channel_mode = ARRAY_SIZE(alc262_modes),
11686		.channel_mode = alc262_modes,
11687		.input_mux = &alc262_capture_source,
11688		.unsol_event = alc_automute_amp_unsol_event,
11689		.setup = alc262_tyan_setup,
11690		.init_hook = alc_automute_amp,
11691	},
11692};
11693
11694static int patch_alc262(struct hda_codec *codec)
11695{
11696	struct alc_spec *spec;
11697	int board_config;
11698	int err;
11699
11700	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
11701	if (spec == NULL)
11702		return -ENOMEM;
11703
11704	codec->spec = spec;
11705#if 0
11706	/* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
11707	 * under-run
11708	 */
11709	{
11710	int tmp;
11711	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
11712	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
11713	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
11714	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
11715	}
11716#endif
11717
11718	alc_fix_pll_init(codec, 0x20, 0x0a, 10);
11719
11720	board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
11721						  alc262_models,
11722						  alc262_cfg_tbl);
11723
11724	if (board_config < 0) {
11725		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
11726		       codec->chip_name);
11727		board_config = ALC262_AUTO;
11728	}
11729
11730	if (board_config == ALC262_AUTO) {
11731		/* automatic parse from the BIOS config */
11732		err = alc262_parse_auto_config(codec);
11733		if (err < 0) {
11734			alc_free(codec);
11735			return err;
11736		} else if (!err) {
11737			printk(KERN_INFO
11738			       "hda_codec: Cannot set up configuration "
11739			       "from BIOS.  Using base mode...\n");
11740			board_config = ALC262_BASIC;
11741		}
11742	}
11743
11744	if (!spec->no_analog) {
11745		err = snd_hda_attach_beep_device(codec, 0x1);
11746		if (err < 0) {
11747			alc_free(codec);
11748			return err;
11749		}
11750	}
11751
11752	if (board_config != ALC262_AUTO)
11753		setup_preset(codec, &alc262_presets[board_config]);
11754
11755	spec->stream_analog_playback = &alc262_pcm_analog_playback;
11756	spec->stream_analog_capture = &alc262_pcm_analog_capture;
11757
11758	spec->stream_digital_playback = &alc262_pcm_digital_playback;
11759	spec->stream_digital_capture = &alc262_pcm_digital_capture;
11760
11761	if (!spec->adc_nids && spec->input_mux) {
11762		int i;
11763		/* check whether the digital-mic has to be supported */
11764		for (i = 0; i < spec->input_mux->num_items; i++) {
11765			if (spec->input_mux->items[i].index >= 9)
11766				break;
11767		}
11768		if (i < spec->input_mux->num_items) {
11769			/* use only ADC0 */
11770			spec->adc_nids = alc262_dmic_adc_nids;
11771			spec->num_adc_nids = 1;
11772			spec->capsrc_nids = alc262_dmic_capsrc_nids;
11773		} else {
11774			/* all analog inputs */
11775			/* check whether NID 0x07 is valid */
11776			unsigned int wcap = get_wcaps(codec, 0x07);
11777
11778			/* get type */
11779			wcap = get_wcaps_type(wcap);
11780			if (wcap != AC_WID_AUD_IN) {
11781				spec->adc_nids = alc262_adc_nids_alt;
11782				spec->num_adc_nids =
11783					ARRAY_SIZE(alc262_adc_nids_alt);
11784				spec->capsrc_nids = alc262_capsrc_nids_alt;
11785			} else {
11786				spec->adc_nids = alc262_adc_nids;
11787				spec->num_adc_nids =
11788					ARRAY_SIZE(alc262_adc_nids);
11789				spec->capsrc_nids = alc262_capsrc_nids;
11790			}
11791		}
11792	}
11793	if (!spec->cap_mixer && !spec->no_analog)
11794		set_capture_mixer(codec);
11795	if (!spec->no_analog)
11796		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
11797
11798	spec->vmaster_nid = 0x0c;
11799
11800	codec->patch_ops = alc_patch_ops;
11801	if (board_config == ALC262_AUTO)
11802		spec->init_hook = alc262_auto_init;
11803#ifdef CONFIG_SND_HDA_POWER_SAVE
11804	if (!spec->loopback.amplist)
11805		spec->loopback.amplist = alc262_loopbacks;
11806#endif
11807	codec->proc_widget_hook = print_realtek_coef;
11808
11809	return 0;
11810}
11811
11812/*
11813 *  ALC268 channel source setting (2 channel)
11814 */
11815#define ALC268_DIGOUT_NID	ALC880_DIGOUT_NID
11816#define alc268_modes		alc260_modes
11817
11818static hda_nid_t alc268_dac_nids[2] = {
11819	/* front, hp */
11820	0x02, 0x03
11821};
11822
11823static hda_nid_t alc268_adc_nids[2] = {
11824	/* ADC0-1 */
11825	0x08, 0x07
11826};
11827
11828static hda_nid_t alc268_adc_nids_alt[1] = {
11829	/* ADC0 */
11830	0x08
11831};
11832
11833static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
11834
11835static struct snd_kcontrol_new alc268_base_mixer[] = {
11836	/* output mixer control */
11837	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
11838	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11839	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
11840	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11841	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11842	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11843	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
11844	{ }
11845};
11846
11847static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
11848	/* output mixer control */
11849	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
11850	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
11851	ALC262_HIPPO_MASTER_SWITCH,
11852	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11853	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11854	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
11855	{ }
11856};
11857
11858/* bind Beep switches of both NID 0x0f and 0x10 */
11859static struct hda_bind_ctls alc268_bind_beep_sw = {
11860	.ops = &snd_hda_bind_sw,
11861	.values = {
11862		HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
11863		HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
11864		0
11865	},
11866};
11867
11868static struct snd_kcontrol_new alc268_beep_mixer[] = {
11869	HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
11870	HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
11871	{ }
11872};
11873
11874static struct hda_verb alc268_eapd_verbs[] = {
11875	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
11876	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
11877	{ }
11878};
11879
11880/* Toshiba specific */
11881static struct hda_verb alc268_toshiba_verbs[] = {
11882	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11883	{ } /* end */
11884};
11885
11886/* Acer specific */
11887/* bind volumes of both NID 0x02 and 0x03 */
11888static struct hda_bind_ctls alc268_acer_bind_master_vol = {
11889	.ops = &snd_hda_bind_vol,
11890	.values = {
11891		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
11892		HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
11893		0
11894	},
11895};
11896
11897/* mute/unmute internal speaker according to the hp jack and mute state */
11898static void alc268_acer_automute(struct hda_codec *codec, int force)
11899{
11900	struct alc_spec *spec = codec->spec;
11901	unsigned int mute;
11902
11903	if (force || !spec->sense_updated) {
11904		unsigned int present;
11905		present = snd_hda_codec_read(codec, 0x14, 0,
11906				    	 AC_VERB_GET_PIN_SENSE, 0);
11907		spec->jack_present = (present & 0x80000000) != 0;
11908		spec->sense_updated = 1;
11909	}
11910	if (spec->jack_present)
11911		mute = HDA_AMP_MUTE; /* mute internal speaker */
11912	else /* unmute internal speaker if necessary */
11913		mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
11914	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11915				 HDA_AMP_MUTE, mute);
11916}
11917
11918
11919/* bind hp and internal speaker mute (with plug check) */
11920static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
11921				     struct snd_ctl_elem_value *ucontrol)
11922{
11923	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11924	long *valp = ucontrol->value.integer.value;
11925	int change;
11926
11927	change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11928	if (change)
11929		alc268_acer_automute(codec, 0);
11930	return change;
11931}
11932
11933static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
11934	/* output mixer control */
11935	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
11936	{
11937		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11938		.name = "Master Playback Switch",
11939		.info = snd_hda_mixer_amp_switch_info,
11940		.get = snd_hda_mixer_amp_switch_get,
11941		.put = alc268_acer_master_sw_put,
11942		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11943	},
11944	HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
11945	{ }
11946};
11947
11948static struct snd_kcontrol_new alc268_acer_mixer[] = {
11949	/* output mixer control */
11950	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
11951	{
11952		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11953		.name = "Master Playback Switch",
11954		.info = snd_hda_mixer_amp_switch_info,
11955		.get = snd_hda_mixer_amp_switch_get,
11956		.put = alc268_acer_master_sw_put,
11957		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11958	},
11959	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11960	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
11961	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
11962	{ }
11963};
11964
11965static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
11966	/* output mixer control */
11967	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
11968	{
11969		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11970		.name = "Master Playback Switch",
11971		.info = snd_hda_mixer_amp_switch_info,
11972		.get = snd_hda_mixer_amp_switch_get,
11973		.put = alc268_acer_master_sw_put,
11974		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11975	},
11976	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11977	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
11978	{ }
11979};
11980
11981static struct hda_verb alc268_acer_aspire_one_verbs[] = {
11982	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11983	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11984	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11985	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
11986	{0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
11987	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
11988	{ }
11989};
11990
11991static struct hda_verb alc268_acer_verbs[] = {
11992	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
11993	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11994	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11995	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11996	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11997	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11998	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11999	{ }
12000};
12001
12002/* unsolicited event for HP jack sensing */
12003#define alc268_toshiba_unsol_event	alc262_hippo_unsol_event
12004#define alc268_toshiba_setup		alc262_hippo_setup
12005#define alc268_toshiba_automute		alc262_hippo_automute
12006
12007static void alc268_acer_unsol_event(struct hda_codec *codec,
12008				       unsigned int res)
12009{
12010	if ((res >> 26) != ALC880_HP_EVENT)
12011		return;
12012	alc268_acer_automute(codec, 1);
12013}
12014
12015static void alc268_acer_init_hook(struct hda_codec *codec)
12016{
12017	alc268_acer_automute(codec, 1);
12018}
12019
12020/* toggle speaker-output according to the hp-jack state */
12021static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
12022{
12023	unsigned int present;
12024	unsigned char bits;
12025
12026	present = snd_hda_codec_read(codec, 0x15, 0,
12027				AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
12028	bits = present ? AMP_IN_MUTE(0) : 0;
12029	snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
12030				AMP_IN_MUTE(0), bits);
12031	snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
12032				AMP_IN_MUTE(0), bits);
12033}
12034
12035static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
12036				    unsigned int res)
12037{
12038	switch (res >> 26) {
12039	case ALC880_HP_EVENT:
12040		alc268_aspire_one_speaker_automute(codec);
12041		break;
12042	case ALC880_MIC_EVENT:
12043		alc_mic_automute(codec);
12044		break;
12045	}
12046}
12047
12048static void alc268_acer_lc_setup(struct hda_codec *codec)
12049{
12050	struct alc_spec *spec = codec->spec;
12051	spec->ext_mic.pin = 0x18;
12052	spec->ext_mic.mux_idx = 0;
12053	spec->int_mic.pin = 0x12;
12054	spec->int_mic.mux_idx = 6;
12055	spec->auto_mic = 1;
12056}
12057
12058static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12059{
12060	alc268_aspire_one_speaker_automute(codec);
12061	alc_mic_automute(codec);
12062}
12063
12064static struct snd_kcontrol_new alc268_dell_mixer[] = {
12065	/* output mixer control */
12066	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12067	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12068	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12069	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12070	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12071	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12072	{ }
12073};
12074
12075static struct hda_verb alc268_dell_verbs[] = {
12076	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12077	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12078	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12079	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12080	{ }
12081};
12082
12083/* mute/unmute internal speaker according to the hp jack and mute state */
12084static void alc268_dell_setup(struct hda_codec *codec)
12085{
12086	struct alc_spec *spec = codec->spec;
12087
12088	spec->autocfg.hp_pins[0] = 0x15;
12089	spec->autocfg.speaker_pins[0] = 0x14;
12090	spec->ext_mic.pin = 0x18;
12091	spec->ext_mic.mux_idx = 0;
12092	spec->int_mic.pin = 0x19;
12093	spec->int_mic.mux_idx = 1;
12094	spec->auto_mic = 1;
12095}
12096
12097static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12098	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12099	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12100	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12101	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12102	HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12103	HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12104	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12105	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12106	{ }
12107};
12108
12109static struct hda_verb alc267_quanta_il1_verbs[] = {
12110	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12111	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12112	{ }
12113};
12114
12115static void alc267_quanta_il1_setup(struct hda_codec *codec)
12116{
12117	struct alc_spec *spec = codec->spec;
12118	spec->autocfg.hp_pins[0] = 0x15;
12119	spec->autocfg.speaker_pins[0] = 0x14;
12120	spec->ext_mic.pin = 0x18;
12121	spec->ext_mic.mux_idx = 0;
12122	spec->int_mic.pin = 0x19;
12123	spec->int_mic.mux_idx = 1;
12124	spec->auto_mic = 1;
12125}
12126
12127/*
12128 * generic initialization of ADC, input mixers and output mixers
12129 */
12130static struct hda_verb alc268_base_init_verbs[] = {
12131	/* Unmute DAC0-1 and set vol = 0 */
12132	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12133	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12134
12135	/*
12136	 * Set up output mixers (0x0c - 0x0e)
12137	 */
12138	/* set vol=0 to output mixers */
12139	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12140        {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
12141
12142	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12143	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12144
12145	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12146	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
12147	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12148	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12149	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12150	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12151	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12152	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12153
12154	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12155	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12156	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12157	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12158	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12159
12160	/* set PCBEEP vol = 0, mute connections */
12161	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12162	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12163	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12164
12165	/* Unmute Selector 23h,24h and set the default input to mic-in */
12166
12167	{0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
12168	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12169	{0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
12170	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12171
12172	{ }
12173};
12174
12175/*
12176 * generic initialization of ADC, input mixers and output mixers
12177 */
12178static struct hda_verb alc268_volume_init_verbs[] = {
12179	/* set output DAC */
12180	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12181	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12182
12183	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12184	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12185	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12186	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12187	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12188
12189	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12190	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12191	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12192
12193	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12194	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12195
12196	/* set PCBEEP vol = 0, mute connections */
12197	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12198	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12199	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12200
12201	{ }
12202};
12203
12204static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
12205	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12206	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12207	{ } /* end */
12208};
12209
12210static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
12211	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12212	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12213	_DEFINE_CAPSRC(1),
12214	{ } /* end */
12215};
12216
12217static struct snd_kcontrol_new alc268_capture_mixer[] = {
12218	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12219	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12220	HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
12221	HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
12222	_DEFINE_CAPSRC(2),
12223	{ } /* end */
12224};
12225
12226static struct hda_input_mux alc268_capture_source = {
12227	.num_items = 4,
12228	.items = {
12229		{ "Mic", 0x0 },
12230		{ "Front Mic", 0x1 },
12231		{ "Line", 0x2 },
12232		{ "CD", 0x3 },
12233	},
12234};
12235
12236static struct hda_input_mux alc268_acer_capture_source = {
12237	.num_items = 3,
12238	.items = {
12239		{ "Mic", 0x0 },
12240		{ "Internal Mic", 0x1 },
12241		{ "Line", 0x2 },
12242	},
12243};
12244
12245static struct hda_input_mux alc268_acer_dmic_capture_source = {
12246	.num_items = 3,
12247	.items = {
12248		{ "Mic", 0x0 },
12249		{ "Internal Mic", 0x6 },
12250		{ "Line", 0x2 },
12251	},
12252};
12253
12254#ifdef CONFIG_SND_DEBUG
12255static struct snd_kcontrol_new alc268_test_mixer[] = {
12256	/* Volume widgets */
12257	HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12258	HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12259	HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
12260	HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
12261	HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
12262	HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
12263	HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
12264	HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
12265	HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
12266	HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
12267	HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
12268	HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
12269	HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
12270	/* The below appears problematic on some hardwares */
12271	/*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
12272	HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12273	HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
12274	HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
12275	HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
12276
12277	/* Modes for retasking pin widgets */
12278	ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
12279	ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
12280	ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
12281	ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
12282
12283	/* Controls for GPIO pins, assuming they are configured as outputs */
12284	ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
12285	ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
12286	ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
12287	ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
12288
12289	/* Switches to allow the digital SPDIF output pin to be enabled.
12290	 * The ALC268 does not have an SPDIF input.
12291	 */
12292	ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
12293
12294	/* A switch allowing EAPD to be enabled.  Some laptops seem to use
12295	 * this output to turn on an external amplifier.
12296	 */
12297	ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
12298	ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
12299
12300	{ } /* end */
12301};
12302#endif
12303
12304/* create input playback/capture controls for the given pin */
12305static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
12306				    const char *ctlname, int idx)
12307{
12308	char name[32];
12309	hda_nid_t dac;
12310	int err;
12311
12312	sprintf(name, "%s Playback Volume", ctlname);
12313	switch (nid) {
12314	case 0x14:
12315	case 0x16:
12316		dac = 0x02;
12317		break;
12318	case 0x15:
12319		dac = 0x03;
12320		break;
12321	default:
12322		return 0;
12323	}
12324	if (spec->multiout.dac_nids[0] != dac &&
12325	    spec->multiout.dac_nids[1] != dac) {
12326		err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
12327				  HDA_COMPOSE_AMP_VAL(dac, 3, idx,
12328						      HDA_OUTPUT));
12329		if (err < 0)
12330			return err;
12331		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
12332	}
12333
12334	sprintf(name, "%s Playback Switch", ctlname);
12335	if (nid != 0x16)
12336		err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
12337			  HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
12338	else /* mono */
12339		err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
12340			  HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
12341	if (err < 0)
12342		return err;
12343	return 0;
12344}
12345
12346/* add playback controls from the parsed DAC table */
12347static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
12348					     const struct auto_pin_cfg *cfg)
12349{
12350	hda_nid_t nid;
12351	int err;
12352
12353	spec->multiout.dac_nids = spec->private_dac_nids;
12354
12355	nid = cfg->line_out_pins[0];
12356	if (nid) {
12357		const char *name;
12358		if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
12359			name = "Speaker";
12360		else
12361			name = "Front";
12362		err = alc268_new_analog_output(spec, nid, name, 0);
12363		if (err < 0)
12364			return err;
12365	}
12366
12367	nid = cfg->speaker_pins[0];
12368	if (nid == 0x1d) {
12369		err = add_control(spec, ALC_CTL_WIDGET_VOL,
12370				  "Speaker Playback Volume",
12371				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
12372		if (err < 0)
12373			return err;
12374	} else {
12375		err = alc268_new_analog_output(spec, nid, "Speaker", 0);
12376		if (err < 0)
12377			return err;
12378	}
12379	nid = cfg->hp_pins[0];
12380	if (nid) {
12381		err = alc268_new_analog_output(spec, nid, "Headphone", 0);
12382		if (err < 0)
12383			return err;
12384	}
12385
12386	nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
12387	if (nid == 0x16) {
12388		err = add_control(spec, ALC_CTL_WIDGET_MUTE,
12389				  "Mono Playback Switch",
12390				  HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
12391		if (err < 0)
12392			return err;
12393	}
12394	return 0;
12395}
12396
12397/* create playback/capture controls for input pins */
12398static int alc268_auto_create_input_ctls(struct hda_codec *codec,
12399						const struct auto_pin_cfg *cfg)
12400{
12401	return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
12402}
12403
12404static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
12405					      hda_nid_t nid, int pin_type)
12406{
12407	int idx;
12408
12409	alc_set_pin_output(codec, nid, pin_type);
12410	if (nid == 0x14 || nid == 0x16)
12411		idx = 0;
12412	else
12413		idx = 1;
12414	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
12415}
12416
12417static void alc268_auto_init_multi_out(struct hda_codec *codec)
12418{
12419	struct alc_spec *spec = codec->spec;
12420	hda_nid_t nid = spec->autocfg.line_out_pins[0];
12421	if (nid) {
12422		int pin_type = get_pin_type(spec->autocfg.line_out_type);
12423		alc268_auto_set_output_and_unmute(codec, nid, pin_type);
12424	}
12425}
12426
12427static void alc268_auto_init_hp_out(struct hda_codec *codec)
12428{
12429	struct alc_spec *spec = codec->spec;
12430	hda_nid_t pin;
12431
12432	pin = spec->autocfg.hp_pins[0];
12433	if (pin)
12434		alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
12435	pin = spec->autocfg.speaker_pins[0];
12436	if (pin)
12437		alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
12438}
12439
12440static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
12441{
12442	struct alc_spec *spec = codec->spec;
12443	hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
12444	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
12445	hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
12446	unsigned int	dac_vol1, dac_vol2;
12447
12448	if (line_nid == 0x1d || speaker_nid == 0x1d) {
12449		snd_hda_codec_write(codec, speaker_nid, 0,
12450				    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
12451		/* mute mixer inputs from 0x1d */
12452		snd_hda_codec_write(codec, 0x0f, 0,
12453				    AC_VERB_SET_AMP_GAIN_MUTE,
12454				    AMP_IN_UNMUTE(1));
12455		snd_hda_codec_write(codec, 0x10, 0,
12456				    AC_VERB_SET_AMP_GAIN_MUTE,
12457				    AMP_IN_UNMUTE(1));
12458	} else {
12459		/* unmute mixer inputs from 0x1d */
12460		snd_hda_codec_write(codec, 0x0f, 0,
12461				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12462		snd_hda_codec_write(codec, 0x10, 0,
12463				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12464	}
12465
12466	dac_vol1 = dac_vol2 = 0xb000 | 0x40;	/* set max volume  */
12467	if (line_nid == 0x14)
12468		dac_vol2 = AMP_OUT_ZERO;
12469	else if (line_nid == 0x15)
12470		dac_vol1 = AMP_OUT_ZERO;
12471	if (hp_nid == 0x14)
12472		dac_vol2 = AMP_OUT_ZERO;
12473	else if (hp_nid == 0x15)
12474		dac_vol1 = AMP_OUT_ZERO;
12475	if (line_nid != 0x16 || hp_nid != 0x16 ||
12476	    spec->autocfg.line_out_pins[1] != 0x16 ||
12477	    spec->autocfg.line_out_pins[2] != 0x16)
12478		dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
12479
12480	snd_hda_codec_write(codec, 0x02, 0,
12481			    AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
12482	snd_hda_codec_write(codec, 0x03, 0,
12483			    AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
12484}
12485
12486/* pcm configuration: identical with ALC880 */
12487#define alc268_pcm_analog_playback	alc880_pcm_analog_playback
12488#define alc268_pcm_analog_capture	alc880_pcm_analog_capture
12489#define alc268_pcm_analog_alt_capture	alc880_pcm_analog_alt_capture
12490#define alc268_pcm_digital_playback	alc880_pcm_digital_playback
12491
12492/*
12493 * BIOS auto configuration
12494 */
12495static int alc268_parse_auto_config(struct hda_codec *codec)
12496{
12497	struct alc_spec *spec = codec->spec;
12498	int err;
12499	static hda_nid_t alc268_ignore[] = { 0 };
12500
12501	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12502					   alc268_ignore);
12503	if (err < 0)
12504		return err;
12505	if (!spec->autocfg.line_outs) {
12506		if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
12507			spec->multiout.max_channels = 2;
12508			spec->no_analog = 1;
12509			goto dig_only;
12510		}
12511		return 0; /* can't find valid BIOS pin config */
12512	}
12513	err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
12514	if (err < 0)
12515		return err;
12516	err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
12517	if (err < 0)
12518		return err;
12519
12520	spec->multiout.max_channels = 2;
12521
12522 dig_only:
12523	/* digital only support output */
12524	if (spec->autocfg.dig_outs) {
12525		spec->multiout.dig_out_nid = ALC268_DIGOUT_NID;
12526		spec->dig_out_type = spec->autocfg.dig_out_type[0];
12527	}
12528	if (spec->kctls.list)
12529		add_mixer(spec, spec->kctls.list);
12530
12531	if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
12532		add_mixer(spec, alc268_beep_mixer);
12533
12534	add_verb(spec, alc268_volume_init_verbs);
12535	spec->num_mux_defs = 2;
12536	spec->input_mux = &spec->private_imux[0];
12537
12538	err = alc_auto_add_mic_boost(codec);
12539	if (err < 0)
12540		return err;
12541
12542	alc_ssid_check(codec, 0x15, 0x1b, 0x14);
12543
12544	return 1;
12545}
12546
12547#define alc268_auto_init_analog_input	alc882_auto_init_analog_input
12548
12549/* init callback for auto-configuration model -- overriding the default init */
12550static void alc268_auto_init(struct hda_codec *codec)
12551{
12552	struct alc_spec *spec = codec->spec;
12553	alc268_auto_init_multi_out(codec);
12554	alc268_auto_init_hp_out(codec);
12555	alc268_auto_init_mono_speaker_out(codec);
12556	alc268_auto_init_analog_input(codec);
12557	if (spec->unsol_event)
12558		alc_inithook(codec);
12559}
12560
12561/*
12562 * configuration and preset
12563 */
12564static const char *alc268_models[ALC268_MODEL_LAST] = {
12565	[ALC267_QUANTA_IL1]	= "quanta-il1",
12566	[ALC268_3ST]		= "3stack",
12567	[ALC268_TOSHIBA]	= "toshiba",
12568	[ALC268_ACER]		= "acer",
12569	[ALC268_ACER_DMIC]	= "acer-dmic",
12570	[ALC268_ACER_ASPIRE_ONE]	= "acer-aspire",
12571	[ALC268_DELL]		= "dell",
12572	[ALC268_ZEPTO]		= "zepto",
12573#ifdef CONFIG_SND_DEBUG
12574	[ALC268_TEST]		= "test",
12575#endif
12576	[ALC268_AUTO]		= "auto",
12577};
12578
12579static struct snd_pci_quirk alc268_cfg_tbl[] = {
12580	SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
12581	SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
12582	SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
12583	SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
12584	SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
12585	SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
12586						ALC268_ACER_ASPIRE_ONE),
12587	SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
12588	SND_PCI_QUIRK(0x1028, 0x02b0, "Dell Inspiron Mini9", ALC268_DELL),
12589	/* almost compatible with toshiba but with optional digital outs;
12590	 * auto-probing seems working fine
12591	 */
12592	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
12593			   ALC268_AUTO),
12594	SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
12595	SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
12596	SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
12597	SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
12598	SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
12599	SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
12600	{}
12601};
12602
12603/* Toshiba laptops have no unique PCI SSID but only codec SSID */
12604static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
12605	SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
12606	SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
12607	SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
12608			   ALC268_TOSHIBA),
12609	{}
12610};
12611
12612static struct alc_config_preset alc268_presets[] = {
12613	[ALC267_QUANTA_IL1] = {
12614		.mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
12615			    alc268_capture_nosrc_mixer },
12616		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12617				alc267_quanta_il1_verbs },
12618		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12619		.dac_nids = alc268_dac_nids,
12620		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12621		.adc_nids = alc268_adc_nids_alt,
12622		.hp_nid = 0x03,
12623		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12624		.channel_mode = alc268_modes,
12625		.unsol_event = alc_sku_unsol_event,
12626		.setup = alc267_quanta_il1_setup,
12627		.init_hook = alc_inithook,
12628	},
12629	[ALC268_3ST] = {
12630		.mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
12631			    alc268_beep_mixer },
12632		.init_verbs = { alc268_base_init_verbs },
12633		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12634		.dac_nids = alc268_dac_nids,
12635                .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12636                .adc_nids = alc268_adc_nids_alt,
12637		.capsrc_nids = alc268_capsrc_nids,
12638		.hp_nid = 0x03,
12639		.dig_out_nid = ALC268_DIGOUT_NID,
12640		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12641		.channel_mode = alc268_modes,
12642		.input_mux = &alc268_capture_source,
12643	},
12644	[ALC268_TOSHIBA] = {
12645		.mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
12646			    alc268_beep_mixer },
12647		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12648				alc268_toshiba_verbs },
12649		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12650		.dac_nids = alc268_dac_nids,
12651		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12652		.adc_nids = alc268_adc_nids_alt,
12653		.capsrc_nids = alc268_capsrc_nids,
12654		.hp_nid = 0x03,
12655		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12656		.channel_mode = alc268_modes,
12657		.input_mux = &alc268_capture_source,
12658		.unsol_event = alc268_toshiba_unsol_event,
12659		.setup = alc268_toshiba_setup,
12660		.init_hook = alc268_toshiba_automute,
12661	},
12662	[ALC268_ACER] = {
12663		.mixers = { alc268_acer_mixer, alc268_capture_nosrc_mixer,
12664			    alc268_beep_mixer },
12665		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12666				alc268_acer_verbs },
12667		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12668		.dac_nids = alc268_dac_nids,
12669		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12670		.adc_nids = alc268_adc_nids_alt,
12671		.capsrc_nids = alc268_capsrc_nids,
12672		.hp_nid = 0x02,
12673		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12674		.channel_mode = alc268_modes,
12675		.input_mux = &alc268_acer_capture_source,
12676		.unsol_event = alc268_acer_unsol_event,
12677		.init_hook = alc268_acer_init_hook,
12678	},
12679	[ALC268_ACER_DMIC] = {
12680		.mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
12681			    alc268_beep_mixer },
12682		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12683				alc268_acer_verbs },
12684		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12685		.dac_nids = alc268_dac_nids,
12686		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12687		.adc_nids = alc268_adc_nids_alt,
12688		.capsrc_nids = alc268_capsrc_nids,
12689		.hp_nid = 0x02,
12690		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12691		.channel_mode = alc268_modes,
12692		.input_mux = &alc268_acer_dmic_capture_source,
12693		.unsol_event = alc268_acer_unsol_event,
12694		.init_hook = alc268_acer_init_hook,
12695	},
12696	[ALC268_ACER_ASPIRE_ONE] = {
12697		.mixers = { alc268_acer_aspire_one_mixer,
12698			    alc268_beep_mixer,
12699			    alc268_capture_nosrc_mixer },
12700		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12701				alc268_acer_aspire_one_verbs },
12702		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12703		.dac_nids = alc268_dac_nids,
12704		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12705		.adc_nids = alc268_adc_nids_alt,
12706		.capsrc_nids = alc268_capsrc_nids,
12707		.hp_nid = 0x03,
12708		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12709		.channel_mode = alc268_modes,
12710		.unsol_event = alc268_acer_lc_unsol_event,
12711		.setup = alc268_acer_lc_setup,
12712		.init_hook = alc268_acer_lc_init_hook,
12713	},
12714	[ALC268_DELL] = {
12715		.mixers = { alc268_dell_mixer, alc268_beep_mixer,
12716			    alc268_capture_nosrc_mixer },
12717		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12718				alc268_dell_verbs },
12719		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12720		.dac_nids = alc268_dac_nids,
12721		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12722		.adc_nids = alc268_adc_nids_alt,
12723		.capsrc_nids = alc268_capsrc_nids,
12724		.hp_nid = 0x02,
12725		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12726		.channel_mode = alc268_modes,
12727		.unsol_event = alc_sku_unsol_event,
12728		.setup = alc268_dell_setup,
12729		.init_hook = alc_inithook,
12730	},
12731	[ALC268_ZEPTO] = {
12732		.mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
12733			    alc268_beep_mixer },
12734		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12735				alc268_toshiba_verbs },
12736		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12737		.dac_nids = alc268_dac_nids,
12738		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12739		.adc_nids = alc268_adc_nids_alt,
12740		.capsrc_nids = alc268_capsrc_nids,
12741		.hp_nid = 0x03,
12742		.dig_out_nid = ALC268_DIGOUT_NID,
12743		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12744		.channel_mode = alc268_modes,
12745		.input_mux = &alc268_capture_source,
12746		.setup = alc268_toshiba_setup,
12747		.init_hook = alc268_toshiba_automute,
12748	},
12749#ifdef CONFIG_SND_DEBUG
12750	[ALC268_TEST] = {
12751		.mixers = { alc268_test_mixer, alc268_capture_mixer },
12752		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12753				alc268_volume_init_verbs },
12754		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
12755		.dac_nids = alc268_dac_nids,
12756		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12757		.adc_nids = alc268_adc_nids_alt,
12758		.capsrc_nids = alc268_capsrc_nids,
12759		.hp_nid = 0x03,
12760		.dig_out_nid = ALC268_DIGOUT_NID,
12761		.num_channel_mode = ARRAY_SIZE(alc268_modes),
12762		.channel_mode = alc268_modes,
12763		.input_mux = &alc268_capture_source,
12764	},
12765#endif
12766};
12767
12768static int patch_alc268(struct hda_codec *codec)
12769{
12770	struct alc_spec *spec;
12771	int board_config;
12772	int i, has_beep, err;
12773
12774	spec = kcalloc(1, sizeof(*spec), GFP_KERNEL);
12775	if (spec == NULL)
12776		return -ENOMEM;
12777
12778	codec->spec = spec;
12779
12780	board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
12781						  alc268_models,
12782						  alc268_cfg_tbl);
12783
12784	if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
12785		board_config = snd_hda_check_board_codec_sid_config(codec,
12786			ALC882_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
12787
12788	if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
12789		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12790		       codec->chip_name);
12791		board_config = ALC268_AUTO;
12792	}
12793
12794	if (board_config == ALC268_AUTO) {
12795		/* automatic parse from the BIOS config */
12796		err = alc268_parse_auto_config(codec);
12797		if (err < 0) {
12798			alc_free(codec);
12799			return err;
12800		} else if (!err) {
12801			printk(KERN_INFO
12802			       "hda_codec: Cannot set up configuration "
12803			       "from BIOS.  Using base mode...\n");
12804			board_config = ALC268_3ST;
12805		}
12806	}
12807
12808	if (board_config != ALC268_AUTO)
12809		setup_preset(codec, &alc268_presets[board_config]);
12810
12811	spec->stream_analog_playback = &alc268_pcm_analog_playback;
12812	spec->stream_analog_capture = &alc268_pcm_analog_capture;
12813	spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
12814
12815	spec->stream_digital_playback = &alc268_pcm_digital_playback;
12816
12817	has_beep = 0;
12818	for (i = 0; i < spec->num_mixers; i++) {
12819		if (spec->mixers[i] == alc268_beep_mixer) {
12820			has_beep = 1;
12821			break;
12822		}
12823	}
12824
12825	if (has_beep) {
12826		err = snd_hda_attach_beep_device(codec, 0x1);
12827		if (err < 0) {
12828			alc_free(codec);
12829			return err;
12830		}
12831		if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
12832			/* override the amp caps for beep generator */
12833			snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
12834					  (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
12835					  (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
12836					  (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
12837					  (0 << AC_AMPCAP_MUTE_SHIFT));
12838	}
12839
12840	if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
12841		/* check whether NID 0x07 is valid */
12842		unsigned int wcap = get_wcaps(codec, 0x07);
12843		int i;
12844
12845		/* get type */
12846		wcap = get_wcaps_type(wcap);
12847		if (spec->auto_mic ||
12848		    wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
12849			spec->adc_nids = alc268_adc_nids_alt;
12850			spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
12851			if (spec->auto_mic || spec->input_mux->num_items == 1)
12852				add_mixer(spec, alc268_capture_nosrc_mixer);
12853			else
12854				add_mixer(spec, alc268_capture_alt_mixer);
12855		} else {
12856			spec->adc_nids = alc268_adc_nids;
12857			spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
12858			add_mixer(spec, alc268_capture_mixer);
12859		}
12860		spec->capsrc_nids = alc268_capsrc_nids;
12861		/* set default input source */
12862		for (i = 0; i < spec->num_adc_nids; i++)
12863			snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
12864				0, AC_VERB_SET_CONNECT_SEL,
12865				i < spec->num_mux_defs ?
12866				spec->input_mux[i].items[0].index :
12867				spec->input_mux->items[0].index);
12868	}
12869
12870	spec->vmaster_nid = 0x02;
12871
12872	codec->patch_ops = alc_patch_ops;
12873	if (board_config == ALC268_AUTO)
12874		spec->init_hook = alc268_auto_init;
12875
12876	codec->proc_widget_hook = print_realtek_coef;
12877
12878	return 0;
12879}
12880
12881/*
12882 *  ALC269 channel source setting (2 channel)
12883 */
12884#define ALC269_DIGOUT_NID	ALC880_DIGOUT_NID
12885
12886#define alc269_dac_nids		alc260_dac_nids
12887
12888static hda_nid_t alc269_adc_nids[1] = {
12889	/* ADC1 */
12890	0x08,
12891};
12892
12893static hda_nid_t alc269_capsrc_nids[1] = {
12894	0x23,
12895};
12896
12897/* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24),
12898 *       not a mux!
12899 */
12900
12901#define alc269_modes		alc260_modes
12902#define alc269_capture_source	alc880_lg_lw_capture_source
12903
12904static struct snd_kcontrol_new alc269_base_mixer[] = {
12905	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12906	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12907	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
12908	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
12909	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
12910	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
12911	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12912	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
12913	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
12914	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12915	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12916	HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
12917	{ } /* end */
12918};
12919
12920static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
12921	/* output mixer control */
12922	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12923	{
12924		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12925		.name = "Master Playback Switch",
12926		.info = snd_hda_mixer_amp_switch_info,
12927		.get = snd_hda_mixer_amp_switch_get,
12928		.put = alc268_acer_master_sw_put,
12929		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12930	},
12931	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
12932	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
12933	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12934	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
12935	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
12936	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12937	{ }
12938};
12939
12940static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
12941	/* output mixer control */
12942	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12943	{
12944		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12945		.name = "Master Playback Switch",
12946		.info = snd_hda_mixer_amp_switch_info,
12947		.get = snd_hda_mixer_amp_switch_get,
12948		.put = alc268_acer_master_sw_put,
12949		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12950	},
12951	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
12952	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
12953	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12954	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
12955	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
12956	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12957	HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
12958	HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
12959	HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
12960	{ }
12961};
12962
12963static struct snd_kcontrol_new alc269_eeepc_mixer[] = {
12964	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12965	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12966	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12967	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12968	{ } /* end */
12969};
12970
12971/* capture mixer elements */
12972static struct snd_kcontrol_new alc269_epc_capture_mixer[] = {
12973	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
12974	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
12975	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12976	{ } /* end */
12977};
12978
12979/* FSC amilo */
12980#define alc269_fujitsu_mixer	alc269_eeepc_mixer
12981
12982static struct hda_verb alc269_quanta_fl1_verbs[] = {
12983	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
12984	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12985	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12986	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12987	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12988	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12989	{ }
12990};
12991
12992static struct hda_verb alc269_lifebook_verbs[] = {
12993	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
12994	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
12995	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12996	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12997	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12998	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12999	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13000	{0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13001	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13002	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13003	{ }
13004};
13005
13006/* toggle speaker-output according to the hp-jack state */
13007static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
13008{
13009	unsigned int present;
13010	unsigned char bits;
13011
13012	present = snd_hda_codec_read(codec, 0x15, 0,
13013			AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
13014	bits = present ? AMP_IN_MUTE(0) : 0;
13015	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13016			AMP_IN_MUTE(0), bits);
13017	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13018			AMP_IN_MUTE(0), bits);
13019
13020	snd_hda_codec_write(codec, 0x20, 0,
13021			AC_VERB_SET_COEF_INDEX, 0x0c);
13022	snd_hda_codec_write(codec, 0x20, 0,
13023			AC_VERB_SET_PROC_COEF, 0x680);
13024
13025	snd_hda_codec_write(codec, 0x20, 0,
13026			AC_VERB_SET_COEF_INDEX, 0x0c);
13027	snd_hda_codec_write(codec, 0x20, 0,
13028			AC_VERB_SET_PROC_COEF, 0x480);
13029}
13030
13031/* toggle speaker-output according to the hp-jacks state */
13032static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
13033{
13034	unsigned int present;
13035	unsigned char bits;
13036
13037	/* Check laptop headphone socket */
13038	present = snd_hda_codec_read(codec, 0x15, 0,
13039			AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
13040
13041	/* Check port replicator headphone socket */
13042	present |= snd_hda_codec_read(codec, 0x1a, 0,
13043			AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
13044
13045	bits = present ? AMP_IN_MUTE(0) : 0;
13046	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13047			AMP_IN_MUTE(0), bits);
13048	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13049			AMP_IN_MUTE(0), bits);
13050
13051	snd_hda_codec_write(codec, 0x20, 0,
13052			AC_VERB_SET_COEF_INDEX, 0x0c);
13053	snd_hda_codec_write(codec, 0x20, 0,
13054			AC_VERB_SET_PROC_COEF, 0x680);
13055
13056	snd_hda_codec_write(codec, 0x20, 0,
13057			AC_VERB_SET_COEF_INDEX, 0x0c);
13058	snd_hda_codec_write(codec, 0x20, 0,
13059			AC_VERB_SET_PROC_COEF, 0x480);
13060}
13061
13062static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13063{
13064	unsigned int present_laptop;
13065	unsigned int present_dock;
13066
13067	present_laptop = snd_hda_codec_read(codec, 0x18, 0,
13068				AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
13069
13070	present_dock = snd_hda_codec_read(codec, 0x1b, 0,
13071				AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
13072
13073	/* Laptop mic port overrides dock mic port, design decision */
13074	if (present_dock)
13075		snd_hda_codec_write(codec, 0x23, 0,
13076				AC_VERB_SET_CONNECT_SEL, 0x3);
13077	if (present_laptop)
13078		snd_hda_codec_write(codec, 0x23, 0,
13079				AC_VERB_SET_CONNECT_SEL, 0x0);
13080	if (!present_dock && !present_laptop)
13081		snd_hda_codec_write(codec, 0x23, 0,
13082				AC_VERB_SET_CONNECT_SEL, 0x1);
13083}
13084
13085static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
13086				    unsigned int res)
13087{
13088	switch (res >> 26) {
13089	case ALC880_HP_EVENT:
13090		alc269_quanta_fl1_speaker_automute(codec);
13091		break;
13092	case ALC880_MIC_EVENT:
13093		alc_mic_automute(codec);
13094		break;
13095	}
13096}
13097
13098static void alc269_lifebook_unsol_event(struct hda_codec *codec,
13099					unsigned int res)
13100{
13101	if ((res >> 26) == ALC880_HP_EVENT)
13102		alc269_lifebook_speaker_automute(codec);
13103	if ((res >> 26) == ALC880_MIC_EVENT)
13104		alc269_lifebook_mic_autoswitch(codec);
13105}
13106
13107static void alc269_quanta_fl1_setup(struct hda_codec *codec)
13108{
13109	struct alc_spec *spec = codec->spec;
13110	spec->ext_mic.pin = 0x18;
13111	spec->ext_mic.mux_idx = 0;
13112	spec->int_mic.pin = 0x19;
13113	spec->int_mic.mux_idx = 1;
13114	spec->auto_mic = 1;
13115}
13116
13117static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
13118{
13119	alc269_quanta_fl1_speaker_automute(codec);
13120	alc_mic_automute(codec);
13121}
13122
13123static void alc269_lifebook_init_hook(struct hda_codec *codec)
13124{
13125	alc269_lifebook_speaker_automute(codec);
13126	alc269_lifebook_mic_autoswitch(codec);
13127}
13128
13129static struct hda_verb alc269_eeepc_dmic_init_verbs[] = {
13130	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13131	{0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
13132	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13133	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13134	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13135	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13136	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13137	{}
13138};
13139
13140static struct hda_verb alc269_eeepc_amic_init_verbs[] = {
13141	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13142	{0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
13143	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13144	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
13145	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13146	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13147	{}
13148};
13149
13150/* toggle speaker-output according to the hp-jack state */
13151static void alc269_speaker_automute(struct hda_codec *codec)
13152{
13153	unsigned int present;
13154	unsigned char bits;
13155
13156	present = snd_hda_codec_read(codec, 0x15, 0,
13157				AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
13158	bits = present ? AMP_IN_MUTE(0) : 0;
13159	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13160				AMP_IN_MUTE(0), bits);
13161	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13162				AMP_IN_MUTE(0), bits);
13163}
13164
13165/* unsolicited event for HP jack sensing */
13166static void alc269_eeepc_unsol_event(struct hda_codec *codec,
13167				     unsigned int res)
13168{
13169	switch (res >> 26) {
13170	case ALC880_HP_EVENT:
13171		alc269_speaker_automute(codec);
13172		break;
13173	case ALC880_MIC_EVENT:
13174		alc_mic_automute(codec);
13175		break;
13176	}
13177}
13178
13179static void alc269_eeepc_dmic_setup(struct hda_codec *codec)
13180{
13181	struct alc_spec *spec = codec->spec;
13182	spec->ext_mic.pin = 0x18;
13183	spec->ext_mic.mux_idx = 0;
13184	spec->int_mic.pin = 0x12;
13185	spec->int_mic.mux_idx = 5;
13186	spec->auto_mic = 1;
13187}
13188
13189static void alc269_eeepc_amic_setup(struct hda_codec *codec)
13190{
13191	struct alc_spec *spec = codec->spec;
13192	spec->ext_mic.pin = 0x18;
13193	spec->ext_mic.mux_idx = 0;
13194	spec->int_mic.pin = 0x19;
13195	spec->int_mic.mux_idx = 1;
13196	spec->auto_mic = 1;
13197}
13198
13199static void alc269_eeepc_inithook(struct hda_codec *codec)
13200{
13201	alc269_speaker_automute(codec);
13202	alc_mic_automute(codec);
13203}
13204
13205/*
13206 * generic initialization of ADC, input mixers and output mixers
13207 */
13208static struct hda_verb alc269_init_verbs[] = {
13209	/*
13210	 * Unmute ADC0 and set the default input to mic-in
13211	 */
13212	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13213
13214	/* Mute input amps (PCBeep, Line In, Mic 1 & Mic 2) of the
13215	 * analog-loopback mixer widget
13216	 * Note: PASD motherboards uses the Line In 2 as the input for
13217	 * front panel mic (mic 2)
13218	 */
13219	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
13220	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
13221	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13222	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
13223	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
13224	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
13225
13226	/*
13227	 * Set up output mixers (0x0c - 0x0e)
13228	 */
13229	/* set vol=0 to output mixers */
13230	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13231	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13232
13233	/* set up input amps for analog loopback */
13234	/* Amp Indices: DAC = 0, mixer = 1 */
13235	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13236	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13237	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13238	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13239	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13240	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13241
13242	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13243	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13244	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13245	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13246	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13247	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13248	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13249
13250	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13251	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13252	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13253	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13254	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13255	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13256	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13257
13258	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
13259	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
13260
13261	/* FIXME: use matrix-type input source selection */
13262	/* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
13263	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
13264	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
13265	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13266	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
13267	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
13268
13269	/* set EAPD */
13270	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
13271	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
13272	{ }
13273};
13274
13275#define alc269_auto_create_multi_out_ctls \
13276	alc268_auto_create_multi_out_ctls
13277#define alc269_auto_create_input_ctls \
13278	alc268_auto_create_input_ctls
13279
13280#ifdef CONFIG_SND_HDA_POWER_SAVE
13281#define alc269_loopbacks	alc880_loopbacks
13282#endif
13283
13284/* pcm configuration: identical with ALC880 */
13285#define alc269_pcm_analog_playback	alc880_pcm_analog_playback
13286#define alc269_pcm_analog_capture	alc880_pcm_analog_capture
13287#define alc269_pcm_digital_playback	alc880_pcm_digital_playback
13288#define alc269_pcm_digital_capture	alc880_pcm_digital_capture
13289
13290static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
13291	.substreams = 1,
13292	.channels_min = 2,
13293	.channels_max = 8,
13294	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13295	/* NID is set in alc_build_pcms */
13296	.ops = {
13297		.open = alc880_playback_pcm_open,
13298		.prepare = alc880_playback_pcm_prepare,
13299		.cleanup = alc880_playback_pcm_cleanup
13300	},
13301};
13302
13303static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
13304	.substreams = 1,
13305	.channels_min = 2,
13306	.channels_max = 2,
13307	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13308	/* NID is set in alc_build_pcms */
13309};
13310
13311/*
13312 * BIOS auto configuration
13313 */
13314static int alc269_parse_auto_config(struct hda_codec *codec)
13315{
13316	struct alc_spec *spec = codec->spec;
13317	int err;
13318	static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
13319
13320	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13321					   alc269_ignore);
13322	if (err < 0)
13323		return err;
13324
13325	err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
13326	if (err < 0)
13327		return err;
13328	err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
13329	if (err < 0)
13330		return err;
13331
13332	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
13333
13334	if (spec->autocfg.dig_outs)
13335		spec->multiout.dig_out_nid = ALC269_DIGOUT_NID;
13336
13337	if (spec->kctls.list)
13338		add_mixer(spec, spec->kctls.list);
13339
13340	add_verb(spec, alc269_init_verbs);
13341	spec->num_mux_defs = 1;
13342	spec->input_mux = &spec->private_imux[0];
13343	/* set default input source */
13344	snd_hda_codec_write_cache(codec, alc269_capsrc_nids[0],
13345				  0, AC_VERB_SET_CONNECT_SEL,
13346				  spec->input_mux->items[0].index);
13347
13348	err = alc_auto_add_mic_boost(codec);
13349	if (err < 0)
13350		return err;
13351
13352	if (!spec->cap_mixer && !spec->no_analog)
13353		set_capture_mixer(codec);
13354
13355	alc_ssid_check(codec, 0x15, 0x1b, 0x14);
13356
13357	return 1;
13358}
13359
13360#define alc269_auto_init_multi_out	alc268_auto_init_multi_out
13361#define alc269_auto_init_hp_out		alc268_auto_init_hp_out
13362#define alc269_auto_init_analog_input	alc882_auto_init_analog_input
13363
13364
13365/* init callback for auto-configuration model -- overriding the default init */
13366static void alc269_auto_init(struct hda_codec *codec)
13367{
13368	struct alc_spec *spec = codec->spec;
13369	alc269_auto_init_multi_out(codec);
13370	alc269_auto_init_hp_out(codec);
13371	alc269_auto_init_analog_input(codec);
13372	if (spec->unsol_event)
13373		alc_inithook(codec);
13374}
13375
13376/*
13377 * configuration and preset
13378 */
13379static const char *alc269_models[ALC269_MODEL_LAST] = {
13380	[ALC269_BASIC]			= "basic",
13381	[ALC269_QUANTA_FL1]		= "quanta",
13382	[ALC269_ASUS_EEEPC_P703]	= "eeepc-p703",
13383	[ALC269_ASUS_EEEPC_P901]	= "eeepc-p901",
13384	[ALC269_FUJITSU]		= "fujitsu",
13385	[ALC269_LIFEBOOK]		= "lifebook",
13386	[ALC269_AUTO]			= "auto",
13387};
13388
13389static struct snd_pci_quirk alc269_cfg_tbl[] = {
13390	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
13391	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
13392		      ALC269_ASUS_EEEPC_P703),
13393        SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_ASUS_EEEPC_P703),
13394        SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_ASUS_EEEPC_P703),
13395        SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_ASUS_EEEPC_P703),
13396        SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_ASUS_EEEPC_P703),
13397        SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_ASUS_EEEPC_P703),
13398        SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_ASUS_EEEPC_P703),
13399	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
13400		      ALC269_ASUS_EEEPC_P901),
13401	SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
13402		      ALC269_ASUS_EEEPC_P901),
13403        SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_ASUS_EEEPC_P901),
13404	SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
13405	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
13406	{}
13407};
13408
13409static struct alc_config_preset alc269_presets[] = {
13410	[ALC269_BASIC] = {
13411		.mixers = { alc269_base_mixer },
13412		.init_verbs = { alc269_init_verbs },
13413		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
13414		.dac_nids = alc269_dac_nids,
13415		.hp_nid = 0x03,
13416		.num_channel_mode = ARRAY_SIZE(alc269_modes),
13417		.channel_mode = alc269_modes,
13418		.input_mux = &alc269_capture_source,
13419	},
13420	[ALC269_QUANTA_FL1] = {
13421		.mixers = { alc269_quanta_fl1_mixer },
13422		.init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
13423		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
13424		.dac_nids = alc269_dac_nids,
13425		.hp_nid = 0x03,
13426		.num_channel_mode = ARRAY_SIZE(alc269_modes),
13427		.channel_mode = alc269_modes,
13428		.input_mux = &alc269_capture_source,
13429		.unsol_event = alc269_quanta_fl1_unsol_event,
13430		.setup = alc269_quanta_fl1_setup,
13431		.init_hook = alc269_quanta_fl1_init_hook,
13432	},
13433	[ALC269_ASUS_EEEPC_P703] = {
13434		.mixers = { alc269_eeepc_mixer },
13435		.cap_mixer = alc269_epc_capture_mixer,
13436		.init_verbs = { alc269_init_verbs,
13437				alc269_eeepc_amic_init_verbs },
13438		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
13439		.dac_nids = alc269_dac_nids,
13440		.hp_nid = 0x03,
13441		.num_channel_mode = ARRAY_SIZE(alc269_modes),
13442		.channel_mode = alc269_modes,
13443		.unsol_event = alc269_eeepc_unsol_event,
13444		.setup = alc269_eeepc_amic_setup,
13445		.init_hook = alc269_eeepc_inithook,
13446	},
13447	[ALC269_ASUS_EEEPC_P901] = {
13448		.mixers = { alc269_eeepc_mixer },
13449		.cap_mixer = alc269_epc_capture_mixer,
13450		.init_verbs = { alc269_init_verbs,
13451				alc269_eeepc_dmic_init_verbs },
13452		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
13453		.dac_nids = alc269_dac_nids,
13454		.hp_nid = 0x03,
13455		.num_channel_mode = ARRAY_SIZE(alc269_modes),
13456		.channel_mode = alc269_modes,
13457		.unsol_event = alc269_eeepc_unsol_event,
13458		.setup = alc269_eeepc_dmic_setup,
13459		.init_hook = alc269_eeepc_inithook,
13460	},
13461	[ALC269_FUJITSU] = {
13462		.mixers = { alc269_fujitsu_mixer },
13463		.cap_mixer = alc269_epc_capture_mixer,
13464		.init_verbs = { alc269_init_verbs,
13465				alc269_eeepc_dmic_init_verbs },
13466		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
13467		.dac_nids = alc269_dac_nids,
13468		.hp_nid = 0x03,
13469		.num_channel_mode = ARRAY_SIZE(alc269_modes),
13470		.channel_mode = alc269_modes,
13471		.unsol_event = alc269_eeepc_unsol_event,
13472		.setup = alc269_eeepc_dmic_setup,
13473		.init_hook = alc269_eeepc_inithook,
13474	},
13475	[ALC269_LIFEBOOK] = {
13476		.mixers = { alc269_lifebook_mixer },
13477		.init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
13478		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
13479		.dac_nids = alc269_dac_nids,
13480		.hp_nid = 0x03,
13481		.num_channel_mode = ARRAY_SIZE(alc269_modes),
13482		.channel_mode = alc269_modes,
13483		.input_mux = &alc269_capture_source,
13484		.unsol_event = alc269_lifebook_unsol_event,
13485		.init_hook = alc269_lifebook_init_hook,
13486	},
13487};
13488
13489static int patch_alc269(struct hda_codec *codec)
13490{
13491	struct alc_spec *spec;
13492	int board_config;
13493	int err;
13494
13495	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13496	if (spec == NULL)
13497		return -ENOMEM;
13498
13499	codec->spec = spec;
13500
13501	alc_fix_pll_init(codec, 0x20, 0x04, 15);
13502
13503	board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
13504						  alc269_models,
13505						  alc269_cfg_tbl);
13506
13507	if (board_config < 0) {
13508		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13509		       codec->chip_name);
13510		board_config = ALC269_AUTO;
13511	}
13512
13513	if (board_config == ALC269_AUTO) {
13514		/* automatic parse from the BIOS config */
13515		err = alc269_parse_auto_config(codec);
13516		if (err < 0) {
13517			alc_free(codec);
13518			return err;
13519		} else if (!err) {
13520			printk(KERN_INFO
13521			       "hda_codec: Cannot set up configuration "
13522			       "from BIOS.  Using base mode...\n");
13523			board_config = ALC269_BASIC;
13524		}
13525	}
13526
13527	err = snd_hda_attach_beep_device(codec, 0x1);
13528	if (err < 0) {
13529		alc_free(codec);
13530		return err;
13531	}
13532
13533	if (board_config != ALC269_AUTO)
13534		setup_preset(codec, &alc269_presets[board_config]);
13535
13536	if (codec->subsystem_id == 0x17aa3bf8) {
13537		/* Due to a hardware problem on Lenovo Ideadpad, we need to
13538		 * fix the sample rate of analog I/O to 44.1kHz
13539		 */
13540		spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
13541		spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
13542	} else {
13543		spec->stream_analog_playback = &alc269_pcm_analog_playback;
13544		spec->stream_analog_capture = &alc269_pcm_analog_capture;
13545	}
13546	spec->stream_digital_playback = &alc269_pcm_digital_playback;
13547	spec->stream_digital_capture = &alc269_pcm_digital_capture;
13548
13549	spec->adc_nids = alc269_adc_nids;
13550	spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
13551	spec->capsrc_nids = alc269_capsrc_nids;
13552	if (!spec->cap_mixer)
13553		set_capture_mixer(codec);
13554	set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
13555
13556	spec->vmaster_nid = 0x02;
13557
13558	codec->patch_ops = alc_patch_ops;
13559	if (board_config == ALC269_AUTO)
13560		spec->init_hook = alc269_auto_init;
13561#ifdef CONFIG_SND_HDA_POWER_SAVE
13562	if (!spec->loopback.amplist)
13563		spec->loopback.amplist = alc269_loopbacks;
13564#endif
13565	codec->proc_widget_hook = print_realtek_coef;
13566
13567	return 0;
13568}
13569
13570/*
13571 *  ALC861 channel source setting (2/6 channel selection for 3-stack)
13572 */
13573
13574/*
13575 * set the path ways for 2 channel output
13576 * need to set the codec line out and mic 1 pin widgets to inputs
13577 */
13578static struct hda_verb alc861_threestack_ch2_init[] = {
13579	/* set pin widget 1Ah (line in) for input */
13580	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13581	/* set pin widget 18h (mic1/2) for input, for mic also enable
13582	 * the vref
13583	 */
13584	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13585
13586	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
13587#if 0
13588	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13589	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
13590#endif
13591	{ } /* end */
13592};
13593/*
13594 * 6ch mode
13595 * need to set the codec line out and mic 1 pin widgets to outputs
13596 */
13597static struct hda_verb alc861_threestack_ch6_init[] = {
13598	/* set pin widget 1Ah (line in) for output (Back Surround)*/
13599	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13600	/* set pin widget 18h (mic1) for output (CLFE)*/
13601	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13602
13603	{ 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
13604	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
13605
13606	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
13607#if 0
13608	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13609	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
13610#endif
13611	{ } /* end */
13612};
13613
13614static struct hda_channel_mode alc861_threestack_modes[2] = {
13615	{ 2, alc861_threestack_ch2_init },
13616	{ 6, alc861_threestack_ch6_init },
13617};
13618/* Set mic1 as input and unmute the mixer */
13619static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
13620	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13621	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13622	{ } /* end */
13623};
13624/* Set mic1 as output and mute mixer */
13625static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
13626	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13627	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13628	{ } /* end */
13629};
13630
13631static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
13632	{ 2, alc861_uniwill_m31_ch2_init },
13633	{ 4, alc861_uniwill_m31_ch4_init },
13634};
13635
13636/* Set mic1 and line-in as input and unmute the mixer */
13637static struct hda_verb alc861_asus_ch2_init[] = {
13638	/* set pin widget 1Ah (line in) for input */
13639	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13640	/* set pin widget 18h (mic1/2) for input, for mic also enable
13641	 * the vref
13642	 */
13643	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13644
13645	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
13646#if 0
13647	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13648	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
13649#endif
13650	{ } /* end */
13651};
13652/* Set mic1 nad line-in as output and mute mixer */
13653static struct hda_verb alc861_asus_ch6_init[] = {
13654	/* set pin widget 1Ah (line in) for output (Back Surround)*/
13655	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13656	/* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
13657	/* set pin widget 18h (mic1) for output (CLFE)*/
13658	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13659	/* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
13660	{ 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
13661	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
13662
13663	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
13664#if 0
13665	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13666	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
13667#endif
13668	{ } /* end */
13669};
13670
13671static struct hda_channel_mode alc861_asus_modes[2] = {
13672	{ 2, alc861_asus_ch2_init },
13673	{ 6, alc861_asus_ch6_init },
13674};
13675
13676/* patch-ALC861 */
13677
13678static struct snd_kcontrol_new alc861_base_mixer[] = {
13679        /* output mixer control */
13680	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13681	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13682	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13683	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13684	HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
13685
13686        /*Input mixer control */
13687	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13688	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
13689	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13690	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13691	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13692	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13693	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13694	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13695	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13696	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
13697
13698	{ } /* end */
13699};
13700
13701static struct snd_kcontrol_new alc861_3ST_mixer[] = {
13702        /* output mixer control */
13703	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13704	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13705	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13706	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13707	/*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
13708
13709	/* Input mixer control */
13710	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13711	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
13712	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13713	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13714	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13715	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13716	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13717	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13718	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13719	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
13720
13721	{
13722		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13723		.name = "Channel Mode",
13724		.info = alc_ch_mode_info,
13725		.get = alc_ch_mode_get,
13726		.put = alc_ch_mode_put,
13727                .private_value = ARRAY_SIZE(alc861_threestack_modes),
13728	},
13729	{ } /* end */
13730};
13731
13732static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
13733        /* output mixer control */
13734	HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13735	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13736	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13737
13738	{ } /* end */
13739};
13740
13741static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
13742        /* output mixer control */
13743	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13744	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13745	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13746	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13747	/*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
13748
13749	/* Input mixer control */
13750	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13751	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
13752	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13753	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13754	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13755	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13756	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13757	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13758	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13759	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
13760
13761	{
13762		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13763		.name = "Channel Mode",
13764		.info = alc_ch_mode_info,
13765		.get = alc_ch_mode_get,
13766		.put = alc_ch_mode_put,
13767                .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
13768	},
13769	{ } /* end */
13770};
13771
13772static struct snd_kcontrol_new alc861_asus_mixer[] = {
13773        /* output mixer control */
13774	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13775	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13776	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13777	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13778	HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
13779
13780	/* Input mixer control */
13781	HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13782	HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13783	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13784	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13785	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13786	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13787	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13788	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13789	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13790	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
13791
13792	{
13793		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13794		.name = "Channel Mode",
13795		.info = alc_ch_mode_info,
13796		.get = alc_ch_mode_get,
13797		.put = alc_ch_mode_put,
13798                .private_value = ARRAY_SIZE(alc861_asus_modes),
13799	},
13800	{ }
13801};
13802
13803/* additional mixer */
13804static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
13805	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13806	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13807	{ }
13808};
13809
13810/*
13811 * generic initialization of ADC, input mixers and output mixers
13812 */
13813static struct hda_verb alc861_base_init_verbs[] = {
13814	/*
13815	 * Unmute ADC0 and set the default input to mic-in
13816	 */
13817	/* port-A for surround (rear panel) */
13818	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13819	{ 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
13820	/* port-B for mic-in (rear panel) with vref */
13821	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13822	/* port-C for line-in (rear panel) */
13823	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13824	/* port-D for Front */
13825	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13826	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
13827	/* port-E for HP out (front panel) */
13828	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
13829	/* route front PCM to HP */
13830	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
13831	/* port-F for mic-in (front panel) with vref */
13832	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13833	/* port-G for CLFE (rear panel) */
13834	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13835	{ 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
13836	/* port-H for side (rear panel) */
13837	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13838	{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
13839	/* CD-in */
13840	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13841	/* route front mic to ADC1*/
13842	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
13843	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13844
13845	/* Unmute DAC0~3 & spdif out*/
13846	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13847	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13848	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13849	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13850	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13851
13852	/* Unmute Mixer 14 (mic) 1c (Line in)*/
13853	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13854        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13855	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13856        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13857
13858	/* Unmute Stereo Mixer 15 */
13859	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13860	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13861	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
13862	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
13863
13864	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13865	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13866	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13867	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13868	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13869	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13870	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13871	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13872	/* hp used DAC 3 (Front) */
13873	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
13874        {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
13875
13876	{ }
13877};
13878
13879static struct hda_verb alc861_threestack_init_verbs[] = {
13880	/*
13881	 * Unmute ADC0 and set the default input to mic-in
13882	 */
13883	/* port-A for surround (rear panel) */
13884	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13885	/* port-B for mic-in (rear panel) with vref */
13886	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13887	/* port-C for line-in (rear panel) */
13888	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13889	/* port-D for Front */
13890	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13891	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
13892	/* port-E for HP out (front panel) */
13893	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
13894	/* route front PCM to HP */
13895	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
13896	/* port-F for mic-in (front panel) with vref */
13897	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13898	/* port-G for CLFE (rear panel) */
13899	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13900	/* port-H for side (rear panel) */
13901	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13902	/* CD-in */
13903	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13904	/* route front mic to ADC1*/
13905	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
13906	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13907	/* Unmute DAC0~3 & spdif out*/
13908	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13909	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13910	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13911	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13912	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13913
13914	/* Unmute Mixer 14 (mic) 1c (Line in)*/
13915	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13916        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13917	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13918        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13919
13920	/* Unmute Stereo Mixer 15 */
13921	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13922	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13923	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
13924	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
13925
13926	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13927	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13928	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13929	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13930	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13931	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13932	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13933	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13934	/* hp used DAC 3 (Front) */
13935	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
13936        {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
13937	{ }
13938};
13939
13940static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
13941	/*
13942	 * Unmute ADC0 and set the default input to mic-in
13943	 */
13944	/* port-A for surround (rear panel) */
13945	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13946	/* port-B for mic-in (rear panel) with vref */
13947	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13948	/* port-C for line-in (rear panel) */
13949	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13950	/* port-D for Front */
13951	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13952	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
13953	/* port-E for HP out (front panel) */
13954	/* this has to be set to VREF80 */
13955	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13956	/* route front PCM to HP */
13957	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
13958	/* port-F for mic-in (front panel) with vref */
13959	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13960	/* port-G for CLFE (rear panel) */
13961	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13962	/* port-H for side (rear panel) */
13963	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
13964	/* CD-in */
13965	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13966	/* route front mic to ADC1*/
13967	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
13968	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13969	/* Unmute DAC0~3 & spdif out*/
13970	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13971	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13972	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13973	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13974	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13975
13976	/* Unmute Mixer 14 (mic) 1c (Line in)*/
13977	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13978        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13979	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13980        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13981
13982	/* Unmute Stereo Mixer 15 */
13983	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13984	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13985	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
13986	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
13987
13988	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13989	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13990	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13991	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13992	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13993	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13994	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13995	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13996	/* hp used DAC 3 (Front) */
13997	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
13998        {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
13999	{ }
14000};
14001
14002static struct hda_verb alc861_asus_init_verbs[] = {
14003	/*
14004	 * Unmute ADC0 and set the default input to mic-in
14005	 */
14006	/* port-A for surround (rear panel)
14007	 * according to codec#0 this is the HP jack
14008	 */
14009	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
14010	/* route front PCM to HP */
14011	{ 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
14012	/* port-B for mic-in (rear panel) with vref */
14013	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14014	/* port-C for line-in (rear panel) */
14015	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14016	/* port-D for Front */
14017	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14018	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14019	/* port-E for HP out (front panel) */
14020	/* this has to be set to VREF80 */
14021	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14022	/* route front PCM to HP */
14023	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14024	/* port-F for mic-in (front panel) with vref */
14025	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14026	/* port-G for CLFE (rear panel) */
14027	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14028	/* port-H for side (rear panel) */
14029	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14030	/* CD-in */
14031	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14032	/* route front mic to ADC1*/
14033	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14034	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14035	/* Unmute DAC0~3 & spdif out*/
14036	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14037	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14038	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14039	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14040	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14041	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14042	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14043        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14044	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14045        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14046
14047	/* Unmute Stereo Mixer 15 */
14048	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14049	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14050	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14051	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14052
14053	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14054	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14055	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14056	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14057	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14058	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14059	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14060	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14061	/* hp used DAC 3 (Front) */
14062	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14063	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14064	{ }
14065};
14066
14067/* additional init verbs for ASUS laptops */
14068static struct hda_verb alc861_asus_laptop_init_verbs[] = {
14069	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
14070	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
14071	{ }
14072};
14073
14074/*
14075 * generic initialization of ADC, input mixers and output mixers
14076 */
14077static struct hda_verb alc861_auto_init_verbs[] = {
14078	/*
14079	 * Unmute ADC0 and set the default input to mic-in
14080	 */
14081	/* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
14082	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14083
14084	/* Unmute DAC0~3 & spdif out*/
14085	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14086	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14087	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14088	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14089	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14090
14091	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14092	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14093	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14094	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14095	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14096
14097	/* Unmute Stereo Mixer 15 */
14098	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14099	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14100	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14101	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
14102
14103	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14104	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14105	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14106	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14107	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14108	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14109	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14110	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14111
14112	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14113	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14114	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14115	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14116	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14117	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14118	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14119	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14120
14121	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},	/* set Mic 1 */
14122
14123	{ }
14124};
14125
14126static struct hda_verb alc861_toshiba_init_verbs[] = {
14127	{0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14128
14129	{ }
14130};
14131
14132/* toggle speaker-output according to the hp-jack state */
14133static void alc861_toshiba_automute(struct hda_codec *codec)
14134{
14135	unsigned int present;
14136
14137	present = snd_hda_codec_read(codec, 0x0f, 0,
14138				     AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
14139	snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
14140				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
14141	snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
14142				 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
14143}
14144
14145static void alc861_toshiba_unsol_event(struct hda_codec *codec,
14146				       unsigned int res)
14147{
14148	if ((res >> 26) == ALC880_HP_EVENT)
14149		alc861_toshiba_automute(codec);
14150}
14151
14152/* pcm configuration: identical with ALC880 */
14153#define alc861_pcm_analog_playback	alc880_pcm_analog_playback
14154#define alc861_pcm_analog_capture	alc880_pcm_analog_capture
14155#define alc861_pcm_digital_playback	alc880_pcm_digital_playback
14156#define alc861_pcm_digital_capture	alc880_pcm_digital_capture
14157
14158
14159#define ALC861_DIGOUT_NID	0x07
14160
14161static struct hda_channel_mode alc861_8ch_modes[1] = {
14162	{ 8, NULL }
14163};
14164
14165static hda_nid_t alc861_dac_nids[4] = {
14166	/* front, surround, clfe, side */
14167	0x03, 0x06, 0x05, 0x04
14168};
14169
14170static hda_nid_t alc660_dac_nids[3] = {
14171	/* front, clfe, surround */
14172	0x03, 0x05, 0x06
14173};
14174
14175static hda_nid_t alc861_adc_nids[1] = {
14176	/* ADC0-2 */
14177	0x08,
14178};
14179
14180static struct hda_input_mux alc861_capture_source = {
14181	.num_items = 5,
14182	.items = {
14183		{ "Mic", 0x0 },
14184		{ "Front Mic", 0x3 },
14185		{ "Line", 0x1 },
14186		{ "CD", 0x4 },
14187		{ "Mixer", 0x5 },
14188	},
14189};
14190
14191static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
14192{
14193	struct alc_spec *spec = codec->spec;
14194	hda_nid_t mix, srcs[5];
14195	int i, j, num;
14196
14197	if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
14198		return 0;
14199	num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14200	if (num < 0)
14201		return 0;
14202	for (i = 0; i < num; i++) {
14203		unsigned int type;
14204		type = get_wcaps_type(get_wcaps(codec, srcs[i]));
14205		if (type != AC_WID_AUD_OUT)
14206			continue;
14207		for (j = 0; j < spec->multiout.num_dacs; j++)
14208			if (spec->multiout.dac_nids[j] == srcs[i])
14209				break;
14210		if (j >= spec->multiout.num_dacs)
14211			return srcs[i];
14212	}
14213	return 0;
14214}
14215
14216/* fill in the dac_nids table from the parsed pin configuration */
14217static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
14218				     const struct auto_pin_cfg *cfg)
14219{
14220	struct alc_spec *spec = codec->spec;
14221	int i;
14222	hda_nid_t nid, dac;
14223
14224	spec->multiout.dac_nids = spec->private_dac_nids;
14225	for (i = 0; i < cfg->line_outs; i++) {
14226		nid = cfg->line_out_pins[i];
14227		dac = alc861_look_for_dac(codec, nid);
14228		if (!dac)
14229			continue;
14230		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
14231	}
14232	return 0;
14233}
14234
14235static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
14236				hda_nid_t nid, unsigned int chs)
14237{
14238	char name[32];
14239	snprintf(name, sizeof(name), "%s Playback Switch", pfx);
14240	return add_control(codec->spec, ALC_CTL_WIDGET_MUTE, name,
14241			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
14242}
14243
14244/* add playback controls from the parsed DAC table */
14245static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
14246					     const struct auto_pin_cfg *cfg)
14247{
14248	struct alc_spec *spec = codec->spec;
14249	static const char *chname[4] = {
14250		"Front", "Surround", NULL /*CLFE*/, "Side"
14251	};
14252	hda_nid_t nid;
14253	int i, err;
14254
14255	if (cfg->line_outs == 1) {
14256		const char *pfx = NULL;
14257		if (!cfg->hp_outs)
14258			pfx = "Master";
14259		else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
14260			pfx = "Speaker";
14261		if (pfx) {
14262			nid = spec->multiout.dac_nids[0];
14263			return alc861_create_out_sw(codec, pfx, nid, 3);
14264		}
14265	}
14266
14267	for (i = 0; i < cfg->line_outs; i++) {
14268		nid = spec->multiout.dac_nids[i];
14269		if (!nid)
14270			continue;
14271		if (i == 2) {
14272			/* Center/LFE */
14273			err = alc861_create_out_sw(codec, "Center", nid, 1);
14274			if (err < 0)
14275				return err;
14276			err = alc861_create_out_sw(codec, "LFE", nid, 2);
14277			if (err < 0)
14278				return err;
14279		} else {
14280			err = alc861_create_out_sw(codec, chname[i], nid, 3);
14281			if (err < 0)
14282				return err;
14283		}
14284	}
14285	return 0;
14286}
14287
14288static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
14289{
14290	struct alc_spec *spec = codec->spec;
14291	int err;
14292	hda_nid_t nid;
14293
14294	if (!pin)
14295		return 0;
14296
14297	if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
14298		nid = alc861_look_for_dac(codec, pin);
14299		if (nid) {
14300			err = alc861_create_out_sw(codec, "Headphone", nid, 3);
14301			if (err < 0)
14302				return err;
14303			spec->multiout.hp_nid = nid;
14304		}
14305	}
14306	return 0;
14307}
14308
14309/* create playback/capture controls for input pins */
14310static int alc861_auto_create_input_ctls(struct hda_codec *codec,
14311						const struct auto_pin_cfg *cfg)
14312{
14313	return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
14314}
14315
14316static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
14317					      hda_nid_t nid,
14318					      int pin_type, hda_nid_t dac)
14319{
14320	hda_nid_t mix, srcs[5];
14321	int i, num;
14322
14323	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
14324			    pin_type);
14325	snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
14326			    AMP_OUT_UNMUTE);
14327	if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
14328		return;
14329	num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14330	if (num < 0)
14331		return;
14332	for (i = 0; i < num; i++) {
14333		unsigned int mute;
14334		if (srcs[i] == dac || srcs[i] == 0x15)
14335			mute = AMP_IN_UNMUTE(i);
14336		else
14337			mute = AMP_IN_MUTE(i);
14338		snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
14339				    mute);
14340	}
14341}
14342
14343static void alc861_auto_init_multi_out(struct hda_codec *codec)
14344{
14345	struct alc_spec *spec = codec->spec;
14346	int i;
14347
14348	for (i = 0; i < spec->autocfg.line_outs; i++) {
14349		hda_nid_t nid = spec->autocfg.line_out_pins[i];
14350		int pin_type = get_pin_type(spec->autocfg.line_out_type);
14351		if (nid)
14352			alc861_auto_set_output_and_unmute(codec, nid, pin_type,
14353							  spec->multiout.dac_nids[i]);
14354	}
14355}
14356
14357static void alc861_auto_init_hp_out(struct hda_codec *codec)
14358{
14359	struct alc_spec *spec = codec->spec;
14360	hda_nid_t pin;
14361
14362	pin = spec->autocfg.hp_pins[0];
14363	if (pin)
14364		alc861_auto_set_output_and_unmute(codec, pin, PIN_HP,
14365						  spec->multiout.hp_nid);
14366	pin = spec->autocfg.speaker_pins[0];
14367	if (pin)
14368		alc861_auto_set_output_and_unmute(codec, pin, PIN_OUT,
14369						  spec->multiout.dac_nids[0]);
14370}
14371
14372static void alc861_auto_init_analog_input(struct hda_codec *codec)
14373{
14374	struct alc_spec *spec = codec->spec;
14375	int i;
14376
14377	for (i = 0; i < AUTO_PIN_LAST; i++) {
14378		hda_nid_t nid = spec->autocfg.input_pins[i];
14379		if (nid >= 0x0c && nid <= 0x11)
14380			alc_set_input_pin(codec, nid, i);
14381	}
14382}
14383
14384/* parse the BIOS configuration and set up the alc_spec */
14385/* return 1 if successful, 0 if the proper config is not found,
14386 * or a negative error code
14387 */
14388static int alc861_parse_auto_config(struct hda_codec *codec)
14389{
14390	struct alc_spec *spec = codec->spec;
14391	int err;
14392	static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
14393
14394	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14395					   alc861_ignore);
14396	if (err < 0)
14397		return err;
14398	if (!spec->autocfg.line_outs)
14399		return 0; /* can't find valid BIOS pin config */
14400
14401	err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
14402	if (err < 0)
14403		return err;
14404	err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
14405	if (err < 0)
14406		return err;
14407	err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
14408	if (err < 0)
14409		return err;
14410	err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
14411	if (err < 0)
14412		return err;
14413
14414	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
14415
14416	if (spec->autocfg.dig_outs)
14417		spec->multiout.dig_out_nid = ALC861_DIGOUT_NID;
14418
14419	if (spec->kctls.list)
14420		add_mixer(spec, spec->kctls.list);
14421
14422	add_verb(spec, alc861_auto_init_verbs);
14423
14424	spec->num_mux_defs = 1;
14425	spec->input_mux = &spec->private_imux[0];
14426
14427	spec->adc_nids = alc861_adc_nids;
14428	spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
14429	set_capture_mixer(codec);
14430
14431	alc_ssid_check(codec, 0x0e, 0x0f, 0x0b);
14432
14433	return 1;
14434}
14435
14436/* additional initialization for auto-configuration model */
14437static void alc861_auto_init(struct hda_codec *codec)
14438{
14439	struct alc_spec *spec = codec->spec;
14440	alc861_auto_init_multi_out(codec);
14441	alc861_auto_init_hp_out(codec);
14442	alc861_auto_init_analog_input(codec);
14443	if (spec->unsol_event)
14444		alc_inithook(codec);
14445}
14446
14447#ifdef CONFIG_SND_HDA_POWER_SAVE
14448static struct hda_amp_list alc861_loopbacks[] = {
14449	{ 0x15, HDA_INPUT, 0 },
14450	{ 0x15, HDA_INPUT, 1 },
14451	{ 0x15, HDA_INPUT, 2 },
14452	{ 0x15, HDA_INPUT, 3 },
14453	{ } /* end */
14454};
14455#endif
14456
14457
14458/*
14459 * configuration and preset
14460 */
14461static const char *alc861_models[ALC861_MODEL_LAST] = {
14462	[ALC861_3ST]		= "3stack",
14463	[ALC660_3ST]		= "3stack-660",
14464	[ALC861_3ST_DIG]	= "3stack-dig",
14465	[ALC861_6ST_DIG]	= "6stack-dig",
14466	[ALC861_UNIWILL_M31]	= "uniwill-m31",
14467	[ALC861_TOSHIBA]	= "toshiba",
14468	[ALC861_ASUS]		= "asus",
14469	[ALC861_ASUS_LAPTOP]	= "asus-laptop",
14470	[ALC861_AUTO]		= "auto",
14471};
14472
14473static struct snd_pci_quirk alc861_cfg_tbl[] = {
14474	SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
14475	SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
14476	SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
14477	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
14478	SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
14479	SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
14480	SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
14481	/* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
14482	 *        Any other models that need this preset?
14483	 */
14484	/* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
14485	SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
14486	SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
14487	SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
14488	SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
14489	SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
14490	/* FIXME: the below seems conflict */
14491	/* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
14492	SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
14493	SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
14494	{}
14495};
14496
14497static struct alc_config_preset alc861_presets[] = {
14498	[ALC861_3ST] = {
14499		.mixers = { alc861_3ST_mixer },
14500		.init_verbs = { alc861_threestack_init_verbs },
14501		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
14502		.dac_nids = alc861_dac_nids,
14503		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14504		.channel_mode = alc861_threestack_modes,
14505		.need_dac_fix = 1,
14506		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14507		.adc_nids = alc861_adc_nids,
14508		.input_mux = &alc861_capture_source,
14509	},
14510	[ALC861_3ST_DIG] = {
14511		.mixers = { alc861_base_mixer },
14512		.init_verbs = { alc861_threestack_init_verbs },
14513		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
14514		.dac_nids = alc861_dac_nids,
14515		.dig_out_nid = ALC861_DIGOUT_NID,
14516		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14517		.channel_mode = alc861_threestack_modes,
14518		.need_dac_fix = 1,
14519		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14520		.adc_nids = alc861_adc_nids,
14521		.input_mux = &alc861_capture_source,
14522	},
14523	[ALC861_6ST_DIG] = {
14524		.mixers = { alc861_base_mixer },
14525		.init_verbs = { alc861_base_init_verbs },
14526		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
14527		.dac_nids = alc861_dac_nids,
14528		.dig_out_nid = ALC861_DIGOUT_NID,
14529		.num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
14530		.channel_mode = alc861_8ch_modes,
14531		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14532		.adc_nids = alc861_adc_nids,
14533		.input_mux = &alc861_capture_source,
14534	},
14535	[ALC660_3ST] = {
14536		.mixers = { alc861_3ST_mixer },
14537		.init_verbs = { alc861_threestack_init_verbs },
14538		.num_dacs = ARRAY_SIZE(alc660_dac_nids),
14539		.dac_nids = alc660_dac_nids,
14540		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14541		.channel_mode = alc861_threestack_modes,
14542		.need_dac_fix = 1,
14543		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14544		.adc_nids = alc861_adc_nids,
14545		.input_mux = &alc861_capture_source,
14546	},
14547	[ALC861_UNIWILL_M31] = {
14548		.mixers = { alc861_uniwill_m31_mixer },
14549		.init_verbs = { alc861_uniwill_m31_init_verbs },
14550		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
14551		.dac_nids = alc861_dac_nids,
14552		.dig_out_nid = ALC861_DIGOUT_NID,
14553		.num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
14554		.channel_mode = alc861_uniwill_m31_modes,
14555		.need_dac_fix = 1,
14556		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14557		.adc_nids = alc861_adc_nids,
14558		.input_mux = &alc861_capture_source,
14559	},
14560	[ALC861_TOSHIBA] = {
14561		.mixers = { alc861_toshiba_mixer },
14562		.init_verbs = { alc861_base_init_verbs,
14563				alc861_toshiba_init_verbs },
14564		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
14565		.dac_nids = alc861_dac_nids,
14566		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
14567		.channel_mode = alc883_3ST_2ch_modes,
14568		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14569		.adc_nids = alc861_adc_nids,
14570		.input_mux = &alc861_capture_source,
14571		.unsol_event = alc861_toshiba_unsol_event,
14572		.init_hook = alc861_toshiba_automute,
14573	},
14574	[ALC861_ASUS] = {
14575		.mixers = { alc861_asus_mixer },
14576		.init_verbs = { alc861_asus_init_verbs },
14577		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
14578		.dac_nids = alc861_dac_nids,
14579		.dig_out_nid = ALC861_DIGOUT_NID,
14580		.num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
14581		.channel_mode = alc861_asus_modes,
14582		.need_dac_fix = 1,
14583		.hp_nid = 0x06,
14584		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14585		.adc_nids = alc861_adc_nids,
14586		.input_mux = &alc861_capture_source,
14587	},
14588	[ALC861_ASUS_LAPTOP] = {
14589		.mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
14590		.init_verbs = { alc861_asus_init_verbs,
14591				alc861_asus_laptop_init_verbs },
14592		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
14593		.dac_nids = alc861_dac_nids,
14594		.dig_out_nid = ALC861_DIGOUT_NID,
14595		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
14596		.channel_mode = alc883_3ST_2ch_modes,
14597		.need_dac_fix = 1,
14598		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14599		.adc_nids = alc861_adc_nids,
14600		.input_mux = &alc861_capture_source,
14601	},
14602};
14603
14604
14605static int patch_alc861(struct hda_codec *codec)
14606{
14607	struct alc_spec *spec;
14608	int board_config;
14609	int err;
14610
14611	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14612	if (spec == NULL)
14613		return -ENOMEM;
14614
14615	codec->spec = spec;
14616
14617        board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
14618						  alc861_models,
14619						  alc861_cfg_tbl);
14620
14621	if (board_config < 0) {
14622		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14623		       codec->chip_name);
14624		board_config = ALC861_AUTO;
14625	}
14626
14627	if (board_config == ALC861_AUTO) {
14628		/* automatic parse from the BIOS config */
14629		err = alc861_parse_auto_config(codec);
14630		if (err < 0) {
14631			alc_free(codec);
14632			return err;
14633		} else if (!err) {
14634			printk(KERN_INFO
14635			       "hda_codec: Cannot set up configuration "
14636			       "from BIOS.  Using base mode...\n");
14637		   board_config = ALC861_3ST_DIG;
14638		}
14639	}
14640
14641	err = snd_hda_attach_beep_device(codec, 0x23);
14642	if (err < 0) {
14643		alc_free(codec);
14644		return err;
14645	}
14646
14647	if (board_config != ALC861_AUTO)
14648		setup_preset(codec, &alc861_presets[board_config]);
14649
14650	spec->stream_analog_playback = &alc861_pcm_analog_playback;
14651	spec->stream_analog_capture = &alc861_pcm_analog_capture;
14652
14653	spec->stream_digital_playback = &alc861_pcm_digital_playback;
14654	spec->stream_digital_capture = &alc861_pcm_digital_capture;
14655
14656	set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
14657
14658	spec->vmaster_nid = 0x03;
14659
14660	codec->patch_ops = alc_patch_ops;
14661	if (board_config == ALC861_AUTO)
14662		spec->init_hook = alc861_auto_init;
14663#ifdef CONFIG_SND_HDA_POWER_SAVE
14664	if (!spec->loopback.amplist)
14665		spec->loopback.amplist = alc861_loopbacks;
14666#endif
14667	codec->proc_widget_hook = print_realtek_coef;
14668
14669	return 0;
14670}
14671
14672/*
14673 * ALC861-VD support
14674 *
14675 * Based on ALC882
14676 *
14677 * In addition, an independent DAC
14678 */
14679#define ALC861VD_DIGOUT_NID	0x06
14680
14681static hda_nid_t alc861vd_dac_nids[4] = {
14682	/* front, surr, clfe, side surr */
14683	0x02, 0x03, 0x04, 0x05
14684};
14685
14686/* dac_nids for ALC660vd are in a different order - according to
14687 * Realtek's driver.
14688 * This should probably result in a different mixer for 6stack models
14689 * of ALC660vd codecs, but for now there is only 3stack mixer
14690 * - and it is the same as in 861vd.
14691 * adc_nids in ALC660vd are (is) the same as in 861vd
14692 */
14693static hda_nid_t alc660vd_dac_nids[3] = {
14694	/* front, rear, clfe, rear_surr */
14695	0x02, 0x04, 0x03
14696};
14697
14698static hda_nid_t alc861vd_adc_nids[1] = {
14699	/* ADC0 */
14700	0x09,
14701};
14702
14703static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
14704
14705/* input MUX */
14706/* FIXME: should be a matrix-type input source selection */
14707static struct hda_input_mux alc861vd_capture_source = {
14708	.num_items = 4,
14709	.items = {
14710		{ "Mic", 0x0 },
14711		{ "Front Mic", 0x1 },
14712		{ "Line", 0x2 },
14713		{ "CD", 0x4 },
14714	},
14715};
14716
14717static struct hda_input_mux alc861vd_dallas_capture_source = {
14718	.num_items = 2,
14719	.items = {
14720		{ "Ext Mic", 0x0 },
14721		{ "Int Mic", 0x1 },
14722	},
14723};
14724
14725static struct hda_input_mux alc861vd_hp_capture_source = {
14726	.num_items = 2,
14727	.items = {
14728		{ "Front Mic", 0x0 },
14729		{ "ATAPI Mic", 0x1 },
14730	},
14731};
14732
14733/*
14734 * 2ch mode
14735 */
14736static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
14737	{ 2, NULL }
14738};
14739
14740/*
14741 * 6ch mode
14742 */
14743static struct hda_verb alc861vd_6stack_ch6_init[] = {
14744	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14745	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14746	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14747	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14748	{ } /* end */
14749};
14750
14751/*
14752 * 8ch mode
14753 */
14754static struct hda_verb alc861vd_6stack_ch8_init[] = {
14755	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14756	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14757	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14758	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
14759	{ } /* end */
14760};
14761
14762static struct hda_channel_mode alc861vd_6stack_modes[2] = {
14763	{ 6, alc861vd_6stack_ch6_init },
14764	{ 8, alc861vd_6stack_ch8_init },
14765};
14766
14767static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
14768	{
14769		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14770		.name = "Channel Mode",
14771		.info = alc_ch_mode_info,
14772		.get = alc_ch_mode_get,
14773		.put = alc_ch_mode_put,
14774	},
14775	{ } /* end */
14776};
14777
14778/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
14779 *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
14780 */
14781static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
14782	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14783	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
14784
14785	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
14786	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
14787
14788	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
14789				HDA_OUTPUT),
14790	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
14791				HDA_OUTPUT),
14792	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
14793	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
14794
14795	HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
14796	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
14797
14798	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
14799
14800	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
14801	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14802	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14803
14804	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
14805	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14806	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
14807
14808	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
14809	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
14810
14811	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
14812	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
14813
14814	{ } /* end */
14815};
14816
14817static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
14818	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14819	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
14820
14821	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
14822
14823	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
14824	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14825	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14826
14827	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
14828	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14829	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
14830
14831	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
14832	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
14833
14834	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
14835	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
14836
14837	{ } /* end */
14838};
14839
14840static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
14841	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14842	/*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
14843	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
14844
14845	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
14846
14847	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
14848	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14849	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14850
14851	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
14852	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14853	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
14854
14855	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
14856	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
14857
14858	{ } /* end */
14859};
14860
14861/* Pin assignment: Speaker=0x14, HP = 0x15,
14862 *                 Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
14863 */
14864static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
14865	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14866	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
14867	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
14868	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
14869	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
14870	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14871	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14872	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
14873	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14874	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
14875	{ } /* end */
14876};
14877
14878/* Pin assignment: Speaker=0x14, Line-out = 0x15,
14879 *                 Front Mic=0x18, ATAPI Mic = 0x19,
14880 */
14881static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
14882	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14883	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
14884	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
14885	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
14886	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14887	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14888	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
14889	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
14890
14891	{ } /* end */
14892};
14893
14894/*
14895 * generic initialization of ADC, input mixers and output mixers
14896 */
14897static struct hda_verb alc861vd_volume_init_verbs[] = {
14898	/*
14899	 * Unmute ADC0 and set the default input to mic-in
14900	 */
14901	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
14902	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14903
14904	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
14905	 * the analog-loopback mixer widget
14906	 */
14907	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
14908	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14909	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14910	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14911	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14912	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
14913
14914	/* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
14915	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14916	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14917	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14918	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
14919
14920	/*
14921	 * Set up output mixers (0x02 - 0x05)
14922	 */
14923	/* set vol=0 to output mixers */
14924	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14925	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14926	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14927	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14928
14929	/* set up input amps for analog loopback */
14930	/* Amp Indices: DAC = 0, mixer = 1 */
14931	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14932	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14933	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14934	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14935	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14936	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14937	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14938	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14939
14940	{ }
14941};
14942
14943/*
14944 * 3-stack pin configuration:
14945 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
14946 */
14947static struct hda_verb alc861vd_3stack_init_verbs[] = {
14948	/*
14949	 * Set pin mode and muting
14950	 */
14951	/* set front pin widgets 0x14 for output */
14952	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14953	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14954	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
14955
14956	/* Mic (rear) pin: input vref at 80% */
14957	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14958	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14959	/* Front Mic pin: input vref at 80% */
14960	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14961	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14962	/* Line In pin: input */
14963	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14964	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14965	/* Line-2 In: Headphone output (output 0 - 0x0c) */
14966	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14967	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14968	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
14969	/* CD pin widget for input */
14970	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14971
14972	{ }
14973};
14974
14975/*
14976 * 6-stack pin configuration:
14977 */
14978static struct hda_verb alc861vd_6stack_init_verbs[] = {
14979	/*
14980	 * Set pin mode and muting
14981	 */
14982	/* set front pin widgets 0x14 for output */
14983	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14984	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14985	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
14986
14987	/* Rear Pin: output 1 (0x0d) */
14988	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14989	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14990	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14991	/* CLFE Pin: output 2 (0x0e) */
14992	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14993	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14994	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
14995	/* Side Pin: output 3 (0x0f) */
14996	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14997	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14998	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
14999
15000	/* Mic (rear) pin: input vref at 80% */
15001	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15002	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15003	/* Front Mic pin: input vref at 80% */
15004	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15005	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15006	/* Line In pin: input */
15007	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15008	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15009	/* Line-2 In: Headphone output (output 0 - 0x0c) */
15010	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15011	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15012	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15013	/* CD pin widget for input */
15014	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15015
15016	{ }
15017};
15018
15019static struct hda_verb alc861vd_eapd_verbs[] = {
15020	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15021	{ }
15022};
15023
15024static struct hda_verb alc660vd_eapd_verbs[] = {
15025	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15026	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
15027	{ }
15028};
15029
15030static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
15031	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15032	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15033	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
15034	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15035	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
15036	{}
15037};
15038
15039static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
15040{
15041	unsigned int present;
15042	unsigned char bits;
15043
15044	present = snd_hda_codec_read(codec, 0x18, 0,
15045				     AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
15046	bits = present ? HDA_AMP_MUTE : 0;
15047	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
15048				 HDA_AMP_MUTE, bits);
15049}
15050
15051static void alc861vd_lenovo_setup(struct hda_codec *codec)
15052{
15053	struct alc_spec *spec = codec->spec;
15054	spec->autocfg.hp_pins[0] = 0x1b;
15055	spec->autocfg.speaker_pins[0] = 0x14;
15056}
15057
15058static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
15059{
15060	alc_automute_amp(codec);
15061	alc861vd_lenovo_mic_automute(codec);
15062}
15063
15064static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
15065					unsigned int res)
15066{
15067	switch (res >> 26) {
15068	case ALC880_MIC_EVENT:
15069		alc861vd_lenovo_mic_automute(codec);
15070		break;
15071	default:
15072		alc_automute_amp_unsol_event(codec, res);
15073		break;
15074	}
15075}
15076
15077static struct hda_verb alc861vd_dallas_verbs[] = {
15078	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15079	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15080	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15081	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15082
15083	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15084	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15085	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15086	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15087	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15088	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15089	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15090	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15091
15092	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15093	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15094	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15095	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15096	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15097	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15098	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15099	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15100
15101	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15102	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15103	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15104	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15105	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15106	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15107	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15108	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15109
15110	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15111	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15112	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15113	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15114
15115	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15116	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15117	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15118
15119	{ } /* end */
15120};
15121
15122/* toggle speaker-output according to the hp-jack state */
15123static void alc861vd_dallas_setup(struct hda_codec *codec)
15124{
15125	struct alc_spec *spec = codec->spec;
15126
15127	spec->autocfg.hp_pins[0] = 0x15;
15128	spec->autocfg.speaker_pins[0] = 0x14;
15129}
15130
15131#ifdef CONFIG_SND_HDA_POWER_SAVE
15132#define alc861vd_loopbacks	alc880_loopbacks
15133#endif
15134
15135/* pcm configuration: identical with ALC880 */
15136#define alc861vd_pcm_analog_playback	alc880_pcm_analog_playback
15137#define alc861vd_pcm_analog_capture	alc880_pcm_analog_capture
15138#define alc861vd_pcm_digital_playback	alc880_pcm_digital_playback
15139#define alc861vd_pcm_digital_capture	alc880_pcm_digital_capture
15140
15141/*
15142 * configuration and preset
15143 */
15144static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
15145	[ALC660VD_3ST]		= "3stack-660",
15146	[ALC660VD_3ST_DIG]	= "3stack-660-digout",
15147	[ALC660VD_ASUS_V1S]	= "asus-v1s",
15148	[ALC861VD_3ST]		= "3stack",
15149	[ALC861VD_3ST_DIG]	= "3stack-digout",
15150	[ALC861VD_6ST_DIG]	= "6stack-digout",
15151	[ALC861VD_LENOVO]	= "lenovo",
15152	[ALC861VD_DALLAS]	= "dallas",
15153	[ALC861VD_HP]		= "hp",
15154	[ALC861VD_AUTO]		= "auto",
15155};
15156
15157static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
15158	SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
15159	SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
15160	SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
15161	SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),
15162	SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
15163	SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
15164	SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
15165	SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
15166	/*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
15167	SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
15168	SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
15169	SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
15170	SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
15171	SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
15172	SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
15173	{}
15174};
15175
15176static struct alc_config_preset alc861vd_presets[] = {
15177	[ALC660VD_3ST] = {
15178		.mixers = { alc861vd_3st_mixer },
15179		.init_verbs = { alc861vd_volume_init_verbs,
15180				 alc861vd_3stack_init_verbs },
15181		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15182		.dac_nids = alc660vd_dac_nids,
15183		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15184		.channel_mode = alc861vd_3stack_2ch_modes,
15185		.input_mux = &alc861vd_capture_source,
15186	},
15187	[ALC660VD_3ST_DIG] = {
15188		.mixers = { alc861vd_3st_mixer },
15189		.init_verbs = { alc861vd_volume_init_verbs,
15190				 alc861vd_3stack_init_verbs },
15191		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15192		.dac_nids = alc660vd_dac_nids,
15193		.dig_out_nid = ALC861VD_DIGOUT_NID,
15194		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15195		.channel_mode = alc861vd_3stack_2ch_modes,
15196		.input_mux = &alc861vd_capture_source,
15197	},
15198	[ALC861VD_3ST] = {
15199		.mixers = { alc861vd_3st_mixer },
15200		.init_verbs = { alc861vd_volume_init_verbs,
15201				 alc861vd_3stack_init_verbs },
15202		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15203		.dac_nids = alc861vd_dac_nids,
15204		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15205		.channel_mode = alc861vd_3stack_2ch_modes,
15206		.input_mux = &alc861vd_capture_source,
15207	},
15208	[ALC861VD_3ST_DIG] = {
15209		.mixers = { alc861vd_3st_mixer },
15210		.init_verbs = { alc861vd_volume_init_verbs,
15211		 		 alc861vd_3stack_init_verbs },
15212		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15213		.dac_nids = alc861vd_dac_nids,
15214		.dig_out_nid = ALC861VD_DIGOUT_NID,
15215		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15216		.channel_mode = alc861vd_3stack_2ch_modes,
15217		.input_mux = &alc861vd_capture_source,
15218	},
15219	[ALC861VD_6ST_DIG] = {
15220		.mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
15221		.init_verbs = { alc861vd_volume_init_verbs,
15222				alc861vd_6stack_init_verbs },
15223		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15224		.dac_nids = alc861vd_dac_nids,
15225		.dig_out_nid = ALC861VD_DIGOUT_NID,
15226		.num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
15227		.channel_mode = alc861vd_6stack_modes,
15228		.input_mux = &alc861vd_capture_source,
15229	},
15230	[ALC861VD_LENOVO] = {
15231		.mixers = { alc861vd_lenovo_mixer },
15232		.init_verbs = { alc861vd_volume_init_verbs,
15233				alc861vd_3stack_init_verbs,
15234				alc861vd_eapd_verbs,
15235				alc861vd_lenovo_unsol_verbs },
15236		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15237		.dac_nids = alc660vd_dac_nids,
15238		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15239		.channel_mode = alc861vd_3stack_2ch_modes,
15240		.input_mux = &alc861vd_capture_source,
15241		.unsol_event = alc861vd_lenovo_unsol_event,
15242		.setup = alc861vd_lenovo_setup,
15243		.init_hook = alc861vd_lenovo_init_hook,
15244	},
15245	[ALC861VD_DALLAS] = {
15246		.mixers = { alc861vd_dallas_mixer },
15247		.init_verbs = { alc861vd_dallas_verbs },
15248		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15249		.dac_nids = alc861vd_dac_nids,
15250		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15251		.channel_mode = alc861vd_3stack_2ch_modes,
15252		.input_mux = &alc861vd_dallas_capture_source,
15253		.unsol_event = alc_automute_amp_unsol_event,
15254		.setup = alc861vd_dallas_setup,
15255		.init_hook = alc_automute_amp,
15256	},
15257	[ALC861VD_HP] = {
15258		.mixers = { alc861vd_hp_mixer },
15259		.init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
15260		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15261		.dac_nids = alc861vd_dac_nids,
15262		.dig_out_nid = ALC861VD_DIGOUT_NID,
15263		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15264		.channel_mode = alc861vd_3stack_2ch_modes,
15265		.input_mux = &alc861vd_hp_capture_source,
15266		.unsol_event = alc_automute_amp_unsol_event,
15267		.setup = alc861vd_dallas_setup,
15268		.init_hook = alc_automute_amp,
15269	},
15270	[ALC660VD_ASUS_V1S] = {
15271		.mixers = { alc861vd_lenovo_mixer },
15272		.init_verbs = { alc861vd_volume_init_verbs,
15273				alc861vd_3stack_init_verbs,
15274				alc861vd_eapd_verbs,
15275				alc861vd_lenovo_unsol_verbs },
15276		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15277		.dac_nids = alc660vd_dac_nids,
15278		.dig_out_nid = ALC861VD_DIGOUT_NID,
15279		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15280		.channel_mode = alc861vd_3stack_2ch_modes,
15281		.input_mux = &alc861vd_capture_source,
15282		.unsol_event = alc861vd_lenovo_unsol_event,
15283		.setup = alc861vd_lenovo_setup,
15284		.init_hook = alc861vd_lenovo_init_hook,
15285	},
15286};
15287
15288/*
15289 * BIOS auto configuration
15290 */
15291static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
15292						const struct auto_pin_cfg *cfg)
15293{
15294	return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
15295}
15296
15297
15298static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
15299				hda_nid_t nid, int pin_type, int dac_idx)
15300{
15301	alc_set_pin_output(codec, nid, pin_type);
15302}
15303
15304static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
15305{
15306	struct alc_spec *spec = codec->spec;
15307	int i;
15308
15309	for (i = 0; i <= HDA_SIDE; i++) {
15310		hda_nid_t nid = spec->autocfg.line_out_pins[i];
15311		int pin_type = get_pin_type(spec->autocfg.line_out_type);
15312		if (nid)
15313			alc861vd_auto_set_output_and_unmute(codec, nid,
15314							    pin_type, i);
15315	}
15316}
15317
15318
15319static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
15320{
15321	struct alc_spec *spec = codec->spec;
15322	hda_nid_t pin;
15323
15324	pin = spec->autocfg.hp_pins[0];
15325	if (pin) /* connect to front and use dac 0 */
15326		alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
15327	pin = spec->autocfg.speaker_pins[0];
15328	if (pin)
15329		alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
15330}
15331
15332#define ALC861VD_PIN_CD_NID		ALC880_PIN_CD_NID
15333
15334static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
15335{
15336	struct alc_spec *spec = codec->spec;
15337	int i;
15338
15339	for (i = 0; i < AUTO_PIN_LAST; i++) {
15340		hda_nid_t nid = spec->autocfg.input_pins[i];
15341		if (alc_is_input_pin(codec, nid)) {
15342			alc_set_input_pin(codec, nid, i);
15343			if (nid != ALC861VD_PIN_CD_NID &&
15344			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
15345				snd_hda_codec_write(codec, nid, 0,
15346						AC_VERB_SET_AMP_GAIN_MUTE,
15347						AMP_OUT_MUTE);
15348		}
15349	}
15350}
15351
15352#define alc861vd_auto_init_input_src	alc882_auto_init_input_src
15353
15354#define alc861vd_idx_to_mixer_vol(nid)		((nid) + 0x02)
15355#define alc861vd_idx_to_mixer_switch(nid)	((nid) + 0x0c)
15356
15357/* add playback controls from the parsed DAC table */
15358/* Based on ALC880 version. But ALC861VD has separate,
15359 * different NIDs for mute/unmute switch and volume control */
15360static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
15361					     const struct auto_pin_cfg *cfg)
15362{
15363	char name[32];
15364	static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
15365	hda_nid_t nid_v, nid_s;
15366	int i, err;
15367
15368	for (i = 0; i < cfg->line_outs; i++) {
15369		if (!spec->multiout.dac_nids[i])
15370			continue;
15371		nid_v = alc861vd_idx_to_mixer_vol(
15372				alc880_dac_to_idx(
15373					spec->multiout.dac_nids[i]));
15374		nid_s = alc861vd_idx_to_mixer_switch(
15375				alc880_dac_to_idx(
15376					spec->multiout.dac_nids[i]));
15377
15378		if (i == 2) {
15379			/* Center/LFE */
15380			err = add_control(spec, ALC_CTL_WIDGET_VOL,
15381					  "Center Playback Volume",
15382					  HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
15383							      HDA_OUTPUT));
15384			if (err < 0)
15385				return err;
15386			err = add_control(spec, ALC_CTL_WIDGET_VOL,
15387					  "LFE Playback Volume",
15388					  HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
15389							      HDA_OUTPUT));
15390			if (err < 0)
15391				return err;
15392			err = add_control(spec, ALC_CTL_BIND_MUTE,
15393					  "Center Playback Switch",
15394					  HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
15395							      HDA_INPUT));
15396			if (err < 0)
15397				return err;
15398			err = add_control(spec, ALC_CTL_BIND_MUTE,
15399					  "LFE Playback Switch",
15400					  HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
15401							      HDA_INPUT));
15402			if (err < 0)
15403				return err;
15404		} else {
15405			const char *pfx;
15406			if (cfg->line_outs == 1 &&
15407			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
15408				if (!cfg->hp_pins)
15409					pfx = "Speaker";
15410				else
15411					pfx = "PCM";
15412			} else
15413				pfx = chname[i];
15414			sprintf(name, "%s Playback Volume", pfx);
15415			err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
15416					  HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
15417							      HDA_OUTPUT));
15418			if (err < 0)
15419				return err;
15420			if (cfg->line_outs == 1 &&
15421			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
15422				pfx = "Speaker";
15423			sprintf(name, "%s Playback Switch", pfx);
15424			err = add_control(spec, ALC_CTL_BIND_MUTE, name,
15425					  HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
15426							      HDA_INPUT));
15427			if (err < 0)
15428				return err;
15429		}
15430	}
15431	return 0;
15432}
15433
15434/* add playback controls for speaker and HP outputs */
15435/* Based on ALC880 version. But ALC861VD has separate,
15436 * different NIDs for mute/unmute switch and volume control */
15437static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
15438					hda_nid_t pin, const char *pfx)
15439{
15440	hda_nid_t nid_v, nid_s;
15441	int err;
15442	char name[32];
15443
15444	if (!pin)
15445		return 0;
15446
15447	if (alc880_is_fixed_pin(pin)) {
15448		nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
15449		/* specify the DAC as the extra output */
15450		if (!spec->multiout.hp_nid)
15451			spec->multiout.hp_nid = nid_v;
15452		else
15453			spec->multiout.extra_out_nid[0] = nid_v;
15454		/* control HP volume/switch on the output mixer amp */
15455		nid_v = alc861vd_idx_to_mixer_vol(
15456				alc880_fixed_pin_idx(pin));
15457		nid_s = alc861vd_idx_to_mixer_switch(
15458				alc880_fixed_pin_idx(pin));
15459
15460		sprintf(name, "%s Playback Volume", pfx);
15461		err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
15462				  HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
15463		if (err < 0)
15464			return err;
15465		sprintf(name, "%s Playback Switch", pfx);
15466		err = add_control(spec, ALC_CTL_BIND_MUTE, name,
15467				  HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
15468		if (err < 0)
15469			return err;
15470	} else if (alc880_is_multi_pin(pin)) {
15471		/* set manual connection */
15472		/* we have only a switch on HP-out PIN */
15473		sprintf(name, "%s Playback Switch", pfx);
15474		err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
15475				  HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
15476		if (err < 0)
15477			return err;
15478	}
15479	return 0;
15480}
15481
15482/* parse the BIOS configuration and set up the alc_spec
15483 * return 1 if successful, 0 if the proper config is not found,
15484 * or a negative error code
15485 * Based on ALC880 version - had to change it to override
15486 * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
15487static int alc861vd_parse_auto_config(struct hda_codec *codec)
15488{
15489	struct alc_spec *spec = codec->spec;
15490	int err;
15491	static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
15492
15493	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15494					   alc861vd_ignore);
15495	if (err < 0)
15496		return err;
15497	if (!spec->autocfg.line_outs)
15498		return 0; /* can't find valid BIOS pin config */
15499
15500	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
15501	if (err < 0)
15502		return err;
15503	err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
15504	if (err < 0)
15505		return err;
15506	err = alc861vd_auto_create_extra_out(spec,
15507					     spec->autocfg.speaker_pins[0],
15508					     "Speaker");
15509	if (err < 0)
15510		return err;
15511	err = alc861vd_auto_create_extra_out(spec,
15512					     spec->autocfg.hp_pins[0],
15513					     "Headphone");
15514	if (err < 0)
15515		return err;
15516	err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
15517	if (err < 0)
15518		return err;
15519
15520	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15521
15522	if (spec->autocfg.dig_outs)
15523		spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID;
15524
15525	if (spec->kctls.list)
15526		add_mixer(spec, spec->kctls.list);
15527
15528	add_verb(spec, alc861vd_volume_init_verbs);
15529
15530	spec->num_mux_defs = 1;
15531	spec->input_mux = &spec->private_imux[0];
15532
15533	err = alc_auto_add_mic_boost(codec);
15534	if (err < 0)
15535		return err;
15536
15537	alc_ssid_check(codec, 0x15, 0x1b, 0x14);
15538
15539	return 1;
15540}
15541
15542/* additional initialization for auto-configuration model */
15543static void alc861vd_auto_init(struct hda_codec *codec)
15544{
15545	struct alc_spec *spec = codec->spec;
15546	alc861vd_auto_init_multi_out(codec);
15547	alc861vd_auto_init_hp_out(codec);
15548	alc861vd_auto_init_analog_input(codec);
15549	alc861vd_auto_init_input_src(codec);
15550	if (spec->unsol_event)
15551		alc_inithook(codec);
15552}
15553
15554static int patch_alc861vd(struct hda_codec *codec)
15555{
15556	struct alc_spec *spec;
15557	int err, board_config;
15558
15559	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
15560	if (spec == NULL)
15561		return -ENOMEM;
15562
15563	codec->spec = spec;
15564
15565	board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
15566						  alc861vd_models,
15567						  alc861vd_cfg_tbl);
15568
15569	if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
15570		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15571		       codec->chip_name);
15572		board_config = ALC861VD_AUTO;
15573	}
15574
15575	if (board_config == ALC861VD_AUTO) {
15576		/* automatic parse from the BIOS config */
15577		err = alc861vd_parse_auto_config(codec);
15578		if (err < 0) {
15579			alc_free(codec);
15580			return err;
15581		} else if (!err) {
15582			printk(KERN_INFO
15583			       "hda_codec: Cannot set up configuration "
15584			       "from BIOS.  Using base mode...\n");
15585			board_config = ALC861VD_3ST;
15586		}
15587	}
15588
15589	err = snd_hda_attach_beep_device(codec, 0x23);
15590	if (err < 0) {
15591		alc_free(codec);
15592		return err;
15593	}
15594
15595	if (board_config != ALC861VD_AUTO)
15596		setup_preset(codec, &alc861vd_presets[board_config]);
15597
15598	if (codec->vendor_id == 0x10ec0660) {
15599		/* always turn on EAPD */
15600		add_verb(spec, alc660vd_eapd_verbs);
15601	}
15602
15603	spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
15604	spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
15605
15606	spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
15607	spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
15608
15609	if (!spec->adc_nids) {
15610		spec->adc_nids = alc861vd_adc_nids;
15611		spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
15612	}
15613	if (!spec->capsrc_nids)
15614		spec->capsrc_nids = alc861vd_capsrc_nids;
15615
15616	set_capture_mixer(codec);
15617	set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
15618
15619	spec->vmaster_nid = 0x02;
15620
15621	codec->patch_ops = alc_patch_ops;
15622
15623	if (board_config == ALC861VD_AUTO)
15624		spec->init_hook = alc861vd_auto_init;
15625#ifdef CONFIG_SND_HDA_POWER_SAVE
15626	if (!spec->loopback.amplist)
15627		spec->loopback.amplist = alc861vd_loopbacks;
15628#endif
15629	codec->proc_widget_hook = print_realtek_coef;
15630
15631	return 0;
15632}
15633
15634/*
15635 * ALC662 support
15636 *
15637 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
15638 * configuration.  Each pin widget can choose any input DACs and a mixer.
15639 * Each ADC is connected from a mixer of all inputs.  This makes possible
15640 * 6-channel independent captures.
15641 *
15642 * In addition, an independent DAC for the multi-playback (not used in this
15643 * driver yet).
15644 */
15645#define ALC662_DIGOUT_NID	0x06
15646#define ALC662_DIGIN_NID	0x0a
15647
15648static hda_nid_t alc662_dac_nids[4] = {
15649	/* front, rear, clfe, rear_surr */
15650	0x02, 0x03, 0x04
15651};
15652
15653static hda_nid_t alc272_dac_nids[2] = {
15654	0x02, 0x03
15655};
15656
15657static hda_nid_t alc662_adc_nids[2] = {
15658	/* ADC1-2 */
15659	0x09, 0x08
15660};
15661
15662static hda_nid_t alc272_adc_nids[1] = {
15663	/* ADC1-2 */
15664	0x08,
15665};
15666
15667static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
15668static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
15669
15670
15671/* input MUX */
15672/* FIXME: should be a matrix-type input source selection */
15673static struct hda_input_mux alc662_capture_source = {
15674	.num_items = 4,
15675	.items = {
15676		{ "Mic", 0x0 },
15677		{ "Front Mic", 0x1 },
15678		{ "Line", 0x2 },
15679		{ "CD", 0x4 },
15680	},
15681};
15682
15683static struct hda_input_mux alc662_lenovo_101e_capture_source = {
15684	.num_items = 2,
15685	.items = {
15686		{ "Mic", 0x1 },
15687		{ "Line", 0x2 },
15688	},
15689};
15690
15691static struct hda_input_mux alc663_capture_source = {
15692	.num_items = 3,
15693	.items = {
15694		{ "Mic", 0x0 },
15695		{ "Front Mic", 0x1 },
15696		{ "Line", 0x2 },
15697	},
15698};
15699
15700#if 0 /* set to 1 for testing other input sources below */
15701static struct hda_input_mux alc272_nc10_capture_source = {
15702	.num_items = 16,
15703	.items = {
15704		{ "Autoselect Mic", 0x0 },
15705		{ "Internal Mic", 0x1 },
15706		{ "In-0x02", 0x2 },
15707		{ "In-0x03", 0x3 },
15708		{ "In-0x04", 0x4 },
15709		{ "In-0x05", 0x5 },
15710		{ "In-0x06", 0x6 },
15711		{ "In-0x07", 0x7 },
15712		{ "In-0x08", 0x8 },
15713		{ "In-0x09", 0x9 },
15714		{ "In-0x0a", 0x0a },
15715		{ "In-0x0b", 0x0b },
15716		{ "In-0x0c", 0x0c },
15717		{ "In-0x0d", 0x0d },
15718		{ "In-0x0e", 0x0e },
15719		{ "In-0x0f", 0x0f },
15720	},
15721};
15722#endif
15723
15724/*
15725 * 2ch mode
15726 */
15727static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
15728	{ 2, NULL }
15729};
15730
15731/*
15732 * 2ch mode
15733 */
15734static struct hda_verb alc662_3ST_ch2_init[] = {
15735	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
15736	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
15737	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
15738	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
15739	{ } /* end */
15740};
15741
15742/*
15743 * 6ch mode
15744 */
15745static struct hda_verb alc662_3ST_ch6_init[] = {
15746	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15747	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
15748	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
15749	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15750	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
15751	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
15752	{ } /* end */
15753};
15754
15755static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
15756	{ 2, alc662_3ST_ch2_init },
15757	{ 6, alc662_3ST_ch6_init },
15758};
15759
15760/*
15761 * 2ch mode
15762 */
15763static struct hda_verb alc662_sixstack_ch6_init[] = {
15764	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15765	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15766	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15767	{ } /* end */
15768};
15769
15770/*
15771 * 6ch mode
15772 */
15773static struct hda_verb alc662_sixstack_ch8_init[] = {
15774	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15775	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15776	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15777	{ } /* end */
15778};
15779
15780static struct hda_channel_mode alc662_5stack_modes[2] = {
15781	{ 2, alc662_sixstack_ch6_init },
15782	{ 6, alc662_sixstack_ch8_init },
15783};
15784
15785/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
15786 *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
15787 */
15788
15789static struct snd_kcontrol_new alc662_base_mixer[] = {
15790	/* output mixer control */
15791	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
15792	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
15793	HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
15794	HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
15795	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
15796	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
15797	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
15798	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
15799	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15800
15801	/*Input mixer control */
15802	HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
15803	HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
15804	HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
15805	HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
15806	HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
15807	HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
15808	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
15809	HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
15810	{ } /* end */
15811};
15812
15813static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
15814	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15815	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
15816	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15817	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15818	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15819	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15820	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15821	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15822	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15823	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15824	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15825	{ } /* end */
15826};
15827
15828static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
15829	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15830	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
15831	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15832	HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
15833	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
15834	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
15835	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
15836	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
15837	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15838	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15839	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15840	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15841	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15842	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15843	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15844	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15845	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15846	{ } /* end */
15847};
15848
15849static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
15850	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15851	HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
15852	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15853	HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
15854	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15855	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15856	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15857	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15858	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15859	{ } /* end */
15860};
15861
15862static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
15863	HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15864	ALC262_HIPPO_MASTER_SWITCH,
15865
15866	HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
15867	HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15868	HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15869
15870	HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
15871	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15872	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15873	{ } /* end */
15874};
15875
15876static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
15877	ALC262_HIPPO_MASTER_SWITCH,
15878	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15879	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15880	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
15881	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
15882	HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
15883	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15884	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15885	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15886	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15887	{ } /* end */
15888};
15889
15890static struct hda_bind_ctls alc663_asus_bind_master_vol = {
15891	.ops = &snd_hda_bind_vol,
15892	.values = {
15893		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
15894		HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
15895		0
15896	},
15897};
15898
15899static struct hda_bind_ctls alc663_asus_one_bind_switch = {
15900	.ops = &snd_hda_bind_sw,
15901	.values = {
15902		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
15903		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
15904		0
15905	},
15906};
15907
15908static struct snd_kcontrol_new alc663_m51va_mixer[] = {
15909	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
15910	HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
15911	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15912	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15913	{ } /* end */
15914};
15915
15916static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
15917	.ops = &snd_hda_bind_sw,
15918	.values = {
15919		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
15920		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
15921		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
15922		0
15923	},
15924};
15925
15926static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
15927	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
15928	HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
15929	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15930	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15931	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15932	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15933
15934	{ } /* end */
15935};
15936
15937static struct hda_bind_ctls alc663_asus_four_bind_switch = {
15938	.ops = &snd_hda_bind_sw,
15939	.values = {
15940		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
15941		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
15942		HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
15943		0
15944	},
15945};
15946
15947static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
15948	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
15949	HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
15950	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15951	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15952	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15953	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15954	{ } /* end */
15955};
15956
15957static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
15958	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15959	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
15960	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15961	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15962	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15963	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15964	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15965	{ } /* end */
15966};
15967
15968static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
15969	.ops = &snd_hda_bind_vol,
15970	.values = {
15971		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
15972		HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
15973		0
15974	},
15975};
15976
15977static struct hda_bind_ctls alc663_asus_two_bind_switch = {
15978	.ops = &snd_hda_bind_sw,
15979	.values = {
15980		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
15981		HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
15982		0
15983	},
15984};
15985
15986static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
15987	HDA_BIND_VOL("Master Playback Volume",
15988				&alc663_asus_two_bind_master_vol),
15989	HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
15990	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15991	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
15992	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15993	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15994	{ } /* end */
15995};
15996
15997static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
15998	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
15999	HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16000	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16001	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16002	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16003	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16004	{ } /* end */
16005};
16006
16007static struct snd_kcontrol_new alc663_g71v_mixer[] = {
16008	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16009	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16010	HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16011	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16012	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16013
16014	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16015	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16016	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16017	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16018	{ } /* end */
16019};
16020
16021static struct snd_kcontrol_new alc663_g50v_mixer[] = {
16022	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16023	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16024	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16025
16026	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16027	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16028	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16029	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16030	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16031	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16032	{ } /* end */
16033};
16034
16035static struct snd_kcontrol_new alc662_chmode_mixer[] = {
16036	{
16037		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
16038		.name = "Channel Mode",
16039		.info = alc_ch_mode_info,
16040		.get = alc_ch_mode_get,
16041		.put = alc_ch_mode_put,
16042	},
16043	{ } /* end */
16044};
16045
16046static struct hda_verb alc662_init_verbs[] = {
16047	/* ADC: mute amp left and right */
16048	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16049	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16050	/* Front mixer: unmute input/output amp left and right (volume = 0) */
16051
16052	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16053	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16054	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16055	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16056	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16057
16058	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16059	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16060	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16061	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16062	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16063	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16064
16065	/* Front Pin: output 0 (0x0c) */
16066	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16067	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16068
16069	/* Rear Pin: output 1 (0x0d) */
16070	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16071	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16072
16073	/* CLFE Pin: output 2 (0x0e) */
16074	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16075	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16076
16077	/* Mic (rear) pin: input vref at 80% */
16078	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16079	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16080	/* Front Mic pin: input vref at 80% */
16081	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16082	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16083	/* Line In pin: input */
16084	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16085	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16086	/* Line-2 In: Headphone output (output 0 - 0x0c) */
16087	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16088	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16089	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16090	/* CD pin widget for input */
16091	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16092
16093	/* FIXME: use matrix-type input source selection */
16094	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
16095	/* Input mixer */
16096	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16097	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16098
16099	/* always trun on EAPD */
16100	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16101	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16102
16103	{ }
16104};
16105
16106static struct hda_verb alc662_sue_init_verbs[] = {
16107	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16108	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
16109	{}
16110};
16111
16112static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
16113	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16114	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16115	{}
16116};
16117
16118/* Set Unsolicited Event*/
16119static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
16120	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16121	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16122	{}
16123};
16124
16125/*
16126 * generic initialization of ADC, input mixers and output mixers
16127 */
16128static struct hda_verb alc662_auto_init_verbs[] = {
16129	/*
16130	 * Unmute ADC and set the default input to mic-in
16131	 */
16132	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16133	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16134
16135	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
16136	 * mixer widget
16137	 * Note: PASD motherboards uses the Line In 2 as the input for front
16138	 * panel mic (mic 2)
16139	 */
16140	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
16141	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16142	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16143	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16144	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16145	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16146
16147	/*
16148	 * Set up output mixers (0x0c - 0x0f)
16149	 */
16150	/* set vol=0 to output mixers */
16151	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16152	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16153	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16154
16155	/* set up input amps for analog loopback */
16156	/* Amp Indices: DAC = 0, mixer = 1 */
16157	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16158	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16159	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16160	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16161	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16162	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16163
16164
16165	/* FIXME: use matrix-type input source selection */
16166	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
16167	/* Input mixer */
16168	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16169	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16170	{ }
16171};
16172
16173/* additional verbs for ALC663 */
16174static struct hda_verb alc663_auto_init_verbs[] = {
16175	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16176	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16177	{ }
16178};
16179
16180static struct hda_verb alc663_m51va_init_verbs[] = {
16181	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16182	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16183	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16184	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16185	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16186	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16187	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16188	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16189	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16190	{}
16191};
16192
16193static struct hda_verb alc663_21jd_amic_init_verbs[] = {
16194	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16195	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16196	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16197	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16198	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16199	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16200	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16201	{}
16202};
16203
16204static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
16205	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16206	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16207	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16208	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
16209	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16210	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16211	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16212	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16213	{}
16214};
16215
16216static struct hda_verb alc663_15jd_amic_init_verbs[] = {
16217	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16218	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16219	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16220	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16221	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16222	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16223	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16224	{}
16225};
16226
16227static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
16228	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16229	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16230	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16231	{0x21, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Headphone */
16232	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16233	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16234	{0x15, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Headphone */
16235	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16236	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16237	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16238	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16239	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16240	{}
16241};
16242
16243static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
16244	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16245	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16246	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16247	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16248	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16249	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16250	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16251	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16252	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16253	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16254	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16255	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16256	{}
16257};
16258
16259static struct hda_verb alc663_g71v_init_verbs[] = {
16260	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16261	/* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
16262	/* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
16263
16264	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16265	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16266	{0x21, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
16267
16268	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16269	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
16270	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
16271	{}
16272};
16273
16274static struct hda_verb alc663_g50v_init_verbs[] = {
16275	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16276	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16277	{0x21, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
16278
16279	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16280	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16281	{}
16282};
16283
16284static struct hda_verb alc662_ecs_init_verbs[] = {
16285	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
16286	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16287	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16288	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16289	{}
16290};
16291
16292static struct hda_verb alc272_dell_zm1_init_verbs[] = {
16293	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16294	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16295	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16296	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16297	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16298	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16299	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16300	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16301	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16302	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16303	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16304	{}
16305};
16306
16307static struct hda_verb alc272_dell_init_verbs[] = {
16308	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16309	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16310	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16311	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16312	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16313	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16314	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
16315	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16316	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16317	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16318	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16319	{}
16320};
16321
16322static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
16323	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
16324	HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
16325	{ } /* end */
16326};
16327
16328static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
16329	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
16330	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
16331	{ } /* end */
16332};
16333
16334static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
16335{
16336	unsigned int present;
16337	unsigned char bits;
16338
16339	present = snd_hda_codec_read(codec, 0x14, 0,
16340				     AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
16341	bits = present ? HDA_AMP_MUTE : 0;
16342	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16343				 HDA_AMP_MUTE, bits);
16344}
16345
16346static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
16347{
16348	unsigned int present;
16349	unsigned char bits;
16350
16351 	present = snd_hda_codec_read(codec, 0x1b, 0,
16352				     AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
16353	bits = present ? HDA_AMP_MUTE : 0;
16354	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16355				 HDA_AMP_MUTE, bits);
16356	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
16357				 HDA_AMP_MUTE, bits);
16358}
16359
16360static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
16361					   unsigned int res)
16362{
16363	if ((res >> 26) == ALC880_HP_EVENT)
16364		alc662_lenovo_101e_all_automute(codec);
16365	if ((res >> 26) == ALC880_FRONT_EVENT)
16366		alc662_lenovo_101e_ispeaker_automute(codec);
16367}
16368
16369/* unsolicited event for HP jack sensing */
16370static void alc662_eeepc_unsol_event(struct hda_codec *codec,
16371				     unsigned int res)
16372{
16373	if ((res >> 26) == ALC880_MIC_EVENT)
16374		alc_mic_automute(codec);
16375	else
16376		alc262_hippo_unsol_event(codec, res);
16377}
16378
16379static void alc662_eeepc_setup(struct hda_codec *codec)
16380{
16381	struct alc_spec *spec = codec->spec;
16382
16383	alc262_hippo1_setup(codec);
16384	spec->ext_mic.pin = 0x18;
16385	spec->ext_mic.mux_idx = 0;
16386	spec->int_mic.pin = 0x19;
16387	spec->int_mic.mux_idx = 1;
16388	spec->auto_mic = 1;
16389}
16390
16391static void alc662_eeepc_inithook(struct hda_codec *codec)
16392{
16393	alc262_hippo_automute(codec);
16394	alc_mic_automute(codec);
16395}
16396
16397static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
16398{
16399	struct alc_spec *spec = codec->spec;
16400
16401	spec->autocfg.hp_pins[0] = 0x14;
16402	spec->autocfg.speaker_pins[0] = 0x1b;
16403}
16404
16405#define alc662_eeepc_ep20_inithook	alc262_hippo_master_update
16406
16407static void alc663_m51va_speaker_automute(struct hda_codec *codec)
16408{
16409	unsigned int present;
16410	unsigned char bits;
16411
16412	present = snd_hda_codec_read(codec, 0x21, 0,
16413			AC_VERB_GET_PIN_SENSE, 0)
16414			& AC_PINSENSE_PRESENCE;
16415	bits = present ? HDA_AMP_MUTE : 0;
16416	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16417				AMP_IN_MUTE(0), bits);
16418	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16419				AMP_IN_MUTE(0), bits);
16420}
16421
16422static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
16423{
16424	unsigned int present;
16425	unsigned char bits;
16426
16427	present = snd_hda_codec_read(codec, 0x21, 0,
16428			AC_VERB_GET_PIN_SENSE, 0)
16429			& AC_PINSENSE_PRESENCE;
16430	bits = present ? HDA_AMP_MUTE : 0;
16431	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16432				AMP_IN_MUTE(0), bits);
16433	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16434				AMP_IN_MUTE(0), bits);
16435	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
16436				AMP_IN_MUTE(0), bits);
16437	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
16438				AMP_IN_MUTE(0), bits);
16439}
16440
16441static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
16442{
16443	unsigned int present;
16444	unsigned char bits;
16445
16446	present = snd_hda_codec_read(codec, 0x15, 0,
16447			AC_VERB_GET_PIN_SENSE, 0)
16448			& AC_PINSENSE_PRESENCE;
16449	bits = present ? HDA_AMP_MUTE : 0;
16450	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16451				AMP_IN_MUTE(0), bits);
16452	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16453				AMP_IN_MUTE(0), bits);
16454	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
16455				AMP_IN_MUTE(0), bits);
16456	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
16457				AMP_IN_MUTE(0), bits);
16458}
16459
16460static void alc662_f5z_speaker_automute(struct hda_codec *codec)
16461{
16462	unsigned int present;
16463	unsigned char bits;
16464
16465	present = snd_hda_codec_read(codec, 0x1b, 0,
16466			AC_VERB_GET_PIN_SENSE, 0)
16467			& AC_PINSENSE_PRESENCE;
16468	bits = present ? 0 : PIN_OUT;
16469	snd_hda_codec_write(codec, 0x14, 0,
16470			 AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
16471}
16472
16473static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
16474{
16475	unsigned int present1, present2;
16476
16477	present1 = snd_hda_codec_read(codec, 0x21, 0,
16478			AC_VERB_GET_PIN_SENSE, 0)
16479			& AC_PINSENSE_PRESENCE;
16480	present2 = snd_hda_codec_read(codec, 0x15, 0,
16481			AC_VERB_GET_PIN_SENSE, 0)
16482			& AC_PINSENSE_PRESENCE;
16483
16484	if (present1 || present2) {
16485		snd_hda_codec_write_cache(codec, 0x14, 0,
16486			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
16487	} else {
16488		snd_hda_codec_write_cache(codec, 0x14, 0,
16489			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
16490	}
16491}
16492
16493static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
16494{
16495	unsigned int present1, present2;
16496
16497	present1 = snd_hda_codec_read(codec, 0x1b, 0,
16498				AC_VERB_GET_PIN_SENSE, 0)
16499				& AC_PINSENSE_PRESENCE;
16500	present2 = snd_hda_codec_read(codec, 0x15, 0,
16501				AC_VERB_GET_PIN_SENSE, 0)
16502				& AC_PINSENSE_PRESENCE;
16503
16504	if (present1 || present2) {
16505		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16506				AMP_IN_MUTE(0), AMP_IN_MUTE(0));
16507		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16508				AMP_IN_MUTE(0), AMP_IN_MUTE(0));
16509	} else {
16510		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16511				AMP_IN_MUTE(0), 0);
16512		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16513				AMP_IN_MUTE(0), 0);
16514	}
16515}
16516
16517static void alc663_m51va_unsol_event(struct hda_codec *codec,
16518					   unsigned int res)
16519{
16520	switch (res >> 26) {
16521	case ALC880_HP_EVENT:
16522		alc663_m51va_speaker_automute(codec);
16523		break;
16524	case ALC880_MIC_EVENT:
16525		alc_mic_automute(codec);
16526		break;
16527	}
16528}
16529
16530static void alc663_m51va_setup(struct hda_codec *codec)
16531{
16532	struct alc_spec *spec = codec->spec;
16533	spec->ext_mic.pin = 0x18;
16534	spec->ext_mic.mux_idx = 0;
16535	spec->int_mic.pin = 0x12;
16536	spec->int_mic.mux_idx = 1;
16537	spec->auto_mic = 1;
16538}
16539
16540static void alc663_m51va_inithook(struct hda_codec *codec)
16541{
16542	alc663_m51va_speaker_automute(codec);
16543	alc_mic_automute(codec);
16544}
16545
16546/* ***************** Mode1 ******************************/
16547#define alc663_mode1_unsol_event	alc663_m51va_unsol_event
16548#define alc663_mode1_setup		alc663_m51va_setup
16549#define alc663_mode1_inithook		alc663_m51va_inithook
16550
16551/* ***************** Mode2 ******************************/
16552static void alc662_mode2_unsol_event(struct hda_codec *codec,
16553					   unsigned int res)
16554{
16555	switch (res >> 26) {
16556	case ALC880_HP_EVENT:
16557		alc662_f5z_speaker_automute(codec);
16558		break;
16559	case ALC880_MIC_EVENT:
16560		alc_mic_automute(codec);
16561		break;
16562	}
16563}
16564
16565#define alc662_mode2_setup	alc663_m51va_setup
16566
16567static void alc662_mode2_inithook(struct hda_codec *codec)
16568{
16569	alc662_f5z_speaker_automute(codec);
16570	alc_mic_automute(codec);
16571}
16572/* ***************** Mode3 ******************************/
16573static void alc663_mode3_unsol_event(struct hda_codec *codec,
16574					   unsigned int res)
16575{
16576	switch (res >> 26) {
16577	case ALC880_HP_EVENT:
16578		alc663_two_hp_m1_speaker_automute(codec);
16579		break;
16580	case ALC880_MIC_EVENT:
16581		alc_mic_automute(codec);
16582		break;
16583	}
16584}
16585
16586#define alc663_mode3_setup	alc663_m51va_setup
16587
16588static void alc663_mode3_inithook(struct hda_codec *codec)
16589{
16590	alc663_two_hp_m1_speaker_automute(codec);
16591	alc_mic_automute(codec);
16592}
16593/* ***************** Mode4 ******************************/
16594static void alc663_mode4_unsol_event(struct hda_codec *codec,
16595					   unsigned int res)
16596{
16597	switch (res >> 26) {
16598	case ALC880_HP_EVENT:
16599		alc663_21jd_two_speaker_automute(codec);
16600		break;
16601	case ALC880_MIC_EVENT:
16602		alc_mic_automute(codec);
16603		break;
16604	}
16605}
16606
16607#define alc663_mode4_setup	alc663_m51va_setup
16608
16609static void alc663_mode4_inithook(struct hda_codec *codec)
16610{
16611	alc663_21jd_two_speaker_automute(codec);
16612	alc_mic_automute(codec);
16613}
16614/* ***************** Mode5 ******************************/
16615static void alc663_mode5_unsol_event(struct hda_codec *codec,
16616					   unsigned int res)
16617{
16618	switch (res >> 26) {
16619	case ALC880_HP_EVENT:
16620		alc663_15jd_two_speaker_automute(codec);
16621		break;
16622	case ALC880_MIC_EVENT:
16623		alc_mic_automute(codec);
16624		break;
16625	}
16626}
16627
16628#define alc663_mode5_setup	alc663_m51va_setup
16629
16630static void alc663_mode5_inithook(struct hda_codec *codec)
16631{
16632	alc663_15jd_two_speaker_automute(codec);
16633	alc_mic_automute(codec);
16634}
16635/* ***************** Mode6 ******************************/
16636static void alc663_mode6_unsol_event(struct hda_codec *codec,
16637					   unsigned int res)
16638{
16639	switch (res >> 26) {
16640	case ALC880_HP_EVENT:
16641		alc663_two_hp_m2_speaker_automute(codec);
16642		break;
16643	case ALC880_MIC_EVENT:
16644		alc_mic_automute(codec);
16645		break;
16646	}
16647}
16648
16649#define alc663_mode6_setup	alc663_m51va_setup
16650
16651static void alc663_mode6_inithook(struct hda_codec *codec)
16652{
16653	alc663_two_hp_m2_speaker_automute(codec);
16654	alc_mic_automute(codec);
16655}
16656
16657static void alc663_g71v_hp_automute(struct hda_codec *codec)
16658{
16659	unsigned int present;
16660	unsigned char bits;
16661
16662	present = snd_hda_codec_read(codec, 0x21, 0,
16663				     AC_VERB_GET_PIN_SENSE, 0)
16664		& AC_PINSENSE_PRESENCE;
16665	bits = present ? HDA_AMP_MUTE : 0;
16666	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16667				 HDA_AMP_MUTE, bits);
16668	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
16669				 HDA_AMP_MUTE, bits);
16670}
16671
16672static void alc663_g71v_front_automute(struct hda_codec *codec)
16673{
16674	unsigned int present;
16675	unsigned char bits;
16676
16677	present = snd_hda_codec_read(codec, 0x15, 0,
16678				     AC_VERB_GET_PIN_SENSE, 0)
16679		& AC_PINSENSE_PRESENCE;
16680	bits = present ? HDA_AMP_MUTE : 0;
16681	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
16682				 HDA_AMP_MUTE, bits);
16683}
16684
16685static void alc663_g71v_unsol_event(struct hda_codec *codec,
16686					   unsigned int res)
16687{
16688	switch (res >> 26) {
16689	case ALC880_HP_EVENT:
16690		alc663_g71v_hp_automute(codec);
16691		break;
16692	case ALC880_FRONT_EVENT:
16693		alc663_g71v_front_automute(codec);
16694		break;
16695	case ALC880_MIC_EVENT:
16696		alc_mic_automute(codec);
16697		break;
16698	}
16699}
16700
16701#define alc663_g71v_setup	alc663_m51va_setup
16702
16703static void alc663_g71v_inithook(struct hda_codec *codec)
16704{
16705	alc663_g71v_front_automute(codec);
16706	alc663_g71v_hp_automute(codec);
16707	alc_mic_automute(codec);
16708}
16709
16710static void alc663_g50v_unsol_event(struct hda_codec *codec,
16711					   unsigned int res)
16712{
16713	switch (res >> 26) {
16714	case ALC880_HP_EVENT:
16715		alc663_m51va_speaker_automute(codec);
16716		break;
16717	case ALC880_MIC_EVENT:
16718		alc_mic_automute(codec);
16719		break;
16720	}
16721}
16722
16723#define alc663_g50v_setup	alc663_m51va_setup
16724
16725static void alc663_g50v_inithook(struct hda_codec *codec)
16726{
16727	alc663_m51va_speaker_automute(codec);
16728	alc_mic_automute(codec);
16729}
16730
16731static struct snd_kcontrol_new alc662_ecs_mixer[] = {
16732	HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16733	ALC262_HIPPO_MASTER_SWITCH,
16734
16735	HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
16736	HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
16737	HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
16738
16739	HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
16740	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16741	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16742	{ } /* end */
16743};
16744
16745static struct snd_kcontrol_new alc272_nc10_mixer[] = {
16746	/* Master Playback automatically created from Speaker and Headphone */
16747	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16748	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16749	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16750	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16751
16752	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16753	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16754	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
16755
16756	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16757	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16758	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
16759	{ } /* end */
16760};
16761
16762#ifdef CONFIG_SND_HDA_POWER_SAVE
16763#define alc662_loopbacks	alc880_loopbacks
16764#endif
16765
16766
16767/* pcm configuration: identical with ALC880 */
16768#define alc662_pcm_analog_playback	alc880_pcm_analog_playback
16769#define alc662_pcm_analog_capture	alc880_pcm_analog_capture
16770#define alc662_pcm_digital_playback	alc880_pcm_digital_playback
16771#define alc662_pcm_digital_capture	alc880_pcm_digital_capture
16772
16773/*
16774 * configuration and preset
16775 */
16776static const char *alc662_models[ALC662_MODEL_LAST] = {
16777	[ALC662_3ST_2ch_DIG]	= "3stack-dig",
16778	[ALC662_3ST_6ch_DIG]	= "3stack-6ch-dig",
16779	[ALC662_3ST_6ch]	= "3stack-6ch",
16780	[ALC662_5ST_DIG]	= "6stack-dig",
16781	[ALC662_LENOVO_101E]	= "lenovo-101e",
16782	[ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
16783	[ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
16784	[ALC662_ECS] = "ecs",
16785	[ALC663_ASUS_M51VA] = "m51va",
16786	[ALC663_ASUS_G71V] = "g71v",
16787	[ALC663_ASUS_H13] = "h13",
16788	[ALC663_ASUS_G50V] = "g50v",
16789	[ALC663_ASUS_MODE1] = "asus-mode1",
16790	[ALC662_ASUS_MODE2] = "asus-mode2",
16791	[ALC663_ASUS_MODE3] = "asus-mode3",
16792	[ALC663_ASUS_MODE4] = "asus-mode4",
16793	[ALC663_ASUS_MODE5] = "asus-mode5",
16794	[ALC663_ASUS_MODE6] = "asus-mode6",
16795	[ALC272_DELL]		= "dell",
16796	[ALC272_DELL_ZM1]	= "dell-zm1",
16797	[ALC272_SAMSUNG_NC10]	= "samsung-nc10",
16798	[ALC662_AUTO]		= "auto",
16799};
16800
16801static struct snd_pci_quirk alc662_cfg_tbl[] = {
16802	SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
16803	SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
16804	SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
16805	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
16806	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
16807	SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
16808	SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
16809	SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
16810	SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
16811	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
16812	SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
16813	SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
16814	SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
16815	SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
16816	SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
16817	SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
16818	SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
16819	SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
16820	SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
16821	SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
16822	SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
16823	SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
16824	SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
16825	SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
16826	SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
16827	SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
16828	/*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
16829	SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
16830	SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
16831	SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
16832	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
16833	SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
16834	SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
16835	SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
16836	SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
16837	SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
16838	SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
16839	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
16840	SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
16841	SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
16842	SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
16843	/*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
16844	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
16845	SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
16846	SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
16847	SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
16848	SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
16849	SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
16850	SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
16851	SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
16852	SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
16853	SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
16854		      ALC662_3ST_6ch_DIG),
16855	SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
16856	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
16857		      ALC662_3ST_6ch_DIG),
16858	SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
16859	SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
16860	SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
16861	SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
16862					ALC662_3ST_6ch_DIG),
16863	SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
16864			   ALC663_ASUS_H13),
16865	{}
16866};
16867
16868static struct alc_config_preset alc662_presets[] = {
16869	[ALC662_3ST_2ch_DIG] = {
16870		.mixers = { alc662_3ST_2ch_mixer },
16871		.init_verbs = { alc662_init_verbs },
16872		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
16873		.dac_nids = alc662_dac_nids,
16874		.dig_out_nid = ALC662_DIGOUT_NID,
16875		.dig_in_nid = ALC662_DIGIN_NID,
16876		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16877		.channel_mode = alc662_3ST_2ch_modes,
16878		.input_mux = &alc662_capture_source,
16879	},
16880	[ALC662_3ST_6ch_DIG] = {
16881		.mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
16882		.init_verbs = { alc662_init_verbs },
16883		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
16884		.dac_nids = alc662_dac_nids,
16885		.dig_out_nid = ALC662_DIGOUT_NID,
16886		.dig_in_nid = ALC662_DIGIN_NID,
16887		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
16888		.channel_mode = alc662_3ST_6ch_modes,
16889		.need_dac_fix = 1,
16890		.input_mux = &alc662_capture_source,
16891	},
16892	[ALC662_3ST_6ch] = {
16893		.mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
16894		.init_verbs = { alc662_init_verbs },
16895		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
16896		.dac_nids = alc662_dac_nids,
16897		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
16898		.channel_mode = alc662_3ST_6ch_modes,
16899		.need_dac_fix = 1,
16900		.input_mux = &alc662_capture_source,
16901	},
16902	[ALC662_5ST_DIG] = {
16903		.mixers = { alc662_base_mixer, alc662_chmode_mixer },
16904		.init_verbs = { alc662_init_verbs },
16905		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
16906		.dac_nids = alc662_dac_nids,
16907		.dig_out_nid = ALC662_DIGOUT_NID,
16908		.dig_in_nid = ALC662_DIGIN_NID,
16909		.num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
16910		.channel_mode = alc662_5stack_modes,
16911		.input_mux = &alc662_capture_source,
16912	},
16913	[ALC662_LENOVO_101E] = {
16914		.mixers = { alc662_lenovo_101e_mixer },
16915		.init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
16916		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
16917		.dac_nids = alc662_dac_nids,
16918		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16919		.channel_mode = alc662_3ST_2ch_modes,
16920		.input_mux = &alc662_lenovo_101e_capture_source,
16921		.unsol_event = alc662_lenovo_101e_unsol_event,
16922		.init_hook = alc662_lenovo_101e_all_automute,
16923	},
16924	[ALC662_ASUS_EEEPC_P701] = {
16925		.mixers = { alc662_eeepc_p701_mixer },
16926		.init_verbs = { alc662_init_verbs,
16927				alc662_eeepc_sue_init_verbs },
16928		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
16929		.dac_nids = alc662_dac_nids,
16930		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16931		.channel_mode = alc662_3ST_2ch_modes,
16932		.unsol_event = alc662_eeepc_unsol_event,
16933		.setup = alc662_eeepc_setup,
16934		.init_hook = alc662_eeepc_inithook,
16935	},
16936	[ALC662_ASUS_EEEPC_EP20] = {
16937		.mixers = { alc662_eeepc_ep20_mixer,
16938			    alc662_chmode_mixer },
16939		.init_verbs = { alc662_init_verbs,
16940				alc662_eeepc_ep20_sue_init_verbs },
16941		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
16942		.dac_nids = alc662_dac_nids,
16943		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
16944		.channel_mode = alc662_3ST_6ch_modes,
16945		.input_mux = &alc662_lenovo_101e_capture_source,
16946		.unsol_event = alc662_eeepc_unsol_event,
16947		.setup = alc662_eeepc_ep20_setup,
16948		.init_hook = alc662_eeepc_ep20_inithook,
16949	},
16950	[ALC662_ECS] = {
16951		.mixers = { alc662_ecs_mixer },
16952		.init_verbs = { alc662_init_verbs,
16953				alc662_ecs_init_verbs },
16954		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
16955		.dac_nids = alc662_dac_nids,
16956		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16957		.channel_mode = alc662_3ST_2ch_modes,
16958		.unsol_event = alc662_eeepc_unsol_event,
16959		.setup = alc662_eeepc_setup,
16960		.init_hook = alc662_eeepc_inithook,
16961	},
16962	[ALC663_ASUS_M51VA] = {
16963		.mixers = { alc663_m51va_mixer },
16964		.init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
16965		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
16966		.dac_nids = alc662_dac_nids,
16967		.dig_out_nid = ALC662_DIGOUT_NID,
16968		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16969		.channel_mode = alc662_3ST_2ch_modes,
16970		.unsol_event = alc663_m51va_unsol_event,
16971		.setup = alc663_m51va_setup,
16972		.init_hook = alc663_m51va_inithook,
16973	},
16974	[ALC663_ASUS_G71V] = {
16975		.mixers = { alc663_g71v_mixer },
16976		.init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
16977		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
16978		.dac_nids = alc662_dac_nids,
16979		.dig_out_nid = ALC662_DIGOUT_NID,
16980		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16981		.channel_mode = alc662_3ST_2ch_modes,
16982		.unsol_event = alc663_g71v_unsol_event,
16983		.setup = alc663_g71v_setup,
16984		.init_hook = alc663_g71v_inithook,
16985	},
16986	[ALC663_ASUS_H13] = {
16987		.mixers = { alc663_m51va_mixer },
16988		.init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
16989		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
16990		.dac_nids = alc662_dac_nids,
16991		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
16992		.channel_mode = alc662_3ST_2ch_modes,
16993		.unsol_event = alc663_m51va_unsol_event,
16994		.init_hook = alc663_m51va_inithook,
16995	},
16996	[ALC663_ASUS_G50V] = {
16997		.mixers = { alc663_g50v_mixer },
16998		.init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
16999		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17000		.dac_nids = alc662_dac_nids,
17001		.dig_out_nid = ALC662_DIGOUT_NID,
17002		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17003		.channel_mode = alc662_3ST_6ch_modes,
17004		.input_mux = &alc663_capture_source,
17005		.unsol_event = alc663_g50v_unsol_event,
17006		.setup = alc663_g50v_setup,
17007		.init_hook = alc663_g50v_inithook,
17008	},
17009	[ALC663_ASUS_MODE1] = {
17010		.mixers = { alc663_m51va_mixer },
17011		.cap_mixer = alc662_auto_capture_mixer,
17012		.init_verbs = { alc662_init_verbs,
17013				alc663_21jd_amic_init_verbs },
17014		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17015		.hp_nid = 0x03,
17016		.dac_nids = alc662_dac_nids,
17017		.dig_out_nid = ALC662_DIGOUT_NID,
17018		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17019		.channel_mode = alc662_3ST_2ch_modes,
17020		.unsol_event = alc663_mode1_unsol_event,
17021		.setup = alc663_mode1_setup,
17022		.init_hook = alc663_mode1_inithook,
17023	},
17024	[ALC662_ASUS_MODE2] = {
17025		.mixers = { alc662_1bjd_mixer },
17026		.cap_mixer = alc662_auto_capture_mixer,
17027		.init_verbs = { alc662_init_verbs,
17028				alc662_1bjd_amic_init_verbs },
17029		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17030		.dac_nids = alc662_dac_nids,
17031		.dig_out_nid = ALC662_DIGOUT_NID,
17032		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17033		.channel_mode = alc662_3ST_2ch_modes,
17034		.unsol_event = alc662_mode2_unsol_event,
17035		.setup = alc662_mode2_setup,
17036		.init_hook = alc662_mode2_inithook,
17037	},
17038	[ALC663_ASUS_MODE3] = {
17039		.mixers = { alc663_two_hp_m1_mixer },
17040		.cap_mixer = alc662_auto_capture_mixer,
17041		.init_verbs = { alc662_init_verbs,
17042				alc663_two_hp_amic_m1_init_verbs },
17043		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17044		.hp_nid = 0x03,
17045		.dac_nids = alc662_dac_nids,
17046		.dig_out_nid = ALC662_DIGOUT_NID,
17047		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17048		.channel_mode = alc662_3ST_2ch_modes,
17049		.unsol_event = alc663_mode3_unsol_event,
17050		.setup = alc663_mode3_setup,
17051		.init_hook = alc663_mode3_inithook,
17052	},
17053	[ALC663_ASUS_MODE4] = {
17054		.mixers = { alc663_asus_21jd_clfe_mixer },
17055		.cap_mixer = alc662_auto_capture_mixer,
17056		.init_verbs = { alc662_init_verbs,
17057				alc663_21jd_amic_init_verbs},
17058		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17059		.hp_nid = 0x03,
17060		.dac_nids = alc662_dac_nids,
17061		.dig_out_nid = ALC662_DIGOUT_NID,
17062		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17063		.channel_mode = alc662_3ST_2ch_modes,
17064		.unsol_event = alc663_mode4_unsol_event,
17065		.setup = alc663_mode4_setup,
17066		.init_hook = alc663_mode4_inithook,
17067	},
17068	[ALC663_ASUS_MODE5] = {
17069		.mixers = { alc663_asus_15jd_clfe_mixer },
17070		.cap_mixer = alc662_auto_capture_mixer,
17071		.init_verbs = { alc662_init_verbs,
17072				alc663_15jd_amic_init_verbs },
17073		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17074		.hp_nid = 0x03,
17075		.dac_nids = alc662_dac_nids,
17076		.dig_out_nid = ALC662_DIGOUT_NID,
17077		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17078		.channel_mode = alc662_3ST_2ch_modes,
17079		.unsol_event = alc663_mode5_unsol_event,
17080		.setup = alc663_mode5_setup,
17081		.init_hook = alc663_mode5_inithook,
17082	},
17083	[ALC663_ASUS_MODE6] = {
17084		.mixers = { alc663_two_hp_m2_mixer },
17085		.cap_mixer = alc662_auto_capture_mixer,
17086		.init_verbs = { alc662_init_verbs,
17087				alc663_two_hp_amic_m2_init_verbs },
17088		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
17089		.hp_nid = 0x03,
17090		.dac_nids = alc662_dac_nids,
17091		.dig_out_nid = ALC662_DIGOUT_NID,
17092		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17093		.channel_mode = alc662_3ST_2ch_modes,
17094		.unsol_event = alc663_mode6_unsol_event,
17095		.setup = alc663_mode6_setup,
17096		.init_hook = alc663_mode6_inithook,
17097	},
17098	[ALC272_DELL] = {
17099		.mixers = { alc663_m51va_mixer },
17100		.cap_mixer = alc272_auto_capture_mixer,
17101		.init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
17102		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
17103		.dac_nids = alc662_dac_nids,
17104		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17105		.adc_nids = alc272_adc_nids,
17106		.num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
17107		.capsrc_nids = alc272_capsrc_nids,
17108		.channel_mode = alc662_3ST_2ch_modes,
17109		.unsol_event = alc663_m51va_unsol_event,
17110		.setup = alc663_m51va_setup,
17111		.init_hook = alc663_m51va_inithook,
17112	},
17113	[ALC272_DELL_ZM1] = {
17114		.mixers = { alc663_m51va_mixer },
17115		.cap_mixer = alc662_auto_capture_mixer,
17116		.init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
17117		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
17118		.dac_nids = alc662_dac_nids,
17119		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17120		.adc_nids = alc662_adc_nids,
17121		.num_adc_nids = 1,
17122		.capsrc_nids = alc662_capsrc_nids,
17123		.channel_mode = alc662_3ST_2ch_modes,
17124		.unsol_event = alc663_m51va_unsol_event,
17125		.setup = alc663_m51va_setup,
17126		.init_hook = alc663_m51va_inithook,
17127	},
17128	[ALC272_SAMSUNG_NC10] = {
17129		.mixers = { alc272_nc10_mixer },
17130		.init_verbs = { alc662_init_verbs,
17131				alc663_21jd_amic_init_verbs },
17132		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
17133		.dac_nids = alc272_dac_nids,
17134		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17135		.channel_mode = alc662_3ST_2ch_modes,
17136		/*.input_mux = &alc272_nc10_capture_source,*/
17137		.unsol_event = alc663_mode4_unsol_event,
17138		.setup = alc663_mode4_setup,
17139		.init_hook = alc663_mode4_inithook,
17140	},
17141};
17142
17143
17144/*
17145 * BIOS auto configuration
17146 */
17147
17148/* add playback controls from the parsed DAC table */
17149static int alc662_auto_create_multi_out_ctls(struct alc_spec *spec,
17150					     const struct auto_pin_cfg *cfg)
17151{
17152	char name[32];
17153	static const char *chname[4] = {
17154		"Front", "Surround", NULL /*CLFE*/, "Side"
17155	};
17156	hda_nid_t nid;
17157	int i, err;
17158
17159	for (i = 0; i < cfg->line_outs; i++) {
17160		if (!spec->multiout.dac_nids[i])
17161			continue;
17162		nid = alc880_idx_to_dac(i);
17163		if (i == 2) {
17164			/* Center/LFE */
17165			err = add_control(spec, ALC_CTL_WIDGET_VOL,
17166					  "Center Playback Volume",
17167					  HDA_COMPOSE_AMP_VAL(nid, 1, 0,
17168							      HDA_OUTPUT));
17169			if (err < 0)
17170				return err;
17171			err = add_control(spec, ALC_CTL_WIDGET_VOL,
17172					  "LFE Playback Volume",
17173					  HDA_COMPOSE_AMP_VAL(nid, 2, 0,
17174							      HDA_OUTPUT));
17175			if (err < 0)
17176				return err;
17177			err = add_control(spec, ALC_CTL_WIDGET_MUTE,
17178					  "Center Playback Switch",
17179					  HDA_COMPOSE_AMP_VAL(0x0e, 1, 0,
17180							      HDA_INPUT));
17181			if (err < 0)
17182				return err;
17183			err = add_control(spec, ALC_CTL_WIDGET_MUTE,
17184					  "LFE Playback Switch",
17185					  HDA_COMPOSE_AMP_VAL(0x0e, 2, 0,
17186							      HDA_INPUT));
17187			if (err < 0)
17188				return err;
17189		} else {
17190			const char *pfx;
17191			if (cfg->line_outs == 1 &&
17192			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
17193				if (!cfg->hp_pins)
17194					pfx = "Speaker";
17195				else
17196					pfx = "PCM";
17197			} else
17198				pfx = chname[i];
17199			sprintf(name, "%s Playback Volume", pfx);
17200			err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
17201					  HDA_COMPOSE_AMP_VAL(nid, 3, 0,
17202							      HDA_OUTPUT));
17203			if (err < 0)
17204				return err;
17205			if (cfg->line_outs == 1 &&
17206			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
17207				pfx = "Speaker";
17208			sprintf(name, "%s Playback Switch", pfx);
17209			err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
17210				HDA_COMPOSE_AMP_VAL(alc880_idx_to_mixer(i),
17211						    3, 0, HDA_INPUT));
17212			if (err < 0)
17213				return err;
17214		}
17215	}
17216	return 0;
17217}
17218
17219/* add playback controls for speaker and HP outputs */
17220static int alc662_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
17221					const char *pfx)
17222{
17223	hda_nid_t nid;
17224	int err;
17225	char name[32];
17226
17227	if (!pin)
17228		return 0;
17229
17230	if (pin == 0x17) {
17231		/* ALC663 has a mono output pin on 0x17 */
17232		sprintf(name, "%s Playback Switch", pfx);
17233		err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
17234				  HDA_COMPOSE_AMP_VAL(pin, 2, 0, HDA_OUTPUT));
17235		return err;
17236	}
17237
17238	if (alc880_is_fixed_pin(pin)) {
17239		nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
17240		/* printk(KERN_DEBUG "DAC nid=%x\n",nid); */
17241		/* specify the DAC as the extra output */
17242		if (!spec->multiout.hp_nid)
17243			spec->multiout.hp_nid = nid;
17244		else
17245			spec->multiout.extra_out_nid[0] = nid;
17246		/* control HP volume/switch on the output mixer amp */
17247		nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
17248		sprintf(name, "%s Playback Volume", pfx);
17249		err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
17250				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
17251		if (err < 0)
17252			return err;
17253		sprintf(name, "%s Playback Switch", pfx);
17254		err = add_control(spec, ALC_CTL_BIND_MUTE, name,
17255				  HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
17256		if (err < 0)
17257			return err;
17258	} else if (alc880_is_multi_pin(pin)) {
17259		/* set manual connection */
17260		/* we have only a switch on HP-out PIN */
17261		sprintf(name, "%s Playback Switch", pfx);
17262		err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
17263				  HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
17264		if (err < 0)
17265			return err;
17266	}
17267	return 0;
17268}
17269
17270/* create playback/capture controls for input pins */
17271#define alc662_auto_create_input_ctls \
17272	alc880_auto_create_input_ctls
17273
17274static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
17275					      hda_nid_t nid, int pin_type,
17276					      int dac_idx)
17277{
17278	alc_set_pin_output(codec, nid, pin_type);
17279	/* need the manual connection? */
17280	if (alc880_is_multi_pin(nid)) {
17281		struct alc_spec *spec = codec->spec;
17282		int idx = alc880_multi_pin_idx(nid);
17283		snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
17284				    AC_VERB_SET_CONNECT_SEL,
17285				    alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
17286	}
17287}
17288
17289static void alc662_auto_init_multi_out(struct hda_codec *codec)
17290{
17291	struct alc_spec *spec = codec->spec;
17292	int i;
17293
17294	for (i = 0; i <= HDA_SIDE; i++) {
17295		hda_nid_t nid = spec->autocfg.line_out_pins[i];
17296		int pin_type = get_pin_type(spec->autocfg.line_out_type);
17297		if (nid)
17298			alc662_auto_set_output_and_unmute(codec, nid, pin_type,
17299							  i);
17300	}
17301}
17302
17303static void alc662_auto_init_hp_out(struct hda_codec *codec)
17304{
17305	struct alc_spec *spec = codec->spec;
17306	hda_nid_t pin;
17307
17308	pin = spec->autocfg.hp_pins[0];
17309	if (pin) /* connect to front */
17310		/* use dac 0 */
17311		alc662_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
17312	pin = spec->autocfg.speaker_pins[0];
17313	if (pin)
17314		alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
17315}
17316
17317#define ALC662_PIN_CD_NID		ALC880_PIN_CD_NID
17318
17319static void alc662_auto_init_analog_input(struct hda_codec *codec)
17320{
17321	struct alc_spec *spec = codec->spec;
17322	int i;
17323
17324	for (i = 0; i < AUTO_PIN_LAST; i++) {
17325		hda_nid_t nid = spec->autocfg.input_pins[i];
17326		if (alc_is_input_pin(codec, nid)) {
17327			alc_set_input_pin(codec, nid, i);
17328			if (nid != ALC662_PIN_CD_NID &&
17329			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
17330				snd_hda_codec_write(codec, nid, 0,
17331						    AC_VERB_SET_AMP_GAIN_MUTE,
17332						    AMP_OUT_MUTE);
17333		}
17334	}
17335}
17336
17337#define alc662_auto_init_input_src	alc882_auto_init_input_src
17338
17339static int alc662_parse_auto_config(struct hda_codec *codec)
17340{
17341	struct alc_spec *spec = codec->spec;
17342	int err;
17343	static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
17344
17345	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
17346					   alc662_ignore);
17347	if (err < 0)
17348		return err;
17349	if (!spec->autocfg.line_outs)
17350		return 0; /* can't find valid BIOS pin config */
17351
17352	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
17353	if (err < 0)
17354		return err;
17355	err = alc662_auto_create_multi_out_ctls(spec, &spec->autocfg);
17356	if (err < 0)
17357		return err;
17358	err = alc662_auto_create_extra_out(spec,
17359					   spec->autocfg.speaker_pins[0],
17360					   "Speaker");
17361	if (err < 0)
17362		return err;
17363	err = alc662_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
17364					   "Headphone");
17365	if (err < 0)
17366		return err;
17367	err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
17368	if (err < 0)
17369		return err;
17370
17371	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
17372
17373	if (spec->autocfg.dig_outs)
17374		spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
17375
17376	if (spec->kctls.list)
17377		add_mixer(spec, spec->kctls.list);
17378
17379	spec->num_mux_defs = 1;
17380	spec->input_mux = &spec->private_imux[0];
17381
17382	add_verb(spec, alc662_auto_init_verbs);
17383	if (codec->vendor_id == 0x10ec0663)
17384		add_verb(spec, alc663_auto_init_verbs);
17385
17386	err = alc_auto_add_mic_boost(codec);
17387	if (err < 0)
17388		return err;
17389
17390	alc_ssid_check(codec, 0x15, 0x1b, 0x14);
17391
17392	return 1;
17393}
17394
17395/* additional initialization for auto-configuration model */
17396static void alc662_auto_init(struct hda_codec *codec)
17397{
17398	struct alc_spec *spec = codec->spec;
17399	alc662_auto_init_multi_out(codec);
17400	alc662_auto_init_hp_out(codec);
17401	alc662_auto_init_analog_input(codec);
17402	alc662_auto_init_input_src(codec);
17403	if (spec->unsol_event)
17404		alc_inithook(codec);
17405}
17406
17407static int patch_alc662(struct hda_codec *codec)
17408{
17409	struct alc_spec *spec;
17410	int err, board_config;
17411
17412	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
17413	if (!spec)
17414		return -ENOMEM;
17415
17416	codec->spec = spec;
17417
17418	alc_fix_pll_init(codec, 0x20, 0x04, 15);
17419
17420	board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
17421						  alc662_models,
17422			  	                  alc662_cfg_tbl);
17423	if (board_config < 0) {
17424		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
17425		       codec->chip_name);
17426		board_config = ALC662_AUTO;
17427	}
17428
17429	if (board_config == ALC662_AUTO) {
17430		/* automatic parse from the BIOS config */
17431		err = alc662_parse_auto_config(codec);
17432		if (err < 0) {
17433			alc_free(codec);
17434			return err;
17435		} else if (!err) {
17436			printk(KERN_INFO
17437			       "hda_codec: Cannot set up configuration "
17438			       "from BIOS.  Using base mode...\n");
17439			board_config = ALC662_3ST_2ch_DIG;
17440		}
17441	}
17442
17443	err = snd_hda_attach_beep_device(codec, 0x1);
17444	if (err < 0) {
17445		alc_free(codec);
17446		return err;
17447	}
17448
17449	if (board_config != ALC662_AUTO)
17450		setup_preset(codec, &alc662_presets[board_config]);
17451
17452	spec->stream_analog_playback = &alc662_pcm_analog_playback;
17453	spec->stream_analog_capture = &alc662_pcm_analog_capture;
17454
17455	spec->stream_digital_playback = &alc662_pcm_digital_playback;
17456	spec->stream_digital_capture = &alc662_pcm_digital_capture;
17457
17458	if (!spec->adc_nids) {
17459		spec->adc_nids = alc662_adc_nids;
17460		spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
17461	}
17462	if (!spec->capsrc_nids)
17463		spec->capsrc_nids = alc662_capsrc_nids;
17464
17465	if (!spec->cap_mixer)
17466		set_capture_mixer(codec);
17467	if (codec->vendor_id == 0x10ec0662)
17468		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
17469	else
17470		set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
17471
17472	spec->vmaster_nid = 0x02;
17473
17474	codec->patch_ops = alc_patch_ops;
17475	if (board_config == ALC662_AUTO)
17476		spec->init_hook = alc662_auto_init;
17477#ifdef CONFIG_SND_HDA_POWER_SAVE
17478	if (!spec->loopback.amplist)
17479		spec->loopback.amplist = alc662_loopbacks;
17480#endif
17481	codec->proc_widget_hook = print_realtek_coef;
17482
17483	return 0;
17484}
17485
17486/*
17487 * patch entries
17488 */
17489static struct hda_codec_preset snd_hda_preset_realtek[] = {
17490	{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
17491	{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
17492	{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
17493	{ .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
17494	{ .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
17495	{ .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
17496	{ .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
17497	  .patch = patch_alc861 },
17498	{ .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
17499	{ .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
17500	{ .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
17501	{ .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
17502	  .patch = patch_alc882 },
17503	{ .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
17504	  .patch = patch_alc662 },
17505	{ .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
17506	{ .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
17507	{ .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
17508	{ .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
17509	{ .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
17510	  .patch = patch_alc882 },
17511	{ .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
17512	  .patch = patch_alc882 },
17513	{ .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
17514	{ .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
17515	{ .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
17516	  .patch = patch_alc882 },
17517	{ .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc882 },
17518	{ .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
17519	{} /* terminator */
17520};
17521
17522MODULE_ALIAS("snd-hda-codec-id:10ec*");
17523
17524MODULE_LICENSE("GPL");
17525MODULE_DESCRIPTION("Realtek HD-audio codec");
17526
17527static struct hda_codec_preset_list realtek_list = {
17528	.preset = snd_hda_preset_realtek,
17529	.owner = THIS_MODULE,
17530};
17531
17532static int __init patch_realtek_init(void)
17533{
17534	return snd_hda_add_codec_preset(&realtek_list);
17535}
17536
17537static void __exit patch_realtek_exit(void)
17538{
17539	snd_hda_delete_codec_preset(&realtek_list);
17540}
17541
17542module_init(patch_realtek_init)
17543module_exit(patch_realtek_exit)
17544