patch_realtek.c revision fbc256692eac29e04cf87e45736d7ff149180a52
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_AMIC,
135	ALC269_DMIC,
136	ALC269VB_AMIC,
137	ALC269VB_DMIC,
138	ALC269_FUJITSU,
139	ALC269_LIFEBOOK,
140	ALC269_AUTO,
141	ALC269_MODEL_LAST /* last tag */
142};
143
144/* ALC861 models */
145enum {
146	ALC861_3ST,
147	ALC660_3ST,
148	ALC861_3ST_DIG,
149	ALC861_6ST_DIG,
150	ALC861_UNIWILL_M31,
151	ALC861_TOSHIBA,
152	ALC861_ASUS,
153	ALC861_ASUS_LAPTOP,
154	ALC861_AUTO,
155	ALC861_MODEL_LAST,
156};
157
158/* ALC861-VD models */
159enum {
160	ALC660VD_3ST,
161	ALC660VD_3ST_DIG,
162	ALC660VD_ASUS_V1S,
163	ALC861VD_3ST,
164	ALC861VD_3ST_DIG,
165	ALC861VD_6ST_DIG,
166	ALC861VD_LENOVO,
167	ALC861VD_DALLAS,
168	ALC861VD_HP,
169	ALC861VD_AUTO,
170	ALC861VD_MODEL_LAST,
171};
172
173/* ALC662 models */
174enum {
175	ALC662_3ST_2ch_DIG,
176	ALC662_3ST_6ch_DIG,
177	ALC662_3ST_6ch,
178	ALC662_5ST_DIG,
179	ALC662_LENOVO_101E,
180	ALC662_ASUS_EEEPC_P701,
181	ALC662_ASUS_EEEPC_EP20,
182	ALC663_ASUS_M51VA,
183	ALC663_ASUS_G71V,
184	ALC663_ASUS_H13,
185	ALC663_ASUS_G50V,
186	ALC662_ECS,
187	ALC663_ASUS_MODE1,
188	ALC662_ASUS_MODE2,
189	ALC663_ASUS_MODE3,
190	ALC663_ASUS_MODE4,
191	ALC663_ASUS_MODE5,
192	ALC663_ASUS_MODE6,
193	ALC663_ASUS_MODE7,
194	ALC663_ASUS_MODE8,
195	ALC272_DELL,
196	ALC272_DELL_ZM1,
197	ALC272_SAMSUNG_NC10,
198	ALC662_AUTO,
199	ALC662_MODEL_LAST,
200};
201
202/* ALC882 models */
203enum {
204	ALC882_3ST_DIG,
205	ALC882_6ST_DIG,
206	ALC882_ARIMA,
207	ALC882_W2JC,
208	ALC882_TARGA,
209	ALC882_ASUS_A7J,
210	ALC882_ASUS_A7M,
211	ALC885_MACPRO,
212	ALC885_MBA21,
213	ALC885_MBP3,
214	ALC885_MB5,
215	ALC885_MACMINI3,
216	ALC885_IMAC24,
217	ALC885_IMAC91,
218	ALC883_3ST_2ch_DIG,
219	ALC883_3ST_6ch_DIG,
220	ALC883_3ST_6ch,
221	ALC883_6ST_DIG,
222	ALC883_TARGA_DIG,
223	ALC883_TARGA_2ch_DIG,
224	ALC883_TARGA_8ch_DIG,
225	ALC883_ACER,
226	ALC883_ACER_ASPIRE,
227	ALC888_ACER_ASPIRE_4930G,
228	ALC888_ACER_ASPIRE_6530G,
229	ALC888_ACER_ASPIRE_8930G,
230	ALC888_ACER_ASPIRE_7730G,
231	ALC883_MEDION,
232	ALC883_MEDION_MD2,
233	ALC883_MEDION_WIM2160,
234	ALC883_LAPTOP_EAPD,
235	ALC883_LENOVO_101E_2ch,
236	ALC883_LENOVO_NB0763,
237	ALC888_LENOVO_MS7195_DIG,
238	ALC888_LENOVO_SKY,
239	ALC883_HAIER_W66,
240	ALC888_3ST_HP,
241	ALC888_6ST_DELL,
242	ALC883_MITAC,
243	ALC883_CLEVO_M540R,
244	ALC883_CLEVO_M720,
245	ALC883_FUJITSU_PI2515,
246	ALC888_FUJITSU_XA3530,
247	ALC883_3ST_6ch_INTEL,
248	ALC889A_INTEL,
249	ALC889_INTEL,
250	ALC888_ASUS_M90V,
251	ALC888_ASUS_EEE1601,
252	ALC889A_MB31,
253	ALC1200_ASUS_P5Q,
254	ALC883_SONY_VAIO_TT,
255	ALC882_AUTO,
256	ALC882_MODEL_LAST,
257};
258
259/* for GPIO Poll */
260#define GPIO_MASK	0x03
261
262/* extra amp-initialization sequence types */
263enum {
264	ALC_INIT_NONE,
265	ALC_INIT_DEFAULT,
266	ALC_INIT_GPIO1,
267	ALC_INIT_GPIO2,
268	ALC_INIT_GPIO3,
269};
270
271struct alc_mic_route {
272	hda_nid_t pin;
273	unsigned char mux_idx;
274	unsigned char amix_idx;
275};
276
277#define MUX_IDX_UNDEF	((unsigned char)-1)
278
279struct alc_customize_define {
280	unsigned int  sku_cfg;
281	unsigned char port_connectivity;
282	unsigned char check_sum;
283	unsigned char customization;
284	unsigned char external_amp;
285	unsigned int  enable_pcbeep:1;
286	unsigned int  platform_type:1;
287	unsigned int  swap:1;
288	unsigned int  override:1;
289};
290
291struct alc_spec {
292	/* codec parameterization */
293	struct snd_kcontrol_new *mixers[5];	/* mixer arrays */
294	unsigned int num_mixers;
295	struct snd_kcontrol_new *cap_mixer;	/* capture mixer */
296	unsigned int beep_amp;	/* beep amp value, set via set_beep_amp() */
297
298	const struct hda_verb *init_verbs[10];	/* initialization verbs
299						 * don't forget NULL
300						 * termination!
301						 */
302	unsigned int num_init_verbs;
303
304	char stream_name_analog[32];	/* analog PCM stream */
305	struct hda_pcm_stream *stream_analog_playback;
306	struct hda_pcm_stream *stream_analog_capture;
307	struct hda_pcm_stream *stream_analog_alt_playback;
308	struct hda_pcm_stream *stream_analog_alt_capture;
309
310	char stream_name_digital[32];	/* digital PCM stream */
311	struct hda_pcm_stream *stream_digital_playback;
312	struct hda_pcm_stream *stream_digital_capture;
313
314	/* playback */
315	struct hda_multi_out multiout;	/* playback set-up
316					 * max_channels, dacs must be set
317					 * dig_out_nid and hp_nid are optional
318					 */
319	hda_nid_t alt_dac_nid;
320	hda_nid_t slave_dig_outs[3];	/* optional - for auto-parsing */
321	int dig_out_type;
322
323	/* capture */
324	unsigned int num_adc_nids;
325	hda_nid_t *adc_nids;
326	hda_nid_t *capsrc_nids;
327	hda_nid_t dig_in_nid;		/* digital-in NID; optional */
328
329	/* capture source */
330	unsigned int num_mux_defs;
331	const struct hda_input_mux *input_mux;
332	unsigned int cur_mux[3];
333	struct alc_mic_route ext_mic;
334	struct alc_mic_route int_mic;
335
336	/* channel model */
337	const struct hda_channel_mode *channel_mode;
338	int num_channel_mode;
339	int need_dac_fix;
340	int const_channel_count;
341	int ext_channel_count;
342
343	/* PCM information */
344	struct hda_pcm pcm_rec[3];	/* used in alc_build_pcms() */
345
346	/* dynamic controls, init_verbs and input_mux */
347	struct auto_pin_cfg autocfg;
348	struct alc_customize_define cdefine;
349	struct snd_array kctls;
350	struct hda_input_mux private_imux[3];
351	hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
352	hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
353	hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
354
355	/* hooks */
356	void (*init_hook)(struct hda_codec *codec);
357	void (*unsol_event)(struct hda_codec *codec, unsigned int res);
358#ifdef CONFIG_SND_HDA_POWER_SAVE
359	void (*power_hook)(struct hda_codec *codec);
360#endif
361
362	/* for pin sensing */
363	unsigned int sense_updated: 1;
364	unsigned int jack_present: 1;
365	unsigned int master_sw: 1;
366	unsigned int auto_mic:1;
367
368	/* other flags */
369	unsigned int no_analog :1; /* digital I/O only */
370	int init_amp;
371
372	/* for virtual master */
373	hda_nid_t vmaster_nid;
374#ifdef CONFIG_SND_HDA_POWER_SAVE
375	struct hda_loopback_check loopback;
376#endif
377
378	/* for PLL fix */
379	hda_nid_t pll_nid;
380	unsigned int pll_coef_idx, pll_coef_bit;
381};
382
383/*
384 * configuration template - to be copied to the spec instance
385 */
386struct alc_config_preset {
387	struct snd_kcontrol_new *mixers[5]; /* should be identical size
388					     * with spec
389					     */
390	struct snd_kcontrol_new *cap_mixer; /* capture mixer */
391	const struct hda_verb *init_verbs[5];
392	unsigned int num_dacs;
393	hda_nid_t *dac_nids;
394	hda_nid_t dig_out_nid;		/* optional */
395	hda_nid_t hp_nid;		/* optional */
396	hda_nid_t *slave_dig_outs;
397	unsigned int num_adc_nids;
398	hda_nid_t *adc_nids;
399	hda_nid_t *capsrc_nids;
400	hda_nid_t dig_in_nid;
401	unsigned int num_channel_mode;
402	const struct hda_channel_mode *channel_mode;
403	int need_dac_fix;
404	int const_channel_count;
405	unsigned int num_mux_defs;
406	const struct hda_input_mux *input_mux;
407	void (*unsol_event)(struct hda_codec *, unsigned int);
408	void (*setup)(struct hda_codec *);
409	void (*init_hook)(struct hda_codec *);
410#ifdef CONFIG_SND_HDA_POWER_SAVE
411	struct hda_amp_list *loopbacks;
412	void (*power_hook)(struct hda_codec *codec);
413#endif
414};
415
416
417/*
418 * input MUX handling
419 */
420static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
421			     struct snd_ctl_elem_info *uinfo)
422{
423	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
424	struct alc_spec *spec = codec->spec;
425	unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
426	if (mux_idx >= spec->num_mux_defs)
427		mux_idx = 0;
428	if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
429		mux_idx = 0;
430	return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
431}
432
433static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
434			    struct snd_ctl_elem_value *ucontrol)
435{
436	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
437	struct alc_spec *spec = codec->spec;
438	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
439
440	ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
441	return 0;
442}
443
444static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
445			    struct snd_ctl_elem_value *ucontrol)
446{
447	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
448	struct alc_spec *spec = codec->spec;
449	const struct hda_input_mux *imux;
450	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
451	unsigned int mux_idx;
452	hda_nid_t nid = spec->capsrc_nids ?
453		spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
454	unsigned int type;
455
456	mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
457	imux = &spec->input_mux[mux_idx];
458	if (!imux->num_items && mux_idx > 0)
459		imux = &spec->input_mux[0];
460
461	type = get_wcaps_type(get_wcaps(codec, nid));
462	if (type == AC_WID_AUD_MIX) {
463		/* Matrix-mixer style (e.g. ALC882) */
464		unsigned int *cur_val = &spec->cur_mux[adc_idx];
465		unsigned int i, idx;
466
467		idx = ucontrol->value.enumerated.item[0];
468		if (idx >= imux->num_items)
469			idx = imux->num_items - 1;
470		if (*cur_val == idx)
471			return 0;
472		for (i = 0; i < imux->num_items; i++) {
473			unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
474			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
475						 imux->items[i].index,
476						 HDA_AMP_MUTE, v);
477		}
478		*cur_val = idx;
479		return 1;
480	} else {
481		/* MUX style (e.g. ALC880) */
482		return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
483					     &spec->cur_mux[adc_idx]);
484	}
485}
486
487/*
488 * channel mode setting
489 */
490static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
491			    struct snd_ctl_elem_info *uinfo)
492{
493	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
494	struct alc_spec *spec = codec->spec;
495	return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
496				    spec->num_channel_mode);
497}
498
499static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
500			   struct snd_ctl_elem_value *ucontrol)
501{
502	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
503	struct alc_spec *spec = codec->spec;
504	return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
505				   spec->num_channel_mode,
506				   spec->ext_channel_count);
507}
508
509static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
510			   struct snd_ctl_elem_value *ucontrol)
511{
512	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
513	struct alc_spec *spec = codec->spec;
514	int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
515				      spec->num_channel_mode,
516				      &spec->ext_channel_count);
517	if (err >= 0 && !spec->const_channel_count) {
518		spec->multiout.max_channels = spec->ext_channel_count;
519		if (spec->need_dac_fix)
520			spec->multiout.num_dacs = spec->multiout.max_channels / 2;
521	}
522	return err;
523}
524
525/*
526 * Control the mode of pin widget settings via the mixer.  "pc" is used
527 * instead of "%" to avoid consequences of accidently treating the % as
528 * being part of a format specifier.  Maximum allowed length of a value is
529 * 63 characters plus NULL terminator.
530 *
531 * Note: some retasking pin complexes seem to ignore requests for input
532 * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
533 * are requested.  Therefore order this list so that this behaviour will not
534 * cause problems when mixer clients move through the enum sequentially.
535 * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
536 * March 2006.
537 */
538static char *alc_pin_mode_names[] = {
539	"Mic 50pc bias", "Mic 80pc bias",
540	"Line in", "Line out", "Headphone out",
541};
542static unsigned char alc_pin_mode_values[] = {
543	PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
544};
545/* The control can present all 5 options, or it can limit the options based
546 * in the pin being assumed to be exclusively an input or an output pin.  In
547 * addition, "input" pins may or may not process the mic bias option
548 * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
549 * accept requests for bias as of chip versions up to March 2006) and/or
550 * wiring in the computer.
551 */
552#define ALC_PIN_DIR_IN              0x00
553#define ALC_PIN_DIR_OUT             0x01
554#define ALC_PIN_DIR_INOUT           0x02
555#define ALC_PIN_DIR_IN_NOMICBIAS    0x03
556#define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
557
558/* Info about the pin modes supported by the different pin direction modes.
559 * For each direction the minimum and maximum values are given.
560 */
561static signed char alc_pin_mode_dir_info[5][2] = {
562	{ 0, 2 },    /* ALC_PIN_DIR_IN */
563	{ 3, 4 },    /* ALC_PIN_DIR_OUT */
564	{ 0, 4 },    /* ALC_PIN_DIR_INOUT */
565	{ 2, 2 },    /* ALC_PIN_DIR_IN_NOMICBIAS */
566	{ 2, 4 },    /* ALC_PIN_DIR_INOUT_NOMICBIAS */
567};
568#define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
569#define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
570#define alc_pin_mode_n_items(_dir) \
571	(alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
572
573static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
574			     struct snd_ctl_elem_info *uinfo)
575{
576	unsigned int item_num = uinfo->value.enumerated.item;
577	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
578
579	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
580	uinfo->count = 1;
581	uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
582
583	if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
584		item_num = alc_pin_mode_min(dir);
585	strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
586	return 0;
587}
588
589static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
590			    struct snd_ctl_elem_value *ucontrol)
591{
592	unsigned int i;
593	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
594	hda_nid_t nid = kcontrol->private_value & 0xffff;
595	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
596	long *valp = ucontrol->value.integer.value;
597	unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
598						 AC_VERB_GET_PIN_WIDGET_CONTROL,
599						 0x00);
600
601	/* Find enumerated value for current pinctl setting */
602	i = alc_pin_mode_min(dir);
603	while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
604		i++;
605	*valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
606	return 0;
607}
608
609static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
610			    struct snd_ctl_elem_value *ucontrol)
611{
612	signed int change;
613	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
614	hda_nid_t nid = kcontrol->private_value & 0xffff;
615	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
616	long val = *ucontrol->value.integer.value;
617	unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
618						 AC_VERB_GET_PIN_WIDGET_CONTROL,
619						 0x00);
620
621	if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
622		val = alc_pin_mode_min(dir);
623
624	change = pinctl != alc_pin_mode_values[val];
625	if (change) {
626		/* Set pin mode to that requested */
627		snd_hda_codec_write_cache(codec, nid, 0,
628					  AC_VERB_SET_PIN_WIDGET_CONTROL,
629					  alc_pin_mode_values[val]);
630
631		/* Also enable the retasking pin's input/output as required
632		 * for the requested pin mode.  Enum values of 2 or less are
633		 * input modes.
634		 *
635		 * Dynamically switching the input/output buffers probably
636		 * reduces noise slightly (particularly on input) so we'll
637		 * do it.  However, having both input and output buffers
638		 * enabled simultaneously doesn't seem to be problematic if
639		 * this turns out to be necessary in the future.
640		 */
641		if (val <= 2) {
642			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
643						 HDA_AMP_MUTE, HDA_AMP_MUTE);
644			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
645						 HDA_AMP_MUTE, 0);
646		} else {
647			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
648						 HDA_AMP_MUTE, HDA_AMP_MUTE);
649			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
650						 HDA_AMP_MUTE, 0);
651		}
652	}
653	return change;
654}
655
656#define ALC_PIN_MODE(xname, nid, dir) \
657	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
658	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
659	  .info = alc_pin_mode_info, \
660	  .get = alc_pin_mode_get, \
661	  .put = alc_pin_mode_put, \
662	  .private_value = nid | (dir<<16) }
663
664/* A switch control for ALC260 GPIO pins.  Multiple GPIOs can be ganged
665 * together using a mask with more than one bit set.  This control is
666 * currently used only by the ALC260 test model.  At this stage they are not
667 * needed for any "production" models.
668 */
669#ifdef CONFIG_SND_DEBUG
670#define alc_gpio_data_info	snd_ctl_boolean_mono_info
671
672static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
673			     struct snd_ctl_elem_value *ucontrol)
674{
675	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
676	hda_nid_t nid = kcontrol->private_value & 0xffff;
677	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
678	long *valp = ucontrol->value.integer.value;
679	unsigned int val = snd_hda_codec_read(codec, nid, 0,
680					      AC_VERB_GET_GPIO_DATA, 0x00);
681
682	*valp = (val & mask) != 0;
683	return 0;
684}
685static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
686			     struct snd_ctl_elem_value *ucontrol)
687{
688	signed int change;
689	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
690	hda_nid_t nid = kcontrol->private_value & 0xffff;
691	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
692	long val = *ucontrol->value.integer.value;
693	unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
694						    AC_VERB_GET_GPIO_DATA,
695						    0x00);
696
697	/* Set/unset the masked GPIO bit(s) as needed */
698	change = (val == 0 ? 0 : mask) != (gpio_data & mask);
699	if (val == 0)
700		gpio_data &= ~mask;
701	else
702		gpio_data |= mask;
703	snd_hda_codec_write_cache(codec, nid, 0,
704				  AC_VERB_SET_GPIO_DATA, gpio_data);
705
706	return change;
707}
708#define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
709	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
710	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
711	  .info = alc_gpio_data_info, \
712	  .get = alc_gpio_data_get, \
713	  .put = alc_gpio_data_put, \
714	  .private_value = nid | (mask<<16) }
715#endif   /* CONFIG_SND_DEBUG */
716
717/* A switch control to allow the enabling of the digital IO pins on the
718 * ALC260.  This is incredibly simplistic; the intention of this control is
719 * to provide something in the test model allowing digital outputs to be
720 * identified if present.  If models are found which can utilise these
721 * outputs a more complete mixer control can be devised for those models if
722 * necessary.
723 */
724#ifdef CONFIG_SND_DEBUG
725#define alc_spdif_ctrl_info	snd_ctl_boolean_mono_info
726
727static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
728			      struct snd_ctl_elem_value *ucontrol)
729{
730	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
731	hda_nid_t nid = kcontrol->private_value & 0xffff;
732	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
733	long *valp = ucontrol->value.integer.value;
734	unsigned int val = snd_hda_codec_read(codec, nid, 0,
735					      AC_VERB_GET_DIGI_CONVERT_1, 0x00);
736
737	*valp = (val & mask) != 0;
738	return 0;
739}
740static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
741			      struct snd_ctl_elem_value *ucontrol)
742{
743	signed int change;
744	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
745	hda_nid_t nid = kcontrol->private_value & 0xffff;
746	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
747	long val = *ucontrol->value.integer.value;
748	unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
749						    AC_VERB_GET_DIGI_CONVERT_1,
750						    0x00);
751
752	/* Set/unset the masked control bit(s) as needed */
753	change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
754	if (val==0)
755		ctrl_data &= ~mask;
756	else
757		ctrl_data |= mask;
758	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
759				  ctrl_data);
760
761	return change;
762}
763#define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
764	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
765	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
766	  .info = alc_spdif_ctrl_info, \
767	  .get = alc_spdif_ctrl_get, \
768	  .put = alc_spdif_ctrl_put, \
769	  .private_value = nid | (mask<<16) }
770#endif   /* CONFIG_SND_DEBUG */
771
772/* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
773 * Again, this is only used in the ALC26x test models to help identify when
774 * the EAPD line must be asserted for features to work.
775 */
776#ifdef CONFIG_SND_DEBUG
777#define alc_eapd_ctrl_info	snd_ctl_boolean_mono_info
778
779static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
780			      struct snd_ctl_elem_value *ucontrol)
781{
782	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
783	hda_nid_t nid = kcontrol->private_value & 0xffff;
784	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
785	long *valp = ucontrol->value.integer.value;
786	unsigned int val = snd_hda_codec_read(codec, nid, 0,
787					      AC_VERB_GET_EAPD_BTLENABLE, 0x00);
788
789	*valp = (val & mask) != 0;
790	return 0;
791}
792
793static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
794			      struct snd_ctl_elem_value *ucontrol)
795{
796	int change;
797	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
798	hda_nid_t nid = kcontrol->private_value & 0xffff;
799	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
800	long val = *ucontrol->value.integer.value;
801	unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
802						    AC_VERB_GET_EAPD_BTLENABLE,
803						    0x00);
804
805	/* Set/unset the masked control bit(s) as needed */
806	change = (!val ? 0 : mask) != (ctrl_data & mask);
807	if (!val)
808		ctrl_data &= ~mask;
809	else
810		ctrl_data |= mask;
811	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
812				  ctrl_data);
813
814	return change;
815}
816
817#define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
818	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
819	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
820	  .info = alc_eapd_ctrl_info, \
821	  .get = alc_eapd_ctrl_get, \
822	  .put = alc_eapd_ctrl_put, \
823	  .private_value = nid | (mask<<16) }
824#endif   /* CONFIG_SND_DEBUG */
825
826/*
827 * set up the input pin config (depending on the given auto-pin type)
828 */
829static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
830			      int auto_pin_type)
831{
832	unsigned int val = PIN_IN;
833
834	if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
835		unsigned int pincap;
836		pincap = snd_hda_query_pin_caps(codec, nid);
837		pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
838		if (pincap & AC_PINCAP_VREF_80)
839			val = PIN_VREF80;
840		else if (pincap & AC_PINCAP_VREF_50)
841			val = PIN_VREF50;
842		else if (pincap & AC_PINCAP_VREF_100)
843			val = PIN_VREF100;
844		else if (pincap & AC_PINCAP_VREF_GRD)
845			val = PIN_VREFGRD;
846	}
847	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
848}
849
850/*
851 */
852static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
853{
854	if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
855		return;
856	spec->mixers[spec->num_mixers++] = mix;
857}
858
859static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
860{
861	if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
862		return;
863	spec->init_verbs[spec->num_init_verbs++] = verb;
864}
865
866/*
867 * set up from the preset table
868 */
869static void setup_preset(struct hda_codec *codec,
870			 const struct alc_config_preset *preset)
871{
872	struct alc_spec *spec = codec->spec;
873	int i;
874
875	for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
876		add_mixer(spec, preset->mixers[i]);
877	spec->cap_mixer = preset->cap_mixer;
878	for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
879	     i++)
880		add_verb(spec, preset->init_verbs[i]);
881
882	spec->channel_mode = preset->channel_mode;
883	spec->num_channel_mode = preset->num_channel_mode;
884	spec->need_dac_fix = preset->need_dac_fix;
885	spec->const_channel_count = preset->const_channel_count;
886
887	if (preset->const_channel_count)
888		spec->multiout.max_channels = preset->const_channel_count;
889	else
890		spec->multiout.max_channels = spec->channel_mode[0].channels;
891	spec->ext_channel_count = spec->channel_mode[0].channels;
892
893	spec->multiout.num_dacs = preset->num_dacs;
894	spec->multiout.dac_nids = preset->dac_nids;
895	spec->multiout.dig_out_nid = preset->dig_out_nid;
896	spec->multiout.slave_dig_outs = preset->slave_dig_outs;
897	spec->multiout.hp_nid = preset->hp_nid;
898
899	spec->num_mux_defs = preset->num_mux_defs;
900	if (!spec->num_mux_defs)
901		spec->num_mux_defs = 1;
902	spec->input_mux = preset->input_mux;
903
904	spec->num_adc_nids = preset->num_adc_nids;
905	spec->adc_nids = preset->adc_nids;
906	spec->capsrc_nids = preset->capsrc_nids;
907	spec->dig_in_nid = preset->dig_in_nid;
908
909	spec->unsol_event = preset->unsol_event;
910	spec->init_hook = preset->init_hook;
911#ifdef CONFIG_SND_HDA_POWER_SAVE
912	spec->power_hook = preset->power_hook;
913	spec->loopback.amplist = preset->loopbacks;
914#endif
915
916	if (preset->setup)
917		preset->setup(codec);
918}
919
920/* Enable GPIO mask and set output */
921static struct hda_verb alc_gpio1_init_verbs[] = {
922	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
923	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
924	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
925	{ }
926};
927
928static struct hda_verb alc_gpio2_init_verbs[] = {
929	{0x01, AC_VERB_SET_GPIO_MASK, 0x02},
930	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
931	{0x01, AC_VERB_SET_GPIO_DATA, 0x02},
932	{ }
933};
934
935static struct hda_verb alc_gpio3_init_verbs[] = {
936	{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
937	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
938	{0x01, AC_VERB_SET_GPIO_DATA, 0x03},
939	{ }
940};
941
942/*
943 * Fix hardware PLL issue
944 * On some codecs, the analog PLL gating control must be off while
945 * the default value is 1.
946 */
947static void alc_fix_pll(struct hda_codec *codec)
948{
949	struct alc_spec *spec = codec->spec;
950	unsigned int val;
951
952	if (!spec->pll_nid)
953		return;
954	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
955			    spec->pll_coef_idx);
956	val = snd_hda_codec_read(codec, spec->pll_nid, 0,
957				 AC_VERB_GET_PROC_COEF, 0);
958	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
959			    spec->pll_coef_idx);
960	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
961			    val & ~(1 << spec->pll_coef_bit));
962}
963
964static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
965			     unsigned int coef_idx, unsigned int coef_bit)
966{
967	struct alc_spec *spec = codec->spec;
968	spec->pll_nid = nid;
969	spec->pll_coef_idx = coef_idx;
970	spec->pll_coef_bit = coef_bit;
971	alc_fix_pll(codec);
972}
973
974static void alc_automute_pin(struct hda_codec *codec)
975{
976	struct alc_spec *spec = codec->spec;
977	unsigned int nid = spec->autocfg.hp_pins[0];
978	int i;
979
980	if (!nid)
981		return;
982	spec->jack_present = snd_hda_jack_detect(codec, nid);
983	for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
984		nid = spec->autocfg.speaker_pins[i];
985		if (!nid)
986			break;
987		snd_hda_codec_write(codec, nid, 0,
988				    AC_VERB_SET_PIN_WIDGET_CONTROL,
989				    spec->jack_present ? 0 : PIN_OUT);
990	}
991}
992
993static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
994				hda_nid_t nid)
995{
996	hda_nid_t conn[HDA_MAX_NUM_INPUTS];
997	int i, nums;
998
999	nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
1000	for (i = 0; i < nums; i++)
1001		if (conn[i] == nid)
1002			return i;
1003	return -1;
1004}
1005
1006static void alc_mic_automute(struct hda_codec *codec)
1007{
1008	struct alc_spec *spec = codec->spec;
1009	struct alc_mic_route *dead, *alive;
1010	unsigned int present, type;
1011	hda_nid_t cap_nid;
1012
1013	if (!spec->auto_mic)
1014		return;
1015	if (!spec->int_mic.pin || !spec->ext_mic.pin)
1016		return;
1017	if (snd_BUG_ON(!spec->adc_nids))
1018		return;
1019
1020	cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1021
1022	present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1023	if (present) {
1024		alive = &spec->ext_mic;
1025		dead = &spec->int_mic;
1026	} else {
1027		alive = &spec->int_mic;
1028		dead = &spec->ext_mic;
1029	}
1030
1031	type = get_wcaps_type(get_wcaps(codec, cap_nid));
1032	if (type == AC_WID_AUD_MIX) {
1033		/* Matrix-mixer style (e.g. ALC882) */
1034		snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1035					 alive->mux_idx,
1036					 HDA_AMP_MUTE, 0);
1037		snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1038					 dead->mux_idx,
1039					 HDA_AMP_MUTE, HDA_AMP_MUTE);
1040	} else {
1041		/* MUX style (e.g. ALC880) */
1042		snd_hda_codec_write_cache(codec, cap_nid, 0,
1043					  AC_VERB_SET_CONNECT_SEL,
1044					  alive->mux_idx);
1045	}
1046
1047	/* FIXME: analog mixer */
1048}
1049
1050/* unsolicited event for HP jack sensing */
1051static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1052{
1053	if (codec->vendor_id == 0x10ec0880)
1054		res >>= 28;
1055	else
1056		res >>= 26;
1057	switch (res) {
1058	case ALC880_HP_EVENT:
1059		alc_automute_pin(codec);
1060		break;
1061	case ALC880_MIC_EVENT:
1062		alc_mic_automute(codec);
1063		break;
1064	}
1065}
1066
1067static void alc_inithook(struct hda_codec *codec)
1068{
1069	alc_automute_pin(codec);
1070	alc_mic_automute(codec);
1071}
1072
1073/* additional initialization for ALC888 variants */
1074static void alc888_coef_init(struct hda_codec *codec)
1075{
1076	unsigned int tmp;
1077
1078	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1079	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1080	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1081	if ((tmp & 0xf0) == 0x20)
1082		/* alc888S-VC */
1083		snd_hda_codec_read(codec, 0x20, 0,
1084				   AC_VERB_SET_PROC_COEF, 0x830);
1085	 else
1086		 /* alc888-VB */
1087		 snd_hda_codec_read(codec, 0x20, 0,
1088				    AC_VERB_SET_PROC_COEF, 0x3030);
1089}
1090
1091static void alc889_coef_init(struct hda_codec *codec)
1092{
1093	unsigned int tmp;
1094
1095	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1096	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1097	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1098	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1099}
1100
1101/* turn on/off EAPD control (only if available) */
1102static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
1103{
1104	if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
1105		return;
1106	if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
1107		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
1108				    on ? 2 : 0);
1109}
1110
1111static void alc_auto_init_amp(struct hda_codec *codec, int type)
1112{
1113	unsigned int tmp;
1114
1115	switch (type) {
1116	case ALC_INIT_GPIO1:
1117		snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1118		break;
1119	case ALC_INIT_GPIO2:
1120		snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1121		break;
1122	case ALC_INIT_GPIO3:
1123		snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1124		break;
1125	case ALC_INIT_DEFAULT:
1126		switch (codec->vendor_id) {
1127		case 0x10ec0260:
1128			set_eapd(codec, 0x0f, 1);
1129			set_eapd(codec, 0x10, 1);
1130			break;
1131		case 0x10ec0262:
1132		case 0x10ec0267:
1133		case 0x10ec0268:
1134		case 0x10ec0269:
1135		case 0x10ec0270:
1136		case 0x10ec0272:
1137		case 0x10ec0660:
1138		case 0x10ec0662:
1139		case 0x10ec0663:
1140		case 0x10ec0862:
1141		case 0x10ec0889:
1142			set_eapd(codec, 0x14, 1);
1143			set_eapd(codec, 0x15, 1);
1144			break;
1145		}
1146		switch (codec->vendor_id) {
1147		case 0x10ec0260:
1148			snd_hda_codec_write(codec, 0x1a, 0,
1149					    AC_VERB_SET_COEF_INDEX, 7);
1150			tmp = snd_hda_codec_read(codec, 0x1a, 0,
1151						 AC_VERB_GET_PROC_COEF, 0);
1152			snd_hda_codec_write(codec, 0x1a, 0,
1153					    AC_VERB_SET_COEF_INDEX, 7);
1154			snd_hda_codec_write(codec, 0x1a, 0,
1155					    AC_VERB_SET_PROC_COEF,
1156					    tmp | 0x2010);
1157			break;
1158		case 0x10ec0262:
1159		case 0x10ec0880:
1160		case 0x10ec0882:
1161		case 0x10ec0883:
1162		case 0x10ec0885:
1163		case 0x10ec0887:
1164		case 0x10ec0889:
1165			alc889_coef_init(codec);
1166			break;
1167		case 0x10ec0888:
1168			alc888_coef_init(codec);
1169			break;
1170#if 0 /* XXX: This may cause the silent output on speaker on some machines */
1171		case 0x10ec0267:
1172		case 0x10ec0268:
1173			snd_hda_codec_write(codec, 0x20, 0,
1174					    AC_VERB_SET_COEF_INDEX, 7);
1175			tmp = snd_hda_codec_read(codec, 0x20, 0,
1176						 AC_VERB_GET_PROC_COEF, 0);
1177			snd_hda_codec_write(codec, 0x20, 0,
1178					    AC_VERB_SET_COEF_INDEX, 7);
1179			snd_hda_codec_write(codec, 0x20, 0,
1180					    AC_VERB_SET_PROC_COEF,
1181					    tmp | 0x3000);
1182			break;
1183#endif /* XXX */
1184		}
1185		break;
1186	}
1187}
1188
1189static void alc_init_auto_hp(struct hda_codec *codec)
1190{
1191	struct alc_spec *spec = codec->spec;
1192
1193	if (!spec->autocfg.hp_pins[0])
1194		return;
1195
1196	if (!spec->autocfg.speaker_pins[0]) {
1197		if (spec->autocfg.line_out_pins[0] &&
1198		    spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
1199			spec->autocfg.speaker_pins[0] =
1200				spec->autocfg.line_out_pins[0];
1201		else
1202			return;
1203	}
1204
1205	snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1206		    spec->autocfg.hp_pins[0]);
1207	snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1208				  AC_VERB_SET_UNSOLICITED_ENABLE,
1209				  AC_USRSP_EN | ALC880_HP_EVENT);
1210	spec->unsol_event = alc_sku_unsol_event;
1211}
1212
1213static void alc_init_auto_mic(struct hda_codec *codec)
1214{
1215	struct alc_spec *spec = codec->spec;
1216	struct auto_pin_cfg *cfg = &spec->autocfg;
1217	hda_nid_t fixed, ext;
1218	int i;
1219
1220	/* there must be only two mic inputs exclusively */
1221	for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1222		if (cfg->input_pins[i])
1223			return;
1224
1225	fixed = ext = 0;
1226	for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1227		hda_nid_t nid = cfg->input_pins[i];
1228		unsigned int defcfg;
1229		if (!nid)
1230			return;
1231		defcfg = snd_hda_codec_get_pincfg(codec, nid);
1232		switch (get_defcfg_connect(defcfg)) {
1233		case AC_JACK_PORT_FIXED:
1234			if (fixed)
1235				return; /* already occupied */
1236			fixed = nid;
1237			break;
1238		case AC_JACK_PORT_COMPLEX:
1239			if (ext)
1240				return; /* already occupied */
1241			ext = nid;
1242			break;
1243		default:
1244			return; /* invalid entry */
1245		}
1246	}
1247	if (!ext || !fixed)
1248		return;
1249	if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1250		return; /* no unsol support */
1251	snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1252		    ext, fixed);
1253	spec->ext_mic.pin = ext;
1254	spec->int_mic.pin = fixed;
1255	spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1256	spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1257	spec->auto_mic = 1;
1258	snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1259				  AC_VERB_SET_UNSOLICITED_ENABLE,
1260				  AC_USRSP_EN | ALC880_MIC_EVENT);
1261	spec->unsol_event = alc_sku_unsol_event;
1262}
1263
1264static int alc_auto_parse_customize_define(struct hda_codec *codec)
1265{
1266	unsigned int ass, tmp, i;
1267	unsigned nid = 0;
1268	struct alc_spec *spec = codec->spec;
1269
1270	ass = codec->subsystem_id & 0xffff;
1271	if (ass != codec->bus->pci->subsystem_device && (ass & 1))
1272		goto do_sku;
1273
1274	nid = 0x1d;
1275	if (codec->vendor_id == 0x10ec0260)
1276		nid = 0x17;
1277	ass = snd_hda_codec_get_pincfg(codec, nid);
1278
1279	if (!(ass & 1)) {
1280		printk(KERN_INFO "hda_codec: %s: SKU not ready 0x%08x\n",
1281		       codec->chip_name, ass);
1282		return -1;
1283	}
1284
1285	/* check sum */
1286	tmp = 0;
1287	for (i = 1; i < 16; i++) {
1288		if ((ass >> i) & 1)
1289			tmp++;
1290	}
1291	if (((ass >> 16) & 0xf) != tmp)
1292		return -1;
1293
1294	spec->cdefine.port_connectivity = ass >> 30;
1295	spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
1296	spec->cdefine.check_sum = (ass >> 16) & 0xf;
1297	spec->cdefine.customization = ass >> 8;
1298do_sku:
1299	spec->cdefine.sku_cfg = ass;
1300	spec->cdefine.external_amp = (ass & 0x38) >> 3;
1301	spec->cdefine.platform_type = (ass & 0x4) >> 2;
1302	spec->cdefine.swap = (ass & 0x2) >> 1;
1303	spec->cdefine.override = ass & 0x1;
1304
1305	snd_printd("SKU: Nid=0x%x sku_cfg=0x%08x\n",
1306		   nid, spec->cdefine.sku_cfg);
1307	snd_printd("SKU: port_connectivity=0x%x\n",
1308		   spec->cdefine.port_connectivity);
1309	snd_printd("SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
1310	snd_printd("SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
1311	snd_printd("SKU: customization=0x%08x\n", spec->cdefine.customization);
1312	snd_printd("SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
1313	snd_printd("SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
1314	snd_printd("SKU: swap=0x%x\n", spec->cdefine.swap);
1315	snd_printd("SKU: override=0x%x\n", spec->cdefine.override);
1316
1317	return 0;
1318}
1319
1320/* check subsystem ID and set up device-specific initialization;
1321 * return 1 if initialized, 0 if invalid SSID
1322 */
1323/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1324 *	31 ~ 16 :	Manufacture ID
1325 *	15 ~ 8	:	SKU ID
1326 *	7  ~ 0	:	Assembly ID
1327 *	port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1328 */
1329static int alc_subsystem_id(struct hda_codec *codec,
1330			    hda_nid_t porta, hda_nid_t porte,
1331			    hda_nid_t portd, hda_nid_t porti)
1332{
1333	unsigned int ass, tmp, i;
1334	unsigned nid;
1335	struct alc_spec *spec = codec->spec;
1336
1337	ass = codec->subsystem_id & 0xffff;
1338	if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1339		goto do_sku;
1340
1341	/* invalid SSID, check the special NID pin defcfg instead */
1342	/*
1343	 * 31~30	: port connectivity
1344	 * 29~21	: reserve
1345	 * 20		: PCBEEP input
1346	 * 19~16	: Check sum (15:1)
1347	 * 15~1		: Custom
1348	 * 0		: override
1349	*/
1350	nid = 0x1d;
1351	if (codec->vendor_id == 0x10ec0260)
1352		nid = 0x17;
1353	ass = snd_hda_codec_get_pincfg(codec, nid);
1354	snd_printd("realtek: No valid SSID, "
1355		   "checking pincfg 0x%08x for NID 0x%x\n",
1356		   ass, nid);
1357	if (!(ass & 1))
1358		return 0;
1359	if ((ass >> 30) != 1)	/* no physical connection */
1360		return 0;
1361
1362	/* check sum */
1363	tmp = 0;
1364	for (i = 1; i < 16; i++) {
1365		if ((ass >> i) & 1)
1366			tmp++;
1367	}
1368	if (((ass >> 16) & 0xf) != tmp)
1369		return 0;
1370do_sku:
1371	snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1372		   ass & 0xffff, codec->vendor_id);
1373	/*
1374	 * 0 : override
1375	 * 1 :	Swap Jack
1376	 * 2 : 0 --> Desktop, 1 --> Laptop
1377	 * 3~5 : External Amplifier control
1378	 * 7~6 : Reserved
1379	*/
1380	tmp = (ass & 0x38) >> 3;	/* external Amp control */
1381	switch (tmp) {
1382	case 1:
1383		spec->init_amp = ALC_INIT_GPIO1;
1384		break;
1385	case 3:
1386		spec->init_amp = ALC_INIT_GPIO2;
1387		break;
1388	case 7:
1389		spec->init_amp = ALC_INIT_GPIO3;
1390		break;
1391	case 5:
1392		spec->init_amp = ALC_INIT_DEFAULT;
1393		break;
1394	}
1395
1396	/* is laptop or Desktop and enable the function "Mute internal speaker
1397	 * when the external headphone out jack is plugged"
1398	 */
1399	if (!(ass & 0x8000))
1400		return 1;
1401	/*
1402	 * 10~8 : Jack location
1403	 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1404	 * 14~13: Resvered
1405	 * 15   : 1 --> enable the function "Mute internal speaker
1406	 *	        when the external headphone out jack is plugged"
1407	 */
1408	if (!spec->autocfg.hp_pins[0]) {
1409		hda_nid_t nid;
1410		tmp = (ass >> 11) & 0x3;	/* HP to chassis */
1411		if (tmp == 0)
1412			nid = porta;
1413		else if (tmp == 1)
1414			nid = porte;
1415		else if (tmp == 2)
1416			nid = portd;
1417		else if (tmp == 3)
1418			nid = porti;
1419		else
1420			return 1;
1421		for (i = 0; i < spec->autocfg.line_outs; i++)
1422			if (spec->autocfg.line_out_pins[i] == nid)
1423				return 1;
1424		spec->autocfg.hp_pins[0] = nid;
1425	}
1426
1427	alc_init_auto_hp(codec);
1428	alc_init_auto_mic(codec);
1429	return 1;
1430}
1431
1432static void alc_ssid_check(struct hda_codec *codec,
1433			   hda_nid_t porta, hda_nid_t porte,
1434			   hda_nid_t portd, hda_nid_t porti)
1435{
1436	if (!alc_subsystem_id(codec, porta, porte, portd, porti)) {
1437		struct alc_spec *spec = codec->spec;
1438		snd_printd("realtek: "
1439			   "Enable default setup for auto mode as fallback\n");
1440		spec->init_amp = ALC_INIT_DEFAULT;
1441		alc_init_auto_hp(codec);
1442		alc_init_auto_mic(codec);
1443	}
1444}
1445
1446/*
1447 * Fix-up pin default configurations and add default verbs
1448 */
1449
1450struct alc_pincfg {
1451	hda_nid_t nid;
1452	u32 val;
1453};
1454
1455struct alc_fixup {
1456	const struct alc_pincfg *pins;
1457	const struct hda_verb *verbs;
1458};
1459
1460static void alc_pick_fixup(struct hda_codec *codec,
1461			   const struct snd_pci_quirk *quirk,
1462			   const struct alc_fixup *fix,
1463			   int pre_init)
1464{
1465	const struct alc_pincfg *cfg;
1466
1467	quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1468	if (!quirk)
1469		return;
1470	fix += quirk->value;
1471	cfg = fix->pins;
1472	if (pre_init && cfg) {
1473#ifdef CONFIG_SND_DEBUG_VERBOSE
1474		snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n",
1475			    codec->chip_name, quirk->name);
1476#endif
1477		for (; cfg->nid; cfg++)
1478			snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1479	}
1480	if (!pre_init && fix->verbs) {
1481#ifdef CONFIG_SND_DEBUG_VERBOSE
1482		snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-verbs for %s\n",
1483			    codec->chip_name, quirk->name);
1484#endif
1485		add_verb(codec->spec, fix->verbs);
1486	}
1487}
1488
1489static int alc_read_coef_idx(struct hda_codec *codec,
1490			unsigned int coef_idx)
1491{
1492	unsigned int val;
1493	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1494		    		coef_idx);
1495	val = snd_hda_codec_read(codec, 0x20, 0,
1496			 	AC_VERB_GET_PROC_COEF, 0);
1497	return val;
1498}
1499
1500/*
1501 * ALC888
1502 */
1503
1504/*
1505 * 2ch mode
1506 */
1507static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1508/* Mic-in jack as mic in */
1509	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1510	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1511/* Line-in jack as Line in */
1512	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1513	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1514/* Line-Out as Front */
1515	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1516	{ } /* end */
1517};
1518
1519/*
1520 * 4ch mode
1521 */
1522static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1523/* Mic-in jack as mic in */
1524	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1525	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1526/* Line-in jack as Surround */
1527	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1528	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1529/* Line-Out as Front */
1530	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1531	{ } /* end */
1532};
1533
1534/*
1535 * 6ch mode
1536 */
1537static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1538/* Mic-in jack as CLFE */
1539	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1540	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1541/* Line-in jack as Surround */
1542	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1543	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1544/* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1545	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1546	{ } /* end */
1547};
1548
1549/*
1550 * 8ch mode
1551 */
1552static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1553/* Mic-in jack as CLFE */
1554	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1555	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1556/* Line-in jack as Surround */
1557	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1558	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1559/* Line-Out as Side */
1560	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1561	{ } /* end */
1562};
1563
1564static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1565	{ 2, alc888_4ST_ch2_intel_init },
1566	{ 4, alc888_4ST_ch4_intel_init },
1567	{ 6, alc888_4ST_ch6_intel_init },
1568	{ 8, alc888_4ST_ch8_intel_init },
1569};
1570
1571/*
1572 * ALC888 Fujitsu Siemens Amillo xa3530
1573 */
1574
1575static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1576/* Front Mic: set to PIN_IN (empty by default) */
1577	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1578/* Connect Internal HP to Front */
1579	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1580	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1581	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1582/* Connect Bass HP to Front */
1583	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1584	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1585	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1586/* Connect Line-Out side jack (SPDIF) to Side */
1587	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1588	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1589	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1590/* Connect Mic jack to CLFE */
1591	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1592	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1593	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1594/* Connect Line-in jack to Surround */
1595	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1596	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1597	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1598/* Connect HP out jack to Front */
1599	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1600	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1601	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1602/* Enable unsolicited event for HP jack and Line-out jack */
1603	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1604	{0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1605	{}
1606};
1607
1608static void alc_automute_amp(struct hda_codec *codec)
1609{
1610	struct alc_spec *spec = codec->spec;
1611	unsigned int mute;
1612	hda_nid_t nid;
1613	int i;
1614
1615	spec->jack_present = 0;
1616	for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1617		nid = spec->autocfg.hp_pins[i];
1618		if (!nid)
1619			break;
1620		if (snd_hda_jack_detect(codec, nid)) {
1621			spec->jack_present = 1;
1622			break;
1623		}
1624	}
1625
1626	mute = spec->jack_present ? HDA_AMP_MUTE : 0;
1627	/* Toggle internal speakers muting */
1628	for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1629		nid = spec->autocfg.speaker_pins[i];
1630		if (!nid)
1631			break;
1632		snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1633					 HDA_AMP_MUTE, mute);
1634	}
1635}
1636
1637static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1638					 unsigned int res)
1639{
1640	if (codec->vendor_id == 0x10ec0880)
1641		res >>= 28;
1642	else
1643		res >>= 26;
1644	if (res == ALC880_HP_EVENT)
1645		alc_automute_amp(codec);
1646}
1647
1648static void alc889_automute_setup(struct hda_codec *codec)
1649{
1650	struct alc_spec *spec = codec->spec;
1651
1652	spec->autocfg.hp_pins[0] = 0x15;
1653	spec->autocfg.speaker_pins[0] = 0x14;
1654	spec->autocfg.speaker_pins[1] = 0x16;
1655	spec->autocfg.speaker_pins[2] = 0x17;
1656	spec->autocfg.speaker_pins[3] = 0x19;
1657	spec->autocfg.speaker_pins[4] = 0x1a;
1658}
1659
1660static void alc889_intel_init_hook(struct hda_codec *codec)
1661{
1662	alc889_coef_init(codec);
1663	alc_automute_amp(codec);
1664}
1665
1666static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
1667{
1668	struct alc_spec *spec = codec->spec;
1669
1670	spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1671	spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1672	spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1673	spec->autocfg.speaker_pins[1] = 0x15; /* bass */
1674}
1675
1676/*
1677 * ALC888 Acer Aspire 4930G model
1678 */
1679
1680static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1681/* Front Mic: set to PIN_IN (empty by default) */
1682	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1683/* Unselect Front Mic by default in input mixer 3 */
1684	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1685/* Enable unsolicited event for HP jack */
1686	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1687/* Connect Internal HP to front */
1688	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1689	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1690	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1691/* Connect HP out to front */
1692	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1693	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1694	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1695	{ }
1696};
1697
1698/*
1699 * ALC888 Acer Aspire 6530G model
1700 */
1701
1702static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1703/* Route to built-in subwoofer as well as speakers */
1704	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1705	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1706	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1707	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1708/* Bias voltage on for external mic port */
1709	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
1710/* Front Mic: set to PIN_IN (empty by default) */
1711	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1712/* Unselect Front Mic by default in input mixer 3 */
1713	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1714/* Enable unsolicited event for HP jack */
1715	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1716/* Enable speaker output */
1717	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1718	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1719	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
1720/* Enable headphone output */
1721	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1722	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1723	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1724	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
1725	{ }
1726};
1727
1728/*
1729 * ALC889 Acer Aspire 8930G model
1730 */
1731
1732static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
1733/* Front Mic: set to PIN_IN (empty by default) */
1734	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1735/* Unselect Front Mic by default in input mixer 3 */
1736	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1737/* Enable unsolicited event for HP jack */
1738	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1739/* Connect Internal Front to Front */
1740	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1741	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1742	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1743/* Connect Internal Rear to Rear */
1744	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1745	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1746	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1747/* Connect Internal CLFE to CLFE */
1748	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1749	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1750	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1751/* Connect HP out to Front */
1752	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1753	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1754	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1755/* Enable all DACs */
1756/*  DAC DISABLE/MUTE 1? */
1757/*  setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1758	{0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1759	{0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1760/*  DAC DISABLE/MUTE 2? */
1761/*  some bit here disables the other DACs. Init=0x4900 */
1762	{0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1763	{0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1764/* DMIC fix
1765 * This laptop has a stereo digital microphone. The mics are only 1cm apart
1766 * which makes the stereo useless. However, either the mic or the ALC889
1767 * makes the signal become a difference/sum signal instead of standard
1768 * stereo, which is annoying. So instead we flip this bit which makes the
1769 * codec replicate the sum signal to both channels, turning it into a
1770 * normal mono mic.
1771 */
1772/*  DMIC_CONTROL? Init value = 0x0001 */
1773	{0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1774	{0x20, AC_VERB_SET_PROC_COEF, 0x0003},
1775	{ }
1776};
1777
1778static struct hda_input_mux alc888_2_capture_sources[2] = {
1779	/* Front mic only available on one ADC */
1780	{
1781		.num_items = 4,
1782		.items = {
1783			{ "Mic", 0x0 },
1784			{ "Line", 0x2 },
1785			{ "CD", 0x4 },
1786			{ "Front Mic", 0xb },
1787		},
1788	},
1789	{
1790		.num_items = 3,
1791		.items = {
1792			{ "Mic", 0x0 },
1793			{ "Line", 0x2 },
1794			{ "CD", 0x4 },
1795		},
1796	}
1797};
1798
1799static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
1800	/* Interal mic only available on one ADC */
1801	{
1802		.num_items = 5,
1803		.items = {
1804			{ "Ext Mic", 0x0 },
1805			{ "Line In", 0x2 },
1806			{ "CD", 0x4 },
1807			{ "Input Mix", 0xa },
1808			{ "Int Mic", 0xb },
1809		},
1810	},
1811	{
1812		.num_items = 4,
1813		.items = {
1814			{ "Ext Mic", 0x0 },
1815			{ "Line In", 0x2 },
1816			{ "CD", 0x4 },
1817			{ "Input Mix", 0xa },
1818		},
1819	}
1820};
1821
1822static struct hda_input_mux alc889_capture_sources[3] = {
1823	/* Digital mic only available on first "ADC" */
1824	{
1825		.num_items = 5,
1826		.items = {
1827			{ "Mic", 0x0 },
1828			{ "Line", 0x2 },
1829			{ "CD", 0x4 },
1830			{ "Front Mic", 0xb },
1831			{ "Input Mix", 0xa },
1832		},
1833	},
1834	{
1835		.num_items = 4,
1836		.items = {
1837			{ "Mic", 0x0 },
1838			{ "Line", 0x2 },
1839			{ "CD", 0x4 },
1840			{ "Input Mix", 0xa },
1841		},
1842	},
1843	{
1844		.num_items = 4,
1845		.items = {
1846			{ "Mic", 0x0 },
1847			{ "Line", 0x2 },
1848			{ "CD", 0x4 },
1849			{ "Input Mix", 0xa },
1850		},
1851	}
1852};
1853
1854static struct snd_kcontrol_new alc888_base_mixer[] = {
1855	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1856	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1857	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1858	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1859	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1860		HDA_OUTPUT),
1861	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1862	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1863	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1864	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1865	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1866	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1867	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1868	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1869	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1870	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1871	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1872	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1873	{ } /* end */
1874};
1875
1876static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
1877	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1878	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1879	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1880	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1881	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1882		HDA_OUTPUT),
1883	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1884	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1885	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1886	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1887	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1888	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1889	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1890	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1891	{ } /* end */
1892};
1893
1894
1895static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
1896{
1897	struct alc_spec *spec = codec->spec;
1898
1899	spec->autocfg.hp_pins[0] = 0x15;
1900	spec->autocfg.speaker_pins[0] = 0x14;
1901	spec->autocfg.speaker_pins[1] = 0x16;
1902	spec->autocfg.speaker_pins[2] = 0x17;
1903}
1904
1905static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
1906{
1907	struct alc_spec *spec = codec->spec;
1908
1909	spec->autocfg.hp_pins[0] = 0x15;
1910	spec->autocfg.speaker_pins[0] = 0x14;
1911	spec->autocfg.speaker_pins[1] = 0x16;
1912	spec->autocfg.speaker_pins[2] = 0x17;
1913}
1914
1915static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
1916{
1917	struct alc_spec *spec = codec->spec;
1918
1919	spec->autocfg.hp_pins[0] = 0x15;
1920	spec->autocfg.speaker_pins[0] = 0x14;
1921	spec->autocfg.speaker_pins[1] = 0x16;
1922	spec->autocfg.speaker_pins[2] = 0x1b;
1923}
1924
1925/*
1926 * ALC880 3-stack model
1927 *
1928 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
1929 * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
1930 *                 F-Mic = 0x1b, HP = 0x19
1931 */
1932
1933static hda_nid_t alc880_dac_nids[4] = {
1934	/* front, rear, clfe, rear_surr */
1935	0x02, 0x05, 0x04, 0x03
1936};
1937
1938static hda_nid_t alc880_adc_nids[3] = {
1939	/* ADC0-2 */
1940	0x07, 0x08, 0x09,
1941};
1942
1943/* The datasheet says the node 0x07 is connected from inputs,
1944 * but it shows zero connection in the real implementation on some devices.
1945 * Note: this is a 915GAV bug, fixed on 915GLV
1946 */
1947static hda_nid_t alc880_adc_nids_alt[2] = {
1948	/* ADC1-2 */
1949	0x08, 0x09,
1950};
1951
1952#define ALC880_DIGOUT_NID	0x06
1953#define ALC880_DIGIN_NID	0x0a
1954
1955static struct hda_input_mux alc880_capture_source = {
1956	.num_items = 4,
1957	.items = {
1958		{ "Mic", 0x0 },
1959		{ "Front Mic", 0x3 },
1960		{ "Line", 0x2 },
1961		{ "CD", 0x4 },
1962	},
1963};
1964
1965/* channel source setting (2/6 channel selection for 3-stack) */
1966/* 2ch mode */
1967static struct hda_verb alc880_threestack_ch2_init[] = {
1968	/* set line-in to input, mute it */
1969	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1970	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1971	/* set mic-in to input vref 80%, mute it */
1972	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1973	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1974	{ } /* end */
1975};
1976
1977/* 6ch mode */
1978static struct hda_verb alc880_threestack_ch6_init[] = {
1979	/* set line-in to output, unmute it */
1980	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1981	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1982	/* set mic-in to output, unmute it */
1983	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1984	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1985	{ } /* end */
1986};
1987
1988static struct hda_channel_mode alc880_threestack_modes[2] = {
1989	{ 2, alc880_threestack_ch2_init },
1990	{ 6, alc880_threestack_ch6_init },
1991};
1992
1993static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
1994	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1995	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1996	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1997	HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
1998	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1999	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2000	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2001	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2002	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2003	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2004	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2005	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2006	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2007	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2008	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
2009	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
2010	HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
2011	{
2012		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2013		.name = "Channel Mode",
2014		.info = alc_ch_mode_info,
2015		.get = alc_ch_mode_get,
2016		.put = alc_ch_mode_put,
2017	},
2018	{ } /* end */
2019};
2020
2021/* capture mixer elements */
2022static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
2023			    struct snd_ctl_elem_info *uinfo)
2024{
2025	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2026	struct alc_spec *spec = codec->spec;
2027	int err;
2028
2029	mutex_lock(&codec->control_mutex);
2030	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2031						      HDA_INPUT);
2032	err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
2033	mutex_unlock(&codec->control_mutex);
2034	return err;
2035}
2036
2037static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
2038			   unsigned int size, unsigned int __user *tlv)
2039{
2040	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2041	struct alc_spec *spec = codec->spec;
2042	int err;
2043
2044	mutex_lock(&codec->control_mutex);
2045	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2046						      HDA_INPUT);
2047	err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
2048	mutex_unlock(&codec->control_mutex);
2049	return err;
2050}
2051
2052typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
2053			     struct snd_ctl_elem_value *ucontrol);
2054
2055static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
2056				 struct snd_ctl_elem_value *ucontrol,
2057				 getput_call_t func)
2058{
2059	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2060	struct alc_spec *spec = codec->spec;
2061	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2062	int err;
2063
2064	mutex_lock(&codec->control_mutex);
2065	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
2066						      3, 0, HDA_INPUT);
2067	err = func(kcontrol, ucontrol);
2068	mutex_unlock(&codec->control_mutex);
2069	return err;
2070}
2071
2072static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
2073			   struct snd_ctl_elem_value *ucontrol)
2074{
2075	return alc_cap_getput_caller(kcontrol, ucontrol,
2076				     snd_hda_mixer_amp_volume_get);
2077}
2078
2079static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
2080			   struct snd_ctl_elem_value *ucontrol)
2081{
2082	return alc_cap_getput_caller(kcontrol, ucontrol,
2083				     snd_hda_mixer_amp_volume_put);
2084}
2085
2086/* capture mixer elements */
2087#define alc_cap_sw_info		snd_ctl_boolean_stereo_info
2088
2089static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
2090			  struct snd_ctl_elem_value *ucontrol)
2091{
2092	return alc_cap_getput_caller(kcontrol, ucontrol,
2093				     snd_hda_mixer_amp_switch_get);
2094}
2095
2096static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2097			  struct snd_ctl_elem_value *ucontrol)
2098{
2099	return alc_cap_getput_caller(kcontrol, ucontrol,
2100				     snd_hda_mixer_amp_switch_put);
2101}
2102
2103#define _DEFINE_CAPMIX(num) \
2104	{ \
2105		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2106		.name = "Capture Switch", \
2107		.access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2108		.count = num, \
2109		.info = alc_cap_sw_info, \
2110		.get = alc_cap_sw_get, \
2111		.put = alc_cap_sw_put, \
2112	}, \
2113	{ \
2114		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2115		.name = "Capture Volume", \
2116		.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2117			   SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2118			   SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2119		.count = num, \
2120		.info = alc_cap_vol_info, \
2121		.get = alc_cap_vol_get, \
2122		.put = alc_cap_vol_put, \
2123		.tlv = { .c = alc_cap_vol_tlv }, \
2124	}
2125
2126#define _DEFINE_CAPSRC(num) \
2127	{ \
2128		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2129		/* .name = "Capture Source", */ \
2130		.name = "Input Source", \
2131		.count = num, \
2132		.info = alc_mux_enum_info, \
2133		.get = alc_mux_enum_get, \
2134		.put = alc_mux_enum_put, \
2135	}
2136
2137#define DEFINE_CAPMIX(num) \
2138static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2139	_DEFINE_CAPMIX(num),				      \
2140	_DEFINE_CAPSRC(num),				      \
2141	{ } /* end */					      \
2142}
2143
2144#define DEFINE_CAPMIX_NOSRC(num) \
2145static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2146	_DEFINE_CAPMIX(num),					    \
2147	{ } /* end */						    \
2148}
2149
2150/* up to three ADCs */
2151DEFINE_CAPMIX(1);
2152DEFINE_CAPMIX(2);
2153DEFINE_CAPMIX(3);
2154DEFINE_CAPMIX_NOSRC(1);
2155DEFINE_CAPMIX_NOSRC(2);
2156DEFINE_CAPMIX_NOSRC(3);
2157
2158/*
2159 * ALC880 5-stack model
2160 *
2161 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2162 *      Side = 0x02 (0xd)
2163 * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2164 *                 Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2165 */
2166
2167/* additional mixers to alc880_three_stack_mixer */
2168static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2169	HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2170	HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2171	{ } /* end */
2172};
2173
2174/* channel source setting (6/8 channel selection for 5-stack) */
2175/* 6ch mode */
2176static struct hda_verb alc880_fivestack_ch6_init[] = {
2177	/* set line-in to input, mute it */
2178	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2179	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2180	{ } /* end */
2181};
2182
2183/* 8ch mode */
2184static struct hda_verb alc880_fivestack_ch8_init[] = {
2185	/* set line-in to output, unmute it */
2186	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2187	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2188	{ } /* end */
2189};
2190
2191static struct hda_channel_mode alc880_fivestack_modes[2] = {
2192	{ 6, alc880_fivestack_ch6_init },
2193	{ 8, alc880_fivestack_ch8_init },
2194};
2195
2196
2197/*
2198 * ALC880 6-stack model
2199 *
2200 * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2201 *      Side = 0x05 (0x0f)
2202 * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2203 *   Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2204 */
2205
2206static hda_nid_t alc880_6st_dac_nids[4] = {
2207	/* front, rear, clfe, rear_surr */
2208	0x02, 0x03, 0x04, 0x05
2209};
2210
2211static struct hda_input_mux alc880_6stack_capture_source = {
2212	.num_items = 4,
2213	.items = {
2214		{ "Mic", 0x0 },
2215		{ "Front Mic", 0x1 },
2216		{ "Line", 0x2 },
2217		{ "CD", 0x4 },
2218	},
2219};
2220
2221/* fixed 8-channels */
2222static struct hda_channel_mode alc880_sixstack_modes[1] = {
2223	{ 8, NULL },
2224};
2225
2226static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2227	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2228	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2229	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2230	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2231	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2232	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2233	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2234	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2235	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2236	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2237	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2238	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2239	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2240	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2241	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2242	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2243	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2244	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2245	{
2246		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2247		.name = "Channel Mode",
2248		.info = alc_ch_mode_info,
2249		.get = alc_ch_mode_get,
2250		.put = alc_ch_mode_put,
2251	},
2252	{ } /* end */
2253};
2254
2255
2256/*
2257 * ALC880 W810 model
2258 *
2259 * W810 has rear IO for:
2260 * Front (DAC 02)
2261 * Surround (DAC 03)
2262 * Center/LFE (DAC 04)
2263 * Digital out (06)
2264 *
2265 * The system also has a pair of internal speakers, and a headphone jack.
2266 * These are both connected to Line2 on the codec, hence to DAC 02.
2267 *
2268 * There is a variable resistor to control the speaker or headphone
2269 * volume. This is a hardware-only device without a software API.
2270 *
2271 * Plugging headphones in will disable the internal speakers. This is
2272 * implemented in hardware, not via the driver using jack sense. In
2273 * a similar fashion, plugging into the rear socket marked "front" will
2274 * disable both the speakers and headphones.
2275 *
2276 * For input, there's a microphone jack, and an "audio in" jack.
2277 * These may not do anything useful with this driver yet, because I
2278 * haven't setup any initialization verbs for these yet...
2279 */
2280
2281static hda_nid_t alc880_w810_dac_nids[3] = {
2282	/* front, rear/surround, clfe */
2283	0x02, 0x03, 0x04
2284};
2285
2286/* fixed 6 channels */
2287static struct hda_channel_mode alc880_w810_modes[1] = {
2288	{ 6, NULL }
2289};
2290
2291/* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2292static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2293	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2294	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2295	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2296	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2297	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2298	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2299	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2300	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2301	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2302	{ } /* end */
2303};
2304
2305
2306/*
2307 * Z710V model
2308 *
2309 * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
2310 * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2311 *                 Line = 0x1a
2312 */
2313
2314static hda_nid_t alc880_z71v_dac_nids[1] = {
2315	0x02
2316};
2317#define ALC880_Z71V_HP_DAC	0x03
2318
2319/* fixed 2 channels */
2320static struct hda_channel_mode alc880_2_jack_modes[1] = {
2321	{ 2, NULL }
2322};
2323
2324static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2325	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2326	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2327	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2328	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
2329	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2330	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2331	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2332	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2333	{ } /* end */
2334};
2335
2336
2337/*
2338 * ALC880 F1734 model
2339 *
2340 * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2341 * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2342 */
2343
2344static hda_nid_t alc880_f1734_dac_nids[1] = {
2345	0x03
2346};
2347#define ALC880_F1734_HP_DAC	0x02
2348
2349static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2350	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2351	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2352	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2353	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2354	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2355	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2356	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2357	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2358	{ } /* end */
2359};
2360
2361static struct hda_input_mux alc880_f1734_capture_source = {
2362	.num_items = 2,
2363	.items = {
2364		{ "Mic", 0x1 },
2365		{ "CD", 0x4 },
2366	},
2367};
2368
2369
2370/*
2371 * ALC880 ASUS model
2372 *
2373 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2374 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2375 *  Mic = 0x18, Line = 0x1a
2376 */
2377
2378#define alc880_asus_dac_nids	alc880_w810_dac_nids	/* identical with w810 */
2379#define alc880_asus_modes	alc880_threestack_modes	/* 2/6 channel mode */
2380
2381static struct snd_kcontrol_new alc880_asus_mixer[] = {
2382	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2383	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2384	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2385	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2386	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2387	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2388	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2389	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2390	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2391	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2392	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2393	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2394	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2395	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2396	{
2397		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2398		.name = "Channel Mode",
2399		.info = alc_ch_mode_info,
2400		.get = alc_ch_mode_get,
2401		.put = alc_ch_mode_put,
2402	},
2403	{ } /* end */
2404};
2405
2406/*
2407 * ALC880 ASUS W1V model
2408 *
2409 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2410 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2411 *  Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2412 */
2413
2414/* additional mixers to alc880_asus_mixer */
2415static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2416	HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2417	HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2418	{ } /* end */
2419};
2420
2421/* TCL S700 */
2422static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2423	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2424	HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2425	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2426	HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2427	HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2428	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2429	HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2430	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2431	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
2432	{ } /* end */
2433};
2434
2435/* Uniwill */
2436static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2437	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2438	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2439	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2440	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2441	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2442	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2443	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2444	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2445	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2446	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2447	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2448	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2449	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2450	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2451	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2452	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2453	{
2454		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2455		.name = "Channel Mode",
2456		.info = alc_ch_mode_info,
2457		.get = alc_ch_mode_get,
2458		.put = alc_ch_mode_put,
2459	},
2460	{ } /* end */
2461};
2462
2463static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2464	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2465	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2466	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2467	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2468	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2469	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2470	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2471	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2472	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2473	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2474	{ } /* end */
2475};
2476
2477static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2478	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2479	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2480	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2481	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2482	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2483	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2484	{ } /* end */
2485};
2486
2487/*
2488 * virtual master controls
2489 */
2490
2491/*
2492 * slave controls for virtual master
2493 */
2494static const char *alc_slave_vols[] = {
2495	"Front Playback Volume",
2496	"Surround Playback Volume",
2497	"Center Playback Volume",
2498	"LFE Playback Volume",
2499	"Side Playback Volume",
2500	"Headphone Playback Volume",
2501	"Speaker Playback Volume",
2502	"Mono Playback Volume",
2503	"Line-Out Playback Volume",
2504	"PCM Playback Volume",
2505	NULL,
2506};
2507
2508static const char *alc_slave_sws[] = {
2509	"Front Playback Switch",
2510	"Surround Playback Switch",
2511	"Center Playback Switch",
2512	"LFE Playback Switch",
2513	"Side Playback Switch",
2514	"Headphone Playback Switch",
2515	"Speaker Playback Switch",
2516	"Mono Playback Switch",
2517	"IEC958 Playback Switch",
2518	"Line-Out Playback Switch",
2519	"PCM Playback Switch",
2520	NULL,
2521};
2522
2523/*
2524 * build control elements
2525 */
2526
2527#define NID_MAPPING		(-1)
2528
2529#define SUBDEV_SPEAKER_		(0 << 6)
2530#define SUBDEV_HP_		(1 << 6)
2531#define SUBDEV_LINE_		(2 << 6)
2532#define SUBDEV_SPEAKER(x)	(SUBDEV_SPEAKER_ | ((x) & 0x3f))
2533#define SUBDEV_HP(x)		(SUBDEV_HP_ | ((x) & 0x3f))
2534#define SUBDEV_LINE(x)		(SUBDEV_LINE_ | ((x) & 0x3f))
2535
2536static void alc_free_kctls(struct hda_codec *codec);
2537
2538#ifdef CONFIG_SND_HDA_INPUT_BEEP
2539/* additional beep mixers; the actual parameters are overwritten at build */
2540static struct snd_kcontrol_new alc_beep_mixer[] = {
2541	HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2542	HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
2543	{ } /* end */
2544};
2545#endif
2546
2547static int alc_build_controls(struct hda_codec *codec)
2548{
2549	struct alc_spec *spec = codec->spec;
2550	struct snd_kcontrol *kctl;
2551	struct snd_kcontrol_new *knew;
2552	int i, j, err;
2553	unsigned int u;
2554	hda_nid_t nid;
2555
2556	for (i = 0; i < spec->num_mixers; i++) {
2557		err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2558		if (err < 0)
2559			return err;
2560	}
2561	if (spec->cap_mixer) {
2562		err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2563		if (err < 0)
2564			return err;
2565	}
2566	if (spec->multiout.dig_out_nid) {
2567		err = snd_hda_create_spdif_out_ctls(codec,
2568						    spec->multiout.dig_out_nid);
2569		if (err < 0)
2570			return err;
2571		if (!spec->no_analog) {
2572			err = snd_hda_create_spdif_share_sw(codec,
2573							    &spec->multiout);
2574			if (err < 0)
2575				return err;
2576			spec->multiout.share_spdif = 1;
2577		}
2578	}
2579	if (spec->dig_in_nid) {
2580		err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2581		if (err < 0)
2582			return err;
2583	}
2584
2585#ifdef CONFIG_SND_HDA_INPUT_BEEP
2586	/* create beep controls if needed */
2587	if (spec->beep_amp) {
2588		struct snd_kcontrol_new *knew;
2589		for (knew = alc_beep_mixer; knew->name; knew++) {
2590			struct snd_kcontrol *kctl;
2591			kctl = snd_ctl_new1(knew, codec);
2592			if (!kctl)
2593				return -ENOMEM;
2594			kctl->private_value = spec->beep_amp;
2595			err = snd_hda_ctl_add(codec, 0, kctl);
2596			if (err < 0)
2597				return err;
2598		}
2599	}
2600#endif
2601
2602	/* if we have no master control, let's create it */
2603	if (!spec->no_analog &&
2604	    !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
2605		unsigned int vmaster_tlv[4];
2606		snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
2607					HDA_OUTPUT, vmaster_tlv);
2608		err = snd_hda_add_vmaster(codec, "Master Playback Volume",
2609					  vmaster_tlv, alc_slave_vols);
2610		if (err < 0)
2611			return err;
2612	}
2613	if (!spec->no_analog &&
2614	    !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2615		err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2616					  NULL, alc_slave_sws);
2617		if (err < 0)
2618			return err;
2619	}
2620
2621	/* assign Capture Source enums to NID */
2622	kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
2623	if (!kctl)
2624		kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
2625	for (i = 0; kctl && i < kctl->count; i++) {
2626		hda_nid_t *nids = spec->capsrc_nids;
2627		if (!nids)
2628			nids = spec->adc_nids;
2629		err = snd_hda_add_nid(codec, kctl, i, nids[i]);
2630		if (err < 0)
2631			return err;
2632	}
2633	if (spec->cap_mixer) {
2634		const char *kname = kctl ? kctl->id.name : NULL;
2635		for (knew = spec->cap_mixer; knew->name; knew++) {
2636			if (kname && strcmp(knew->name, kname) == 0)
2637				continue;
2638			kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2639			for (i = 0; kctl && i < kctl->count; i++) {
2640				err = snd_hda_add_nid(codec, kctl, i,
2641						      spec->adc_nids[i]);
2642				if (err < 0)
2643					return err;
2644			}
2645		}
2646	}
2647
2648	/* other nid->control mapping */
2649	for (i = 0; i < spec->num_mixers; i++) {
2650		for (knew = spec->mixers[i]; knew->name; knew++) {
2651			if (knew->iface != NID_MAPPING)
2652				continue;
2653			kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2654			if (kctl == NULL)
2655				continue;
2656			u = knew->subdevice;
2657			for (j = 0; j < 4; j++, u >>= 8) {
2658				nid = u & 0x3f;
2659				if (nid == 0)
2660					continue;
2661				switch (u & 0xc0) {
2662				case SUBDEV_SPEAKER_:
2663					nid = spec->autocfg.speaker_pins[nid];
2664					break;
2665				case SUBDEV_LINE_:
2666					nid = spec->autocfg.line_out_pins[nid];
2667					break;
2668				case SUBDEV_HP_:
2669					nid = spec->autocfg.hp_pins[nid];
2670					break;
2671				default:
2672					continue;
2673				}
2674				err = snd_hda_add_nid(codec, kctl, 0, nid);
2675				if (err < 0)
2676					return err;
2677			}
2678			u = knew->private_value;
2679			for (j = 0; j < 4; j++, u >>= 8) {
2680				nid = u & 0xff;
2681				if (nid == 0)
2682					continue;
2683				err = snd_hda_add_nid(codec, kctl, 0, nid);
2684				if (err < 0)
2685					return err;
2686			}
2687		}
2688	}
2689
2690	alc_free_kctls(codec); /* no longer needed */
2691
2692	return 0;
2693}
2694
2695
2696/*
2697 * initialize the codec volumes, etc
2698 */
2699
2700/*
2701 * generic initialization of ADC, input mixers and output mixers
2702 */
2703static struct hda_verb alc880_volume_init_verbs[] = {
2704	/*
2705	 * Unmute ADC0-2 and set the default input to mic-in
2706	 */
2707	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2708	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2709	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
2710	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2711	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
2712	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2713
2714	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2715	 * mixer widget
2716	 * Note: PASD motherboards uses the Line In 2 as the input for front
2717	 * panel mic (mic 2)
2718	 */
2719	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
2720	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2721	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2722	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2723	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2724	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2725	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2726	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2727
2728	/*
2729	 * Set up output mixers (0x0c - 0x0f)
2730	 */
2731	/* set vol=0 to output mixers */
2732	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2733	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2734	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2735	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2736	/* set up input amps for analog loopback */
2737	/* Amp Indices: DAC = 0, mixer = 1 */
2738	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2739	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2740	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2741	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2742	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2743	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2744	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2745	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2746
2747	{ }
2748};
2749
2750/*
2751 * 3-stack pin configuration:
2752 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2753 */
2754static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2755	/*
2756	 * preset connection lists of input pins
2757	 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2758	 */
2759	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2760	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2761	{0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2762
2763	/*
2764	 * Set pin mode and muting
2765	 */
2766	/* set front pin widgets 0x14 for output */
2767	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2768	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2769	/* Mic1 (rear panel) pin widget for input and vref at 80% */
2770	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2771	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2772	/* Mic2 (as headphone out) for HP output */
2773	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2774	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2775	/* Line In pin widget for input */
2776	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2777	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2778	/* Line2 (as front mic) pin widget for input and vref at 80% */
2779	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2780	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2781	/* CD pin widget for input */
2782	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2783
2784	{ }
2785};
2786
2787/*
2788 * 5-stack pin configuration:
2789 * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2790 * line-in/side = 0x1a, f-mic = 0x1b
2791 */
2792static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2793	/*
2794	 * preset connection lists of input pins
2795	 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2796	 */
2797	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2798	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
2799
2800	/*
2801	 * Set pin mode and muting
2802	 */
2803	/* set pin widgets 0x14-0x17 for output */
2804	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2805	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2806	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2807	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2808	/* unmute pins for output (no gain on this amp) */
2809	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2810	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2811	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2812	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2813
2814	/* Mic1 (rear panel) pin widget for input and vref at 80% */
2815	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2816	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2817	/* Mic2 (as headphone out) for HP output */
2818	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2819	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2820	/* Line In pin widget for input */
2821	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2822	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2823	/* Line2 (as front mic) pin widget for input and vref at 80% */
2824	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2825	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2826	/* CD pin widget for input */
2827	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2828
2829	{ }
2830};
2831
2832/*
2833 * W810 pin configuration:
2834 * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2835 */
2836static struct hda_verb alc880_pin_w810_init_verbs[] = {
2837	/* hphone/speaker input selector: front DAC */
2838	{0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
2839
2840	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2841	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2842	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2843	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2844	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2845	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2846
2847	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2848	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2849
2850	{ }
2851};
2852
2853/*
2854 * Z71V pin configuration:
2855 * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2856 */
2857static struct hda_verb alc880_pin_z71v_init_verbs[] = {
2858	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2859	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2860	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2861	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2862
2863	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2864	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2865	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2866	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2867
2868	{ }
2869};
2870
2871/*
2872 * 6-stack pin configuration:
2873 * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2874 * f-mic = 0x19, line = 0x1a, HP = 0x1b
2875 */
2876static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2877	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2878
2879	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2880	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2881	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2882	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2883	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2884	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2885	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2886	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2887
2888	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2889	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2890	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2891	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2892	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2893	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2894	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2895	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2896	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2897
2898	{ }
2899};
2900
2901/*
2902 * Uniwill pin configuration:
2903 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
2904 * line = 0x1a
2905 */
2906static struct hda_verb alc880_uniwill_init_verbs[] = {
2907	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2908
2909	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2910	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2911	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2912	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2913	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2914	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2915	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2916	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2917	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2918	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2919	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2920	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2921	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2922	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2923
2924	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2925	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2926	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2927	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2928	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2929	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2930	/* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
2931	/* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
2932	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2933
2934	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2935	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
2936
2937	{ }
2938};
2939
2940/*
2941* Uniwill P53
2942* HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
2943 */
2944static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
2945	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2946
2947	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2948	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2949	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2950	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2951	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2952	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2953	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2954	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2955	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2956	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2957	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2958	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2959
2960	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2961	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2962	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2963	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2964	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2965	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2966
2967	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2968	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
2969
2970	{ }
2971};
2972
2973static struct hda_verb alc880_beep_init_verbs[] = {
2974	{ 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
2975	{ }
2976};
2977
2978/* auto-toggle front mic */
2979static void alc880_uniwill_mic_automute(struct hda_codec *codec)
2980{
2981 	unsigned int present;
2982	unsigned char bits;
2983
2984	present = snd_hda_jack_detect(codec, 0x18);
2985	bits = present ? HDA_AMP_MUTE : 0;
2986	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
2987}
2988
2989static void alc880_uniwill_setup(struct hda_codec *codec)
2990{
2991	struct alc_spec *spec = codec->spec;
2992
2993	spec->autocfg.hp_pins[0] = 0x14;
2994	spec->autocfg.speaker_pins[0] = 0x15;
2995	spec->autocfg.speaker_pins[0] = 0x16;
2996}
2997
2998static void alc880_uniwill_init_hook(struct hda_codec *codec)
2999{
3000	alc_automute_amp(codec);
3001	alc880_uniwill_mic_automute(codec);
3002}
3003
3004static void alc880_uniwill_unsol_event(struct hda_codec *codec,
3005				       unsigned int res)
3006{
3007	/* Looks like the unsol event is incompatible with the standard
3008	 * definition.  4bit tag is placed at 28 bit!
3009	 */
3010	switch (res >> 28) {
3011	case ALC880_MIC_EVENT:
3012		alc880_uniwill_mic_automute(codec);
3013		break;
3014	default:
3015		alc_automute_amp_unsol_event(codec, res);
3016		break;
3017	}
3018}
3019
3020static void alc880_uniwill_p53_setup(struct hda_codec *codec)
3021{
3022	struct alc_spec *spec = codec->spec;
3023
3024	spec->autocfg.hp_pins[0] = 0x14;
3025	spec->autocfg.speaker_pins[0] = 0x15;
3026}
3027
3028static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
3029{
3030	unsigned int present;
3031
3032	present = snd_hda_codec_read(codec, 0x21, 0,
3033				     AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
3034	present &= HDA_AMP_VOLMASK;
3035	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
3036				 HDA_AMP_VOLMASK, present);
3037	snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
3038				 HDA_AMP_VOLMASK, present);
3039}
3040
3041static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
3042					   unsigned int res)
3043{
3044	/* Looks like the unsol event is incompatible with the standard
3045	 * definition.  4bit tag is placed at 28 bit!
3046	 */
3047	if ((res >> 28) == ALC880_DCVOL_EVENT)
3048		alc880_uniwill_p53_dcvol_automute(codec);
3049	else
3050		alc_automute_amp_unsol_event(codec, res);
3051}
3052
3053/*
3054 * F1734 pin configuration:
3055 * HP = 0x14, speaker-out = 0x15, mic = 0x18
3056 */
3057static struct hda_verb alc880_pin_f1734_init_verbs[] = {
3058	{0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
3059	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3060	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3061	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3062	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3063
3064	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3065	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3066	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3067	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3068
3069	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3070	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3071	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
3072	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3073	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3074	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3075	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3076	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3077	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3078
3079	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
3080	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
3081
3082	{ }
3083};
3084
3085/*
3086 * ASUS pin configuration:
3087 * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
3088 */
3089static struct hda_verb alc880_pin_asus_init_verbs[] = {
3090	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3091	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3092	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3093	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3094
3095	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3096	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3097	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3098	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3099	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3100	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3101	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3102	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3103
3104	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3105	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3106	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3107	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3108	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3109	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3110	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3111	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3112	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3113
3114	{ }
3115};
3116
3117/* Enable GPIO mask and set output */
3118#define alc880_gpio1_init_verbs	alc_gpio1_init_verbs
3119#define alc880_gpio2_init_verbs	alc_gpio2_init_verbs
3120#define alc880_gpio3_init_verbs	alc_gpio3_init_verbs
3121
3122/* Clevo m520g init */
3123static struct hda_verb alc880_pin_clevo_init_verbs[] = {
3124	/* headphone output */
3125	{0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3126	/* line-out */
3127	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3128	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3129	/* Line-in */
3130	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3131	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3132	/* CD */
3133	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3134	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3135	/* Mic1 (rear panel) */
3136	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3137	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3138	/* Mic2 (front panel) */
3139	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3140	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3141	/* headphone */
3142	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3143	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3144        /* change to EAPD mode */
3145	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3146	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3147
3148	{ }
3149};
3150
3151static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
3152	/* change to EAPD mode */
3153	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3154	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3155
3156	/* Headphone output */
3157	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3158	/* Front output*/
3159	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3160	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
3161
3162	/* Line In pin widget for input */
3163	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3164	/* CD pin widget for input */
3165	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3166	/* Mic1 (rear panel) pin widget for input and vref at 80% */
3167	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3168
3169	/* change to EAPD mode */
3170	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3171	{0x20, AC_VERB_SET_PROC_COEF,  0x3070},
3172
3173	{ }
3174};
3175
3176/*
3177 * LG m1 express dual
3178 *
3179 * Pin assignment:
3180 *   Rear Line-In/Out (blue): 0x14
3181 *   Build-in Mic-In: 0x15
3182 *   Speaker-out: 0x17
3183 *   HP-Out (green): 0x1b
3184 *   Mic-In/Out (red): 0x19
3185 *   SPDIF-Out: 0x1e
3186 */
3187
3188/* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3189static hda_nid_t alc880_lg_dac_nids[3] = {
3190	0x05, 0x02, 0x03
3191};
3192
3193/* seems analog CD is not working */
3194static struct hda_input_mux alc880_lg_capture_source = {
3195	.num_items = 3,
3196	.items = {
3197		{ "Mic", 0x1 },
3198		{ "Line", 0x5 },
3199		{ "Internal Mic", 0x6 },
3200	},
3201};
3202
3203/* 2,4,6 channel modes */
3204static struct hda_verb alc880_lg_ch2_init[] = {
3205	/* set line-in and mic-in to input */
3206	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3207	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3208	{ }
3209};
3210
3211static struct hda_verb alc880_lg_ch4_init[] = {
3212	/* set line-in to out and mic-in to input */
3213	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3214	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3215	{ }
3216};
3217
3218static struct hda_verb alc880_lg_ch6_init[] = {
3219	/* set line-in and mic-in to output */
3220	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3221	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3222	{ }
3223};
3224
3225static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3226	{ 2, alc880_lg_ch2_init },
3227	{ 4, alc880_lg_ch4_init },
3228	{ 6, alc880_lg_ch6_init },
3229};
3230
3231static struct snd_kcontrol_new alc880_lg_mixer[] = {
3232	HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3233	HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3234	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3235	HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3236	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3237	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3238	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3239	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3240	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3241	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3242	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3243	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3244	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3245	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3246	{
3247		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3248		.name = "Channel Mode",
3249		.info = alc_ch_mode_info,
3250		.get = alc_ch_mode_get,
3251		.put = alc_ch_mode_put,
3252	},
3253	{ } /* end */
3254};
3255
3256static struct hda_verb alc880_lg_init_verbs[] = {
3257	/* set capture source to mic-in */
3258	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3259	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3260	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3261	/* mute all amp mixer inputs */
3262	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
3263	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3264	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3265	/* line-in to input */
3266	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3267	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3268	/* built-in mic */
3269	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3270	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3271	/* speaker-out */
3272	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3273	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3274	/* mic-in to input */
3275	{0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3276	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3277	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3278	/* HP-out */
3279	{0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3280	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3281	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3282	/* jack sense */
3283	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3284	{ }
3285};
3286
3287/* toggle speaker-output according to the hp-jack state */
3288static void alc880_lg_setup(struct hda_codec *codec)
3289{
3290	struct alc_spec *spec = codec->spec;
3291
3292	spec->autocfg.hp_pins[0] = 0x1b;
3293	spec->autocfg.speaker_pins[0] = 0x17;
3294}
3295
3296/*
3297 * LG LW20
3298 *
3299 * Pin assignment:
3300 *   Speaker-out: 0x14
3301 *   Mic-In: 0x18
3302 *   Built-in Mic-In: 0x19
3303 *   Line-In: 0x1b
3304 *   HP-Out: 0x1a
3305 *   SPDIF-Out: 0x1e
3306 */
3307
3308static struct hda_input_mux alc880_lg_lw_capture_source = {
3309	.num_items = 3,
3310	.items = {
3311		{ "Mic", 0x0 },
3312		{ "Internal Mic", 0x1 },
3313		{ "Line In", 0x2 },
3314	},
3315};
3316
3317#define alc880_lg_lw_modes alc880_threestack_modes
3318
3319static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3320	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3321	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3322	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3323	HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3324	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3325	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3326	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3327	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3328	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3329	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
3330	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3331	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3332	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3333	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
3334	{
3335		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3336		.name = "Channel Mode",
3337		.info = alc_ch_mode_info,
3338		.get = alc_ch_mode_get,
3339		.put = alc_ch_mode_put,
3340	},
3341	{ } /* end */
3342};
3343
3344static struct hda_verb alc880_lg_lw_init_verbs[] = {
3345	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3346	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3347	{0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3348
3349	/* set capture source to mic-in */
3350	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3351	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3352	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3353	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3354	/* speaker-out */
3355	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3356	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3357	/* HP-out */
3358	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3359	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3360	/* mic-in to input */
3361	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3362	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3363	/* built-in mic */
3364	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3365	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3366	/* jack sense */
3367	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3368	{ }
3369};
3370
3371/* toggle speaker-output according to the hp-jack state */
3372static void alc880_lg_lw_setup(struct hda_codec *codec)
3373{
3374	struct alc_spec *spec = codec->spec;
3375
3376	spec->autocfg.hp_pins[0] = 0x1b;
3377	spec->autocfg.speaker_pins[0] = 0x14;
3378}
3379
3380static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3381	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3382	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3383	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3384	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3385	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3386	HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3387	{ } /* end */
3388};
3389
3390static struct hda_input_mux alc880_medion_rim_capture_source = {
3391	.num_items = 2,
3392	.items = {
3393		{ "Mic", 0x0 },
3394		{ "Internal Mic", 0x1 },
3395	},
3396};
3397
3398static struct hda_verb alc880_medion_rim_init_verbs[] = {
3399	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3400
3401	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3402	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3403
3404	/* Mic1 (rear panel) pin widget for input and vref at 80% */
3405	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3406	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3407	/* Mic2 (as headphone out) for HP output */
3408	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3409	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3410	/* Internal Speaker */
3411	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3412	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3413
3414	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3415	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3416
3417	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3418	{ }
3419};
3420
3421/* toggle speaker-output according to the hp-jack state */
3422static void alc880_medion_rim_automute(struct hda_codec *codec)
3423{
3424	struct alc_spec *spec = codec->spec;
3425	alc_automute_amp(codec);
3426	/* toggle EAPD */
3427	if (spec->jack_present)
3428		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3429	else
3430		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3431}
3432
3433static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3434					  unsigned int res)
3435{
3436	/* Looks like the unsol event is incompatible with the standard
3437	 * definition.  4bit tag is placed at 28 bit!
3438	 */
3439	if ((res >> 28) == ALC880_HP_EVENT)
3440		alc880_medion_rim_automute(codec);
3441}
3442
3443static void alc880_medion_rim_setup(struct hda_codec *codec)
3444{
3445	struct alc_spec *spec = codec->spec;
3446
3447	spec->autocfg.hp_pins[0] = 0x14;
3448	spec->autocfg.speaker_pins[0] = 0x1b;
3449}
3450
3451#ifdef CONFIG_SND_HDA_POWER_SAVE
3452static struct hda_amp_list alc880_loopbacks[] = {
3453	{ 0x0b, HDA_INPUT, 0 },
3454	{ 0x0b, HDA_INPUT, 1 },
3455	{ 0x0b, HDA_INPUT, 2 },
3456	{ 0x0b, HDA_INPUT, 3 },
3457	{ 0x0b, HDA_INPUT, 4 },
3458	{ } /* end */
3459};
3460
3461static struct hda_amp_list alc880_lg_loopbacks[] = {
3462	{ 0x0b, HDA_INPUT, 1 },
3463	{ 0x0b, HDA_INPUT, 6 },
3464	{ 0x0b, HDA_INPUT, 7 },
3465	{ } /* end */
3466};
3467#endif
3468
3469/*
3470 * Common callbacks
3471 */
3472
3473static int alc_init(struct hda_codec *codec)
3474{
3475	struct alc_spec *spec = codec->spec;
3476	unsigned int i;
3477
3478	alc_fix_pll(codec);
3479	alc_auto_init_amp(codec, spec->init_amp);
3480
3481	for (i = 0; i < spec->num_init_verbs; i++)
3482		snd_hda_sequence_write(codec, spec->init_verbs[i]);
3483
3484	if (spec->init_hook)
3485		spec->init_hook(codec);
3486
3487#ifdef CONFIG_SND_HDA_POWER_SAVE
3488	if (codec->patch_ops.check_power_status)
3489		codec->patch_ops.check_power_status(codec, 0x01);
3490#endif
3491	return 0;
3492}
3493
3494static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3495{
3496	struct alc_spec *spec = codec->spec;
3497
3498	if (spec->unsol_event)
3499		spec->unsol_event(codec, res);
3500}
3501
3502#ifdef CONFIG_SND_HDA_POWER_SAVE
3503static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3504{
3505	struct alc_spec *spec = codec->spec;
3506	return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3507}
3508#endif
3509
3510/*
3511 * Analog playback callbacks
3512 */
3513static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3514				    struct hda_codec *codec,
3515				    struct snd_pcm_substream *substream)
3516{
3517	struct alc_spec *spec = codec->spec;
3518	return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3519					     hinfo);
3520}
3521
3522static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3523				       struct hda_codec *codec,
3524				       unsigned int stream_tag,
3525				       unsigned int format,
3526				       struct snd_pcm_substream *substream)
3527{
3528	struct alc_spec *spec = codec->spec;
3529	return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3530						stream_tag, format, substream);
3531}
3532
3533static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3534				       struct hda_codec *codec,
3535				       struct snd_pcm_substream *substream)
3536{
3537	struct alc_spec *spec = codec->spec;
3538	return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3539}
3540
3541/*
3542 * Digital out
3543 */
3544static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3545					struct hda_codec *codec,
3546					struct snd_pcm_substream *substream)
3547{
3548	struct alc_spec *spec = codec->spec;
3549	return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3550}
3551
3552static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3553					   struct hda_codec *codec,
3554					   unsigned int stream_tag,
3555					   unsigned int format,
3556					   struct snd_pcm_substream *substream)
3557{
3558	struct alc_spec *spec = codec->spec;
3559	return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3560					     stream_tag, format, substream);
3561}
3562
3563static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3564					   struct hda_codec *codec,
3565					   struct snd_pcm_substream *substream)
3566{
3567	struct alc_spec *spec = codec->spec;
3568	return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3569}
3570
3571static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3572					 struct hda_codec *codec,
3573					 struct snd_pcm_substream *substream)
3574{
3575	struct alc_spec *spec = codec->spec;
3576	return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3577}
3578
3579/*
3580 * Analog capture
3581 */
3582static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3583				      struct hda_codec *codec,
3584				      unsigned int stream_tag,
3585				      unsigned int format,
3586				      struct snd_pcm_substream *substream)
3587{
3588	struct alc_spec *spec = codec->spec;
3589
3590	snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3591				   stream_tag, 0, format);
3592	return 0;
3593}
3594
3595static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3596				      struct hda_codec *codec,
3597				      struct snd_pcm_substream *substream)
3598{
3599	struct alc_spec *spec = codec->spec;
3600
3601	snd_hda_codec_cleanup_stream(codec,
3602				     spec->adc_nids[substream->number + 1]);
3603	return 0;
3604}
3605
3606
3607/*
3608 */
3609static struct hda_pcm_stream alc880_pcm_analog_playback = {
3610	.substreams = 1,
3611	.channels_min = 2,
3612	.channels_max = 8,
3613	/* NID is set in alc_build_pcms */
3614	.ops = {
3615		.open = alc880_playback_pcm_open,
3616		.prepare = alc880_playback_pcm_prepare,
3617		.cleanup = alc880_playback_pcm_cleanup
3618	},
3619};
3620
3621static struct hda_pcm_stream alc880_pcm_analog_capture = {
3622	.substreams = 1,
3623	.channels_min = 2,
3624	.channels_max = 2,
3625	/* NID is set in alc_build_pcms */
3626};
3627
3628static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3629	.substreams = 1,
3630	.channels_min = 2,
3631	.channels_max = 2,
3632	/* NID is set in alc_build_pcms */
3633};
3634
3635static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3636	.substreams = 2, /* can be overridden */
3637	.channels_min = 2,
3638	.channels_max = 2,
3639	/* NID is set in alc_build_pcms */
3640	.ops = {
3641		.prepare = alc880_alt_capture_pcm_prepare,
3642		.cleanup = alc880_alt_capture_pcm_cleanup
3643	},
3644};
3645
3646static struct hda_pcm_stream alc880_pcm_digital_playback = {
3647	.substreams = 1,
3648	.channels_min = 2,
3649	.channels_max = 2,
3650	/* NID is set in alc_build_pcms */
3651	.ops = {
3652		.open = alc880_dig_playback_pcm_open,
3653		.close = alc880_dig_playback_pcm_close,
3654		.prepare = alc880_dig_playback_pcm_prepare,
3655		.cleanup = alc880_dig_playback_pcm_cleanup
3656	},
3657};
3658
3659static struct hda_pcm_stream alc880_pcm_digital_capture = {
3660	.substreams = 1,
3661	.channels_min = 2,
3662	.channels_max = 2,
3663	/* NID is set in alc_build_pcms */
3664};
3665
3666/* Used by alc_build_pcms to flag that a PCM has no playback stream */
3667static struct hda_pcm_stream alc_pcm_null_stream = {
3668	.substreams = 0,
3669	.channels_min = 0,
3670	.channels_max = 0,
3671};
3672
3673static int alc_build_pcms(struct hda_codec *codec)
3674{
3675	struct alc_spec *spec = codec->spec;
3676	struct hda_pcm *info = spec->pcm_rec;
3677	int i;
3678
3679	codec->num_pcms = 1;
3680	codec->pcm_info = info;
3681
3682	if (spec->no_analog)
3683		goto skip_analog;
3684
3685	snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3686		 "%s Analog", codec->chip_name);
3687	info->name = spec->stream_name_analog;
3688
3689	if (spec->stream_analog_playback) {
3690		if (snd_BUG_ON(!spec->multiout.dac_nids))
3691			return -EINVAL;
3692		info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3693		info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3694	}
3695	if (spec->stream_analog_capture) {
3696		if (snd_BUG_ON(!spec->adc_nids))
3697			return -EINVAL;
3698		info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3699		info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3700	}
3701
3702	if (spec->channel_mode) {
3703		info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3704		for (i = 0; i < spec->num_channel_mode; i++) {
3705			if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3706				info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3707			}
3708		}
3709	}
3710
3711 skip_analog:
3712	/* SPDIF for stream index #1 */
3713	if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3714		snprintf(spec->stream_name_digital,
3715			 sizeof(spec->stream_name_digital),
3716			 "%s Digital", codec->chip_name);
3717		codec->num_pcms = 2;
3718	        codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3719		info = spec->pcm_rec + 1;
3720		info->name = spec->stream_name_digital;
3721		if (spec->dig_out_type)
3722			info->pcm_type = spec->dig_out_type;
3723		else
3724			info->pcm_type = HDA_PCM_TYPE_SPDIF;
3725		if (spec->multiout.dig_out_nid &&
3726		    spec->stream_digital_playback) {
3727			info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3728			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3729		}
3730		if (spec->dig_in_nid &&
3731		    spec->stream_digital_capture) {
3732			info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3733			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3734		}
3735		/* FIXME: do we need this for all Realtek codec models? */
3736		codec->spdif_status_reset = 1;
3737	}
3738
3739	if (spec->no_analog)
3740		return 0;
3741
3742	/* If the use of more than one ADC is requested for the current
3743	 * model, configure a second analog capture-only PCM.
3744	 */
3745	/* Additional Analaog capture for index #2 */
3746	if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3747	    (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
3748		codec->num_pcms = 3;
3749		info = spec->pcm_rec + 2;
3750		info->name = spec->stream_name_analog;
3751		if (spec->alt_dac_nid) {
3752			info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3753				*spec->stream_analog_alt_playback;
3754			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3755				spec->alt_dac_nid;
3756		} else {
3757			info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3758				alc_pcm_null_stream;
3759			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3760		}
3761		if (spec->num_adc_nids > 1) {
3762			info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3763				*spec->stream_analog_alt_capture;
3764			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3765				spec->adc_nids[1];
3766			info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3767				spec->num_adc_nids - 1;
3768		} else {
3769			info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3770				alc_pcm_null_stream;
3771			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3772		}
3773	}
3774
3775	return 0;
3776}
3777
3778static inline void alc_shutup(struct hda_codec *codec)
3779{
3780	snd_hda_shutup_pins(codec);
3781}
3782
3783static void alc_free_kctls(struct hda_codec *codec)
3784{
3785	struct alc_spec *spec = codec->spec;
3786
3787	if (spec->kctls.list) {
3788		struct snd_kcontrol_new *kctl = spec->kctls.list;
3789		int i;
3790		for (i = 0; i < spec->kctls.used; i++)
3791			kfree(kctl[i].name);
3792	}
3793	snd_array_free(&spec->kctls);
3794}
3795
3796static void alc_free(struct hda_codec *codec)
3797{
3798	struct alc_spec *spec = codec->spec;
3799
3800	if (!spec)
3801		return;
3802
3803	alc_shutup(codec);
3804	alc_free_kctls(codec);
3805	kfree(spec);
3806	snd_hda_detach_beep_device(codec);
3807}
3808
3809#ifdef CONFIG_SND_HDA_POWER_SAVE
3810static void alc_power_eapd(struct hda_codec *codec)
3811{
3812	/* We currently only handle front, HP */
3813	switch (codec->vendor_id) {
3814	case 0x10ec0260:
3815		set_eapd(codec, 0x0f, 0);
3816		set_eapd(codec, 0x10, 0);
3817		break;
3818	case 0x10ec0262:
3819	case 0x10ec0267:
3820	case 0x10ec0268:
3821	case 0x10ec0269:
3822	case 0x10ec0270:
3823	case 0x10ec0272:
3824	case 0x10ec0660:
3825	case 0x10ec0662:
3826	case 0x10ec0663:
3827	case 0x10ec0862:
3828	case 0x10ec0889:
3829		set_eapd(codec, 0x14, 0);
3830		set_eapd(codec, 0x15, 0);
3831		break;
3832	}
3833}
3834
3835static int alc_suspend(struct hda_codec *codec, pm_message_t state)
3836{
3837	struct alc_spec *spec = codec->spec;
3838	alc_shutup(codec);
3839	if (spec && spec->power_hook)
3840		spec->power_hook(codec);
3841	return 0;
3842}
3843#endif
3844
3845#ifdef SND_HDA_NEEDS_RESUME
3846static int alc_resume(struct hda_codec *codec)
3847{
3848	codec->patch_ops.init(codec);
3849	snd_hda_codec_resume_amp(codec);
3850	snd_hda_codec_resume_cache(codec);
3851#ifdef CONFIG_SND_HDA_POWER_SAVE
3852	if (codec->patch_ops.check_power_status)
3853		codec->patch_ops.check_power_status(codec, 0x01);
3854#endif
3855	return 0;
3856}
3857#endif
3858
3859/*
3860 */
3861static struct hda_codec_ops alc_patch_ops = {
3862	.build_controls = alc_build_controls,
3863	.build_pcms = alc_build_pcms,
3864	.init = alc_init,
3865	.free = alc_free,
3866	.unsol_event = alc_unsol_event,
3867#ifdef SND_HDA_NEEDS_RESUME
3868	.resume = alc_resume,
3869#endif
3870#ifdef CONFIG_SND_HDA_POWER_SAVE
3871	.suspend = alc_suspend,
3872	.check_power_status = alc_check_power_status,
3873#endif
3874	.reboot_notify = alc_shutup,
3875};
3876
3877/* replace the codec chip_name with the given string */
3878static int alc_codec_rename(struct hda_codec *codec, const char *name)
3879{
3880	kfree(codec->chip_name);
3881	codec->chip_name = kstrdup(name, GFP_KERNEL);
3882	if (!codec->chip_name) {
3883		alc_free(codec);
3884		return -ENOMEM;
3885	}
3886	return 0;
3887}
3888
3889/*
3890 * Test configuration for debugging
3891 *
3892 * Almost all inputs/outputs are enabled.  I/O pins can be configured via
3893 * enum controls.
3894 */
3895#ifdef CONFIG_SND_DEBUG
3896static hda_nid_t alc880_test_dac_nids[4] = {
3897	0x02, 0x03, 0x04, 0x05
3898};
3899
3900static struct hda_input_mux alc880_test_capture_source = {
3901	.num_items = 7,
3902	.items = {
3903		{ "In-1", 0x0 },
3904		{ "In-2", 0x1 },
3905		{ "In-3", 0x2 },
3906		{ "In-4", 0x3 },
3907		{ "CD", 0x4 },
3908		{ "Front", 0x5 },
3909		{ "Surround", 0x6 },
3910	},
3911};
3912
3913static struct hda_channel_mode alc880_test_modes[4] = {
3914	{ 2, NULL },
3915	{ 4, NULL },
3916	{ 6, NULL },
3917	{ 8, NULL },
3918};
3919
3920static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
3921				 struct snd_ctl_elem_info *uinfo)
3922{
3923	static char *texts[] = {
3924		"N/A", "Line Out", "HP Out",
3925		"In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
3926	};
3927	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3928	uinfo->count = 1;
3929	uinfo->value.enumerated.items = 8;
3930	if (uinfo->value.enumerated.item >= 8)
3931		uinfo->value.enumerated.item = 7;
3932	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3933	return 0;
3934}
3935
3936static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
3937				struct snd_ctl_elem_value *ucontrol)
3938{
3939	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3940	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3941	unsigned int pin_ctl, item = 0;
3942
3943	pin_ctl = snd_hda_codec_read(codec, nid, 0,
3944				     AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3945	if (pin_ctl & AC_PINCTL_OUT_EN) {
3946		if (pin_ctl & AC_PINCTL_HP_EN)
3947			item = 2;
3948		else
3949			item = 1;
3950	} else if (pin_ctl & AC_PINCTL_IN_EN) {
3951		switch (pin_ctl & AC_PINCTL_VREFEN) {
3952		case AC_PINCTL_VREF_HIZ: item = 3; break;
3953		case AC_PINCTL_VREF_50:  item = 4; break;
3954		case AC_PINCTL_VREF_GRD: item = 5; break;
3955		case AC_PINCTL_VREF_80:  item = 6; break;
3956		case AC_PINCTL_VREF_100: item = 7; break;
3957		}
3958	}
3959	ucontrol->value.enumerated.item[0] = item;
3960	return 0;
3961}
3962
3963static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
3964				struct snd_ctl_elem_value *ucontrol)
3965{
3966	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3967	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3968	static unsigned int ctls[] = {
3969		0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
3970		AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
3971		AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
3972		AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
3973		AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
3974		AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
3975	};
3976	unsigned int old_ctl, new_ctl;
3977
3978	old_ctl = snd_hda_codec_read(codec, nid, 0,
3979				     AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3980	new_ctl = ctls[ucontrol->value.enumerated.item[0]];
3981	if (old_ctl != new_ctl) {
3982		int val;
3983		snd_hda_codec_write_cache(codec, nid, 0,
3984					  AC_VERB_SET_PIN_WIDGET_CONTROL,
3985					  new_ctl);
3986		val = ucontrol->value.enumerated.item[0] >= 3 ?
3987			HDA_AMP_MUTE : 0;
3988		snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3989					 HDA_AMP_MUTE, val);
3990		return 1;
3991	}
3992	return 0;
3993}
3994
3995static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
3996				 struct snd_ctl_elem_info *uinfo)
3997{
3998	static char *texts[] = {
3999		"Front", "Surround", "CLFE", "Side"
4000	};
4001	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4002	uinfo->count = 1;
4003	uinfo->value.enumerated.items = 4;
4004	if (uinfo->value.enumerated.item >= 4)
4005		uinfo->value.enumerated.item = 3;
4006	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
4007	return 0;
4008}
4009
4010static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
4011				struct snd_ctl_elem_value *ucontrol)
4012{
4013	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4014	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4015	unsigned int sel;
4016
4017	sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
4018	ucontrol->value.enumerated.item[0] = sel & 3;
4019	return 0;
4020}
4021
4022static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
4023				struct snd_ctl_elem_value *ucontrol)
4024{
4025	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4026	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4027	unsigned int sel;
4028
4029	sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
4030	if (ucontrol->value.enumerated.item[0] != sel) {
4031		sel = ucontrol->value.enumerated.item[0] & 3;
4032		snd_hda_codec_write_cache(codec, nid, 0,
4033					  AC_VERB_SET_CONNECT_SEL, sel);
4034		return 1;
4035	}
4036	return 0;
4037}
4038
4039#define PIN_CTL_TEST(xname,nid) {			\
4040		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	\
4041			.name = xname,		       \
4042			.subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4043			.info = alc_test_pin_ctl_info, \
4044			.get = alc_test_pin_ctl_get,   \
4045			.put = alc_test_pin_ctl_put,   \
4046			.private_value = nid	       \
4047			}
4048
4049#define PIN_SRC_TEST(xname,nid) {			\
4050		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	\
4051			.name = xname,		       \
4052			.subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4053			.info = alc_test_pin_src_info, \
4054			.get = alc_test_pin_src_get,   \
4055			.put = alc_test_pin_src_put,   \
4056			.private_value = nid	       \
4057			}
4058
4059static struct snd_kcontrol_new alc880_test_mixer[] = {
4060	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
4061	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
4062	HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
4063	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
4064	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
4065	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
4066	HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
4067	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
4068	PIN_CTL_TEST("Front Pin Mode", 0x14),
4069	PIN_CTL_TEST("Surround Pin Mode", 0x15),
4070	PIN_CTL_TEST("CLFE Pin Mode", 0x16),
4071	PIN_CTL_TEST("Side Pin Mode", 0x17),
4072	PIN_CTL_TEST("In-1 Pin Mode", 0x18),
4073	PIN_CTL_TEST("In-2 Pin Mode", 0x19),
4074	PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
4075	PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
4076	PIN_SRC_TEST("In-1 Pin Source", 0x18),
4077	PIN_SRC_TEST("In-2 Pin Source", 0x19),
4078	PIN_SRC_TEST("In-3 Pin Source", 0x1a),
4079	PIN_SRC_TEST("In-4 Pin Source", 0x1b),
4080	HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
4081	HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
4082	HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
4083	HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
4084	HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
4085	HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
4086	HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
4087	HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
4088	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
4089	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
4090	{
4091		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4092		.name = "Channel Mode",
4093		.info = alc_ch_mode_info,
4094		.get = alc_ch_mode_get,
4095		.put = alc_ch_mode_put,
4096	},
4097	{ } /* end */
4098};
4099
4100static struct hda_verb alc880_test_init_verbs[] = {
4101	/* Unmute inputs of 0x0c - 0x0f */
4102	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4103	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4104	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4105	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4106	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4107	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4108	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4109	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4110	/* Vol output for 0x0c-0x0f */
4111	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4112	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4113	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4114	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4115	/* Set output pins 0x14-0x17 */
4116	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4117	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4118	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4119	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4120	/* Unmute output pins 0x14-0x17 */
4121	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4122	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4123	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4124	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4125	/* Set input pins 0x18-0x1c */
4126	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4127	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4128	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4129	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4130	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4131	/* Mute input pins 0x18-0x1b */
4132	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4133	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4134	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4135	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4136	/* ADC set up */
4137	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4138	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
4139	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4140	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
4141	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4142	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
4143	/* Analog input/passthru */
4144	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4145	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4146	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4147	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4148	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4149	{ }
4150};
4151#endif
4152
4153/*
4154 */
4155
4156static const char *alc880_models[ALC880_MODEL_LAST] = {
4157	[ALC880_3ST]		= "3stack",
4158	[ALC880_TCL_S700]	= "tcl",
4159	[ALC880_3ST_DIG]	= "3stack-digout",
4160	[ALC880_CLEVO]		= "clevo",
4161	[ALC880_5ST]		= "5stack",
4162	[ALC880_5ST_DIG]	= "5stack-digout",
4163	[ALC880_W810]		= "w810",
4164	[ALC880_Z71V]		= "z71v",
4165	[ALC880_6ST]		= "6stack",
4166	[ALC880_6ST_DIG]	= "6stack-digout",
4167	[ALC880_ASUS]		= "asus",
4168	[ALC880_ASUS_W1V]	= "asus-w1v",
4169	[ALC880_ASUS_DIG]	= "asus-dig",
4170	[ALC880_ASUS_DIG2]	= "asus-dig2",
4171	[ALC880_UNIWILL_DIG]	= "uniwill",
4172	[ALC880_UNIWILL_P53]	= "uniwill-p53",
4173	[ALC880_FUJITSU]	= "fujitsu",
4174	[ALC880_F1734]		= "F1734",
4175	[ALC880_LG]		= "lg",
4176	[ALC880_LG_LW]		= "lg-lw",
4177	[ALC880_MEDION_RIM]	= "medion",
4178#ifdef CONFIG_SND_DEBUG
4179	[ALC880_TEST]		= "test",
4180#endif
4181	[ALC880_AUTO]		= "auto",
4182};
4183
4184static struct snd_pci_quirk alc880_cfg_tbl[] = {
4185	SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
4186	SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
4187	SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
4188	SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
4189	SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
4190	SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
4191	SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
4192	SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
4193	SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
4194	SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
4195	SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
4196	SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
4197	SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
4198	SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
4199	SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
4200	SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
4201	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
4202	SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
4203	/* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
4204	SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
4205	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
4206	SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
4207	SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
4208	SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
4209	SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
4210	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
4211	SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
4212	SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
4213	SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
4214	SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
4215	SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
4216	SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
4217	SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
4218	SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
4219	SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
4220	SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
4221	SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
4222	SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
4223	SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
4224	SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
4225	SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
4226	SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
4227	SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
4228	SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
4229	SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
4230	SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
4231	SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
4232	SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
4233	SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
4234	SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_F1734),
4235	SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
4236	SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
4237	SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
4238	SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
4239	SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
4240	SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
4241	SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
4242	SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
4243	SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
4244	SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
4245	SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
4246	SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
4247	SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
4248	SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
4249	SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
4250	SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
4251	SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
4252	SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
4253	/* default Intel */
4254	SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
4255	SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
4256	SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
4257	{}
4258};
4259
4260/*
4261 * ALC880 codec presets
4262 */
4263static struct alc_config_preset alc880_presets[] = {
4264	[ALC880_3ST] = {
4265		.mixers = { alc880_three_stack_mixer },
4266		.init_verbs = { alc880_volume_init_verbs,
4267				alc880_pin_3stack_init_verbs },
4268		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4269		.dac_nids = alc880_dac_nids,
4270		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4271		.channel_mode = alc880_threestack_modes,
4272		.need_dac_fix = 1,
4273		.input_mux = &alc880_capture_source,
4274	},
4275	[ALC880_3ST_DIG] = {
4276		.mixers = { alc880_three_stack_mixer },
4277		.init_verbs = { alc880_volume_init_verbs,
4278				alc880_pin_3stack_init_verbs },
4279		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4280		.dac_nids = alc880_dac_nids,
4281		.dig_out_nid = ALC880_DIGOUT_NID,
4282		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4283		.channel_mode = alc880_threestack_modes,
4284		.need_dac_fix = 1,
4285		.input_mux = &alc880_capture_source,
4286	},
4287	[ALC880_TCL_S700] = {
4288		.mixers = { alc880_tcl_s700_mixer },
4289		.init_verbs = { alc880_volume_init_verbs,
4290				alc880_pin_tcl_S700_init_verbs,
4291				alc880_gpio2_init_verbs },
4292		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4293		.dac_nids = alc880_dac_nids,
4294		.adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4295		.num_adc_nids = 1, /* single ADC */
4296		.hp_nid = 0x03,
4297		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4298		.channel_mode = alc880_2_jack_modes,
4299		.input_mux = &alc880_capture_source,
4300	},
4301	[ALC880_5ST] = {
4302		.mixers = { alc880_three_stack_mixer,
4303			    alc880_five_stack_mixer},
4304		.init_verbs = { alc880_volume_init_verbs,
4305				alc880_pin_5stack_init_verbs },
4306		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4307		.dac_nids = alc880_dac_nids,
4308		.num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4309		.channel_mode = alc880_fivestack_modes,
4310		.input_mux = &alc880_capture_source,
4311	},
4312	[ALC880_5ST_DIG] = {
4313		.mixers = { alc880_three_stack_mixer,
4314			    alc880_five_stack_mixer },
4315		.init_verbs = { alc880_volume_init_verbs,
4316				alc880_pin_5stack_init_verbs },
4317		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4318		.dac_nids = alc880_dac_nids,
4319		.dig_out_nid = ALC880_DIGOUT_NID,
4320		.num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4321		.channel_mode = alc880_fivestack_modes,
4322		.input_mux = &alc880_capture_source,
4323	},
4324	[ALC880_6ST] = {
4325		.mixers = { alc880_six_stack_mixer },
4326		.init_verbs = { alc880_volume_init_verbs,
4327				alc880_pin_6stack_init_verbs },
4328		.num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4329		.dac_nids = alc880_6st_dac_nids,
4330		.num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4331		.channel_mode = alc880_sixstack_modes,
4332		.input_mux = &alc880_6stack_capture_source,
4333	},
4334	[ALC880_6ST_DIG] = {
4335		.mixers = { alc880_six_stack_mixer },
4336		.init_verbs = { alc880_volume_init_verbs,
4337				alc880_pin_6stack_init_verbs },
4338		.num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4339		.dac_nids = alc880_6st_dac_nids,
4340		.dig_out_nid = ALC880_DIGOUT_NID,
4341		.num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4342		.channel_mode = alc880_sixstack_modes,
4343		.input_mux = &alc880_6stack_capture_source,
4344	},
4345	[ALC880_W810] = {
4346		.mixers = { alc880_w810_base_mixer },
4347		.init_verbs = { alc880_volume_init_verbs,
4348				alc880_pin_w810_init_verbs,
4349				alc880_gpio2_init_verbs },
4350		.num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4351		.dac_nids = alc880_w810_dac_nids,
4352		.dig_out_nid = ALC880_DIGOUT_NID,
4353		.num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4354		.channel_mode = alc880_w810_modes,
4355		.input_mux = &alc880_capture_source,
4356	},
4357	[ALC880_Z71V] = {
4358		.mixers = { alc880_z71v_mixer },
4359		.init_verbs = { alc880_volume_init_verbs,
4360				alc880_pin_z71v_init_verbs },
4361		.num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4362		.dac_nids = alc880_z71v_dac_nids,
4363		.dig_out_nid = ALC880_DIGOUT_NID,
4364		.hp_nid = 0x03,
4365		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4366		.channel_mode = alc880_2_jack_modes,
4367		.input_mux = &alc880_capture_source,
4368	},
4369	[ALC880_F1734] = {
4370		.mixers = { alc880_f1734_mixer },
4371		.init_verbs = { alc880_volume_init_verbs,
4372				alc880_pin_f1734_init_verbs },
4373		.num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4374		.dac_nids = alc880_f1734_dac_nids,
4375		.hp_nid = 0x02,
4376		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4377		.channel_mode = alc880_2_jack_modes,
4378		.input_mux = &alc880_f1734_capture_source,
4379		.unsol_event = alc880_uniwill_p53_unsol_event,
4380		.setup = alc880_uniwill_p53_setup,
4381		.init_hook = alc_automute_amp,
4382	},
4383	[ALC880_ASUS] = {
4384		.mixers = { alc880_asus_mixer },
4385		.init_verbs = { alc880_volume_init_verbs,
4386				alc880_pin_asus_init_verbs,
4387				alc880_gpio1_init_verbs },
4388		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4389		.dac_nids = alc880_asus_dac_nids,
4390		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4391		.channel_mode = alc880_asus_modes,
4392		.need_dac_fix = 1,
4393		.input_mux = &alc880_capture_source,
4394	},
4395	[ALC880_ASUS_DIG] = {
4396		.mixers = { alc880_asus_mixer },
4397		.init_verbs = { alc880_volume_init_verbs,
4398				alc880_pin_asus_init_verbs,
4399				alc880_gpio1_init_verbs },
4400		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4401		.dac_nids = alc880_asus_dac_nids,
4402		.dig_out_nid = ALC880_DIGOUT_NID,
4403		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4404		.channel_mode = alc880_asus_modes,
4405		.need_dac_fix = 1,
4406		.input_mux = &alc880_capture_source,
4407	},
4408	[ALC880_ASUS_DIG2] = {
4409		.mixers = { alc880_asus_mixer },
4410		.init_verbs = { alc880_volume_init_verbs,
4411				alc880_pin_asus_init_verbs,
4412				alc880_gpio2_init_verbs }, /* use GPIO2 */
4413		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4414		.dac_nids = alc880_asus_dac_nids,
4415		.dig_out_nid = ALC880_DIGOUT_NID,
4416		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4417		.channel_mode = alc880_asus_modes,
4418		.need_dac_fix = 1,
4419		.input_mux = &alc880_capture_source,
4420	},
4421	[ALC880_ASUS_W1V] = {
4422		.mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
4423		.init_verbs = { alc880_volume_init_verbs,
4424				alc880_pin_asus_init_verbs,
4425				alc880_gpio1_init_verbs },
4426		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4427		.dac_nids = alc880_asus_dac_nids,
4428		.dig_out_nid = ALC880_DIGOUT_NID,
4429		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4430		.channel_mode = alc880_asus_modes,
4431		.need_dac_fix = 1,
4432		.input_mux = &alc880_capture_source,
4433	},
4434	[ALC880_UNIWILL_DIG] = {
4435		.mixers = { alc880_asus_mixer },
4436		.init_verbs = { alc880_volume_init_verbs,
4437				alc880_pin_asus_init_verbs },
4438		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4439		.dac_nids = alc880_asus_dac_nids,
4440		.dig_out_nid = ALC880_DIGOUT_NID,
4441		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4442		.channel_mode = alc880_asus_modes,
4443		.need_dac_fix = 1,
4444		.input_mux = &alc880_capture_source,
4445	},
4446	[ALC880_UNIWILL] = {
4447		.mixers = { alc880_uniwill_mixer },
4448		.init_verbs = { alc880_volume_init_verbs,
4449				alc880_uniwill_init_verbs },
4450		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4451		.dac_nids = alc880_asus_dac_nids,
4452		.dig_out_nid = ALC880_DIGOUT_NID,
4453		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4454		.channel_mode = alc880_threestack_modes,
4455		.need_dac_fix = 1,
4456		.input_mux = &alc880_capture_source,
4457		.unsol_event = alc880_uniwill_unsol_event,
4458		.setup = alc880_uniwill_setup,
4459		.init_hook = alc880_uniwill_init_hook,
4460	},
4461	[ALC880_UNIWILL_P53] = {
4462		.mixers = { alc880_uniwill_p53_mixer },
4463		.init_verbs = { alc880_volume_init_verbs,
4464				alc880_uniwill_p53_init_verbs },
4465		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4466		.dac_nids = alc880_asus_dac_nids,
4467		.num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4468		.channel_mode = alc880_threestack_modes,
4469		.input_mux = &alc880_capture_source,
4470		.unsol_event = alc880_uniwill_p53_unsol_event,
4471		.setup = alc880_uniwill_p53_setup,
4472		.init_hook = alc_automute_amp,
4473	},
4474	[ALC880_FUJITSU] = {
4475		.mixers = { alc880_fujitsu_mixer },
4476		.init_verbs = { alc880_volume_init_verbs,
4477				alc880_uniwill_p53_init_verbs,
4478	       			alc880_beep_init_verbs },
4479		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4480		.dac_nids = alc880_dac_nids,
4481		.dig_out_nid = ALC880_DIGOUT_NID,
4482		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4483		.channel_mode = alc880_2_jack_modes,
4484		.input_mux = &alc880_capture_source,
4485		.unsol_event = alc880_uniwill_p53_unsol_event,
4486		.setup = alc880_uniwill_p53_setup,
4487		.init_hook = alc_automute_amp,
4488	},
4489	[ALC880_CLEVO] = {
4490		.mixers = { alc880_three_stack_mixer },
4491		.init_verbs = { alc880_volume_init_verbs,
4492				alc880_pin_clevo_init_verbs },
4493		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4494		.dac_nids = alc880_dac_nids,
4495		.hp_nid = 0x03,
4496		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4497		.channel_mode = alc880_threestack_modes,
4498		.need_dac_fix = 1,
4499		.input_mux = &alc880_capture_source,
4500	},
4501	[ALC880_LG] = {
4502		.mixers = { alc880_lg_mixer },
4503		.init_verbs = { alc880_volume_init_verbs,
4504				alc880_lg_init_verbs },
4505		.num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4506		.dac_nids = alc880_lg_dac_nids,
4507		.dig_out_nid = ALC880_DIGOUT_NID,
4508		.num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4509		.channel_mode = alc880_lg_ch_modes,
4510		.need_dac_fix = 1,
4511		.input_mux = &alc880_lg_capture_source,
4512		.unsol_event = alc_automute_amp_unsol_event,
4513		.setup = alc880_lg_setup,
4514		.init_hook = alc_automute_amp,
4515#ifdef CONFIG_SND_HDA_POWER_SAVE
4516		.loopbacks = alc880_lg_loopbacks,
4517#endif
4518	},
4519	[ALC880_LG_LW] = {
4520		.mixers = { alc880_lg_lw_mixer },
4521		.init_verbs = { alc880_volume_init_verbs,
4522				alc880_lg_lw_init_verbs },
4523		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4524		.dac_nids = alc880_dac_nids,
4525		.dig_out_nid = ALC880_DIGOUT_NID,
4526		.num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4527		.channel_mode = alc880_lg_lw_modes,
4528		.input_mux = &alc880_lg_lw_capture_source,
4529		.unsol_event = alc_automute_amp_unsol_event,
4530		.setup = alc880_lg_lw_setup,
4531		.init_hook = alc_automute_amp,
4532	},
4533	[ALC880_MEDION_RIM] = {
4534		.mixers = { alc880_medion_rim_mixer },
4535		.init_verbs = { alc880_volume_init_verbs,
4536				alc880_medion_rim_init_verbs,
4537				alc_gpio2_init_verbs },
4538		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4539		.dac_nids = alc880_dac_nids,
4540		.dig_out_nid = ALC880_DIGOUT_NID,
4541		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4542		.channel_mode = alc880_2_jack_modes,
4543		.input_mux = &alc880_medion_rim_capture_source,
4544		.unsol_event = alc880_medion_rim_unsol_event,
4545		.setup = alc880_medion_rim_setup,
4546		.init_hook = alc880_medion_rim_automute,
4547	},
4548#ifdef CONFIG_SND_DEBUG
4549	[ALC880_TEST] = {
4550		.mixers = { alc880_test_mixer },
4551		.init_verbs = { alc880_test_init_verbs },
4552		.num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4553		.dac_nids = alc880_test_dac_nids,
4554		.dig_out_nid = ALC880_DIGOUT_NID,
4555		.num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4556		.channel_mode = alc880_test_modes,
4557		.input_mux = &alc880_test_capture_source,
4558	},
4559#endif
4560};
4561
4562/*
4563 * Automatic parse of I/O pins from the BIOS configuration
4564 */
4565
4566enum {
4567	ALC_CTL_WIDGET_VOL,
4568	ALC_CTL_WIDGET_MUTE,
4569	ALC_CTL_BIND_MUTE,
4570};
4571static struct snd_kcontrol_new alc880_control_templates[] = {
4572	HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4573	HDA_CODEC_MUTE(NULL, 0, 0, 0),
4574	HDA_BIND_MUTE(NULL, 0, 0, 0),
4575};
4576
4577/* add dynamic controls */
4578static int add_control(struct alc_spec *spec, int type, const char *name,
4579		       unsigned long val)
4580{
4581	struct snd_kcontrol_new *knew;
4582
4583	snd_array_init(&spec->kctls, sizeof(*knew), 32);
4584	knew = snd_array_new(&spec->kctls);
4585	if (!knew)
4586		return -ENOMEM;
4587	*knew = alc880_control_templates[type];
4588	knew->name = kstrdup(name, GFP_KERNEL);
4589	if (!knew->name)
4590		return -ENOMEM;
4591	if (get_amp_nid_(val))
4592		knew->subdevice = HDA_SUBDEV_AMP_FLAG;
4593	knew->private_value = val;
4594	return 0;
4595}
4596
4597static int add_control_with_pfx(struct alc_spec *spec, int type,
4598				const char *pfx, const char *dir,
4599				const char *sfx, unsigned long val)
4600{
4601	char name[32];
4602	snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
4603	return add_control(spec, type, name, val);
4604}
4605
4606#define add_pb_vol_ctrl(spec, type, pfx, val) \
4607	add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val)
4608#define add_pb_sw_ctrl(spec, type, pfx, val) \
4609	add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val)
4610
4611#define alc880_is_fixed_pin(nid)	((nid) >= 0x14 && (nid) <= 0x17)
4612#define alc880_fixed_pin_idx(nid)	((nid) - 0x14)
4613#define alc880_is_multi_pin(nid)	((nid) >= 0x18)
4614#define alc880_multi_pin_idx(nid)	((nid) - 0x18)
4615#define alc880_idx_to_dac(nid)		((nid) + 0x02)
4616#define alc880_dac_to_idx(nid)		((nid) - 0x02)
4617#define alc880_idx_to_mixer(nid)	((nid) + 0x0c)
4618#define alc880_idx_to_selector(nid)	((nid) + 0x10)
4619#define ALC880_PIN_CD_NID		0x1c
4620
4621/* fill in the dac_nids table from the parsed pin configuration */
4622static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4623				     const struct auto_pin_cfg *cfg)
4624{
4625	hda_nid_t nid;
4626	int assigned[4];
4627	int i, j;
4628
4629	memset(assigned, 0, sizeof(assigned));
4630	spec->multiout.dac_nids = spec->private_dac_nids;
4631
4632	/* check the pins hardwired to audio widget */
4633	for (i = 0; i < cfg->line_outs; i++) {
4634		nid = cfg->line_out_pins[i];
4635		if (alc880_is_fixed_pin(nid)) {
4636			int idx = alc880_fixed_pin_idx(nid);
4637			spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
4638			assigned[idx] = 1;
4639		}
4640	}
4641	/* left pins can be connect to any audio widget */
4642	for (i = 0; i < cfg->line_outs; i++) {
4643		nid = cfg->line_out_pins[i];
4644		if (alc880_is_fixed_pin(nid))
4645			continue;
4646		/* search for an empty channel */
4647		for (j = 0; j < cfg->line_outs; j++) {
4648			if (!assigned[j]) {
4649				spec->multiout.dac_nids[i] =
4650					alc880_idx_to_dac(j);
4651				assigned[j] = 1;
4652				break;
4653			}
4654		}
4655	}
4656	spec->multiout.num_dacs = cfg->line_outs;
4657	return 0;
4658}
4659
4660/* add playback controls from the parsed DAC table */
4661static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4662					     const struct auto_pin_cfg *cfg)
4663{
4664	static const char *chname[4] = {
4665		"Front", "Surround", NULL /*CLFE*/, "Side"
4666	};
4667	hda_nid_t nid;
4668	int i, err;
4669
4670	for (i = 0; i < cfg->line_outs; i++) {
4671		if (!spec->multiout.dac_nids[i])
4672			continue;
4673		nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4674		if (i == 2) {
4675			/* Center/LFE */
4676			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4677					      "Center",
4678					  HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4679							      HDA_OUTPUT));
4680			if (err < 0)
4681				return err;
4682			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4683					      "LFE",
4684					  HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4685							      HDA_OUTPUT));
4686			if (err < 0)
4687				return err;
4688			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4689					     "Center",
4690					  HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4691							      HDA_INPUT));
4692			if (err < 0)
4693				return err;
4694			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4695					     "LFE",
4696					  HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4697							      HDA_INPUT));
4698			if (err < 0)
4699				return err;
4700		} else {
4701			const char *pfx;
4702			if (cfg->line_outs == 1 &&
4703			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4704				pfx = "Speaker";
4705			else
4706				pfx = chname[i];
4707			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4708					  HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4709							      HDA_OUTPUT));
4710			if (err < 0)
4711				return err;
4712			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4713					  HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4714							      HDA_INPUT));
4715			if (err < 0)
4716				return err;
4717		}
4718	}
4719	return 0;
4720}
4721
4722/* add playback controls for speaker and HP outputs */
4723static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4724					const char *pfx)
4725{
4726	hda_nid_t nid;
4727	int err;
4728
4729	if (!pin)
4730		return 0;
4731
4732	if (alc880_is_fixed_pin(pin)) {
4733		nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
4734		/* specify the DAC as the extra output */
4735		if (!spec->multiout.hp_nid)
4736			spec->multiout.hp_nid = nid;
4737		else
4738			spec->multiout.extra_out_nid[0] = nid;
4739		/* control HP volume/switch on the output mixer amp */
4740		nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
4741		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4742				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4743		if (err < 0)
4744			return err;
4745		err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4746				  HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4747		if (err < 0)
4748			return err;
4749	} else if (alc880_is_multi_pin(pin)) {
4750		/* set manual connection */
4751		/* we have only a switch on HP-out PIN */
4752		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
4753				  HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4754		if (err < 0)
4755			return err;
4756	}
4757	return 0;
4758}
4759
4760/* create input playback/capture controls for the given pin */
4761static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4762			    const char *ctlname,
4763			    int idx, hda_nid_t mix_nid)
4764{
4765	int err;
4766
4767	err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
4768			  HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4769	if (err < 0)
4770		return err;
4771	err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
4772			  HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4773	if (err < 0)
4774		return err;
4775	return 0;
4776}
4777
4778static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4779{
4780	unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4781	return (pincap & AC_PINCAP_IN) != 0;
4782}
4783
4784/* create playback/capture controls for input pins */
4785static int alc_auto_create_input_ctls(struct hda_codec *codec,
4786				      const struct auto_pin_cfg *cfg,
4787				      hda_nid_t mixer,
4788				      hda_nid_t cap1, hda_nid_t cap2)
4789{
4790	struct alc_spec *spec = codec->spec;
4791	struct hda_input_mux *imux = &spec->private_imux[0];
4792	int i, err, idx;
4793
4794	for (i = 0; i < AUTO_PIN_LAST; i++) {
4795		hda_nid_t pin;
4796
4797		pin = cfg->input_pins[i];
4798		if (!alc_is_input_pin(codec, pin))
4799			continue;
4800
4801		if (mixer) {
4802			idx = get_connection_index(codec, mixer, pin);
4803			if (idx >= 0) {
4804				err = new_analog_input(spec, pin,
4805						       auto_pin_cfg_labels[i],
4806						       idx, mixer);
4807				if (err < 0)
4808					return err;
4809			}
4810		}
4811
4812		if (!cap1)
4813			continue;
4814		idx = get_connection_index(codec, cap1, pin);
4815		if (idx < 0 && cap2)
4816			idx = get_connection_index(codec, cap2, pin);
4817		if (idx >= 0) {
4818			imux->items[imux->num_items].label =
4819				auto_pin_cfg_labels[i];
4820			imux->items[imux->num_items].index = idx;
4821			imux->num_items++;
4822		}
4823	}
4824	return 0;
4825}
4826
4827static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4828						const struct auto_pin_cfg *cfg)
4829{
4830	return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4831}
4832
4833static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4834			       unsigned int pin_type)
4835{
4836	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4837			    pin_type);
4838	/* unmute pin */
4839	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4840			    AMP_OUT_UNMUTE);
4841}
4842
4843static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4844					      hda_nid_t nid, int pin_type,
4845					      int dac_idx)
4846{
4847	alc_set_pin_output(codec, nid, pin_type);
4848	/* need the manual connection? */
4849	if (alc880_is_multi_pin(nid)) {
4850		struct alc_spec *spec = codec->spec;
4851		int idx = alc880_multi_pin_idx(nid);
4852		snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4853				    AC_VERB_SET_CONNECT_SEL,
4854				    alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
4855	}
4856}
4857
4858static int get_pin_type(int line_out_type)
4859{
4860	if (line_out_type == AUTO_PIN_HP_OUT)
4861		return PIN_HP;
4862	else
4863		return PIN_OUT;
4864}
4865
4866static void alc880_auto_init_multi_out(struct hda_codec *codec)
4867{
4868	struct alc_spec *spec = codec->spec;
4869	int i;
4870
4871	for (i = 0; i < spec->autocfg.line_outs; i++) {
4872		hda_nid_t nid = spec->autocfg.line_out_pins[i];
4873		int pin_type = get_pin_type(spec->autocfg.line_out_type);
4874		alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
4875	}
4876}
4877
4878static void alc880_auto_init_extra_out(struct hda_codec *codec)
4879{
4880	struct alc_spec *spec = codec->spec;
4881	hda_nid_t pin;
4882
4883	pin = spec->autocfg.speaker_pins[0];
4884	if (pin) /* connect to front */
4885		alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
4886	pin = spec->autocfg.hp_pins[0];
4887	if (pin) /* connect to front */
4888		alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
4889}
4890
4891static void alc880_auto_init_analog_input(struct hda_codec *codec)
4892{
4893	struct alc_spec *spec = codec->spec;
4894	int i;
4895
4896	for (i = 0; i < AUTO_PIN_LAST; i++) {
4897		hda_nid_t nid = spec->autocfg.input_pins[i];
4898		if (alc_is_input_pin(codec, nid)) {
4899			alc_set_input_pin(codec, nid, i);
4900			if (nid != ALC880_PIN_CD_NID &&
4901			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
4902				snd_hda_codec_write(codec, nid, 0,
4903						    AC_VERB_SET_AMP_GAIN_MUTE,
4904						    AMP_OUT_MUTE);
4905		}
4906	}
4907}
4908
4909static void alc880_auto_init_input_src(struct hda_codec *codec)
4910{
4911	struct alc_spec *spec = codec->spec;
4912	int c;
4913
4914	for (c = 0; c < spec->num_adc_nids; c++) {
4915		unsigned int mux_idx;
4916		const struct hda_input_mux *imux;
4917		mux_idx = c >= spec->num_mux_defs ? 0 : c;
4918		imux = &spec->input_mux[mux_idx];
4919		if (!imux->num_items && mux_idx > 0)
4920			imux = &spec->input_mux[0];
4921		if (imux)
4922			snd_hda_codec_write(codec, spec->adc_nids[c], 0,
4923					    AC_VERB_SET_CONNECT_SEL,
4924					    imux->items[0].index);
4925	}
4926}
4927
4928/* parse the BIOS configuration and set up the alc_spec */
4929/* return 1 if successful, 0 if the proper config is not found,
4930 * or a negative error code
4931 */
4932static int alc880_parse_auto_config(struct hda_codec *codec)
4933{
4934	struct alc_spec *spec = codec->spec;
4935	int i, err;
4936	static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
4937
4938	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4939					   alc880_ignore);
4940	if (err < 0)
4941		return err;
4942	if (!spec->autocfg.line_outs)
4943		return 0; /* can't find valid BIOS pin config */
4944
4945	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
4946	if (err < 0)
4947		return err;
4948	err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
4949	if (err < 0)
4950		return err;
4951	err = alc880_auto_create_extra_out(spec,
4952					   spec->autocfg.speaker_pins[0],
4953					   "Speaker");
4954	if (err < 0)
4955		return err;
4956	err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
4957					   "Headphone");
4958	if (err < 0)
4959		return err;
4960	err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
4961	if (err < 0)
4962		return err;
4963
4964	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4965
4966	/* check multiple SPDIF-out (for recent codecs) */
4967	for (i = 0; i < spec->autocfg.dig_outs; i++) {
4968		hda_nid_t dig_nid;
4969		err = snd_hda_get_connections(codec,
4970					      spec->autocfg.dig_out_pins[i],
4971					      &dig_nid, 1);
4972		if (err < 0)
4973			continue;
4974		if (!i)
4975			spec->multiout.dig_out_nid = dig_nid;
4976		else {
4977			spec->multiout.slave_dig_outs = spec->slave_dig_outs;
4978			if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
4979				break;
4980			spec->slave_dig_outs[i - 1] = dig_nid;
4981		}
4982	}
4983	if (spec->autocfg.dig_in_pin)
4984		spec->dig_in_nid = ALC880_DIGIN_NID;
4985
4986	if (spec->kctls.list)
4987		add_mixer(spec, spec->kctls.list);
4988
4989	add_verb(spec, alc880_volume_init_verbs);
4990
4991	spec->num_mux_defs = 1;
4992	spec->input_mux = &spec->private_imux[0];
4993
4994	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4995
4996	return 1;
4997}
4998
4999/* additional initialization for auto-configuration model */
5000static void alc880_auto_init(struct hda_codec *codec)
5001{
5002	struct alc_spec *spec = codec->spec;
5003	alc880_auto_init_multi_out(codec);
5004	alc880_auto_init_extra_out(codec);
5005	alc880_auto_init_analog_input(codec);
5006	alc880_auto_init_input_src(codec);
5007	if (spec->unsol_event)
5008		alc_inithook(codec);
5009}
5010
5011/* check the ADC/MUX contains all input pins; some ADC/MUX contains only
5012 * one of two digital mic pins, e.g. on ALC272
5013 */
5014static void fixup_automic_adc(struct hda_codec *codec)
5015{
5016	struct alc_spec *spec = codec->spec;
5017	int i;
5018
5019	for (i = 0; i < spec->num_adc_nids; i++) {
5020		hda_nid_t cap = spec->capsrc_nids ?
5021			spec->capsrc_nids[i] : spec->adc_nids[i];
5022		int iidx, eidx;
5023
5024		iidx = get_connection_index(codec, cap, spec->int_mic.pin);
5025		if (iidx < 0)
5026			continue;
5027		eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
5028		if (eidx < 0)
5029			continue;
5030		spec->int_mic.mux_idx = iidx;
5031		spec->ext_mic.mux_idx = eidx;
5032		if (spec->capsrc_nids)
5033			spec->capsrc_nids += i;
5034		spec->adc_nids += i;
5035		spec->num_adc_nids = 1;
5036		return;
5037	}
5038	snd_printd(KERN_INFO "hda_codec: %s: "
5039		   "No ADC/MUX containing both 0x%x and 0x%x pins\n",
5040		   codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
5041	spec->auto_mic = 0; /* disable auto-mic to be sure */
5042}
5043
5044/* choose the ADC/MUX containing the input pin and initialize the setup */
5045static void fixup_single_adc(struct hda_codec *codec)
5046{
5047	struct alc_spec *spec = codec->spec;
5048	hda_nid_t pin = 0;
5049	int i;
5050
5051	/* search for the input pin; there must be only one */
5052	for (i = 0; i < AUTO_PIN_LAST; i++) {
5053		if (spec->autocfg.input_pins[i]) {
5054			pin = spec->autocfg.input_pins[i];
5055			break;
5056		}
5057	}
5058	if (!pin)
5059		return;
5060
5061	/* set the default connection to that pin */
5062	for (i = 0; i < spec->num_adc_nids; i++) {
5063		hda_nid_t cap = spec->capsrc_nids ?
5064			spec->capsrc_nids[i] : spec->adc_nids[i];
5065		int idx;
5066
5067		idx = get_connection_index(codec, cap, pin);
5068		if (idx < 0)
5069			continue;
5070		/* use only this ADC */
5071		if (spec->capsrc_nids)
5072			spec->capsrc_nids += i;
5073		spec->adc_nids += i;
5074		spec->num_adc_nids = 1;
5075		/* select or unmute this route */
5076		if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
5077			snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
5078						 HDA_AMP_MUTE, 0);
5079		} else {
5080			snd_hda_codec_write_cache(codec, cap, 0,
5081					  AC_VERB_SET_CONNECT_SEL, idx);
5082		}
5083		return;
5084	}
5085}
5086
5087static void set_capture_mixer(struct hda_codec *codec)
5088{
5089	struct alc_spec *spec = codec->spec;
5090	static struct snd_kcontrol_new *caps[2][3] = {
5091		{ alc_capture_mixer_nosrc1,
5092		  alc_capture_mixer_nosrc2,
5093		  alc_capture_mixer_nosrc3 },
5094		{ alc_capture_mixer1,
5095		  alc_capture_mixer2,
5096		  alc_capture_mixer3 },
5097	};
5098	if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
5099		int mux = 0;
5100		if (spec->auto_mic)
5101			fixup_automic_adc(codec);
5102		else if (spec->input_mux) {
5103			if (spec->input_mux->num_items > 1)
5104				mux = 1;
5105			else if (spec->input_mux->num_items == 1)
5106				fixup_single_adc(codec);
5107		}
5108		spec->cap_mixer = caps[mux][spec->num_adc_nids - 1];
5109	}
5110}
5111
5112/* fill adc_nids (and capsrc_nids) containing all active input pins */
5113static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids,
5114				 int num_nids)
5115{
5116	struct alc_spec *spec = codec->spec;
5117	int n;
5118	hda_nid_t fallback_adc = 0, fallback_cap = 0;
5119
5120	for (n = 0; n < num_nids; n++) {
5121		hda_nid_t adc, cap;
5122		hda_nid_t conn[HDA_MAX_NUM_INPUTS];
5123		int nconns, i, j;
5124
5125		adc = nids[n];
5126		if (get_wcaps_type(get_wcaps(codec, adc)) != AC_WID_AUD_IN)
5127			continue;
5128		cap = adc;
5129		nconns = snd_hda_get_connections(codec, cap, conn,
5130						 ARRAY_SIZE(conn));
5131		if (nconns == 1) {
5132			cap = conn[0];
5133			nconns = snd_hda_get_connections(codec, cap, conn,
5134							 ARRAY_SIZE(conn));
5135		}
5136		if (nconns <= 0)
5137			continue;
5138		if (!fallback_adc) {
5139			fallback_adc = adc;
5140			fallback_cap = cap;
5141		}
5142		for (i = 0; i < AUTO_PIN_LAST; i++) {
5143			hda_nid_t nid = spec->autocfg.input_pins[i];
5144			if (!nid)
5145				continue;
5146			for (j = 0; j < nconns; j++) {
5147				if (conn[j] == nid)
5148					break;
5149			}
5150			if (j >= nconns)
5151				break;
5152		}
5153		if (i >= AUTO_PIN_LAST) {
5154			int num_adcs = spec->num_adc_nids;
5155			spec->private_adc_nids[num_adcs] = adc;
5156			spec->private_capsrc_nids[num_adcs] = cap;
5157			spec->num_adc_nids++;
5158			spec->adc_nids = spec->private_adc_nids;
5159			if (adc != cap)
5160				spec->capsrc_nids = spec->private_capsrc_nids;
5161		}
5162	}
5163	if (!spec->num_adc_nids) {
5164		printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
5165		       " using fallback 0x%x\n",
5166		       codec->chip_name, fallback_adc);
5167		spec->private_adc_nids[0] = fallback_adc;
5168		spec->adc_nids = spec->private_adc_nids;
5169		if (fallback_adc != fallback_cap) {
5170			spec->private_capsrc_nids[0] = fallback_cap;
5171			spec->capsrc_nids = spec->private_adc_nids;
5172		}
5173	}
5174}
5175
5176#ifdef CONFIG_SND_HDA_INPUT_BEEP
5177#define set_beep_amp(spec, nid, idx, dir) \
5178	((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
5179#else
5180#define set_beep_amp(spec, nid, idx, dir) /* NOP */
5181#endif
5182
5183/*
5184 * OK, here we have finally the patch for ALC880
5185 */
5186
5187static int patch_alc880(struct hda_codec *codec)
5188{
5189	struct alc_spec *spec;
5190	int board_config;
5191	int err;
5192
5193	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5194	if (spec == NULL)
5195		return -ENOMEM;
5196
5197	codec->spec = spec;
5198
5199	board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
5200						  alc880_models,
5201						  alc880_cfg_tbl);
5202	if (board_config < 0) {
5203		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5204		       codec->chip_name);
5205		board_config = ALC880_AUTO;
5206	}
5207
5208	if (board_config == ALC880_AUTO) {
5209		/* automatic parse from the BIOS config */
5210		err = alc880_parse_auto_config(codec);
5211		if (err < 0) {
5212			alc_free(codec);
5213			return err;
5214		} else if (!err) {
5215			printk(KERN_INFO
5216			       "hda_codec: Cannot set up configuration "
5217			       "from BIOS.  Using 3-stack mode...\n");
5218			board_config = ALC880_3ST;
5219		}
5220	}
5221
5222	err = snd_hda_attach_beep_device(codec, 0x1);
5223	if (err < 0) {
5224		alc_free(codec);
5225		return err;
5226	}
5227
5228	if (board_config != ALC880_AUTO)
5229		setup_preset(codec, &alc880_presets[board_config]);
5230
5231	spec->stream_analog_playback = &alc880_pcm_analog_playback;
5232	spec->stream_analog_capture = &alc880_pcm_analog_capture;
5233	spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
5234
5235	spec->stream_digital_playback = &alc880_pcm_digital_playback;
5236	spec->stream_digital_capture = &alc880_pcm_digital_capture;
5237
5238	if (!spec->adc_nids && spec->input_mux) {
5239		/* check whether NID 0x07 is valid */
5240		unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
5241		/* get type */
5242		wcap = get_wcaps_type(wcap);
5243		if (wcap != AC_WID_AUD_IN) {
5244			spec->adc_nids = alc880_adc_nids_alt;
5245			spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
5246		} else {
5247			spec->adc_nids = alc880_adc_nids;
5248			spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
5249		}
5250	}
5251	set_capture_mixer(codec);
5252	set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
5253
5254	spec->vmaster_nid = 0x0c;
5255
5256	codec->patch_ops = alc_patch_ops;
5257	if (board_config == ALC880_AUTO)
5258		spec->init_hook = alc880_auto_init;
5259#ifdef CONFIG_SND_HDA_POWER_SAVE
5260	if (!spec->loopback.amplist)
5261		spec->loopback.amplist = alc880_loopbacks;
5262#endif
5263
5264	return 0;
5265}
5266
5267
5268/*
5269 * ALC260 support
5270 */
5271
5272static hda_nid_t alc260_dac_nids[1] = {
5273	/* front */
5274	0x02,
5275};
5276
5277static hda_nid_t alc260_adc_nids[1] = {
5278	/* ADC0 */
5279	0x04,
5280};
5281
5282static hda_nid_t alc260_adc_nids_alt[1] = {
5283	/* ADC1 */
5284	0x05,
5285};
5286
5287/* NIDs used when simultaneous access to both ADCs makes sense.  Note that
5288 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
5289 */
5290static hda_nid_t alc260_dual_adc_nids[2] = {
5291	/* ADC0, ADC1 */
5292	0x04, 0x05
5293};
5294
5295#define ALC260_DIGOUT_NID	0x03
5296#define ALC260_DIGIN_NID	0x06
5297
5298static struct hda_input_mux alc260_capture_source = {
5299	.num_items = 4,
5300	.items = {
5301		{ "Mic", 0x0 },
5302		{ "Front Mic", 0x1 },
5303		{ "Line", 0x2 },
5304		{ "CD", 0x4 },
5305	},
5306};
5307
5308/* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
5309 * headphone jack and the internal CD lines since these are the only pins at
5310 * which audio can appear.  For flexibility, also allow the option of
5311 * recording the mixer output on the second ADC (ADC0 doesn't have a
5312 * connection to the mixer output).
5313 */
5314static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5315	{
5316		.num_items = 3,
5317		.items = {
5318			{ "Mic/Line", 0x0 },
5319			{ "CD", 0x4 },
5320			{ "Headphone", 0x2 },
5321		},
5322	},
5323	{
5324		.num_items = 4,
5325		.items = {
5326			{ "Mic/Line", 0x0 },
5327			{ "CD", 0x4 },
5328			{ "Headphone", 0x2 },
5329			{ "Mixer", 0x5 },
5330		},
5331	},
5332
5333};
5334
5335/* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5336 * the Fujitsu S702x, but jacks are marked differently.
5337 */
5338static struct hda_input_mux alc260_acer_capture_sources[2] = {
5339	{
5340		.num_items = 4,
5341		.items = {
5342			{ "Mic", 0x0 },
5343			{ "Line", 0x2 },
5344			{ "CD", 0x4 },
5345			{ "Headphone", 0x5 },
5346		},
5347	},
5348	{
5349		.num_items = 5,
5350		.items = {
5351			{ "Mic", 0x0 },
5352			{ "Line", 0x2 },
5353			{ "CD", 0x4 },
5354			{ "Headphone", 0x6 },
5355			{ "Mixer", 0x5 },
5356		},
5357	},
5358};
5359
5360/* Maxdata Favorit 100XS */
5361static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5362	{
5363		.num_items = 2,
5364		.items = {
5365			{ "Line/Mic", 0x0 },
5366			{ "CD", 0x4 },
5367		},
5368	},
5369	{
5370		.num_items = 3,
5371		.items = {
5372			{ "Line/Mic", 0x0 },
5373			{ "CD", 0x4 },
5374			{ "Mixer", 0x5 },
5375		},
5376	},
5377};
5378
5379/*
5380 * This is just place-holder, so there's something for alc_build_pcms to look
5381 * at when it calculates the maximum number of channels. ALC260 has no mixer
5382 * element which allows changing the channel mode, so the verb list is
5383 * never used.
5384 */
5385static struct hda_channel_mode alc260_modes[1] = {
5386	{ 2, NULL },
5387};
5388
5389
5390/* Mixer combinations
5391 *
5392 * basic: base_output + input + pc_beep + capture
5393 * HP: base_output + input + capture_alt
5394 * HP_3013: hp_3013 + input + capture
5395 * fujitsu: fujitsu + capture
5396 * acer: acer + capture
5397 */
5398
5399static struct snd_kcontrol_new alc260_base_output_mixer[] = {
5400	HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5401	HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5402	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5403	HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5404	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5405	HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5406	{ } /* end */
5407};
5408
5409static struct snd_kcontrol_new alc260_input_mixer[] = {
5410	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5411	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5412	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5413	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5414	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5415	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5416	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5417	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
5418	{ } /* end */
5419};
5420
5421/* update HP, line and mono out pins according to the master switch */
5422static void alc260_hp_master_update(struct hda_codec *codec,
5423				    hda_nid_t hp, hda_nid_t line,
5424				    hda_nid_t mono)
5425{
5426	struct alc_spec *spec = codec->spec;
5427	unsigned int val = spec->master_sw ? PIN_HP : 0;
5428	/* change HP and line-out pins */
5429	snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5430			    val);
5431	snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5432			    val);
5433	/* mono (speaker) depending on the HP jack sense */
5434	val = (val && !spec->jack_present) ? PIN_OUT : 0;
5435	snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5436			    val);
5437}
5438
5439static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5440				   struct snd_ctl_elem_value *ucontrol)
5441{
5442	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5443	struct alc_spec *spec = codec->spec;
5444	*ucontrol->value.integer.value = spec->master_sw;
5445	return 0;
5446}
5447
5448static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5449				   struct snd_ctl_elem_value *ucontrol)
5450{
5451	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5452	struct alc_spec *spec = codec->spec;
5453	int val = !!*ucontrol->value.integer.value;
5454	hda_nid_t hp, line, mono;
5455
5456	if (val == spec->master_sw)
5457		return 0;
5458	spec->master_sw = val;
5459	hp = (kcontrol->private_value >> 16) & 0xff;
5460	line = (kcontrol->private_value >> 8) & 0xff;
5461	mono = kcontrol->private_value & 0xff;
5462	alc260_hp_master_update(codec, hp, line, mono);
5463	return 1;
5464}
5465
5466static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5467	{
5468		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5469		.name = "Master Playback Switch",
5470		.subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5471		.info = snd_ctl_boolean_mono_info,
5472		.get = alc260_hp_master_sw_get,
5473		.put = alc260_hp_master_sw_put,
5474		.private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5475	},
5476	HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5477	HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5478	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5479	HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5480	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5481			      HDA_OUTPUT),
5482	HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5483	{ } /* end */
5484};
5485
5486static struct hda_verb alc260_hp_unsol_verbs[] = {
5487	{0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5488	{},
5489};
5490
5491static void alc260_hp_automute(struct hda_codec *codec)
5492{
5493	struct alc_spec *spec = codec->spec;
5494
5495	spec->jack_present = snd_hda_jack_detect(codec, 0x10);
5496	alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5497}
5498
5499static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5500{
5501	if ((res >> 26) == ALC880_HP_EVENT)
5502		alc260_hp_automute(codec);
5503}
5504
5505static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5506	{
5507		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5508		.name = "Master Playback Switch",
5509		.subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5510		.info = snd_ctl_boolean_mono_info,
5511		.get = alc260_hp_master_sw_get,
5512		.put = alc260_hp_master_sw_put,
5513		.private_value = (0x15 << 16) | (0x10 << 8) | 0x11
5514	},
5515	HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5516	HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5517	HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5518	HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5519	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5520	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
5521	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5522	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
5523	{ } /* end */
5524};
5525
5526static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5527	.ops = &snd_hda_bind_vol,
5528	.values = {
5529		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5530		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5531		HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5532		0
5533	},
5534};
5535
5536static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5537	.ops = &snd_hda_bind_sw,
5538	.values = {
5539		HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5540		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5541		0
5542	},
5543};
5544
5545static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5546	HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5547	HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5548	HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5549	HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5550	{ } /* end */
5551};
5552
5553static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5554	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5555	{},
5556};
5557
5558static void alc260_hp_3013_automute(struct hda_codec *codec)
5559{
5560	struct alc_spec *spec = codec->spec;
5561
5562	spec->jack_present = snd_hda_jack_detect(codec, 0x15);
5563	alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
5564}
5565
5566static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5567				       unsigned int res)
5568{
5569	if ((res >> 26) == ALC880_HP_EVENT)
5570		alc260_hp_3013_automute(codec);
5571}
5572
5573static void alc260_hp_3012_automute(struct hda_codec *codec)
5574{
5575	unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
5576
5577	snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5578			    bits);
5579	snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5580			    bits);
5581	snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5582			    bits);
5583}
5584
5585static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5586				       unsigned int res)
5587{
5588	if ((res >> 26) == ALC880_HP_EVENT)
5589		alc260_hp_3012_automute(codec);
5590}
5591
5592/* Fujitsu S702x series laptops.  ALC260 pin usage: Mic/Line jack = 0x12,
5593 * HP jack = 0x14, CD audio =  0x16, internal speaker = 0x10.
5594 */
5595static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
5596	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5597	HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
5598	ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5599	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5600	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5601	HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5602	HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
5603	ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
5604	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5605	HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
5606	{ } /* end */
5607};
5608
5609/* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks.  Note that current
5610 * versions of the ALC260 don't act on requests to enable mic bias from NID
5611 * 0x0f (used to drive the headphone jack in these laptops).  The ALC260
5612 * datasheet doesn't mention this restriction.  At this stage it's not clear
5613 * whether this behaviour is intentional or is a hardware bug in chip
5614 * revisions available in early 2006.  Therefore for now allow the
5615 * "Headphone Jack Mode" control to span all choices, but if it turns out
5616 * that the lack of mic bias for this NID is intentional we could change the
5617 * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5618 *
5619 * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5620 * don't appear to make the mic bias available from the "line" jack, even
5621 * though the NID used for this jack (0x14) can supply it.  The theory is
5622 * that perhaps Acer have included blocking capacitors between the ALC260
5623 * and the output jack.  If this turns out to be the case for all such
5624 * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5625 * to ALC_PIN_DIR_INOUT_NOMICBIAS.
5626 *
5627 * The C20x Tablet series have a mono internal speaker which is controlled
5628 * via the chip's Mono sum widget and pin complex, so include the necessary
5629 * controls for such models.  On models without a "mono speaker" the control
5630 * won't do anything.
5631 */
5632static struct snd_kcontrol_new alc260_acer_mixer[] = {
5633	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5634	HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5635	ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5636	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5637			      HDA_OUTPUT),
5638	HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
5639			   HDA_INPUT),
5640	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5641	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5642	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5643	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5644	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5645	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5646	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5647	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5648	{ } /* end */
5649};
5650
5651/* Maxdata Favorit 100XS: one output and one input (0x12) jack
5652 */
5653static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5654	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5655	HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5656	ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5657	HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5658	HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5659	ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5660	{ } /* end */
5661};
5662
5663/* Packard bell V7900  ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5664 * Line In jack = 0x14, CD audio =  0x16, pc beep = 0x17.
5665 */
5666static struct snd_kcontrol_new alc260_will_mixer[] = {
5667	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5668	HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5669	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5670	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5671	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5672	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5673	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5674	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5675	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5676	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5677	{ } /* end */
5678};
5679
5680/* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5681 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5682 */
5683static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5684	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5685	HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5686	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5687	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5688	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5689	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5690	HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5691	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5692	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5693	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5694	{ } /* end */
5695};
5696
5697/*
5698 * initialization verbs
5699 */
5700static struct hda_verb alc260_init_verbs[] = {
5701	/* Line In pin widget for input */
5702	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5703	/* CD pin widget for input */
5704	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5705	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5706	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5707	/* Mic2 (front panel) pin widget for input and vref at 80% */
5708	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5709	/* LINE-2 is used for line-out in rear */
5710	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5711	/* select line-out */
5712	{0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
5713	/* LINE-OUT pin */
5714	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5715	/* enable HP */
5716	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5717	/* enable Mono */
5718	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5719	/* mute capture amp left and right */
5720	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5721	/* set connection select to line in (default select for this ADC) */
5722	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5723	/* mute capture amp left and right */
5724	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5725	/* set connection select to line in (default select for this ADC) */
5726	{0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
5727	/* set vol=0 Line-Out mixer amp left and right */
5728	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5729	/* unmute pin widget amp left and right (no gain on this amp) */
5730	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5731	/* set vol=0 HP mixer amp left and right */
5732	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5733	/* unmute pin widget amp left and right (no gain on this amp) */
5734	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5735	/* set vol=0 Mono mixer amp left and right */
5736	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5737	/* unmute pin widget amp left and right (no gain on this amp) */
5738	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5739	/* unmute LINE-2 out pin */
5740	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5741	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5742	 * Line In 2 = 0x03
5743	 */
5744	/* mute analog inputs */
5745	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5746	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5747	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5748	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5749	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5750	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5751	/* mute Front out path */
5752	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5753	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5754	/* mute Headphone out path */
5755	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5756	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5757	/* mute Mono out path */
5758	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5759	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5760	{ }
5761};
5762
5763#if 0 /* should be identical with alc260_init_verbs? */
5764static struct hda_verb alc260_hp_init_verbs[] = {
5765	/* Headphone and output */
5766	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5767	/* mono output */
5768	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5769	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5770	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5771	/* Mic2 (front panel) pin widget for input and vref at 80% */
5772	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5773	/* Line In pin widget for input */
5774	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5775	/* Line-2 pin widget for output */
5776	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5777	/* CD pin widget for input */
5778	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5779	/* unmute amp left and right */
5780	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5781	/* set connection select to line in (default select for this ADC) */
5782	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5783	/* unmute Line-Out mixer amp left and right (volume = 0) */
5784	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5785	/* mute pin widget amp left and right (no gain on this amp) */
5786	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5787	/* unmute HP mixer amp left and right (volume = 0) */
5788	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5789	/* mute pin widget amp left and right (no gain on this amp) */
5790	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5791	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5792	 * Line In 2 = 0x03
5793	 */
5794	/* mute analog inputs */
5795	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5796	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5797	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5798	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5799	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5800	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5801	/* Unmute Front out path */
5802	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5803	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5804	/* Unmute Headphone out path */
5805	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5806	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5807	/* Unmute Mono out path */
5808	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5809	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5810	{ }
5811};
5812#endif
5813
5814static struct hda_verb alc260_hp_3013_init_verbs[] = {
5815	/* Line out and output */
5816	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5817	/* mono output */
5818	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5819	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5820	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5821	/* Mic2 (front panel) pin widget for input and vref at 80% */
5822	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5823	/* Line In pin widget for input */
5824	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5825	/* Headphone pin widget for output */
5826	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5827	/* CD pin widget for input */
5828	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5829	/* unmute amp left and right */
5830	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5831	/* set connection select to line in (default select for this ADC) */
5832	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5833	/* unmute Line-Out mixer amp left and right (volume = 0) */
5834	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5835	/* mute pin widget amp left and right (no gain on this amp) */
5836	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5837	/* unmute HP mixer amp left and right (volume = 0) */
5838	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5839	/* mute pin widget amp left and right (no gain on this amp) */
5840	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5841	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5842	 * Line In 2 = 0x03
5843	 */
5844	/* mute analog inputs */
5845	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5846	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5847	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5848	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5849	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5850	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5851	/* Unmute Front out path */
5852	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5853	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5854	/* Unmute Headphone out path */
5855	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5856	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5857	/* Unmute Mono out path */
5858	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5859	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5860	{ }
5861};
5862
5863/* Initialisation sequence for ALC260 as configured in Fujitsu S702x
5864 * laptops.  ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
5865 * audio = 0x16, internal speaker = 0x10.
5866 */
5867static struct hda_verb alc260_fujitsu_init_verbs[] = {
5868	/* Disable all GPIOs */
5869	{0x01, AC_VERB_SET_GPIO_MASK, 0},
5870	/* Internal speaker is connected to headphone pin */
5871	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5872	/* Headphone/Line-out jack connects to Line1 pin; make it an output */
5873	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5874	/* Mic/Line-in jack is connected to mic1 pin, so make it an input */
5875	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5876	/* Ensure all other unused pins are disabled and muted. */
5877	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5878	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5879	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5880	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5881	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5882	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5883	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5884	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5885
5886	/* Disable digital (SPDIF) pins */
5887	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5888	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5889
5890	/* Ensure Line1 pin widget takes its input from the OUT1 sum bus
5891	 * when acting as an output.
5892	 */
5893	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5894
5895	/* Start with output sum widgets muted and their output gains at min */
5896	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5897	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5898	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5899	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5900	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5901	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5902	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5903	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5904	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5905
5906	/* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
5907	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5908	/* Unmute Line1 pin widget output buffer since it starts as an output.
5909	 * If the pin mode is changed by the user the pin mode control will
5910	 * take care of enabling the pin's input/output buffers as needed.
5911	 * Therefore there's no need to enable the input buffer at this
5912	 * stage.
5913	 */
5914	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5915	/* Unmute input buffer of pin widget used for Line-in (no equiv
5916	 * mixer ctrl)
5917	 */
5918	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5919
5920	/* Mute capture amp left and right */
5921	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5922	/* Set ADC connection select to match default mixer setting - line
5923	 * in (on mic1 pin)
5924	 */
5925	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5926
5927	/* Do the same for the second ADC: mute capture input amp and
5928	 * set ADC connection to line in (on mic1 pin)
5929	 */
5930	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5931	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5932
5933	/* Mute all inputs to mixer widget (even unconnected ones) */
5934	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5935	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5936	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5937	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5938	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5939	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5940	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5941	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5942
5943	{ }
5944};
5945
5946/* Initialisation sequence for ALC260 as configured in Acer TravelMate and
5947 * similar laptops (adapted from Fujitsu init verbs).
5948 */
5949static struct hda_verb alc260_acer_init_verbs[] = {
5950	/* On TravelMate laptops, GPIO 0 enables the internal speaker and
5951	 * the headphone jack.  Turn this on and rely on the standard mute
5952	 * methods whenever the user wants to turn these outputs off.
5953	 */
5954	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5955	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5956	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5957	/* Internal speaker/Headphone jack is connected to Line-out pin */
5958	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5959	/* Internal microphone/Mic jack is connected to Mic1 pin */
5960	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5961	/* Line In jack is connected to Line1 pin */
5962	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5963	/* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
5964	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5965	/* Ensure all other unused pins are disabled and muted. */
5966	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5967	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5968	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5969	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5970	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5971	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5972	/* Disable digital (SPDIF) pins */
5973	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5974	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5975
5976	/* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5977	 * bus when acting as outputs.
5978	 */
5979	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5980	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5981
5982	/* Start with output sum widgets muted and their output gains at min */
5983	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5984	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5985	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5986	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5987	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5988	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5989	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5990	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5991	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5992
5993	/* Unmute Line-out pin widget amp left and right
5994	 * (no equiv mixer ctrl)
5995	 */
5996	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5997	/* Unmute mono pin widget amp output (no equiv mixer ctrl) */
5998	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5999	/* Unmute Mic1 and Line1 pin widget input buffers since they start as
6000	 * inputs. If the pin mode is changed by the user the pin mode control
6001	 * will take care of enabling the pin's input/output buffers as needed.
6002	 * Therefore there's no need to enable the input buffer at this
6003	 * stage.
6004	 */
6005	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6006	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6007
6008	/* Mute capture amp left and right */
6009	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6010	/* Set ADC connection select to match default mixer setting - mic
6011	 * (on mic1 pin)
6012	 */
6013	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6014
6015	/* Do similar with the second ADC: mute capture input amp and
6016	 * set ADC connection to mic to match ALSA's default state.
6017	 */
6018	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6019	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6020
6021	/* Mute all inputs to mixer widget (even unconnected ones) */
6022	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6023	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6024	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6025	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6026	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6027	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6028	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6029	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6030
6031	{ }
6032};
6033
6034/* Initialisation sequence for Maxdata Favorit 100XS
6035 * (adapted from Acer init verbs).
6036 */
6037static struct hda_verb alc260_favorit100_init_verbs[] = {
6038	/* GPIO 0 enables the output jack.
6039	 * Turn this on and rely on the standard mute
6040	 * methods whenever the user wants to turn these outputs off.
6041	 */
6042	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6043	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6044	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
6045	/* Line/Mic input jack is connected to Mic1 pin */
6046	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
6047	/* Ensure all other unused pins are disabled and muted. */
6048	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6049	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6050	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6051	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6052	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6053	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6054	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6055	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6056	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6057	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6058	/* Disable digital (SPDIF) pins */
6059	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6060	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6061
6062	/* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
6063	 * bus when acting as outputs.
6064	 */
6065	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6066	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6067
6068	/* Start with output sum widgets muted and their output gains at min */
6069	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6070	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6071	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6072	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6073	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6074	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6075	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6076	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6077	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6078
6079	/* Unmute Line-out pin widget amp left and right
6080	 * (no equiv mixer ctrl)
6081	 */
6082	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6083	/* Unmute Mic1 and Line1 pin widget input buffers since they start as
6084	 * inputs. If the pin mode is changed by the user the pin mode control
6085	 * will take care of enabling the pin's input/output buffers as needed.
6086	 * Therefore there's no need to enable the input buffer at this
6087	 * stage.
6088	 */
6089	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6090
6091	/* Mute capture amp left and right */
6092	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6093	/* Set ADC connection select to match default mixer setting - mic
6094	 * (on mic1 pin)
6095	 */
6096	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6097
6098	/* Do similar with the second ADC: mute capture input amp and
6099	 * set ADC connection to mic to match ALSA's default state.
6100	 */
6101	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6102	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6103
6104	/* Mute all inputs to mixer widget (even unconnected ones) */
6105	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6106	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6107	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6108	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6109	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6110	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6111	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6112	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6113
6114	{ }
6115};
6116
6117static struct hda_verb alc260_will_verbs[] = {
6118	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6119	{0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
6120	{0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
6121	{0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6122	{0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6123	{0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
6124	{}
6125};
6126
6127static struct hda_verb alc260_replacer_672v_verbs[] = {
6128	{0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6129	{0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6130	{0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
6131
6132	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6133	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6134	{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6135
6136	{0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6137	{}
6138};
6139
6140/* toggle speaker-output according to the hp-jack state */
6141static void alc260_replacer_672v_automute(struct hda_codec *codec)
6142{
6143        unsigned int present;
6144
6145	/* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
6146	present = snd_hda_jack_detect(codec, 0x0f);
6147	if (present) {
6148		snd_hda_codec_write_cache(codec, 0x01, 0,
6149					  AC_VERB_SET_GPIO_DATA, 1);
6150		snd_hda_codec_write_cache(codec, 0x0f, 0,
6151					  AC_VERB_SET_PIN_WIDGET_CONTROL,
6152					  PIN_HP);
6153	} else {
6154		snd_hda_codec_write_cache(codec, 0x01, 0,
6155					  AC_VERB_SET_GPIO_DATA, 0);
6156		snd_hda_codec_write_cache(codec, 0x0f, 0,
6157					  AC_VERB_SET_PIN_WIDGET_CONTROL,
6158					  PIN_OUT);
6159	}
6160}
6161
6162static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
6163                                       unsigned int res)
6164{
6165        if ((res >> 26) == ALC880_HP_EVENT)
6166                alc260_replacer_672v_automute(codec);
6167}
6168
6169static struct hda_verb alc260_hp_dc7600_verbs[] = {
6170	{0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
6171	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6172	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6173	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6174	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6175	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6176	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
6177	{0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6178	{0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6179	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6180	{}
6181};
6182
6183/* Test configuration for debugging, modelled after the ALC880 test
6184 * configuration.
6185 */
6186#ifdef CONFIG_SND_DEBUG
6187static hda_nid_t alc260_test_dac_nids[1] = {
6188	0x02,
6189};
6190static hda_nid_t alc260_test_adc_nids[2] = {
6191	0x04, 0x05,
6192};
6193/* For testing the ALC260, each input MUX needs its own definition since
6194 * the signal assignments are different.  This assumes that the first ADC
6195 * is NID 0x04.
6196 */
6197static struct hda_input_mux alc260_test_capture_sources[2] = {
6198	{
6199		.num_items = 7,
6200		.items = {
6201			{ "MIC1 pin", 0x0 },
6202			{ "MIC2 pin", 0x1 },
6203			{ "LINE1 pin", 0x2 },
6204			{ "LINE2 pin", 0x3 },
6205			{ "CD pin", 0x4 },
6206			{ "LINE-OUT pin", 0x5 },
6207			{ "HP-OUT pin", 0x6 },
6208		},
6209        },
6210	{
6211		.num_items = 8,
6212		.items = {
6213			{ "MIC1 pin", 0x0 },
6214			{ "MIC2 pin", 0x1 },
6215			{ "LINE1 pin", 0x2 },
6216			{ "LINE2 pin", 0x3 },
6217			{ "CD pin", 0x4 },
6218			{ "Mixer", 0x5 },
6219			{ "LINE-OUT pin", 0x6 },
6220			{ "HP-OUT pin", 0x7 },
6221		},
6222        },
6223};
6224static struct snd_kcontrol_new alc260_test_mixer[] = {
6225	/* Output driver widgets */
6226	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
6227	HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
6228	HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6229	HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
6230	HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6231	HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
6232
6233	/* Modes for retasking pin widgets
6234	 * Note: the ALC260 doesn't seem to act on requests to enable mic
6235         * bias from NIDs 0x0f and 0x10.  The ALC260 datasheet doesn't
6236         * mention this restriction.  At this stage it's not clear whether
6237         * this behaviour is intentional or is a hardware bug in chip
6238         * revisions available at least up until early 2006.  Therefore for
6239         * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
6240         * choices, but if it turns out that the lack of mic bias for these
6241         * NIDs is intentional we could change their modes from
6242         * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
6243	 */
6244	ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
6245	ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
6246	ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
6247	ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
6248	ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
6249	ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
6250
6251	/* Loopback mixer controls */
6252	HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
6253	HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
6254	HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
6255	HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
6256	HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
6257	HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
6258	HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
6259	HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
6260	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6261	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
6262	HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
6263	HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
6264	HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
6265	HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
6266
6267	/* Controls for GPIO pins, assuming they are configured as outputs */
6268	ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
6269	ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
6270	ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
6271	ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
6272
6273	/* Switches to allow the digital IO pins to be enabled.  The datasheet
6274	 * is ambigious as to which NID is which; testing on laptops which
6275	 * make this output available should provide clarification.
6276	 */
6277	ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
6278	ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
6279
6280	/* A switch allowing EAPD to be enabled.  Some laptops seem to use
6281	 * this output to turn on an external amplifier.
6282	 */
6283	ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
6284	ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
6285
6286	{ } /* end */
6287};
6288static struct hda_verb alc260_test_init_verbs[] = {
6289	/* Enable all GPIOs as outputs with an initial value of 0 */
6290	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
6291	{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6292	{0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
6293
6294	/* Enable retasking pins as output, initially without power amp */
6295	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6296	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6297	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6298	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6299	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6300	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6301
6302	/* Disable digital (SPDIF) pins initially, but users can enable
6303	 * them via a mixer switch.  In the case of SPDIF-out, this initverb
6304	 * payload also sets the generation to 0, output to be in "consumer"
6305	 * PCM format, copyright asserted, no pre-emphasis and no validity
6306	 * control.
6307	 */
6308	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6309	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6310
6311	/* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
6312	 * OUT1 sum bus when acting as an output.
6313	 */
6314	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6315	{0x0c, AC_VERB_SET_CONNECT_SEL, 0},
6316	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6317	{0x0e, AC_VERB_SET_CONNECT_SEL, 0},
6318
6319	/* Start with output sum widgets muted and their output gains at min */
6320	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6321	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6322	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6323	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6324	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6325	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6326	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6327	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6328	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6329
6330	/* Unmute retasking pin widget output buffers since the default
6331	 * state appears to be output.  As the pin mode is changed by the
6332	 * user the pin mode control will take care of enabling the pin's
6333	 * input/output buffers as needed.
6334	 */
6335	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6336	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6337	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6338	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6339	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6340	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6341	/* Also unmute the mono-out pin widget */
6342	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6343
6344	/* Mute capture amp left and right */
6345	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6346	/* Set ADC connection select to match default mixer setting (mic1
6347	 * pin)
6348	 */
6349	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6350
6351	/* Do the same for the second ADC: mute capture input amp and
6352	 * set ADC connection to mic1 pin
6353	 */
6354	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6355	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6356
6357	/* Mute all inputs to mixer widget (even unconnected ones) */
6358	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6359	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6360	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6361	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6362	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6363	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6364	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6365	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6366
6367	{ }
6368};
6369#endif
6370
6371#define alc260_pcm_analog_playback	alc880_pcm_analog_alt_playback
6372#define alc260_pcm_analog_capture	alc880_pcm_analog_capture
6373
6374#define alc260_pcm_digital_playback	alc880_pcm_digital_playback
6375#define alc260_pcm_digital_capture	alc880_pcm_digital_capture
6376
6377/*
6378 * for BIOS auto-configuration
6379 */
6380
6381static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
6382					const char *pfx, int *vol_bits)
6383{
6384	hda_nid_t nid_vol;
6385	unsigned long vol_val, sw_val;
6386	int err;
6387
6388	if (nid >= 0x0f && nid < 0x11) {
6389		nid_vol = nid - 0x7;
6390		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6391		sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6392	} else if (nid == 0x11) {
6393		nid_vol = nid - 0x7;
6394		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6395		sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6396	} else if (nid >= 0x12 && nid <= 0x15) {
6397		nid_vol = 0x08;
6398		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6399		sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6400	} else
6401		return 0; /* N/A */
6402
6403	if (!(*vol_bits & (1 << nid_vol))) {
6404		/* first control for the volume widget */
6405		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
6406		if (err < 0)
6407			return err;
6408		*vol_bits |= (1 << nid_vol);
6409	}
6410	err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
6411	if (err < 0)
6412		return err;
6413	return 1;
6414}
6415
6416/* add playback controls from the parsed DAC table */
6417static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6418					     const struct auto_pin_cfg *cfg)
6419{
6420	hda_nid_t nid;
6421	int err;
6422	int vols = 0;
6423
6424	spec->multiout.num_dacs = 1;
6425	spec->multiout.dac_nids = spec->private_dac_nids;
6426	spec->multiout.dac_nids[0] = 0x02;
6427
6428	nid = cfg->line_out_pins[0];
6429	if (nid) {
6430		const char *pfx;
6431		if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6432			pfx = "Master";
6433		else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6434			pfx = "Speaker";
6435		else
6436			pfx = "Front";
6437		err = alc260_add_playback_controls(spec, nid, pfx, &vols);
6438		if (err < 0)
6439			return err;
6440	}
6441
6442	nid = cfg->speaker_pins[0];
6443	if (nid) {
6444		err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
6445		if (err < 0)
6446			return err;
6447	}
6448
6449	nid = cfg->hp_pins[0];
6450	if (nid) {
6451		err = alc260_add_playback_controls(spec, nid, "Headphone",
6452						   &vols);
6453		if (err < 0)
6454			return err;
6455	}
6456	return 0;
6457}
6458
6459/* create playback/capture controls for input pins */
6460static int alc260_auto_create_input_ctls(struct hda_codec *codec,
6461						const struct auto_pin_cfg *cfg)
6462{
6463	return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
6464}
6465
6466static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6467					      hda_nid_t nid, int pin_type,
6468					      int sel_idx)
6469{
6470	alc_set_pin_output(codec, nid, pin_type);
6471	/* need the manual connection? */
6472	if (nid >= 0x12) {
6473		int idx = nid - 0x12;
6474		snd_hda_codec_write(codec, idx + 0x0b, 0,
6475				    AC_VERB_SET_CONNECT_SEL, sel_idx);
6476	}
6477}
6478
6479static void alc260_auto_init_multi_out(struct hda_codec *codec)
6480{
6481	struct alc_spec *spec = codec->spec;
6482	hda_nid_t nid;
6483
6484	nid = spec->autocfg.line_out_pins[0];
6485	if (nid) {
6486		int pin_type = get_pin_type(spec->autocfg.line_out_type);
6487		alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6488	}
6489
6490	nid = spec->autocfg.speaker_pins[0];
6491	if (nid)
6492		alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6493
6494	nid = spec->autocfg.hp_pins[0];
6495	if (nid)
6496		alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
6497}
6498
6499#define ALC260_PIN_CD_NID		0x16
6500static void alc260_auto_init_analog_input(struct hda_codec *codec)
6501{
6502	struct alc_spec *spec = codec->spec;
6503	int i;
6504
6505	for (i = 0; i < AUTO_PIN_LAST; i++) {
6506		hda_nid_t nid = spec->autocfg.input_pins[i];
6507		if (nid >= 0x12) {
6508			alc_set_input_pin(codec, nid, i);
6509			if (nid != ALC260_PIN_CD_NID &&
6510			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
6511				snd_hda_codec_write(codec, nid, 0,
6512						    AC_VERB_SET_AMP_GAIN_MUTE,
6513						    AMP_OUT_MUTE);
6514		}
6515	}
6516}
6517
6518#define alc260_auto_init_input_src	alc880_auto_init_input_src
6519
6520/*
6521 * generic initialization of ADC, input mixers and output mixers
6522 */
6523static struct hda_verb alc260_volume_init_verbs[] = {
6524	/*
6525	 * Unmute ADC0-1 and set the default input to mic-in
6526	 */
6527	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6528	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6529	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6530	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6531
6532	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6533	 * mixer widget
6534	 * Note: PASD motherboards uses the Line In 2 as the input for
6535	 * front panel mic (mic 2)
6536	 */
6537	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
6538	/* mute analog inputs */
6539	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6540	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6541	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6542	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6543	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6544
6545	/*
6546	 * Set up output mixers (0x08 - 0x0a)
6547	 */
6548	/* set vol=0 to output mixers */
6549	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6550	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6551	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6552	/* set up input amps for analog loopback */
6553	/* Amp Indices: DAC = 0, mixer = 1 */
6554	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6555	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6556	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6557	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6558	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6559	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6560
6561	{ }
6562};
6563
6564static int alc260_parse_auto_config(struct hda_codec *codec)
6565{
6566	struct alc_spec *spec = codec->spec;
6567	int err;
6568	static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6569
6570	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6571					   alc260_ignore);
6572	if (err < 0)
6573		return err;
6574	err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6575	if (err < 0)
6576		return err;
6577	if (!spec->kctls.list)
6578		return 0; /* can't find valid BIOS pin config */
6579	err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
6580	if (err < 0)
6581		return err;
6582
6583	spec->multiout.max_channels = 2;
6584
6585	if (spec->autocfg.dig_outs)
6586		spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
6587	if (spec->kctls.list)
6588		add_mixer(spec, spec->kctls.list);
6589
6590	add_verb(spec, alc260_volume_init_verbs);
6591
6592	spec->num_mux_defs = 1;
6593	spec->input_mux = &spec->private_imux[0];
6594
6595	alc_ssid_check(codec, 0x10, 0x15, 0x0f, 0);
6596
6597	return 1;
6598}
6599
6600/* additional initialization for auto-configuration model */
6601static void alc260_auto_init(struct hda_codec *codec)
6602{
6603	struct alc_spec *spec = codec->spec;
6604	alc260_auto_init_multi_out(codec);
6605	alc260_auto_init_analog_input(codec);
6606	alc260_auto_init_input_src(codec);
6607	if (spec->unsol_event)
6608		alc_inithook(codec);
6609}
6610
6611#ifdef CONFIG_SND_HDA_POWER_SAVE
6612static struct hda_amp_list alc260_loopbacks[] = {
6613	{ 0x07, HDA_INPUT, 0 },
6614	{ 0x07, HDA_INPUT, 1 },
6615	{ 0x07, HDA_INPUT, 2 },
6616	{ 0x07, HDA_INPUT, 3 },
6617	{ 0x07, HDA_INPUT, 4 },
6618	{ } /* end */
6619};
6620#endif
6621
6622/*
6623 * ALC260 configurations
6624 */
6625static const char *alc260_models[ALC260_MODEL_LAST] = {
6626	[ALC260_BASIC]		= "basic",
6627	[ALC260_HP]		= "hp",
6628	[ALC260_HP_3013]	= "hp-3013",
6629	[ALC260_HP_DC7600]	= "hp-dc7600",
6630	[ALC260_FUJITSU_S702X]	= "fujitsu",
6631	[ALC260_ACER]		= "acer",
6632	[ALC260_WILL]		= "will",
6633	[ALC260_REPLACER_672V]	= "replacer",
6634	[ALC260_FAVORIT100]	= "favorit100",
6635#ifdef CONFIG_SND_DEBUG
6636	[ALC260_TEST]		= "test",
6637#endif
6638	[ALC260_AUTO]		= "auto",
6639};
6640
6641static struct snd_pci_quirk alc260_cfg_tbl[] = {
6642	SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
6643	SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
6644	SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
6645	SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
6646	SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
6647	SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
6648	SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
6649	SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
6650	SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
6651	SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6652	SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6653	SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6654	SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6655	SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6656	SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6657	SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6658	SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6659	SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
6660	SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
6661	SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
6662	{}
6663};
6664
6665static struct alc_config_preset alc260_presets[] = {
6666	[ALC260_BASIC] = {
6667		.mixers = { alc260_base_output_mixer,
6668			    alc260_input_mixer },
6669		.init_verbs = { alc260_init_verbs },
6670		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6671		.dac_nids = alc260_dac_nids,
6672		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6673		.adc_nids = alc260_dual_adc_nids,
6674		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6675		.channel_mode = alc260_modes,
6676		.input_mux = &alc260_capture_source,
6677	},
6678	[ALC260_HP] = {
6679		.mixers = { alc260_hp_output_mixer,
6680			    alc260_input_mixer },
6681		.init_verbs = { alc260_init_verbs,
6682				alc260_hp_unsol_verbs },
6683		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6684		.dac_nids = alc260_dac_nids,
6685		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6686		.adc_nids = alc260_adc_nids_alt,
6687		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6688		.channel_mode = alc260_modes,
6689		.input_mux = &alc260_capture_source,
6690		.unsol_event = alc260_hp_unsol_event,
6691		.init_hook = alc260_hp_automute,
6692	},
6693	[ALC260_HP_DC7600] = {
6694		.mixers = { alc260_hp_dc7600_mixer,
6695			    alc260_input_mixer },
6696		.init_verbs = { alc260_init_verbs,
6697				alc260_hp_dc7600_verbs },
6698		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6699		.dac_nids = alc260_dac_nids,
6700		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6701		.adc_nids = alc260_adc_nids_alt,
6702		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6703		.channel_mode = alc260_modes,
6704		.input_mux = &alc260_capture_source,
6705		.unsol_event = alc260_hp_3012_unsol_event,
6706		.init_hook = alc260_hp_3012_automute,
6707	},
6708	[ALC260_HP_3013] = {
6709		.mixers = { alc260_hp_3013_mixer,
6710			    alc260_input_mixer },
6711		.init_verbs = { alc260_hp_3013_init_verbs,
6712				alc260_hp_3013_unsol_verbs },
6713		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6714		.dac_nids = alc260_dac_nids,
6715		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6716		.adc_nids = alc260_adc_nids_alt,
6717		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6718		.channel_mode = alc260_modes,
6719		.input_mux = &alc260_capture_source,
6720		.unsol_event = alc260_hp_3013_unsol_event,
6721		.init_hook = alc260_hp_3013_automute,
6722	},
6723	[ALC260_FUJITSU_S702X] = {
6724		.mixers = { alc260_fujitsu_mixer },
6725		.init_verbs = { alc260_fujitsu_init_verbs },
6726		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6727		.dac_nids = alc260_dac_nids,
6728		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6729		.adc_nids = alc260_dual_adc_nids,
6730		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6731		.channel_mode = alc260_modes,
6732		.num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6733		.input_mux = alc260_fujitsu_capture_sources,
6734	},
6735	[ALC260_ACER] = {
6736		.mixers = { alc260_acer_mixer },
6737		.init_verbs = { alc260_acer_init_verbs },
6738		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6739		.dac_nids = alc260_dac_nids,
6740		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6741		.adc_nids = alc260_dual_adc_nids,
6742		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6743		.channel_mode = alc260_modes,
6744		.num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6745		.input_mux = alc260_acer_capture_sources,
6746	},
6747	[ALC260_FAVORIT100] = {
6748		.mixers = { alc260_favorit100_mixer },
6749		.init_verbs = { alc260_favorit100_init_verbs },
6750		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6751		.dac_nids = alc260_dac_nids,
6752		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6753		.adc_nids = alc260_dual_adc_nids,
6754		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6755		.channel_mode = alc260_modes,
6756		.num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6757		.input_mux = alc260_favorit100_capture_sources,
6758	},
6759	[ALC260_WILL] = {
6760		.mixers = { alc260_will_mixer },
6761		.init_verbs = { alc260_init_verbs, alc260_will_verbs },
6762		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6763		.dac_nids = alc260_dac_nids,
6764		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6765		.adc_nids = alc260_adc_nids,
6766		.dig_out_nid = ALC260_DIGOUT_NID,
6767		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6768		.channel_mode = alc260_modes,
6769		.input_mux = &alc260_capture_source,
6770	},
6771	[ALC260_REPLACER_672V] = {
6772		.mixers = { alc260_replacer_672v_mixer },
6773		.init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6774		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6775		.dac_nids = alc260_dac_nids,
6776		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6777		.adc_nids = alc260_adc_nids,
6778		.dig_out_nid = ALC260_DIGOUT_NID,
6779		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6780		.channel_mode = alc260_modes,
6781		.input_mux = &alc260_capture_source,
6782		.unsol_event = alc260_replacer_672v_unsol_event,
6783		.init_hook = alc260_replacer_672v_automute,
6784	},
6785#ifdef CONFIG_SND_DEBUG
6786	[ALC260_TEST] = {
6787		.mixers = { alc260_test_mixer },
6788		.init_verbs = { alc260_test_init_verbs },
6789		.num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6790		.dac_nids = alc260_test_dac_nids,
6791		.num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6792		.adc_nids = alc260_test_adc_nids,
6793		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6794		.channel_mode = alc260_modes,
6795		.num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6796		.input_mux = alc260_test_capture_sources,
6797	},
6798#endif
6799};
6800
6801static int patch_alc260(struct hda_codec *codec)
6802{
6803	struct alc_spec *spec;
6804	int err, board_config;
6805
6806	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6807	if (spec == NULL)
6808		return -ENOMEM;
6809
6810	codec->spec = spec;
6811
6812	board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
6813						  alc260_models,
6814						  alc260_cfg_tbl);
6815	if (board_config < 0) {
6816		snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6817			   codec->chip_name);
6818		board_config = ALC260_AUTO;
6819	}
6820
6821	if (board_config == ALC260_AUTO) {
6822		/* automatic parse from the BIOS config */
6823		err = alc260_parse_auto_config(codec);
6824		if (err < 0) {
6825			alc_free(codec);
6826			return err;
6827		} else if (!err) {
6828			printk(KERN_INFO
6829			       "hda_codec: Cannot set up configuration "
6830			       "from BIOS.  Using base mode...\n");
6831			board_config = ALC260_BASIC;
6832		}
6833	}
6834
6835	err = snd_hda_attach_beep_device(codec, 0x1);
6836	if (err < 0) {
6837		alc_free(codec);
6838		return err;
6839	}
6840
6841	if (board_config != ALC260_AUTO)
6842		setup_preset(codec, &alc260_presets[board_config]);
6843
6844	spec->stream_analog_playback = &alc260_pcm_analog_playback;
6845	spec->stream_analog_capture = &alc260_pcm_analog_capture;
6846
6847	spec->stream_digital_playback = &alc260_pcm_digital_playback;
6848	spec->stream_digital_capture = &alc260_pcm_digital_capture;
6849
6850	if (!spec->adc_nids && spec->input_mux) {
6851		/* check whether NID 0x04 is valid */
6852		unsigned int wcap = get_wcaps(codec, 0x04);
6853		wcap = get_wcaps_type(wcap);
6854		/* get type */
6855		if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
6856			spec->adc_nids = alc260_adc_nids_alt;
6857			spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
6858		} else {
6859			spec->adc_nids = alc260_adc_nids;
6860			spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
6861		}
6862	}
6863	set_capture_mixer(codec);
6864	set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
6865
6866	spec->vmaster_nid = 0x08;
6867
6868	codec->patch_ops = alc_patch_ops;
6869	if (board_config == ALC260_AUTO)
6870		spec->init_hook = alc260_auto_init;
6871#ifdef CONFIG_SND_HDA_POWER_SAVE
6872	if (!spec->loopback.amplist)
6873		spec->loopback.amplist = alc260_loopbacks;
6874#endif
6875
6876	return 0;
6877}
6878
6879
6880/*
6881 * ALC882/883/885/888/889 support
6882 *
6883 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
6884 * configuration.  Each pin widget can choose any input DACs and a mixer.
6885 * Each ADC is connected from a mixer of all inputs.  This makes possible
6886 * 6-channel independent captures.
6887 *
6888 * In addition, an independent DAC for the multi-playback (not used in this
6889 * driver yet).
6890 */
6891#define ALC882_DIGOUT_NID	0x06
6892#define ALC882_DIGIN_NID	0x0a
6893#define ALC883_DIGOUT_NID	ALC882_DIGOUT_NID
6894#define ALC883_DIGIN_NID	ALC882_DIGIN_NID
6895#define ALC1200_DIGOUT_NID	0x10
6896
6897
6898static struct hda_channel_mode alc882_ch_modes[1] = {
6899	{ 8, NULL }
6900};
6901
6902/* DACs */
6903static hda_nid_t alc882_dac_nids[4] = {
6904	/* front, rear, clfe, rear_surr */
6905	0x02, 0x03, 0x04, 0x05
6906};
6907#define alc883_dac_nids		alc882_dac_nids
6908
6909/* ADCs */
6910#define alc882_adc_nids		alc880_adc_nids
6911#define alc882_adc_nids_alt	alc880_adc_nids_alt
6912#define alc883_adc_nids		alc882_adc_nids_alt
6913static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
6914static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
6915#define alc889_adc_nids		alc880_adc_nids
6916
6917static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
6918static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
6919#define alc883_capsrc_nids	alc882_capsrc_nids_alt
6920static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
6921#define alc889_capsrc_nids	alc882_capsrc_nids
6922
6923/* input MUX */
6924/* FIXME: should be a matrix-type input source selection */
6925
6926static struct hda_input_mux alc882_capture_source = {
6927	.num_items = 4,
6928	.items = {
6929		{ "Mic", 0x0 },
6930		{ "Front Mic", 0x1 },
6931		{ "Line", 0x2 },
6932		{ "CD", 0x4 },
6933	},
6934};
6935
6936#define alc883_capture_source	alc882_capture_source
6937
6938static struct hda_input_mux alc889_capture_source = {
6939	.num_items = 3,
6940	.items = {
6941		{ "Front Mic", 0x0 },
6942		{ "Mic", 0x3 },
6943		{ "Line", 0x2 },
6944	},
6945};
6946
6947static struct hda_input_mux mb5_capture_source = {
6948	.num_items = 3,
6949	.items = {
6950		{ "Mic", 0x1 },
6951		{ "Line", 0x2 },
6952		{ "CD", 0x4 },
6953	},
6954};
6955
6956static struct hda_input_mux macmini3_capture_source = {
6957	.num_items = 2,
6958	.items = {
6959		{ "Line", 0x2 },
6960		{ "CD", 0x4 },
6961	},
6962};
6963
6964static struct hda_input_mux alc883_3stack_6ch_intel = {
6965	.num_items = 4,
6966	.items = {
6967		{ "Mic", 0x1 },
6968		{ "Front Mic", 0x0 },
6969		{ "Line", 0x2 },
6970		{ "CD", 0x4 },
6971	},
6972};
6973
6974static struct hda_input_mux alc883_lenovo_101e_capture_source = {
6975	.num_items = 2,
6976	.items = {
6977		{ "Mic", 0x1 },
6978		{ "Line", 0x2 },
6979	},
6980};
6981
6982static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
6983	.num_items = 4,
6984	.items = {
6985		{ "Mic", 0x0 },
6986		{ "iMic", 0x1 },
6987		{ "Line", 0x2 },
6988		{ "CD", 0x4 },
6989	},
6990};
6991
6992static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
6993	.num_items = 2,
6994	.items = {
6995		{ "Mic", 0x0 },
6996		{ "Int Mic", 0x1 },
6997	},
6998};
6999
7000static struct hda_input_mux alc883_lenovo_sky_capture_source = {
7001	.num_items = 3,
7002	.items = {
7003		{ "Mic", 0x0 },
7004		{ "Front Mic", 0x1 },
7005		{ "Line", 0x4 },
7006	},
7007};
7008
7009static struct hda_input_mux alc883_asus_eee1601_capture_source = {
7010	.num_items = 2,
7011	.items = {
7012		{ "Mic", 0x0 },
7013		{ "Line", 0x2 },
7014	},
7015};
7016
7017static struct hda_input_mux alc889A_mb31_capture_source = {
7018	.num_items = 2,
7019	.items = {
7020		{ "Mic", 0x0 },
7021		/* Front Mic (0x01) unused */
7022		{ "Line", 0x2 },
7023		/* Line 2 (0x03) unused */
7024		/* CD (0x04) unused? */
7025	},
7026};
7027
7028/*
7029 * 2ch mode
7030 */
7031static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
7032	{ 2, NULL }
7033};
7034
7035/*
7036 * 2ch mode
7037 */
7038static struct hda_verb alc882_3ST_ch2_init[] = {
7039	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7040	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7041	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7042	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7043	{ } /* end */
7044};
7045
7046/*
7047 * 4ch mode
7048 */
7049static struct hda_verb alc882_3ST_ch4_init[] = {
7050	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7051	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7052	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7053	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7054	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7055	{ } /* end */
7056};
7057
7058/*
7059 * 6ch mode
7060 */
7061static struct hda_verb alc882_3ST_ch6_init[] = {
7062	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7063	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7064	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7065	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7066	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7067	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7068	{ } /* end */
7069};
7070
7071static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
7072	{ 2, alc882_3ST_ch2_init },
7073	{ 4, alc882_3ST_ch4_init },
7074	{ 6, alc882_3ST_ch6_init },
7075};
7076
7077#define alc883_3ST_6ch_modes	alc882_3ST_6ch_modes
7078
7079/*
7080 * 2ch mode
7081 */
7082static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
7083	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
7084	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7085	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7086	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7087	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7088	{ } /* end */
7089};
7090
7091/*
7092 * 4ch mode
7093 */
7094static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
7095	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7096	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7097	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7098	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7099	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7100	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7101	{ } /* end */
7102};
7103
7104/*
7105 * 6ch mode
7106 */
7107static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
7108	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7109	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7110	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7111	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7112	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7113	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7114	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7115	{ } /* end */
7116};
7117
7118static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
7119	{ 2, alc883_3ST_ch2_clevo_init },
7120	{ 4, alc883_3ST_ch4_clevo_init },
7121	{ 6, alc883_3ST_ch6_clevo_init },
7122};
7123
7124
7125/*
7126 * 6ch mode
7127 */
7128static struct hda_verb alc882_sixstack_ch6_init[] = {
7129	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7130	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7131	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7132	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7133	{ } /* end */
7134};
7135
7136/*
7137 * 8ch mode
7138 */
7139static struct hda_verb alc882_sixstack_ch8_init[] = {
7140	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7141	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7142	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7143	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7144	{ } /* end */
7145};
7146
7147static struct hda_channel_mode alc882_sixstack_modes[2] = {
7148	{ 6, alc882_sixstack_ch6_init },
7149	{ 8, alc882_sixstack_ch8_init },
7150};
7151
7152
7153/* Macbook Air 2,1 */
7154
7155static struct hda_channel_mode alc885_mba21_ch_modes[1] = {
7156      { 2, NULL },
7157};
7158
7159/*
7160 * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
7161 */
7162
7163/*
7164 * 2ch mode
7165 */
7166static struct hda_verb alc885_mbp_ch2_init[] = {
7167	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7168	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7169	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7170	{ } /* end */
7171};
7172
7173/*
7174 * 4ch mode
7175 */
7176static struct hda_verb alc885_mbp_ch4_init[] = {
7177	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7178	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7179	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7180	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7181	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7182	{ } /* end */
7183};
7184
7185static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
7186	{ 2, alc885_mbp_ch2_init },
7187	{ 4, alc885_mbp_ch4_init },
7188};
7189
7190/*
7191 * 2ch
7192 * Speakers/Woofer/HP = Front
7193 * LineIn = Input
7194 */
7195static struct hda_verb alc885_mb5_ch2_init[] = {
7196	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7197	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7198	{ } /* end */
7199};
7200
7201/*
7202 * 6ch mode
7203 * Speakers/HP = Front
7204 * Woofer = LFE
7205 * LineIn = Surround
7206 */
7207static struct hda_verb alc885_mb5_ch6_init[] = {
7208	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7209	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7210	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7211	{ } /* end */
7212};
7213
7214static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
7215	{ 2, alc885_mb5_ch2_init },
7216	{ 6, alc885_mb5_ch6_init },
7217};
7218
7219#define alc885_macmini3_6ch_modes	alc885_mb5_6ch_modes
7220
7221/*
7222 * 2ch mode
7223 */
7224static struct hda_verb alc883_4ST_ch2_init[] = {
7225	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7226	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7227	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7228	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7229	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7230	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7231	{ } /* end */
7232};
7233
7234/*
7235 * 4ch mode
7236 */
7237static struct hda_verb alc883_4ST_ch4_init[] = {
7238	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7239	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7240	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7241	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7242	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7243	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7244	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7245	{ } /* end */
7246};
7247
7248/*
7249 * 6ch mode
7250 */
7251static struct hda_verb alc883_4ST_ch6_init[] = {
7252	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7253	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7254	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7255	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7256	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7257	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7258	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7259	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7260	{ } /* end */
7261};
7262
7263/*
7264 * 8ch mode
7265 */
7266static struct hda_verb alc883_4ST_ch8_init[] = {
7267	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7268	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7269	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7270	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7271	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7272	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7273	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7274	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7275	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7276	{ } /* end */
7277};
7278
7279static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
7280	{ 2, alc883_4ST_ch2_init },
7281	{ 4, alc883_4ST_ch4_init },
7282	{ 6, alc883_4ST_ch6_init },
7283	{ 8, alc883_4ST_ch8_init },
7284};
7285
7286
7287/*
7288 * 2ch mode
7289 */
7290static struct hda_verb alc883_3ST_ch2_intel_init[] = {
7291	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7292	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7293	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7294	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7295	{ } /* end */
7296};
7297
7298/*
7299 * 4ch mode
7300 */
7301static struct hda_verb alc883_3ST_ch4_intel_init[] = {
7302	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7303	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7304	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7305	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7306	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7307	{ } /* end */
7308};
7309
7310/*
7311 * 6ch mode
7312 */
7313static struct hda_verb alc883_3ST_ch6_intel_init[] = {
7314	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7315	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7316	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
7317	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7318	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7319	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7320	{ } /* end */
7321};
7322
7323static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7324	{ 2, alc883_3ST_ch2_intel_init },
7325	{ 4, alc883_3ST_ch4_intel_init },
7326	{ 6, alc883_3ST_ch6_intel_init },
7327};
7328
7329/*
7330 * 2ch mode
7331 */
7332static struct hda_verb alc889_ch2_intel_init[] = {
7333	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7334	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
7335	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
7336	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
7337	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7338	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7339	{ } /* end */
7340};
7341
7342/*
7343 * 6ch mode
7344 */
7345static struct hda_verb alc889_ch6_intel_init[] = {
7346	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7347	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7348	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7349	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7350	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7351	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7352	{ } /* end */
7353};
7354
7355/*
7356 * 8ch mode
7357 */
7358static struct hda_verb alc889_ch8_intel_init[] = {
7359	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7360	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7361	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7362	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7363	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
7364	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7365	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7366	{ } /* end */
7367};
7368
7369static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7370	{ 2, alc889_ch2_intel_init },
7371	{ 6, alc889_ch6_intel_init },
7372	{ 8, alc889_ch8_intel_init },
7373};
7374
7375/*
7376 * 6ch mode
7377 */
7378static struct hda_verb alc883_sixstack_ch6_init[] = {
7379	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7380	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7381	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7382	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7383	{ } /* end */
7384};
7385
7386/*
7387 * 8ch mode
7388 */
7389static struct hda_verb alc883_sixstack_ch8_init[] = {
7390	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7391	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7392	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7393	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7394	{ } /* end */
7395};
7396
7397static struct hda_channel_mode alc883_sixstack_modes[2] = {
7398	{ 6, alc883_sixstack_ch6_init },
7399	{ 8, alc883_sixstack_ch8_init },
7400};
7401
7402
7403/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7404 *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7405 */
7406static struct snd_kcontrol_new alc882_base_mixer[] = {
7407	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7408	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7409	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7410	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7411	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7412	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7413	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7414	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7415	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7416	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7417	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7418	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7419	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7420	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7421	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7422	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7423	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7424	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7425	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7426	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7427	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7428	{ } /* end */
7429};
7430
7431/* Macbook Air 2,1 same control for HP and internal Speaker */
7432
7433static struct snd_kcontrol_new alc885_mba21_mixer[] = {
7434      HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7435      HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
7436     { }
7437};
7438
7439
7440static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7441	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7442	HDA_BIND_MUTE   ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7443	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7444	HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7445	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7446	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7447	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7448	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7449	HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7450	HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
7451	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7452	{ } /* end */
7453};
7454
7455static struct snd_kcontrol_new alc885_mb5_mixer[] = {
7456	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7457	HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7458	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7459	HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7460	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7461	HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7462	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7463	HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7464	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7465	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7466	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7467	HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7468	HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7469	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7470	{ } /* end */
7471};
7472
7473static struct snd_kcontrol_new alc885_macmini3_mixer[] = {
7474	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7475	HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7476	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7477	HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7478	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7479	HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7480	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7481	HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7482	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7483	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
7484	HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7485	{ } /* end */
7486};
7487
7488static struct snd_kcontrol_new alc885_imac91_mixer[] = {
7489	HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7490	HDA_BIND_MUTE   ("Line-Out Playback Switch", 0x0c, 0x02, HDA_INPUT),
7491	HDA_CODEC_MUTE  ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT),
7492	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7493	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7494	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7495	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7496	HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7497	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7498	{ } /* end */
7499};
7500
7501
7502static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7503	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7504	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7505	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7506	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7507	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7508	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7509	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7510	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7511	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7512	{ } /* end */
7513};
7514
7515static struct snd_kcontrol_new alc882_targa_mixer[] = {
7516	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7517	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7518	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7519	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7520	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7521	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7522	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7523	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7524	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7525	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7526	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7527	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7528	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7529	{ } /* end */
7530};
7531
7532/* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7533 *                 Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7534 */
7535static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7536	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7537	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7538	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7539	HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7540	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7541	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7542	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7543	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7544	HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7545	HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7546	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7547	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7548	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7549	{ } /* end */
7550};
7551
7552static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7553	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7554	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7555	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7556	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7557	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7558	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7559	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7560	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7561	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7562	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7563	{ } /* end */
7564};
7565
7566static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7567	{
7568		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7569		.name = "Channel Mode",
7570		.info = alc_ch_mode_info,
7571		.get = alc_ch_mode_get,
7572		.put = alc_ch_mode_put,
7573	},
7574	{ } /* end */
7575};
7576
7577static struct hda_verb alc882_base_init_verbs[] = {
7578	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7579	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7580	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7581	/* Rear mixer */
7582	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7583	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7584	/* CLFE mixer */
7585	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7586	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7587	/* Side mixer */
7588	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7589	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7590
7591	/* Front Pin: output 0 (0x0c) */
7592	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7593	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7594	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7595	/* Rear Pin: output 1 (0x0d) */
7596	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7597	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7598	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7599	/* CLFE Pin: output 2 (0x0e) */
7600	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7601	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7602	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7603	/* Side Pin: output 3 (0x0f) */
7604	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7605	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7606	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7607	/* Mic (rear) pin: input vref at 80% */
7608	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7609	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7610	/* Front Mic pin: input vref at 80% */
7611	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7612	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7613	/* Line In pin: input */
7614	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7615	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7616	/* Line-2 In: Headphone output (output 0 - 0x0c) */
7617	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7618	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7619	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
7620	/* CD pin widget for input */
7621	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7622
7623	/* FIXME: use matrix-type input source selection */
7624	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7625	/* Input mixer2 */
7626	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7627	/* Input mixer3 */
7628	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7629	/* ADC2: mute amp left and right */
7630	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7631	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7632	/* ADC3: mute amp left and right */
7633	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7634	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7635
7636	{ }
7637};
7638
7639static struct hda_verb alc882_adc1_init_verbs[] = {
7640	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7641	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7642	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7643	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7644	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7645	/* ADC1: mute amp left and right */
7646	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7647	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7648	{ }
7649};
7650
7651static struct hda_verb alc882_eapd_verbs[] = {
7652	/* change to EAPD mode */
7653	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7654	{0x20, AC_VERB_SET_PROC_COEF, 0x3060},
7655	{ }
7656};
7657
7658static struct hda_verb alc889_eapd_verbs[] = {
7659	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7660	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7661	{ }
7662};
7663
7664static struct hda_verb alc_hp15_unsol_verbs[] = {
7665	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7666	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7667	{}
7668};
7669
7670static struct hda_verb alc885_init_verbs[] = {
7671	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7672	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7673	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7674	/* Rear mixer */
7675	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7676	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7677	/* CLFE mixer */
7678	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7679	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7680	/* Side mixer */
7681	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7682	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7683
7684	/* Front HP Pin: output 0 (0x0c) */
7685	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7686	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7687	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7688	/* Front Pin: output 0 (0x0c) */
7689	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7690	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7691	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7692	/* Rear Pin: output 1 (0x0d) */
7693	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7694	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7695	{0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7696	/* CLFE Pin: output 2 (0x0e) */
7697	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7698	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7699	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7700	/* Side Pin: output 3 (0x0f) */
7701	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7702	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7703	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7704	/* Mic (rear) pin: input vref at 80% */
7705	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7706	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7707	/* Front Mic pin: input vref at 80% */
7708	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7709	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7710	/* Line In pin: input */
7711	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7712	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7713
7714	/* Mixer elements: 0x18, , 0x1a, 0x1b */
7715	/* Input mixer1 */
7716	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7717	/* Input mixer2 */
7718	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7719	/* Input mixer3 */
7720	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7721	/* ADC2: mute amp left and right */
7722	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7723	/* ADC3: mute amp left and right */
7724	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7725
7726	{ }
7727};
7728
7729static struct hda_verb alc885_init_input_verbs[] = {
7730	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7731	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7732	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7733	{ }
7734};
7735
7736
7737/* Unmute Selector 24h and set the default input to front mic */
7738static struct hda_verb alc889_init_input_verbs[] = {
7739	{0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7740	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7741	{ }
7742};
7743
7744
7745#define alc883_init_verbs	alc882_base_init_verbs
7746
7747/* Mac Pro test */
7748static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7749	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7750	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7751	HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7752	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7753	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
7754	/* FIXME: this looks suspicious...
7755	HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
7756	HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
7757	*/
7758	{ } /* end */
7759};
7760
7761static struct hda_verb alc882_macpro_init_verbs[] = {
7762	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7763	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7764	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7765	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7766	/* Front Pin: output 0 (0x0c) */
7767	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7768	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7769	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7770	/* Front Mic pin: input vref at 80% */
7771	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7772	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7773	/* Speaker:  output */
7774	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7775	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7776	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7777	/* Headphone output (output 0 - 0x0c) */
7778	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7779	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7780	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7781
7782	/* FIXME: use matrix-type input source selection */
7783	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7784	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7785	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7786	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7787	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7788	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7789	/* Input mixer2 */
7790	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7791	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7792	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7793	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7794	/* Input mixer3 */
7795	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7796	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7797	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7798	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7799	/* ADC1: mute amp left and right */
7800	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7801	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7802	/* ADC2: mute amp left and right */
7803	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7804	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7805	/* ADC3: mute amp left and right */
7806	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7807	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7808
7809	{ }
7810};
7811
7812/* Macbook 5,1 */
7813static struct hda_verb alc885_mb5_init_verbs[] = {
7814	/* DACs */
7815	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7816	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7817	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7818	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7819	/* Front mixer */
7820	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7821	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7822	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7823	/* Surround mixer */
7824	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7825	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7826	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7827	/* LFE mixer */
7828	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7829	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7830	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7831	/* HP mixer */
7832	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7833	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7834	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7835	/* Front Pin (0x0c) */
7836	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7837	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7838	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7839	/* LFE Pin (0x0e) */
7840	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7841	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7842	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7843	/* HP Pin (0x0f) */
7844	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7845	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7846	{0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7847	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7848	/* Front Mic pin: input vref at 80% */
7849	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7850	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7851	/* Line In pin */
7852	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7853	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7854
7855	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7856	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7857	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7858	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7859	{ }
7860};
7861
7862/* Macmini 3,1 */
7863static struct hda_verb alc885_macmini3_init_verbs[] = {
7864	/* DACs */
7865	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7866	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7867	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7868	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7869	/* Front mixer */
7870	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7871	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7872	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7873	/* Surround mixer */
7874	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7875	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7876	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7877	/* LFE mixer */
7878	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7879	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7880	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7881	/* HP mixer */
7882	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7883	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7884	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7885	/* Front Pin (0x0c) */
7886	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7887	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7888	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7889	/* LFE Pin (0x0e) */
7890	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7891	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7892	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7893	/* HP Pin (0x0f) */
7894	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7895	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7896	{0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7897	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7898	/* Line In pin */
7899	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7900	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7901
7902	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7903	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7904	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7905	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7906	{ }
7907};
7908
7909
7910static struct hda_verb alc885_mba21_init_verbs[] = {
7911	/*Internal and HP Speaker Mixer*/
7912	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7913	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7914	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7915	/*Internal Speaker Pin (0x0c)*/
7916	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
7917	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7918	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7919	/* HP Pin: output 0 (0x0e) */
7920	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7921	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7922	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7923	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
7924	/* Line in (is hp when jack connected)*/
7925	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
7926	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7927
7928	{ }
7929 };
7930
7931
7932/* Macbook Pro rev3 */
7933static struct hda_verb alc885_mbp3_init_verbs[] = {
7934	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7935	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7936	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7937	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7938	/* Rear mixer */
7939	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7940	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7941	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7942	/* HP mixer */
7943	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7944	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7945	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7946	/* Front Pin: output 0 (0x0c) */
7947	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7948	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7949	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7950	/* HP Pin: output 0 (0x0e) */
7951	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7952	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7953	{0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
7954	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7955	/* Mic (rear) pin: input vref at 80% */
7956	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7957	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7958	/* Front Mic pin: input vref at 80% */
7959	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7960	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7961	/* Line In pin: use output 1 when in LineOut mode */
7962	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7963	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7964	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7965
7966	/* FIXME: use matrix-type input source selection */
7967	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7968	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7969	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7970	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7971	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7972	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7973	/* Input mixer2 */
7974	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7975	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7976	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7977	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7978	/* Input mixer3 */
7979	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7980	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7981	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7982	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7983	/* ADC1: mute amp left and right */
7984	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7985	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7986	/* ADC2: mute amp left and right */
7987	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7988	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7989	/* ADC3: mute amp left and right */
7990	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7991	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7992
7993	{ }
7994};
7995
7996/* iMac 9,1 */
7997static struct hda_verb alc885_imac91_init_verbs[] = {
7998	/* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
7999	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8000	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8001	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8002	/* Rear mixer */
8003	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8004	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8005	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8006	/* HP Pin: output 0 (0x0c) */
8007	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8008	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8009	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8010	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8011	/* Internal Speakers: output 0 (0x0d) */
8012	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8013	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8014	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8015	/* Mic (rear) pin: input vref at 80% */
8016	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8017	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8018	/* Front Mic pin: input vref at 80% */
8019	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8020	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8021	/* Line In pin: use output 1 when in LineOut mode */
8022	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
8023	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8024	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8025
8026	/* FIXME: use matrix-type input source selection */
8027	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8028	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
8029	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8030	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8031	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8032	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8033	/* Input mixer2 */
8034	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8035	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8036	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8037	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8038	/* Input mixer3 */
8039	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8040	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8041	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8042	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8043	/* ADC1: mute amp left and right */
8044	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8045	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8046	/* ADC2: mute amp left and right */
8047	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8048	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8049	/* ADC3: mute amp left and right */
8050	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8051	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8052
8053	{ }
8054};
8055
8056/* iMac 24 mixer. */
8057static struct snd_kcontrol_new alc885_imac24_mixer[] = {
8058	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8059	HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
8060	{ } /* end */
8061};
8062
8063/* iMac 24 init verbs. */
8064static struct hda_verb alc885_imac24_init_verbs[] = {
8065	/* Internal speakers: output 0 (0x0c) */
8066	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8067	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8068	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8069	/* Internal speakers: output 0 (0x0c) */
8070	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8071	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8072	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8073	/* Headphone: output 0 (0x0c) */
8074	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8075	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8076	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8077	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8078	/* Front Mic: input vref at 80% */
8079	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8080	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8081	{ }
8082};
8083
8084/* Toggle speaker-output according to the hp-jack state */
8085static void alc885_imac24_setup(struct hda_codec *codec)
8086{
8087	struct alc_spec *spec = codec->spec;
8088
8089	spec->autocfg.hp_pins[0] = 0x14;
8090	spec->autocfg.speaker_pins[0] = 0x18;
8091	spec->autocfg.speaker_pins[1] = 0x1a;
8092}
8093
8094#define alc885_mb5_setup	alc885_imac24_setup
8095#define alc885_macmini3_setup	alc885_imac24_setup
8096
8097/* Macbook Air 2,1 */
8098static void alc885_mba21_setup(struct hda_codec *codec)
8099{
8100       struct alc_spec *spec = codec->spec;
8101
8102       spec->autocfg.hp_pins[0] = 0x14;
8103       spec->autocfg.speaker_pins[0] = 0x18;
8104}
8105
8106
8107
8108static void alc885_mbp3_setup(struct hda_codec *codec)
8109{
8110	struct alc_spec *spec = codec->spec;
8111
8112	spec->autocfg.hp_pins[0] = 0x15;
8113	spec->autocfg.speaker_pins[0] = 0x14;
8114}
8115
8116static void alc885_imac91_setup(struct hda_codec *codec)
8117{
8118	struct alc_spec *spec = codec->spec;
8119
8120	spec->autocfg.hp_pins[0] = 0x14;
8121	spec->autocfg.speaker_pins[0] = 0x15;
8122	spec->autocfg.speaker_pins[1] = 0x1a;
8123}
8124
8125static struct hda_verb alc882_targa_verbs[] = {
8126	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8127	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8128
8129	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8130	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8131
8132	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8133	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8134	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8135
8136	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8137	{ } /* end */
8138};
8139
8140/* toggle speaker-output according to the hp-jack state */
8141static void alc882_targa_automute(struct hda_codec *codec)
8142{
8143	struct alc_spec *spec = codec->spec;
8144	alc_automute_amp(codec);
8145	snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
8146				  spec->jack_present ? 1 : 3);
8147}
8148
8149static void alc882_targa_setup(struct hda_codec *codec)
8150{
8151	struct alc_spec *spec = codec->spec;
8152
8153	spec->autocfg.hp_pins[0] = 0x14;
8154	spec->autocfg.speaker_pins[0] = 0x1b;
8155}
8156
8157static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
8158{
8159	if ((res >> 26) == ALC880_HP_EVENT)
8160		alc882_targa_automute(codec);
8161}
8162
8163static struct hda_verb alc882_asus_a7j_verbs[] = {
8164	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8165	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8166
8167	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8168	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8169	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8170
8171	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8172	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8173	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8174
8175	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8176	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8177	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8178	{ } /* end */
8179};
8180
8181static struct hda_verb alc882_asus_a7m_verbs[] = {
8182	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8183	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8184
8185	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8186	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8187	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8188
8189	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8190	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8191	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8192
8193	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8194	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8195	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8196 	{ } /* end */
8197};
8198
8199static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
8200{
8201	unsigned int gpiostate, gpiomask, gpiodir;
8202
8203	gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
8204				       AC_VERB_GET_GPIO_DATA, 0);
8205
8206	if (!muted)
8207		gpiostate |= (1 << pin);
8208	else
8209		gpiostate &= ~(1 << pin);
8210
8211	gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
8212				      AC_VERB_GET_GPIO_MASK, 0);
8213	gpiomask |= (1 << pin);
8214
8215	gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
8216				     AC_VERB_GET_GPIO_DIRECTION, 0);
8217	gpiodir |= (1 << pin);
8218
8219
8220	snd_hda_codec_write(codec, codec->afg, 0,
8221			    AC_VERB_SET_GPIO_MASK, gpiomask);
8222	snd_hda_codec_write(codec, codec->afg, 0,
8223			    AC_VERB_SET_GPIO_DIRECTION, gpiodir);
8224
8225	msleep(1);
8226
8227	snd_hda_codec_write(codec, codec->afg, 0,
8228			    AC_VERB_SET_GPIO_DATA, gpiostate);
8229}
8230
8231/* set up GPIO at initialization */
8232static void alc885_macpro_init_hook(struct hda_codec *codec)
8233{
8234	alc882_gpio_mute(codec, 0, 0);
8235	alc882_gpio_mute(codec, 1, 0);
8236}
8237
8238/* set up GPIO and update auto-muting at initialization */
8239static void alc885_imac24_init_hook(struct hda_codec *codec)
8240{
8241	alc885_macpro_init_hook(codec);
8242	alc_automute_amp(codec);
8243}
8244
8245/*
8246 * generic initialization of ADC, input mixers and output mixers
8247 */
8248static struct hda_verb alc883_auto_init_verbs[] = {
8249	/*
8250	 * Unmute ADC0-2 and set the default input to mic-in
8251	 */
8252	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8253	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8254	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8255	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8256
8257	/*
8258	 * Set up output mixers (0x0c - 0x0f)
8259	 */
8260	/* set vol=0 to output mixers */
8261	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8262	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8263	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8264	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8265	/* set up input amps for analog loopback */
8266	/* Amp Indices: DAC = 0, mixer = 1 */
8267	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8268	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8269	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8270	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8271	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8272	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8273	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8274	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8275	{0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8276	{0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8277
8278	/* FIXME: use matrix-type input source selection */
8279	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8280	/* Input mixer2 */
8281	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8282	/* Input mixer3 */
8283	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8284	{ }
8285};
8286
8287/* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
8288static struct hda_verb alc889A_mb31_ch2_init[] = {
8289	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8290	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8291	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8292	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8293	{ } /* end */
8294};
8295
8296/* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
8297static struct hda_verb alc889A_mb31_ch4_init[] = {
8298	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8299	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8300	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8301	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8302	{ } /* end */
8303};
8304
8305/* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
8306static struct hda_verb alc889A_mb31_ch5_init[] = {
8307	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as rear */
8308	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8309	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8310	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8311	{ } /* end */
8312};
8313
8314/* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
8315static struct hda_verb alc889A_mb31_ch6_init[] = {
8316	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as front */
8317	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Subwoofer off */
8318	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8319	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8320	{ } /* end */
8321};
8322
8323static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
8324	{ 2, alc889A_mb31_ch2_init },
8325	{ 4, alc889A_mb31_ch4_init },
8326	{ 5, alc889A_mb31_ch5_init },
8327	{ 6, alc889A_mb31_ch6_init },
8328};
8329
8330static struct hda_verb alc883_medion_eapd_verbs[] = {
8331        /* eanable EAPD on medion laptop */
8332	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8333	{0x20, AC_VERB_SET_PROC_COEF, 0x3070},
8334	{ }
8335};
8336
8337#define alc883_base_mixer	alc882_base_mixer
8338
8339static struct snd_kcontrol_new alc883_mitac_mixer[] = {
8340	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8341	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8342	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8343	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8344	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8345	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8346	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8347	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8348	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8349	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8350	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8351	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8352	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8353	{ } /* end */
8354};
8355
8356static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
8357	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8358	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8359	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8360	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8361	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8362	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8363	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8364	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8365	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8366	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8367	{ } /* end */
8368};
8369
8370static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8371	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8372	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8373	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8374	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8375	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8376	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8377	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8378	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8379	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8380	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8381	{ } /* end */
8382};
8383
8384static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8385	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8386	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8387	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8388	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8389	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8390	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8391	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8392	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8393	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8394	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8395	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8396	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8397	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8398	{ } /* end */
8399};
8400
8401static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8402	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8403	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8404	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8405	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8406	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8407	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8408	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8409	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8410	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8411	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8412	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8413	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8414	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8415	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8416	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8417	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8418	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8419	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8420	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8421	{ } /* end */
8422};
8423
8424static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8425	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8426	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8427	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8428	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8429	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8430			      HDA_OUTPUT),
8431	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8432	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8433	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8434	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8435	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8436	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8437	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8438	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8439	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8440	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8441	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8442	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8443	HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8444	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8445	{ } /* end */
8446};
8447
8448static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8449	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8450	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8451	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8452	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8453	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8454			      HDA_OUTPUT),
8455	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8456	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8457	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8458	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8459	HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
8460	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8461	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8462	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8463	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
8464	HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
8465	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
8466	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8467	HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8468	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8469	{ } /* end */
8470};
8471
8472static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
8473	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8474	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8475	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8476	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8477	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8478	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8479	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8480	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8481	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8482	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8483	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8484	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8485	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8486	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8487	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8488	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8489	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8490	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8491	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8492	{ } /* end */
8493};
8494
8495static struct snd_kcontrol_new alc883_targa_mixer[] = {
8496	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8497	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8498	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8499	HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8500	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8501	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8502	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8503	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8504	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8505	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8506	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8507	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8508	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8509	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8510	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8511	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8512	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8513	{ } /* end */
8514};
8515
8516static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
8517	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8518	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8519	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8520	HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8521	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8522	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8523	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8524	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8525	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8526	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8527	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8528	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8529	{ } /* end */
8530};
8531
8532static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
8533	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8534	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8535	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8536	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8537	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8538	{ } /* end */
8539};
8540
8541static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
8542	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8543	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8544	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8545	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8546	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8547	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8548	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8549	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8550	{ } /* end */
8551};
8552
8553static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
8554	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8555	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
8556	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8557	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8558	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8559	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8560	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8561	HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8562	HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8563	{ } /* end */
8564};
8565
8566static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8567	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8568	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8569	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8570	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8571	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8572	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8573	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8574	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8575	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8576	{ } /* end */
8577};
8578
8579static struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = {
8580	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8581	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8582	HDA_CODEC_MUTE("Speaker Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8583	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT),
8584	HDA_CODEC_VOLUME("Line Playback Volume", 0x08, 0x0, HDA_INPUT),
8585	HDA_CODEC_MUTE("Line Playback Switch", 0x08, 0x0, HDA_INPUT),
8586	{ } /* end */
8587};
8588
8589static struct hda_verb alc883_medion_wim2160_verbs[] = {
8590	/* Unmute front mixer */
8591	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8592	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8593
8594	/* Set speaker pin to front mixer */
8595	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8596
8597	/* Init headphone pin */
8598	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8599	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8600	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8601	{0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8602
8603	{ } /* end */
8604};
8605
8606/* toggle speaker-output according to the hp-jack state */
8607static void alc883_medion_wim2160_setup(struct hda_codec *codec)
8608{
8609	struct alc_spec *spec = codec->spec;
8610
8611	spec->autocfg.hp_pins[0] = 0x1a;
8612	spec->autocfg.speaker_pins[0] = 0x15;
8613}
8614
8615static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
8616	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8617	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8618	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8619	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8620	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8621	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8622	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8623	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8624	{ } /* end */
8625};
8626
8627static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8628	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8629	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8630	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8631	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8632	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8633	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8634	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8635	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8636	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8637	{ } /* end */
8638};
8639
8640static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8641	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8642	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8643	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8644	HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8645	HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8646						0x0d, 1, 0x0, HDA_OUTPUT),
8647	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8648	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8649	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8650	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8651	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8652	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8653	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8654	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8655	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8656	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8657	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8658	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8659	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8660	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8661	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8662	{ } /* end */
8663};
8664
8665static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8666	/* Output mixers */
8667	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8668	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8669	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8670	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8671	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8672		HDA_OUTPUT),
8673	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8674	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8675	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8676	/* Output switches */
8677	HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8678	HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8679	HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8680	/* Boost mixers */
8681	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8682	HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8683	/* Input mixers */
8684	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8685	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8686	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8687	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8688	{ } /* end */
8689};
8690
8691static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8692	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8693	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8694	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8695	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8696	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8697	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8698	{ } /* end */
8699};
8700
8701static struct hda_bind_ctls alc883_bind_cap_vol = {
8702	.ops = &snd_hda_bind_vol,
8703	.values = {
8704		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8705		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8706		0
8707	},
8708};
8709
8710static struct hda_bind_ctls alc883_bind_cap_switch = {
8711	.ops = &snd_hda_bind_sw,
8712	.values = {
8713		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8714		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8715		0
8716	},
8717};
8718
8719static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8720	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8721	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8722	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8723	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8724	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8725	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8726	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8727	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8728	{ } /* end */
8729};
8730
8731static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8732	HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8733	HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8734	{
8735		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8736		/* .name = "Capture Source", */
8737		.name = "Input Source",
8738		.count = 1,
8739		.info = alc_mux_enum_info,
8740		.get = alc_mux_enum_get,
8741		.put = alc_mux_enum_put,
8742	},
8743	{ } /* end */
8744};
8745
8746static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8747	{
8748		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8749		.name = "Channel Mode",
8750		.info = alc_ch_mode_info,
8751		.get = alc_ch_mode_get,
8752		.put = alc_ch_mode_put,
8753	},
8754	{ } /* end */
8755};
8756
8757/* toggle speaker-output according to the hp-jack state */
8758static void alc883_mitac_setup(struct hda_codec *codec)
8759{
8760	struct alc_spec *spec = codec->spec;
8761
8762	spec->autocfg.hp_pins[0] = 0x15;
8763	spec->autocfg.speaker_pins[0] = 0x14;
8764	spec->autocfg.speaker_pins[1] = 0x17;
8765}
8766
8767/* auto-toggle front mic */
8768/*
8769static void alc883_mitac_mic_automute(struct hda_codec *codec)
8770{
8771	unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0;
8772
8773	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8774}
8775*/
8776
8777static struct hda_verb alc883_mitac_verbs[] = {
8778	/* HP */
8779	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8780	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8781	/* Subwoofer */
8782	{0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8783	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8784
8785	/* enable unsolicited event */
8786	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8787	/* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8788
8789	{ } /* end */
8790};
8791
8792static struct hda_verb alc883_clevo_m540r_verbs[] = {
8793	/* HP */
8794	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8795	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8796	/* Int speaker */
8797	/*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8798
8799	/* enable unsolicited event */
8800	/*
8801	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8802	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8803	*/
8804
8805	{ } /* end */
8806};
8807
8808static struct hda_verb alc883_clevo_m720_verbs[] = {
8809	/* HP */
8810	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8811	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8812	/* Int speaker */
8813	{0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
8814	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8815
8816	/* enable unsolicited event */
8817	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8818	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8819
8820	{ } /* end */
8821};
8822
8823static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
8824	/* HP */
8825	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8826	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8827	/* Subwoofer */
8828	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8829	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8830
8831	/* enable unsolicited event */
8832	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8833
8834	{ } /* end */
8835};
8836
8837static struct hda_verb alc883_targa_verbs[] = {
8838	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8839	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8840
8841	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8842	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8843
8844/* Connect Line-Out side jack (SPDIF) to Side */
8845	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8846	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8847	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8848/* Connect Mic jack to CLFE */
8849	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8850	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8851	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
8852/* Connect Line-in jack to Surround */
8853	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8854	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8855	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8856/* Connect HP out jack to Front */
8857	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8858	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8859	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8860
8861	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8862
8863	{ } /* end */
8864};
8865
8866static struct hda_verb alc883_lenovo_101e_verbs[] = {
8867	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8868	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
8869        {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
8870	{ } /* end */
8871};
8872
8873static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
8874        {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8875	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8876        {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8877        {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8878	{ } /* end */
8879};
8880
8881static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
8882	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8883	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8884	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8885	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
8886	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT    | AC_USRSP_EN},
8887	{ } /* end */
8888};
8889
8890static struct hda_verb alc883_haier_w66_verbs[] = {
8891	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8892	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8893
8894	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8895
8896	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8897	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8898	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8899	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8900	{ } /* end */
8901};
8902
8903static struct hda_verb alc888_lenovo_sky_verbs[] = {
8904	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8905	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8906	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8907	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8908	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8909	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8910	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8911	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8912	{ } /* end */
8913};
8914
8915static struct hda_verb alc888_6st_dell_verbs[] = {
8916	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8917	{ }
8918};
8919
8920static struct hda_verb alc883_vaiott_verbs[] = {
8921	/* HP */
8922	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8923	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8924
8925	/* enable unsolicited event */
8926	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8927
8928	{ } /* end */
8929};
8930
8931static void alc888_3st_hp_setup(struct hda_codec *codec)
8932{
8933	struct alc_spec *spec = codec->spec;
8934
8935	spec->autocfg.hp_pins[0] = 0x1b;
8936	spec->autocfg.speaker_pins[0] = 0x14;
8937	spec->autocfg.speaker_pins[1] = 0x16;
8938	spec->autocfg.speaker_pins[2] = 0x18;
8939}
8940
8941static struct hda_verb alc888_3st_hp_verbs[] = {
8942	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Front: output 0 (0x0c) */
8943	{0x16, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Rear : output 1 (0x0d) */
8944	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},	/* CLFE : output 2 (0x0e) */
8945	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8946	{ } /* end */
8947};
8948
8949/*
8950 * 2ch mode
8951 */
8952static struct hda_verb alc888_3st_hp_2ch_init[] = {
8953	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8954	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8955	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
8956	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8957	{ } /* end */
8958};
8959
8960/*
8961 * 4ch mode
8962 */
8963static struct hda_verb alc888_3st_hp_4ch_init[] = {
8964	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8965	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8966	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8967	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8968	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8969	{ } /* end */
8970};
8971
8972/*
8973 * 6ch mode
8974 */
8975static struct hda_verb alc888_3st_hp_6ch_init[] = {
8976	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8977	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8978	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
8979	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8980	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8981	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8982	{ } /* end */
8983};
8984
8985static struct hda_channel_mode alc888_3st_hp_modes[3] = {
8986	{ 2, alc888_3st_hp_2ch_init },
8987	{ 4, alc888_3st_hp_4ch_init },
8988	{ 6, alc888_3st_hp_6ch_init },
8989};
8990
8991/* toggle front-jack and RCA according to the hp-jack state */
8992static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
8993{
8994 	unsigned int present = snd_hda_jack_detect(codec, 0x1b);
8995
8996	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8997				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8998	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8999				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9000}
9001
9002/* toggle RCA according to the front-jack state */
9003static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
9004{
9005 	unsigned int present = snd_hda_jack_detect(codec, 0x14);
9006
9007	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9008				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9009}
9010
9011static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
9012					     unsigned int res)
9013{
9014	if ((res >> 26) == ALC880_HP_EVENT)
9015		alc888_lenovo_ms7195_front_automute(codec);
9016	if ((res >> 26) == ALC880_FRONT_EVENT)
9017		alc888_lenovo_ms7195_rca_automute(codec);
9018}
9019
9020static struct hda_verb alc883_medion_md2_verbs[] = {
9021	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9022	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9023
9024	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9025
9026	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9027	{ } /* end */
9028};
9029
9030/* toggle speaker-output according to the hp-jack state */
9031static void alc883_medion_md2_setup(struct hda_codec *codec)
9032{
9033	struct alc_spec *spec = codec->spec;
9034
9035	spec->autocfg.hp_pins[0] = 0x14;
9036	spec->autocfg.speaker_pins[0] = 0x15;
9037}
9038
9039/* toggle speaker-output according to the hp-jack state */
9040#define alc883_targa_init_hook		alc882_targa_init_hook
9041#define alc883_targa_unsol_event	alc882_targa_unsol_event
9042
9043static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
9044{
9045	unsigned int present;
9046
9047	present = snd_hda_jack_detect(codec, 0x18);
9048	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
9049				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9050}
9051
9052static void alc883_clevo_m720_setup(struct hda_codec *codec)
9053{
9054	struct alc_spec *spec = codec->spec;
9055
9056	spec->autocfg.hp_pins[0] = 0x15;
9057	spec->autocfg.speaker_pins[0] = 0x14;
9058}
9059
9060static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
9061{
9062	alc_automute_amp(codec);
9063	alc883_clevo_m720_mic_automute(codec);
9064}
9065
9066static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
9067					   unsigned int res)
9068{
9069	switch (res >> 26) {
9070	case ALC880_MIC_EVENT:
9071		alc883_clevo_m720_mic_automute(codec);
9072		break;
9073	default:
9074		alc_automute_amp_unsol_event(codec, res);
9075		break;
9076	}
9077}
9078
9079/* toggle speaker-output according to the hp-jack state */
9080static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
9081{
9082	struct alc_spec *spec = codec->spec;
9083
9084	spec->autocfg.hp_pins[0] = 0x14;
9085	spec->autocfg.speaker_pins[0] = 0x15;
9086}
9087
9088static void alc883_haier_w66_setup(struct hda_codec *codec)
9089{
9090	struct alc_spec *spec = codec->spec;
9091
9092	spec->autocfg.hp_pins[0] = 0x1b;
9093	spec->autocfg.speaker_pins[0] = 0x14;
9094}
9095
9096static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
9097{
9098	int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
9099
9100	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9101				 HDA_AMP_MUTE, bits);
9102}
9103
9104static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
9105{
9106	int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
9107
9108	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9109				 HDA_AMP_MUTE, bits);
9110	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9111				 HDA_AMP_MUTE, bits);
9112}
9113
9114static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
9115					   unsigned int res)
9116{
9117	if ((res >> 26) == ALC880_HP_EVENT)
9118		alc883_lenovo_101e_all_automute(codec);
9119	if ((res >> 26) == ALC880_FRONT_EVENT)
9120		alc883_lenovo_101e_ispeaker_automute(codec);
9121}
9122
9123/* toggle speaker-output according to the hp-jack state */
9124static void alc883_acer_aspire_setup(struct hda_codec *codec)
9125{
9126	struct alc_spec *spec = codec->spec;
9127
9128	spec->autocfg.hp_pins[0] = 0x14;
9129	spec->autocfg.speaker_pins[0] = 0x15;
9130	spec->autocfg.speaker_pins[1] = 0x16;
9131}
9132
9133static struct hda_verb alc883_acer_eapd_verbs[] = {
9134	/* HP Pin: output 0 (0x0c) */
9135	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9136	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9137	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
9138	/* Front Pin: output 0 (0x0c) */
9139	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9140	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9141	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9142	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
9143        /* eanable EAPD on medion laptop */
9144	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
9145	{0x20, AC_VERB_SET_PROC_COEF, 0x3050},
9146	/* enable unsolicited event */
9147	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9148	{ }
9149};
9150
9151static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
9152	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9153	{0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
9154	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9155	{ } /* end */
9156};
9157
9158static void alc888_6st_dell_setup(struct hda_codec *codec)
9159{
9160	struct alc_spec *spec = codec->spec;
9161
9162	spec->autocfg.hp_pins[0] = 0x1b;
9163	spec->autocfg.speaker_pins[0] = 0x14;
9164	spec->autocfg.speaker_pins[1] = 0x15;
9165	spec->autocfg.speaker_pins[2] = 0x16;
9166	spec->autocfg.speaker_pins[3] = 0x17;
9167}
9168
9169static void alc888_lenovo_sky_setup(struct hda_codec *codec)
9170{
9171	struct alc_spec *spec = codec->spec;
9172
9173	spec->autocfg.hp_pins[0] = 0x1b;
9174	spec->autocfg.speaker_pins[0] = 0x14;
9175	spec->autocfg.speaker_pins[1] = 0x15;
9176	spec->autocfg.speaker_pins[2] = 0x16;
9177	spec->autocfg.speaker_pins[3] = 0x17;
9178	spec->autocfg.speaker_pins[4] = 0x1a;
9179}
9180
9181static void alc883_vaiott_setup(struct hda_codec *codec)
9182{
9183	struct alc_spec *spec = codec->spec;
9184
9185	spec->autocfg.hp_pins[0] = 0x15;
9186	spec->autocfg.speaker_pins[0] = 0x14;
9187	spec->autocfg.speaker_pins[1] = 0x17;
9188}
9189
9190static struct hda_verb alc888_asus_m90v_verbs[] = {
9191	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9192	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9193	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9194	/* enable unsolicited event */
9195	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9196	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9197	{ } /* end */
9198};
9199
9200static void alc883_mode2_setup(struct hda_codec *codec)
9201{
9202	struct alc_spec *spec = codec->spec;
9203
9204	spec->autocfg.hp_pins[0] = 0x1b;
9205	spec->autocfg.speaker_pins[0] = 0x14;
9206	spec->autocfg.speaker_pins[1] = 0x15;
9207	spec->autocfg.speaker_pins[2] = 0x16;
9208	spec->ext_mic.pin = 0x18;
9209	spec->int_mic.pin = 0x19;
9210	spec->ext_mic.mux_idx = 0;
9211	spec->int_mic.mux_idx = 1;
9212	spec->auto_mic = 1;
9213}
9214
9215static struct hda_verb alc888_asus_eee1601_verbs[] = {
9216	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9217	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9218	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9219	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9220	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
9221	{0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
9222	{0x20, AC_VERB_SET_PROC_COEF,  0x0838},
9223	/* enable unsolicited event */
9224	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9225	{ } /* end */
9226};
9227
9228static void alc883_eee1601_inithook(struct hda_codec *codec)
9229{
9230	struct alc_spec *spec = codec->spec;
9231
9232	spec->autocfg.hp_pins[0] = 0x14;
9233	spec->autocfg.speaker_pins[0] = 0x1b;
9234	alc_automute_pin(codec);
9235}
9236
9237static struct hda_verb alc889A_mb31_verbs[] = {
9238	/* Init rear pin (used as headphone output) */
9239	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},    /* Apple Headphones */
9240	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},           /* Connect to front */
9241	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9242	/* Init line pin (used as output in 4ch and 6ch mode) */
9243	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},           /* Connect to CLFE */
9244	/* Init line 2 pin (used as headphone out by default) */
9245	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},  /* Use as input */
9246	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
9247	{ } /* end */
9248};
9249
9250/* Mute speakers according to the headphone jack state */
9251static void alc889A_mb31_automute(struct hda_codec *codec)
9252{
9253	unsigned int present;
9254
9255	/* Mute only in 2ch or 4ch mode */
9256	if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
9257	    == 0x00) {
9258		present = snd_hda_jack_detect(codec, 0x15);
9259		snd_hda_codec_amp_stereo(codec, 0x14,  HDA_OUTPUT, 0,
9260			HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9261		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
9262			HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9263	}
9264}
9265
9266static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
9267{
9268	if ((res >> 26) == ALC880_HP_EVENT)
9269		alc889A_mb31_automute(codec);
9270}
9271
9272
9273#ifdef CONFIG_SND_HDA_POWER_SAVE
9274#define alc882_loopbacks	alc880_loopbacks
9275#endif
9276
9277/* pcm configuration: identical with ALC880 */
9278#define alc882_pcm_analog_playback	alc880_pcm_analog_playback
9279#define alc882_pcm_analog_capture	alc880_pcm_analog_capture
9280#define alc882_pcm_digital_playback	alc880_pcm_digital_playback
9281#define alc882_pcm_digital_capture	alc880_pcm_digital_capture
9282
9283static hda_nid_t alc883_slave_dig_outs[] = {
9284	ALC1200_DIGOUT_NID, 0,
9285};
9286
9287static hda_nid_t alc1200_slave_dig_outs[] = {
9288	ALC883_DIGOUT_NID, 0,
9289};
9290
9291/*
9292 * configuration and preset
9293 */
9294static const char *alc882_models[ALC882_MODEL_LAST] = {
9295	[ALC882_3ST_DIG]	= "3stack-dig",
9296	[ALC882_6ST_DIG]	= "6stack-dig",
9297	[ALC882_ARIMA]		= "arima",
9298	[ALC882_W2JC]		= "w2jc",
9299	[ALC882_TARGA]		= "targa",
9300	[ALC882_ASUS_A7J]	= "asus-a7j",
9301	[ALC882_ASUS_A7M]	= "asus-a7m",
9302	[ALC885_MACPRO]		= "macpro",
9303	[ALC885_MB5]		= "mb5",
9304	[ALC885_MACMINI3]	= "macmini3",
9305	[ALC885_MBA21]		= "mba21",
9306	[ALC885_MBP3]		= "mbp3",
9307	[ALC885_IMAC24]		= "imac24",
9308	[ALC885_IMAC91]		= "imac91",
9309	[ALC883_3ST_2ch_DIG]	= "3stack-2ch-dig",
9310	[ALC883_3ST_6ch_DIG]	= "3stack-6ch-dig",
9311	[ALC883_3ST_6ch]	= "3stack-6ch",
9312	[ALC883_6ST_DIG]	= "alc883-6stack-dig",
9313	[ALC883_TARGA_DIG]	= "targa-dig",
9314	[ALC883_TARGA_2ch_DIG]	= "targa-2ch-dig",
9315	[ALC883_TARGA_8ch_DIG]	= "targa-8ch-dig",
9316	[ALC883_ACER]		= "acer",
9317	[ALC883_ACER_ASPIRE]	= "acer-aspire",
9318	[ALC888_ACER_ASPIRE_4930G]	= "acer-aspire-4930g",
9319	[ALC888_ACER_ASPIRE_6530G]	= "acer-aspire-6530g",
9320	[ALC888_ACER_ASPIRE_8930G]	= "acer-aspire-8930g",
9321	[ALC888_ACER_ASPIRE_7730G]	= "acer-aspire-7730g",
9322	[ALC883_MEDION]		= "medion",
9323	[ALC883_MEDION_MD2]	= "medion-md2",
9324	[ALC883_MEDION_WIM2160]	= "medion-wim2160",
9325	[ALC883_LAPTOP_EAPD]	= "laptop-eapd",
9326	[ALC883_LENOVO_101E_2ch] = "lenovo-101e",
9327	[ALC883_LENOVO_NB0763]	= "lenovo-nb0763",
9328	[ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
9329	[ALC888_LENOVO_SKY] = "lenovo-sky",
9330	[ALC883_HAIER_W66] 	= "haier-w66",
9331	[ALC888_3ST_HP]		= "3stack-hp",
9332	[ALC888_6ST_DELL]	= "6stack-dell",
9333	[ALC883_MITAC]		= "mitac",
9334	[ALC883_CLEVO_M540R]	= "clevo-m540r",
9335	[ALC883_CLEVO_M720]	= "clevo-m720",
9336	[ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
9337	[ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
9338	[ALC883_3ST_6ch_INTEL]	= "3stack-6ch-intel",
9339	[ALC889A_INTEL]		= "intel-alc889a",
9340	[ALC889_INTEL]		= "intel-x58",
9341	[ALC1200_ASUS_P5Q]	= "asus-p5q",
9342	[ALC889A_MB31]		= "mb31",
9343	[ALC883_SONY_VAIO_TT]	= "sony-vaio-tt",
9344	[ALC882_AUTO]		= "auto",
9345};
9346
9347static struct snd_pci_quirk alc882_cfg_tbl[] = {
9348	SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
9349
9350	SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
9351	SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
9352	SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
9353	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
9354	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
9355	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
9356	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
9357		ALC888_ACER_ASPIRE_4930G),
9358	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
9359		ALC888_ACER_ASPIRE_4930G),
9360	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
9361		ALC888_ACER_ASPIRE_8930G),
9362	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
9363		ALC888_ACER_ASPIRE_8930G),
9364	SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
9365	SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
9366	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
9367		ALC888_ACER_ASPIRE_6530G),
9368	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
9369		ALC888_ACER_ASPIRE_6530G),
9370	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
9371		ALC888_ACER_ASPIRE_7730G),
9372	/* default Acer -- disabled as it causes more problems.
9373	 *    model=auto should work fine now
9374	 */
9375	/* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
9376
9377	SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
9378
9379	SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
9380	SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
9381	SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
9382	SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
9383	SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
9384	SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
9385
9386	SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
9387	SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
9388	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
9389	SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
9390	SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
9391	SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
9392	SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
9393	SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
9394	SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
9395	SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
9396	SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
9397
9398	SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
9399	SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
9400	SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
9401	SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
9402	SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
9403	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
9404	SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
9405	SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
9406	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
9407
9408	SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
9409	SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
9410	SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
9411	SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */
9412	SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
9413	SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
9414	SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
9415	SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
9416	SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
9417	SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
9418	SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
9419	SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
9420	SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
9421	SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
9422	SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
9423	SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
9424	SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
9425	SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
9426	SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG),
9427	SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
9428	SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
9429	SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
9430	SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
9431	SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
9432	SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
9433	SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
9434	SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
9435	SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
9436	SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG),
9437	SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
9438	SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
9439
9440	SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
9441	SND_PCI_QUIRK(0x1558, 0x0571, "Clevo laptop M570U", ALC883_3ST_6ch_DIG),
9442	SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
9443	SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
9444	SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
9445	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
9446	SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
9447	/* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
9448	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
9449	SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
9450		      ALC883_FUJITSU_PI2515),
9451	SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
9452		ALC888_FUJITSU_XA3530),
9453	SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
9454	SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9455	SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9456	SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9457	SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
9458	SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
9459	SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
9460	SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
9461	SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
9462
9463	SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
9464	SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
9465	SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
9466	SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
9467	SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
9468	SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
9469	SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG),
9470
9471	{}
9472};
9473
9474/* codec SSID table for Intel Mac */
9475static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9476	SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9477	SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9478	SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
9479	SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
9480	SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
9481	SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
9482	SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
9483	SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
9484	SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
9485	SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
9486	SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
9487	SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
9488	/* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
9489	 * so apparently no perfect solution yet
9490	 */
9491	SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
9492	SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
9493	SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
9494	{} /* terminator */
9495};
9496
9497static struct alc_config_preset alc882_presets[] = {
9498	[ALC882_3ST_DIG] = {
9499		.mixers = { alc882_base_mixer },
9500		.init_verbs = { alc882_base_init_verbs,
9501				alc882_adc1_init_verbs },
9502		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9503		.dac_nids = alc882_dac_nids,
9504		.dig_out_nid = ALC882_DIGOUT_NID,
9505		.dig_in_nid = ALC882_DIGIN_NID,
9506		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9507		.channel_mode = alc882_ch_modes,
9508		.need_dac_fix = 1,
9509		.input_mux = &alc882_capture_source,
9510	},
9511	[ALC882_6ST_DIG] = {
9512		.mixers = { alc882_base_mixer, alc882_chmode_mixer },
9513		.init_verbs = { alc882_base_init_verbs,
9514				alc882_adc1_init_verbs },
9515		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9516		.dac_nids = alc882_dac_nids,
9517		.dig_out_nid = ALC882_DIGOUT_NID,
9518		.dig_in_nid = ALC882_DIGIN_NID,
9519		.num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9520		.channel_mode = alc882_sixstack_modes,
9521		.input_mux = &alc882_capture_source,
9522	},
9523	[ALC882_ARIMA] = {
9524		.mixers = { alc882_base_mixer, alc882_chmode_mixer },
9525		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9526				alc882_eapd_verbs },
9527		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9528		.dac_nids = alc882_dac_nids,
9529		.num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9530		.channel_mode = alc882_sixstack_modes,
9531		.input_mux = &alc882_capture_source,
9532	},
9533	[ALC882_W2JC] = {
9534		.mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
9535		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9536				alc882_eapd_verbs, alc880_gpio1_init_verbs },
9537		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9538		.dac_nids = alc882_dac_nids,
9539		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9540		.channel_mode = alc880_threestack_modes,
9541		.need_dac_fix = 1,
9542		.input_mux = &alc882_capture_source,
9543		.dig_out_nid = ALC882_DIGOUT_NID,
9544	},
9545	   [ALC885_MBA21] = {
9546			.mixers = { alc885_mba21_mixer },
9547			.init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
9548			.num_dacs = 2,
9549			.dac_nids = alc882_dac_nids,
9550			.channel_mode = alc885_mba21_ch_modes,
9551			.num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9552			.input_mux = &alc882_capture_source,
9553			.unsol_event = alc_automute_amp_unsol_event,
9554			.setup = alc885_mba21_setup,
9555			.init_hook = alc_automute_amp,
9556       },
9557	[ALC885_MBP3] = {
9558		.mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
9559		.init_verbs = { alc885_mbp3_init_verbs,
9560				alc880_gpio1_init_verbs },
9561		.num_dacs = 2,
9562		.dac_nids = alc882_dac_nids,
9563		.hp_nid = 0x04,
9564		.channel_mode = alc885_mbp_4ch_modes,
9565		.num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9566		.input_mux = &alc882_capture_source,
9567		.dig_out_nid = ALC882_DIGOUT_NID,
9568		.dig_in_nid = ALC882_DIGIN_NID,
9569		.unsol_event = alc_automute_amp_unsol_event,
9570		.setup = alc885_mbp3_setup,
9571		.init_hook = alc_automute_amp,
9572	},
9573	[ALC885_MB5] = {
9574		.mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
9575		.init_verbs = { alc885_mb5_init_verbs,
9576				alc880_gpio1_init_verbs },
9577		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9578		.dac_nids = alc882_dac_nids,
9579		.channel_mode = alc885_mb5_6ch_modes,
9580		.num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
9581		.input_mux = &mb5_capture_source,
9582		.dig_out_nid = ALC882_DIGOUT_NID,
9583		.dig_in_nid = ALC882_DIGIN_NID,
9584		.unsol_event = alc_automute_amp_unsol_event,
9585		.setup = alc885_mb5_setup,
9586		.init_hook = alc_automute_amp,
9587	},
9588	[ALC885_MACMINI3] = {
9589		.mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
9590		.init_verbs = { alc885_macmini3_init_verbs,
9591				alc880_gpio1_init_verbs },
9592		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9593		.dac_nids = alc882_dac_nids,
9594		.channel_mode = alc885_macmini3_6ch_modes,
9595		.num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
9596		.input_mux = &macmini3_capture_source,
9597		.dig_out_nid = ALC882_DIGOUT_NID,
9598		.dig_in_nid = ALC882_DIGIN_NID,
9599		.unsol_event = alc_automute_amp_unsol_event,
9600		.setup = alc885_macmini3_setup,
9601		.init_hook = alc_automute_amp,
9602	},
9603	[ALC885_MACPRO] = {
9604		.mixers = { alc882_macpro_mixer },
9605		.init_verbs = { alc882_macpro_init_verbs },
9606		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9607		.dac_nids = alc882_dac_nids,
9608		.dig_out_nid = ALC882_DIGOUT_NID,
9609		.dig_in_nid = ALC882_DIGIN_NID,
9610		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9611		.channel_mode = alc882_ch_modes,
9612		.input_mux = &alc882_capture_source,
9613		.init_hook = alc885_macpro_init_hook,
9614	},
9615	[ALC885_IMAC24] = {
9616		.mixers = { alc885_imac24_mixer },
9617		.init_verbs = { alc885_imac24_init_verbs },
9618		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9619		.dac_nids = alc882_dac_nids,
9620		.dig_out_nid = ALC882_DIGOUT_NID,
9621		.dig_in_nid = ALC882_DIGIN_NID,
9622		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9623		.channel_mode = alc882_ch_modes,
9624		.input_mux = &alc882_capture_source,
9625		.unsol_event = alc_automute_amp_unsol_event,
9626		.setup = alc885_imac24_setup,
9627		.init_hook = alc885_imac24_init_hook,
9628	},
9629	[ALC885_IMAC91] = {
9630		.mixers = { alc885_imac91_mixer, alc882_chmode_mixer },
9631		.init_verbs = { alc885_imac91_init_verbs,
9632				alc880_gpio1_init_verbs },
9633		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9634		.dac_nids = alc882_dac_nids,
9635		.channel_mode = alc885_mbp_4ch_modes,
9636		.num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9637		.input_mux = &alc882_capture_source,
9638		.dig_out_nid = ALC882_DIGOUT_NID,
9639		.dig_in_nid = ALC882_DIGIN_NID,
9640		.unsol_event = alc_automute_amp_unsol_event,
9641		.setup = alc885_imac91_setup,
9642		.init_hook = alc_automute_amp,
9643	},
9644	[ALC882_TARGA] = {
9645		.mixers = { alc882_targa_mixer, alc882_chmode_mixer },
9646		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9647				alc880_gpio3_init_verbs, alc882_targa_verbs},
9648		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9649		.dac_nids = alc882_dac_nids,
9650		.dig_out_nid = ALC882_DIGOUT_NID,
9651		.num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9652		.adc_nids = alc882_adc_nids,
9653		.capsrc_nids = alc882_capsrc_nids,
9654		.num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9655		.channel_mode = alc882_3ST_6ch_modes,
9656		.need_dac_fix = 1,
9657		.input_mux = &alc882_capture_source,
9658		.unsol_event = alc882_targa_unsol_event,
9659		.setup = alc882_targa_setup,
9660		.init_hook = alc882_targa_automute,
9661	},
9662	[ALC882_ASUS_A7J] = {
9663		.mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
9664		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9665				alc882_asus_a7j_verbs},
9666		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9667		.dac_nids = alc882_dac_nids,
9668		.dig_out_nid = ALC882_DIGOUT_NID,
9669		.num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9670		.adc_nids = alc882_adc_nids,
9671		.capsrc_nids = alc882_capsrc_nids,
9672		.num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9673		.channel_mode = alc882_3ST_6ch_modes,
9674		.need_dac_fix = 1,
9675		.input_mux = &alc882_capture_source,
9676	},
9677	[ALC882_ASUS_A7M] = {
9678		.mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
9679		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9680				alc882_eapd_verbs, alc880_gpio1_init_verbs,
9681				alc882_asus_a7m_verbs },
9682		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9683		.dac_nids = alc882_dac_nids,
9684		.dig_out_nid = ALC882_DIGOUT_NID,
9685		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9686		.channel_mode = alc880_threestack_modes,
9687		.need_dac_fix = 1,
9688		.input_mux = &alc882_capture_source,
9689	},
9690	[ALC883_3ST_2ch_DIG] = {
9691		.mixers = { alc883_3ST_2ch_mixer },
9692		.init_verbs = { alc883_init_verbs },
9693		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9694		.dac_nids = alc883_dac_nids,
9695		.dig_out_nid = ALC883_DIGOUT_NID,
9696		.dig_in_nid = ALC883_DIGIN_NID,
9697		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9698		.channel_mode = alc883_3ST_2ch_modes,
9699		.input_mux = &alc883_capture_source,
9700	},
9701	[ALC883_3ST_6ch_DIG] = {
9702		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9703		.init_verbs = { alc883_init_verbs },
9704		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9705		.dac_nids = alc883_dac_nids,
9706		.dig_out_nid = ALC883_DIGOUT_NID,
9707		.dig_in_nid = ALC883_DIGIN_NID,
9708		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9709		.channel_mode = alc883_3ST_6ch_modes,
9710		.need_dac_fix = 1,
9711		.input_mux = &alc883_capture_source,
9712	},
9713	[ALC883_3ST_6ch] = {
9714		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9715		.init_verbs = { alc883_init_verbs },
9716		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9717		.dac_nids = alc883_dac_nids,
9718		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9719		.channel_mode = alc883_3ST_6ch_modes,
9720		.need_dac_fix = 1,
9721		.input_mux = &alc883_capture_source,
9722	},
9723	[ALC883_3ST_6ch_INTEL] = {
9724		.mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9725		.init_verbs = { alc883_init_verbs },
9726		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9727		.dac_nids = alc883_dac_nids,
9728		.dig_out_nid = ALC883_DIGOUT_NID,
9729		.dig_in_nid = ALC883_DIGIN_NID,
9730		.slave_dig_outs = alc883_slave_dig_outs,
9731		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9732		.channel_mode = alc883_3ST_6ch_intel_modes,
9733		.need_dac_fix = 1,
9734		.input_mux = &alc883_3stack_6ch_intel,
9735	},
9736	[ALC889A_INTEL] = {
9737		.mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9738		.init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9739				alc_hp15_unsol_verbs },
9740		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9741		.dac_nids = alc883_dac_nids,
9742		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9743		.adc_nids = alc889_adc_nids,
9744		.dig_out_nid = ALC883_DIGOUT_NID,
9745		.dig_in_nid = ALC883_DIGIN_NID,
9746		.slave_dig_outs = alc883_slave_dig_outs,
9747		.num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9748		.channel_mode = alc889_8ch_intel_modes,
9749		.capsrc_nids = alc889_capsrc_nids,
9750		.input_mux = &alc889_capture_source,
9751		.setup = alc889_automute_setup,
9752		.init_hook = alc_automute_amp,
9753		.unsol_event = alc_automute_amp_unsol_event,
9754		.need_dac_fix = 1,
9755	},
9756	[ALC889_INTEL] = {
9757		.mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9758		.init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
9759				alc889_eapd_verbs, alc_hp15_unsol_verbs},
9760		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9761		.dac_nids = alc883_dac_nids,
9762		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9763		.adc_nids = alc889_adc_nids,
9764		.dig_out_nid = ALC883_DIGOUT_NID,
9765		.dig_in_nid = ALC883_DIGIN_NID,
9766		.slave_dig_outs = alc883_slave_dig_outs,
9767		.num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9768		.channel_mode = alc889_8ch_intel_modes,
9769		.capsrc_nids = alc889_capsrc_nids,
9770		.input_mux = &alc889_capture_source,
9771		.setup = alc889_automute_setup,
9772		.init_hook = alc889_intel_init_hook,
9773		.unsol_event = alc_automute_amp_unsol_event,
9774		.need_dac_fix = 1,
9775	},
9776	[ALC883_6ST_DIG] = {
9777		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
9778		.init_verbs = { alc883_init_verbs },
9779		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9780		.dac_nids = alc883_dac_nids,
9781		.dig_out_nid = ALC883_DIGOUT_NID,
9782		.dig_in_nid = ALC883_DIGIN_NID,
9783		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9784		.channel_mode = alc883_sixstack_modes,
9785		.input_mux = &alc883_capture_source,
9786	},
9787	[ALC883_TARGA_DIG] = {
9788		.mixers = { alc883_targa_mixer, alc883_chmode_mixer },
9789		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9790				alc883_targa_verbs},
9791		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9792		.dac_nids = alc883_dac_nids,
9793		.dig_out_nid = ALC883_DIGOUT_NID,
9794		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9795		.channel_mode = alc883_3ST_6ch_modes,
9796		.need_dac_fix = 1,
9797		.input_mux = &alc883_capture_source,
9798		.unsol_event = alc883_targa_unsol_event,
9799		.setup = alc882_targa_setup,
9800		.init_hook = alc882_targa_automute,
9801	},
9802	[ALC883_TARGA_2ch_DIG] = {
9803		.mixers = { alc883_targa_2ch_mixer},
9804		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9805				alc883_targa_verbs},
9806		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9807		.dac_nids = alc883_dac_nids,
9808		.adc_nids = alc883_adc_nids_alt,
9809		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9810		.capsrc_nids = alc883_capsrc_nids,
9811		.dig_out_nid = ALC883_DIGOUT_NID,
9812		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9813		.channel_mode = alc883_3ST_2ch_modes,
9814		.input_mux = &alc883_capture_source,
9815		.unsol_event = alc883_targa_unsol_event,
9816		.setup = alc882_targa_setup,
9817		.init_hook = alc882_targa_automute,
9818	},
9819	[ALC883_TARGA_8ch_DIG] = {
9820		.mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
9821			    alc883_chmode_mixer },
9822		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9823				alc883_targa_verbs },
9824		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9825		.dac_nids = alc883_dac_nids,
9826		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9827		.adc_nids = alc883_adc_nids_rev,
9828		.capsrc_nids = alc883_capsrc_nids_rev,
9829		.dig_out_nid = ALC883_DIGOUT_NID,
9830		.dig_in_nid = ALC883_DIGIN_NID,
9831		.num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
9832		.channel_mode = alc883_4ST_8ch_modes,
9833		.need_dac_fix = 1,
9834		.input_mux = &alc883_capture_source,
9835		.unsol_event = alc883_targa_unsol_event,
9836		.setup = alc882_targa_setup,
9837		.init_hook = alc882_targa_automute,
9838	},
9839	[ALC883_ACER] = {
9840		.mixers = { alc883_base_mixer },
9841		/* On TravelMate laptops, GPIO 0 enables the internal speaker
9842		 * and the headphone jack.  Turn this on and rely on the
9843		 * standard mute methods whenever the user wants to turn
9844		 * these outputs off.
9845		 */
9846		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
9847		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9848		.dac_nids = alc883_dac_nids,
9849		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9850		.channel_mode = alc883_3ST_2ch_modes,
9851		.input_mux = &alc883_capture_source,
9852	},
9853	[ALC883_ACER_ASPIRE] = {
9854		.mixers = { alc883_acer_aspire_mixer },
9855		.init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
9856		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9857		.dac_nids = alc883_dac_nids,
9858		.dig_out_nid = ALC883_DIGOUT_NID,
9859		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9860		.channel_mode = alc883_3ST_2ch_modes,
9861		.input_mux = &alc883_capture_source,
9862		.unsol_event = alc_automute_amp_unsol_event,
9863		.setup = alc883_acer_aspire_setup,
9864		.init_hook = alc_automute_amp,
9865	},
9866	[ALC888_ACER_ASPIRE_4930G] = {
9867		.mixers = { alc888_base_mixer,
9868				alc883_chmode_mixer },
9869		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9870				alc888_acer_aspire_4930g_verbs },
9871		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9872		.dac_nids = alc883_dac_nids,
9873		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9874		.adc_nids = alc883_adc_nids_rev,
9875		.capsrc_nids = alc883_capsrc_nids_rev,
9876		.dig_out_nid = ALC883_DIGOUT_NID,
9877		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9878		.channel_mode = alc883_3ST_6ch_modes,
9879		.need_dac_fix = 1,
9880		.const_channel_count = 6,
9881		.num_mux_defs =
9882			ARRAY_SIZE(alc888_2_capture_sources),
9883		.input_mux = alc888_2_capture_sources,
9884		.unsol_event = alc_automute_amp_unsol_event,
9885		.setup = alc888_acer_aspire_4930g_setup,
9886		.init_hook = alc_automute_amp,
9887	},
9888	[ALC888_ACER_ASPIRE_6530G] = {
9889		.mixers = { alc888_acer_aspire_6530_mixer },
9890		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9891				alc888_acer_aspire_6530g_verbs },
9892		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9893		.dac_nids = alc883_dac_nids,
9894		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9895		.adc_nids = alc883_adc_nids_rev,
9896		.capsrc_nids = alc883_capsrc_nids_rev,
9897		.dig_out_nid = ALC883_DIGOUT_NID,
9898		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9899		.channel_mode = alc883_3ST_2ch_modes,
9900		.num_mux_defs =
9901			ARRAY_SIZE(alc888_2_capture_sources),
9902		.input_mux = alc888_acer_aspire_6530_sources,
9903		.unsol_event = alc_automute_amp_unsol_event,
9904		.setup = alc888_acer_aspire_6530g_setup,
9905		.init_hook = alc_automute_amp,
9906	},
9907	[ALC888_ACER_ASPIRE_8930G] = {
9908		.mixers = { alc889_acer_aspire_8930g_mixer,
9909				alc883_chmode_mixer },
9910		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9911				alc889_acer_aspire_8930g_verbs,
9912				alc889_eapd_verbs},
9913		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9914		.dac_nids = alc883_dac_nids,
9915		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9916		.adc_nids = alc889_adc_nids,
9917		.capsrc_nids = alc889_capsrc_nids,
9918		.dig_out_nid = ALC883_DIGOUT_NID,
9919		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9920		.channel_mode = alc883_3ST_6ch_modes,
9921		.need_dac_fix = 1,
9922		.const_channel_count = 6,
9923		.num_mux_defs =
9924			ARRAY_SIZE(alc889_capture_sources),
9925		.input_mux = alc889_capture_sources,
9926		.unsol_event = alc_automute_amp_unsol_event,
9927		.setup = alc889_acer_aspire_8930g_setup,
9928		.init_hook = alc_automute_amp,
9929#ifdef CONFIG_SND_HDA_POWER_SAVE
9930		.power_hook = alc_power_eapd,
9931#endif
9932	},
9933	[ALC888_ACER_ASPIRE_7730G] = {
9934		.mixers = { alc883_3ST_6ch_mixer,
9935				alc883_chmode_mixer },
9936		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9937				alc888_acer_aspire_7730G_verbs },
9938		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9939		.dac_nids = alc883_dac_nids,
9940		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9941		.adc_nids = alc883_adc_nids_rev,
9942		.capsrc_nids = alc883_capsrc_nids_rev,
9943		.dig_out_nid = ALC883_DIGOUT_NID,
9944		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9945		.channel_mode = alc883_3ST_6ch_modes,
9946		.need_dac_fix = 1,
9947		.const_channel_count = 6,
9948		.input_mux = &alc883_capture_source,
9949		.unsol_event = alc_automute_amp_unsol_event,
9950		.setup = alc888_acer_aspire_6530g_setup,
9951		.init_hook = alc_automute_amp,
9952	},
9953	[ALC883_MEDION] = {
9954		.mixers = { alc883_fivestack_mixer,
9955			    alc883_chmode_mixer },
9956		.init_verbs = { alc883_init_verbs,
9957				alc883_medion_eapd_verbs },
9958		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9959		.dac_nids = alc883_dac_nids,
9960		.adc_nids = alc883_adc_nids_alt,
9961		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9962		.capsrc_nids = alc883_capsrc_nids,
9963		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9964		.channel_mode = alc883_sixstack_modes,
9965		.input_mux = &alc883_capture_source,
9966	},
9967	[ALC883_MEDION_MD2] = {
9968		.mixers = { alc883_medion_md2_mixer},
9969		.init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
9970		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9971		.dac_nids = alc883_dac_nids,
9972		.dig_out_nid = ALC883_DIGOUT_NID,
9973		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9974		.channel_mode = alc883_3ST_2ch_modes,
9975		.input_mux = &alc883_capture_source,
9976		.unsol_event = alc_automute_amp_unsol_event,
9977		.setup = alc883_medion_md2_setup,
9978		.init_hook = alc_automute_amp,
9979	},
9980	[ALC883_MEDION_WIM2160] = {
9981		.mixers = { alc883_medion_wim2160_mixer },
9982		.init_verbs = { alc883_init_verbs, alc883_medion_wim2160_verbs },
9983		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9984		.dac_nids = alc883_dac_nids,
9985		.dig_out_nid = ALC883_DIGOUT_NID,
9986		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
9987		.adc_nids = alc883_adc_nids,
9988		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9989		.channel_mode = alc883_3ST_2ch_modes,
9990		.input_mux = &alc883_capture_source,
9991		.unsol_event = alc_automute_amp_unsol_event,
9992		.setup = alc883_medion_wim2160_setup,
9993		.init_hook = alc_automute_amp,
9994	},
9995	[ALC883_LAPTOP_EAPD] = {
9996		.mixers = { alc883_base_mixer },
9997		.init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
9998		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9999		.dac_nids = alc883_dac_nids,
10000		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10001		.channel_mode = alc883_3ST_2ch_modes,
10002		.input_mux = &alc883_capture_source,
10003	},
10004	[ALC883_CLEVO_M540R] = {
10005		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10006		.init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
10007		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10008		.dac_nids = alc883_dac_nids,
10009		.dig_out_nid = ALC883_DIGOUT_NID,
10010		.dig_in_nid = ALC883_DIGIN_NID,
10011		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
10012		.channel_mode = alc883_3ST_6ch_clevo_modes,
10013		.need_dac_fix = 1,
10014		.input_mux = &alc883_capture_source,
10015		/* This machine has the hardware HP auto-muting, thus
10016		 * we need no software mute via unsol event
10017		 */
10018	},
10019	[ALC883_CLEVO_M720] = {
10020		.mixers = { alc883_clevo_m720_mixer },
10021		.init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
10022		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10023		.dac_nids = alc883_dac_nids,
10024		.dig_out_nid = ALC883_DIGOUT_NID,
10025		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10026		.channel_mode = alc883_3ST_2ch_modes,
10027		.input_mux = &alc883_capture_source,
10028		.unsol_event = alc883_clevo_m720_unsol_event,
10029		.setup = alc883_clevo_m720_setup,
10030		.init_hook = alc883_clevo_m720_init_hook,
10031	},
10032	[ALC883_LENOVO_101E_2ch] = {
10033		.mixers = { alc883_lenovo_101e_2ch_mixer},
10034		.init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
10035		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10036		.dac_nids = alc883_dac_nids,
10037		.adc_nids = alc883_adc_nids_alt,
10038		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
10039		.capsrc_nids = alc883_capsrc_nids,
10040		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10041		.channel_mode = alc883_3ST_2ch_modes,
10042		.input_mux = &alc883_lenovo_101e_capture_source,
10043		.unsol_event = alc883_lenovo_101e_unsol_event,
10044		.init_hook = alc883_lenovo_101e_all_automute,
10045	},
10046	[ALC883_LENOVO_NB0763] = {
10047		.mixers = { alc883_lenovo_nb0763_mixer },
10048		.init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
10049		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10050		.dac_nids = alc883_dac_nids,
10051		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10052		.channel_mode = alc883_3ST_2ch_modes,
10053		.need_dac_fix = 1,
10054		.input_mux = &alc883_lenovo_nb0763_capture_source,
10055		.unsol_event = alc_automute_amp_unsol_event,
10056		.setup = alc883_medion_md2_setup,
10057		.init_hook = alc_automute_amp,
10058	},
10059	[ALC888_LENOVO_MS7195_DIG] = {
10060		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10061		.init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
10062		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10063		.dac_nids = alc883_dac_nids,
10064		.dig_out_nid = ALC883_DIGOUT_NID,
10065		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10066		.channel_mode = alc883_3ST_6ch_modes,
10067		.need_dac_fix = 1,
10068		.input_mux = &alc883_capture_source,
10069		.unsol_event = alc883_lenovo_ms7195_unsol_event,
10070		.init_hook = alc888_lenovo_ms7195_front_automute,
10071	},
10072	[ALC883_HAIER_W66] = {
10073		.mixers = { alc883_targa_2ch_mixer},
10074		.init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
10075		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10076		.dac_nids = alc883_dac_nids,
10077		.dig_out_nid = ALC883_DIGOUT_NID,
10078		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10079		.channel_mode = alc883_3ST_2ch_modes,
10080		.input_mux = &alc883_capture_source,
10081		.unsol_event = alc_automute_amp_unsol_event,
10082		.setup = alc883_haier_w66_setup,
10083		.init_hook = alc_automute_amp,
10084	},
10085	[ALC888_3ST_HP] = {
10086		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10087		.init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
10088		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10089		.dac_nids = alc883_dac_nids,
10090		.num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
10091		.channel_mode = alc888_3st_hp_modes,
10092		.need_dac_fix = 1,
10093		.input_mux = &alc883_capture_source,
10094		.unsol_event = alc_automute_amp_unsol_event,
10095		.setup = alc888_3st_hp_setup,
10096		.init_hook = alc_automute_amp,
10097	},
10098	[ALC888_6ST_DELL] = {
10099		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
10100		.init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
10101		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10102		.dac_nids = alc883_dac_nids,
10103		.dig_out_nid = ALC883_DIGOUT_NID,
10104		.dig_in_nid = ALC883_DIGIN_NID,
10105		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10106		.channel_mode = alc883_sixstack_modes,
10107		.input_mux = &alc883_capture_source,
10108		.unsol_event = alc_automute_amp_unsol_event,
10109		.setup = alc888_6st_dell_setup,
10110		.init_hook = alc_automute_amp,
10111	},
10112	[ALC883_MITAC] = {
10113		.mixers = { alc883_mitac_mixer },
10114		.init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
10115		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10116		.dac_nids = alc883_dac_nids,
10117		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10118		.channel_mode = alc883_3ST_2ch_modes,
10119		.input_mux = &alc883_capture_source,
10120		.unsol_event = alc_automute_amp_unsol_event,
10121		.setup = alc883_mitac_setup,
10122		.init_hook = alc_automute_amp,
10123	},
10124	[ALC883_FUJITSU_PI2515] = {
10125		.mixers = { alc883_2ch_fujitsu_pi2515_mixer },
10126		.init_verbs = { alc883_init_verbs,
10127				alc883_2ch_fujitsu_pi2515_verbs},
10128		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10129		.dac_nids = alc883_dac_nids,
10130		.dig_out_nid = ALC883_DIGOUT_NID,
10131		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10132		.channel_mode = alc883_3ST_2ch_modes,
10133		.input_mux = &alc883_fujitsu_pi2515_capture_source,
10134		.unsol_event = alc_automute_amp_unsol_event,
10135		.setup = alc883_2ch_fujitsu_pi2515_setup,
10136		.init_hook = alc_automute_amp,
10137	},
10138	[ALC888_FUJITSU_XA3530] = {
10139		.mixers = { alc888_base_mixer, alc883_chmode_mixer },
10140		.init_verbs = { alc883_init_verbs,
10141			alc888_fujitsu_xa3530_verbs },
10142		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10143		.dac_nids = alc883_dac_nids,
10144		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10145		.adc_nids = alc883_adc_nids_rev,
10146		.capsrc_nids = alc883_capsrc_nids_rev,
10147		.dig_out_nid = ALC883_DIGOUT_NID,
10148		.num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
10149		.channel_mode = alc888_4ST_8ch_intel_modes,
10150		.num_mux_defs =
10151			ARRAY_SIZE(alc888_2_capture_sources),
10152		.input_mux = alc888_2_capture_sources,
10153		.unsol_event = alc_automute_amp_unsol_event,
10154		.setup = alc888_fujitsu_xa3530_setup,
10155		.init_hook = alc_automute_amp,
10156	},
10157	[ALC888_LENOVO_SKY] = {
10158		.mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
10159		.init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
10160		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10161		.dac_nids = alc883_dac_nids,
10162		.dig_out_nid = ALC883_DIGOUT_NID,
10163		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10164		.channel_mode = alc883_sixstack_modes,
10165		.need_dac_fix = 1,
10166		.input_mux = &alc883_lenovo_sky_capture_source,
10167		.unsol_event = alc_automute_amp_unsol_event,
10168		.setup = alc888_lenovo_sky_setup,
10169		.init_hook = alc_automute_amp,
10170	},
10171	[ALC888_ASUS_M90V] = {
10172		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10173		.init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
10174		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10175		.dac_nids = alc883_dac_nids,
10176		.dig_out_nid = ALC883_DIGOUT_NID,
10177		.dig_in_nid = ALC883_DIGIN_NID,
10178		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10179		.channel_mode = alc883_3ST_6ch_modes,
10180		.need_dac_fix = 1,
10181		.input_mux = &alc883_fujitsu_pi2515_capture_source,
10182		.unsol_event = alc_sku_unsol_event,
10183		.setup = alc883_mode2_setup,
10184		.init_hook = alc_inithook,
10185	},
10186	[ALC888_ASUS_EEE1601] = {
10187		.mixers = { alc883_asus_eee1601_mixer },
10188		.cap_mixer = alc883_asus_eee1601_cap_mixer,
10189		.init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
10190		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10191		.dac_nids = alc883_dac_nids,
10192		.dig_out_nid = ALC883_DIGOUT_NID,
10193		.dig_in_nid = ALC883_DIGIN_NID,
10194		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10195		.channel_mode = alc883_3ST_2ch_modes,
10196		.need_dac_fix = 1,
10197		.input_mux = &alc883_asus_eee1601_capture_source,
10198		.unsol_event = alc_sku_unsol_event,
10199		.init_hook = alc883_eee1601_inithook,
10200	},
10201	[ALC1200_ASUS_P5Q] = {
10202		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
10203		.init_verbs = { alc883_init_verbs },
10204		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10205		.dac_nids = alc883_dac_nids,
10206		.dig_out_nid = ALC1200_DIGOUT_NID,
10207		.dig_in_nid = ALC883_DIGIN_NID,
10208		.slave_dig_outs = alc1200_slave_dig_outs,
10209		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10210		.channel_mode = alc883_sixstack_modes,
10211		.input_mux = &alc883_capture_source,
10212	},
10213	[ALC889A_MB31] = {
10214		.mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
10215		.init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
10216			alc880_gpio1_init_verbs },
10217		.adc_nids = alc883_adc_nids,
10218		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
10219		.capsrc_nids = alc883_capsrc_nids,
10220		.dac_nids = alc883_dac_nids,
10221		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10222		.channel_mode = alc889A_mb31_6ch_modes,
10223		.num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
10224		.input_mux = &alc889A_mb31_capture_source,
10225		.dig_out_nid = ALC883_DIGOUT_NID,
10226		.unsol_event = alc889A_mb31_unsol_event,
10227		.init_hook = alc889A_mb31_automute,
10228	},
10229	[ALC883_SONY_VAIO_TT] = {
10230		.mixers = { alc883_vaiott_mixer },
10231		.init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
10232		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10233		.dac_nids = alc883_dac_nids,
10234		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10235		.channel_mode = alc883_3ST_2ch_modes,
10236		.input_mux = &alc883_capture_source,
10237		.unsol_event = alc_automute_amp_unsol_event,
10238		.setup = alc883_vaiott_setup,
10239		.init_hook = alc_automute_amp,
10240	},
10241};
10242
10243
10244/*
10245 * Pin config fixes
10246 */
10247enum {
10248	PINFIX_ABIT_AW9D_MAX
10249};
10250
10251static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
10252	{ 0x15, 0x01080104 }, /* side */
10253	{ 0x16, 0x01011012 }, /* rear */
10254	{ 0x17, 0x01016011 }, /* clfe */
10255	{ }
10256};
10257
10258static const struct alc_fixup alc882_fixups[] = {
10259	[PINFIX_ABIT_AW9D_MAX] = {
10260		.pins = alc882_abit_aw9d_pinfix
10261	},
10262};
10263
10264static struct snd_pci_quirk alc882_fixup_tbl[] = {
10265	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
10266	{}
10267};
10268
10269/*
10270 * BIOS auto configuration
10271 */
10272static int alc882_auto_create_input_ctls(struct hda_codec *codec,
10273						const struct auto_pin_cfg *cfg)
10274{
10275	return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
10276}
10277
10278static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
10279					      hda_nid_t nid, int pin_type,
10280					      hda_nid_t dac)
10281{
10282	int idx;
10283
10284	/* set as output */
10285	alc_set_pin_output(codec, nid, pin_type);
10286
10287	if (dac == 0x25)
10288		idx = 4;
10289	else if (dac >= 0x02 && dac <= 0x05)
10290		idx = dac - 2;
10291	else
10292		return;
10293	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
10294}
10295
10296static void alc882_auto_init_multi_out(struct hda_codec *codec)
10297{
10298	struct alc_spec *spec = codec->spec;
10299	int i;
10300
10301	for (i = 0; i <= HDA_SIDE; i++) {
10302		hda_nid_t nid = spec->autocfg.line_out_pins[i];
10303		int pin_type = get_pin_type(spec->autocfg.line_out_type);
10304		if (nid)
10305			alc882_auto_set_output_and_unmute(codec, nid, pin_type,
10306					spec->multiout.dac_nids[i]);
10307	}
10308}
10309
10310static void alc882_auto_init_hp_out(struct hda_codec *codec)
10311{
10312	struct alc_spec *spec = codec->spec;
10313	hda_nid_t pin, dac;
10314
10315	pin = spec->autocfg.hp_pins[0];
10316	if (pin) {
10317		dac = spec->multiout.hp_nid;
10318		if (!dac)
10319			dac = spec->multiout.dac_nids[0]; /* to front */
10320		alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, dac);
10321	}
10322	pin = spec->autocfg.speaker_pins[0];
10323	if (pin) {
10324		dac = spec->multiout.extra_out_nid[0];
10325		if (!dac)
10326			dac = spec->multiout.dac_nids[0]; /* to front */
10327		alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, dac);
10328	}
10329}
10330
10331static void alc882_auto_init_analog_input(struct hda_codec *codec)
10332{
10333	struct alc_spec *spec = codec->spec;
10334	int i;
10335
10336	for (i = 0; i < AUTO_PIN_LAST; i++) {
10337		hda_nid_t nid = spec->autocfg.input_pins[i];
10338		if (!nid)
10339			continue;
10340		alc_set_input_pin(codec, nid, i);
10341		if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
10342			snd_hda_codec_write(codec, nid, 0,
10343					    AC_VERB_SET_AMP_GAIN_MUTE,
10344					    AMP_OUT_MUTE);
10345	}
10346}
10347
10348static void alc882_auto_init_input_src(struct hda_codec *codec)
10349{
10350	struct alc_spec *spec = codec->spec;
10351	int c;
10352
10353	for (c = 0; c < spec->num_adc_nids; c++) {
10354		hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
10355		hda_nid_t nid = spec->capsrc_nids[c];
10356		unsigned int mux_idx;
10357		const struct hda_input_mux *imux;
10358		int conns, mute, idx, item;
10359
10360		conns = snd_hda_get_connections(codec, nid, conn_list,
10361						ARRAY_SIZE(conn_list));
10362		if (conns < 0)
10363			continue;
10364		mux_idx = c >= spec->num_mux_defs ? 0 : c;
10365		imux = &spec->input_mux[mux_idx];
10366		if (!imux->num_items && mux_idx > 0)
10367			imux = &spec->input_mux[0];
10368		for (idx = 0; idx < conns; idx++) {
10369			/* if the current connection is the selected one,
10370			 * unmute it as default - otherwise mute it
10371			 */
10372			mute = AMP_IN_MUTE(idx);
10373			for (item = 0; item < imux->num_items; item++) {
10374				if (imux->items[item].index == idx) {
10375					if (spec->cur_mux[c] == item)
10376						mute = AMP_IN_UNMUTE(idx);
10377					break;
10378				}
10379			}
10380			/* check if we have a selector or mixer
10381			 * we could check for the widget type instead, but
10382			 * just check for Amp-In presence (in case of mixer
10383			 * without amp-in there is something wrong, this
10384			 * function shouldn't be used or capsrc nid is wrong)
10385			 */
10386			if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
10387				snd_hda_codec_write(codec, nid, 0,
10388						    AC_VERB_SET_AMP_GAIN_MUTE,
10389						    mute);
10390			else if (mute != AMP_IN_MUTE(idx))
10391				snd_hda_codec_write(codec, nid, 0,
10392						    AC_VERB_SET_CONNECT_SEL,
10393						    idx);
10394		}
10395	}
10396}
10397
10398/* add mic boosts if needed */
10399static int alc_auto_add_mic_boost(struct hda_codec *codec)
10400{
10401	struct alc_spec *spec = codec->spec;
10402	int err;
10403	hda_nid_t nid;
10404
10405	nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
10406	if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10407		err = add_control(spec, ALC_CTL_WIDGET_VOL,
10408				  "Mic Boost",
10409				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10410		if (err < 0)
10411			return err;
10412	}
10413	nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
10414	if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10415		err = add_control(spec, ALC_CTL_WIDGET_VOL,
10416				  "Front Mic Boost",
10417				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10418		if (err < 0)
10419			return err;
10420	}
10421	return 0;
10422}
10423
10424/* almost identical with ALC880 parser... */
10425static int alc882_parse_auto_config(struct hda_codec *codec)
10426{
10427	struct alc_spec *spec = codec->spec;
10428	static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
10429	int i, err;
10430
10431	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
10432					   alc882_ignore);
10433	if (err < 0)
10434		return err;
10435	if (!spec->autocfg.line_outs)
10436		return 0; /* can't find valid BIOS pin config */
10437
10438	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
10439	if (err < 0)
10440		return err;
10441	err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
10442	if (err < 0)
10443		return err;
10444	err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
10445					   "Headphone");
10446	if (err < 0)
10447		return err;
10448	err = alc880_auto_create_extra_out(spec,
10449					   spec->autocfg.speaker_pins[0],
10450					   "Speaker");
10451	if (err < 0)
10452		return err;
10453	err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
10454	if (err < 0)
10455		return err;
10456
10457	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
10458
10459	/* check multiple SPDIF-out (for recent codecs) */
10460	for (i = 0; i < spec->autocfg.dig_outs; i++) {
10461		hda_nid_t dig_nid;
10462		err = snd_hda_get_connections(codec,
10463					      spec->autocfg.dig_out_pins[i],
10464					      &dig_nid, 1);
10465		if (err < 0)
10466			continue;
10467		if (!i)
10468			spec->multiout.dig_out_nid = dig_nid;
10469		else {
10470			spec->multiout.slave_dig_outs = spec->slave_dig_outs;
10471			if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
10472				break;
10473			spec->slave_dig_outs[i - 1] = dig_nid;
10474		}
10475	}
10476	if (spec->autocfg.dig_in_pin)
10477		spec->dig_in_nid = ALC880_DIGIN_NID;
10478
10479	if (spec->kctls.list)
10480		add_mixer(spec, spec->kctls.list);
10481
10482	add_verb(spec, alc883_auto_init_verbs);
10483	/* if ADC 0x07 is available, initialize it, too */
10484	if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
10485		add_verb(spec, alc882_adc1_init_verbs);
10486
10487	spec->num_mux_defs = 1;
10488	spec->input_mux = &spec->private_imux[0];
10489
10490	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
10491
10492	err = alc_auto_add_mic_boost(codec);
10493	if (err < 0)
10494		return err;
10495
10496	return 1; /* config found */
10497}
10498
10499/* additional initialization for auto-configuration model */
10500static void alc882_auto_init(struct hda_codec *codec)
10501{
10502	struct alc_spec *spec = codec->spec;
10503	alc882_auto_init_multi_out(codec);
10504	alc882_auto_init_hp_out(codec);
10505	alc882_auto_init_analog_input(codec);
10506	alc882_auto_init_input_src(codec);
10507	if (spec->unsol_event)
10508		alc_inithook(codec);
10509}
10510
10511static int patch_alc882(struct hda_codec *codec)
10512{
10513	struct alc_spec *spec;
10514	int err, board_config;
10515
10516	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
10517	if (spec == NULL)
10518		return -ENOMEM;
10519
10520	codec->spec = spec;
10521
10522	alc_auto_parse_customize_define(codec);
10523
10524	switch (codec->vendor_id) {
10525	case 0x10ec0882:
10526	case 0x10ec0885:
10527		break;
10528	default:
10529		/* ALC883 and variants */
10530		alc_fix_pll_init(codec, 0x20, 0x0a, 10);
10531		break;
10532	}
10533
10534	board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
10535						  alc882_models,
10536						  alc882_cfg_tbl);
10537
10538	if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
10539		board_config = snd_hda_check_board_codec_sid_config(codec,
10540			ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
10541
10542	if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
10543		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
10544		       codec->chip_name);
10545		board_config = ALC882_AUTO;
10546	}
10547
10548	if (board_config == ALC882_AUTO)
10549		alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 1);
10550
10551	if (board_config == ALC882_AUTO) {
10552		/* automatic parse from the BIOS config */
10553		err = alc882_parse_auto_config(codec);
10554		if (err < 0) {
10555			alc_free(codec);
10556			return err;
10557		} else if (!err) {
10558			printk(KERN_INFO
10559			       "hda_codec: Cannot set up configuration "
10560			       "from BIOS.  Using base mode...\n");
10561			board_config = ALC882_3ST_DIG;
10562		}
10563	}
10564
10565	err = snd_hda_attach_beep_device(codec, 0x1);
10566	if (err < 0) {
10567		alc_free(codec);
10568		return err;
10569	}
10570
10571	if (board_config != ALC882_AUTO)
10572		setup_preset(codec, &alc882_presets[board_config]);
10573
10574	spec->stream_analog_playback = &alc882_pcm_analog_playback;
10575	spec->stream_analog_capture = &alc882_pcm_analog_capture;
10576	/* FIXME: setup DAC5 */
10577	/*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
10578	spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
10579
10580	spec->stream_digital_playback = &alc882_pcm_digital_playback;
10581	spec->stream_digital_capture = &alc882_pcm_digital_capture;
10582
10583	if (!spec->adc_nids && spec->input_mux) {
10584		int i, j;
10585		spec->num_adc_nids = 0;
10586		for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
10587			const struct hda_input_mux *imux = spec->input_mux;
10588			hda_nid_t cap;
10589			hda_nid_t items[16];
10590			hda_nid_t nid = alc882_adc_nids[i];
10591			unsigned int wcap = get_wcaps(codec, nid);
10592			/* get type */
10593			wcap = get_wcaps_type(wcap);
10594			if (wcap != AC_WID_AUD_IN)
10595				continue;
10596			spec->private_adc_nids[spec->num_adc_nids] = nid;
10597			err = snd_hda_get_connections(codec, nid, &cap, 1);
10598			if (err < 0)
10599				continue;
10600			err = snd_hda_get_connections(codec, cap, items,
10601						      ARRAY_SIZE(items));
10602			if (err < 0)
10603				continue;
10604			for (j = 0; j < imux->num_items; j++)
10605				if (imux->items[j].index >= err)
10606					break;
10607			if (j < imux->num_items)
10608				continue;
10609			spec->private_capsrc_nids[spec->num_adc_nids] = cap;
10610			spec->num_adc_nids++;
10611		}
10612		spec->adc_nids = spec->private_adc_nids;
10613		spec->capsrc_nids = spec->private_capsrc_nids;
10614	}
10615
10616	set_capture_mixer(codec);
10617
10618	if (spec->cdefine.enable_pcbeep)
10619		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10620
10621	if (board_config == ALC882_AUTO)
10622		alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 0);
10623
10624	spec->vmaster_nid = 0x0c;
10625
10626	codec->patch_ops = alc_patch_ops;
10627	if (board_config == ALC882_AUTO)
10628		spec->init_hook = alc882_auto_init;
10629#ifdef CONFIG_SND_HDA_POWER_SAVE
10630	if (!spec->loopback.amplist)
10631		spec->loopback.amplist = alc882_loopbacks;
10632#endif
10633
10634	return 0;
10635}
10636
10637
10638/*
10639 * ALC262 support
10640 */
10641
10642#define ALC262_DIGOUT_NID	ALC880_DIGOUT_NID
10643#define ALC262_DIGIN_NID	ALC880_DIGIN_NID
10644
10645#define alc262_dac_nids		alc260_dac_nids
10646#define alc262_adc_nids		alc882_adc_nids
10647#define alc262_adc_nids_alt	alc882_adc_nids_alt
10648#define alc262_capsrc_nids	alc882_capsrc_nids
10649#define alc262_capsrc_nids_alt	alc882_capsrc_nids_alt
10650
10651#define alc262_modes		alc260_modes
10652#define alc262_capture_source	alc882_capture_source
10653
10654static hda_nid_t alc262_dmic_adc_nids[1] = {
10655	/* ADC0 */
10656	0x09
10657};
10658
10659static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
10660
10661static struct snd_kcontrol_new alc262_base_mixer[] = {
10662	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10663	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10664	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10665	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10666	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10667	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10668	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10669	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10670	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10671	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10672	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10673	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10674	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
10675	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10676	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
10677	HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
10678	{ } /* end */
10679};
10680
10681/* update HP, line and mono-out pins according to the master switch */
10682static void alc262_hp_master_update(struct hda_codec *codec)
10683{
10684	struct alc_spec *spec = codec->spec;
10685	int val = spec->master_sw;
10686
10687	/* HP & line-out */
10688	snd_hda_codec_write_cache(codec, 0x1b, 0,
10689				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10690				  val ? PIN_HP : 0);
10691	snd_hda_codec_write_cache(codec, 0x15, 0,
10692				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10693				  val ? PIN_HP : 0);
10694	/* mono (speaker) depending on the HP jack sense */
10695	val = val && !spec->jack_present;
10696	snd_hda_codec_write_cache(codec, 0x16, 0,
10697				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10698				  val ? PIN_OUT : 0);
10699}
10700
10701static void alc262_hp_bpc_automute(struct hda_codec *codec)
10702{
10703	struct alc_spec *spec = codec->spec;
10704
10705	spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
10706	alc262_hp_master_update(codec);
10707}
10708
10709static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10710{
10711	if ((res >> 26) != ALC880_HP_EVENT)
10712		return;
10713	alc262_hp_bpc_automute(codec);
10714}
10715
10716static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10717{
10718	struct alc_spec *spec = codec->spec;
10719
10720	spec->jack_present = snd_hda_jack_detect(codec, 0x15);
10721	alc262_hp_master_update(codec);
10722}
10723
10724static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10725					   unsigned int res)
10726{
10727	if ((res >> 26) != ALC880_HP_EVENT)
10728		return;
10729	alc262_hp_wildwest_automute(codec);
10730}
10731
10732#define alc262_hp_master_sw_get		alc260_hp_master_sw_get
10733
10734static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10735				   struct snd_ctl_elem_value *ucontrol)
10736{
10737	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10738	struct alc_spec *spec = codec->spec;
10739	int val = !!*ucontrol->value.integer.value;
10740
10741	if (val == spec->master_sw)
10742		return 0;
10743	spec->master_sw = val;
10744	alc262_hp_master_update(codec);
10745	return 1;
10746}
10747
10748#define ALC262_HP_MASTER_SWITCH					\
10749	{							\
10750		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		\
10751		.name = "Master Playback Switch",		\
10752		.info = snd_ctl_boolean_mono_info,		\
10753		.get = alc262_hp_master_sw_get,			\
10754		.put = alc262_hp_master_sw_put,			\
10755	}, \
10756	{							\
10757		.iface = NID_MAPPING,				\
10758		.name = "Master Playback Switch",		\
10759		.private_value = 0x15 | (0x16 << 8) | (0x1b << 16),	\
10760	}
10761
10762
10763static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
10764	ALC262_HP_MASTER_SWITCH,
10765	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10766	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10767	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10768	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10769			      HDA_OUTPUT),
10770	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10771			    HDA_OUTPUT),
10772	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10773	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10774	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10775	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10776	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10777	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10778	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10779	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10780	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10781	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10782	HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10783	HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10784	{ } /* end */
10785};
10786
10787static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
10788	ALC262_HP_MASTER_SWITCH,
10789	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10790	HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10791	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10792	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10793	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10794			      HDA_OUTPUT),
10795	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10796			    HDA_OUTPUT),
10797	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10798	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
10799	HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
10800	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10801	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10802	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10803	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10804	{ } /* end */
10805};
10806
10807static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
10808	HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10809	HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10810	HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
10811	{ } /* end */
10812};
10813
10814/* mute/unmute internal speaker according to the hp jack and mute state */
10815static void alc262_hp_t5735_setup(struct hda_codec *codec)
10816{
10817	struct alc_spec *spec = codec->spec;
10818
10819	spec->autocfg.hp_pins[0] = 0x15;
10820	spec->autocfg.speaker_pins[0] = 0x14;
10821}
10822
10823static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
10824	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10825	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10826	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10827	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10828	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10829	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10830	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10831	{ } /* end */
10832};
10833
10834static struct hda_verb alc262_hp_t5735_verbs[] = {
10835	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10836	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10837
10838	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
10839	{ }
10840};
10841
10842static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
10843	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10844	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10845	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
10846	HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
10847	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10848	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10849	{ } /* end */
10850};
10851
10852static struct hda_verb alc262_hp_rp5700_verbs[] = {
10853	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10854	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10855	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10856	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10857	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10858	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10859	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10860	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10861	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10862	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10863	{}
10864};
10865
10866static struct hda_input_mux alc262_hp_rp5700_capture_source = {
10867	.num_items = 1,
10868	.items = {
10869		{ "Line", 0x1 },
10870	},
10871};
10872
10873/* bind hp and internal speaker mute (with plug check) as master switch */
10874static void alc262_hippo_master_update(struct hda_codec *codec)
10875{
10876	struct alc_spec *spec = codec->spec;
10877	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10878	hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
10879	hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
10880	unsigned int mute;
10881
10882	/* HP */
10883	mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
10884	snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
10885				 HDA_AMP_MUTE, mute);
10886	/* mute internal speaker per jack sense */
10887	if (spec->jack_present)
10888		mute = HDA_AMP_MUTE;
10889	if (line_nid)
10890		snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
10891					 HDA_AMP_MUTE, mute);
10892	if (speaker_nid && speaker_nid != line_nid)
10893		snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
10894					 HDA_AMP_MUTE, mute);
10895}
10896
10897#define alc262_hippo_master_sw_get	alc262_hp_master_sw_get
10898
10899static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
10900				      struct snd_ctl_elem_value *ucontrol)
10901{
10902	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10903	struct alc_spec *spec = codec->spec;
10904	int val = !!*ucontrol->value.integer.value;
10905
10906	if (val == spec->master_sw)
10907		return 0;
10908	spec->master_sw = val;
10909	alc262_hippo_master_update(codec);
10910	return 1;
10911}
10912
10913#define ALC262_HIPPO_MASTER_SWITCH				\
10914	{							\
10915		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		\
10916		.name = "Master Playback Switch",		\
10917		.info = snd_ctl_boolean_mono_info,		\
10918		.get = alc262_hippo_master_sw_get,		\
10919		.put = alc262_hippo_master_sw_put,		\
10920	},							\
10921	{							\
10922		.iface = NID_MAPPING,				\
10923		.name = "Master Playback Switch",		\
10924		.subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
10925			     (SUBDEV_SPEAKER(0) << 16), \
10926	}
10927
10928static struct snd_kcontrol_new alc262_hippo_mixer[] = {
10929	ALC262_HIPPO_MASTER_SWITCH,
10930	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10931	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10932	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10933	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10934	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10935	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10936	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10937	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10938	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10939	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10940	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10941	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10942	{ } /* end */
10943};
10944
10945static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
10946	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10947	ALC262_HIPPO_MASTER_SWITCH,
10948	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10949	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10950	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10951	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10952	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10953	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10954	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10955	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10956	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10957	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10958	{ } /* end */
10959};
10960
10961/* mute/unmute internal speaker according to the hp jack and mute state */
10962static void alc262_hippo_automute(struct hda_codec *codec)
10963{
10964	struct alc_spec *spec = codec->spec;
10965	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10966
10967	spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
10968	alc262_hippo_master_update(codec);
10969}
10970
10971static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
10972{
10973	if ((res >> 26) != ALC880_HP_EVENT)
10974		return;
10975	alc262_hippo_automute(codec);
10976}
10977
10978static void alc262_hippo_setup(struct hda_codec *codec)
10979{
10980	struct alc_spec *spec = codec->spec;
10981
10982	spec->autocfg.hp_pins[0] = 0x15;
10983	spec->autocfg.speaker_pins[0] = 0x14;
10984}
10985
10986static void alc262_hippo1_setup(struct hda_codec *codec)
10987{
10988	struct alc_spec *spec = codec->spec;
10989
10990	spec->autocfg.hp_pins[0] = 0x1b;
10991	spec->autocfg.speaker_pins[0] = 0x14;
10992}
10993
10994
10995static struct snd_kcontrol_new alc262_sony_mixer[] = {
10996	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10997	ALC262_HIPPO_MASTER_SWITCH,
10998	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10999	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11000	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11001	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11002	{ } /* end */
11003};
11004
11005static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
11006	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11007	ALC262_HIPPO_MASTER_SWITCH,
11008	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11009	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11010	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11011	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11012	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11013	{ } /* end */
11014};
11015
11016static struct snd_kcontrol_new alc262_tyan_mixer[] = {
11017	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11018	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11019	HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
11020	HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
11021	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11022	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11023	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11024	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11025	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11026	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11027	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11028	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11029	{ } /* end */
11030};
11031
11032static struct hda_verb alc262_tyan_verbs[] = {
11033	/* Headphone automute */
11034	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11035	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11036	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11037
11038	/* P11 AUX_IN, white 4-pin connector */
11039	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11040	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
11041	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
11042	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
11043
11044	{}
11045};
11046
11047/* unsolicited event for HP jack sensing */
11048static void alc262_tyan_setup(struct hda_codec *codec)
11049{
11050	struct alc_spec *spec = codec->spec;
11051
11052	spec->autocfg.hp_pins[0] = 0x1b;
11053	spec->autocfg.speaker_pins[0] = 0x15;
11054}
11055
11056
11057#define alc262_capture_mixer		alc882_capture_mixer
11058#define alc262_capture_alt_mixer	alc882_capture_alt_mixer
11059
11060/*
11061 * generic initialization of ADC, input mixers and output mixers
11062 */
11063static struct hda_verb alc262_init_verbs[] = {
11064	/*
11065	 * Unmute ADC0-2 and set the default input to mic-in
11066	 */
11067	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11068	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11069	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11070	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11071	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11072	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11073
11074	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11075	 * mixer widget
11076	 * Note: PASD motherboards uses the Line In 2 as the input for
11077	 * front panel mic (mic 2)
11078	 */
11079	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11080	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11081	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11082	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11083	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11084	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11085
11086	/*
11087	 * Set up output mixers (0x0c - 0x0e)
11088	 */
11089	/* set vol=0 to output mixers */
11090	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11091	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11092	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11093	/* set up input amps for analog loopback */
11094	/* Amp Indices: DAC = 0, mixer = 1 */
11095	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11096	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11097	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11098	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11099	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11100	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11101
11102	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11103	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11104	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11105	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11106	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11107	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11108
11109	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11110	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11111	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11112	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11113	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11114
11115	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11116	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11117
11118	/* FIXME: use matrix-type input source selection */
11119	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11120	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11121	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11122	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11123	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11124	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11125	/* Input mixer2 */
11126	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11127	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11128	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11129	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11130	/* Input mixer3 */
11131	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11132	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11133	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11134	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11135
11136	{ }
11137};
11138
11139static struct hda_verb alc262_eapd_verbs[] = {
11140	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
11141	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
11142	{ }
11143};
11144
11145static struct hda_verb alc262_hippo1_unsol_verbs[] = {
11146	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11147	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11148	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11149
11150	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11151	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11152	{}
11153};
11154
11155static struct hda_verb alc262_sony_unsol_verbs[] = {
11156	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11157	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11158	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},	// Front Mic
11159
11160	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11161	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11162	{}
11163};
11164
11165static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
11166	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11167	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11168	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11169	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11170	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11171	{ } /* end */
11172};
11173
11174static struct hda_verb alc262_toshiba_s06_verbs[] = {
11175	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11176	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11177	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11178	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11179	{0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
11180	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11181	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
11182	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11183	{}
11184};
11185
11186static void alc262_toshiba_s06_setup(struct hda_codec *codec)
11187{
11188	struct alc_spec *spec = codec->spec;
11189
11190	spec->autocfg.hp_pins[0] = 0x15;
11191	spec->autocfg.speaker_pins[0] = 0x14;
11192	spec->ext_mic.pin = 0x18;
11193	spec->ext_mic.mux_idx = 0;
11194	spec->int_mic.pin = 0x12;
11195	spec->int_mic.mux_idx = 9;
11196	spec->auto_mic = 1;
11197}
11198
11199/*
11200 * nec model
11201 *  0x15 = headphone
11202 *  0x16 = internal speaker
11203 *  0x18 = external mic
11204 */
11205
11206static struct snd_kcontrol_new alc262_nec_mixer[] = {
11207	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
11208	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
11209
11210	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11211	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11212	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11213
11214	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11215	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11216	{ } /* end */
11217};
11218
11219static struct hda_verb alc262_nec_verbs[] = {
11220	/* Unmute Speaker */
11221	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11222
11223	/* Headphone */
11224	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11225	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11226
11227	/* External mic to headphone */
11228	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11229	/* External mic to speaker */
11230	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11231	{}
11232};
11233
11234/*
11235 * fujitsu model
11236 *  0x14 = headphone/spdif-out, 0x15 = internal speaker,
11237 *  0x1b = port replicator headphone out
11238 */
11239
11240#define ALC_HP_EVENT	0x37
11241
11242static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
11243	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11244	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11245	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11246	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11247	{}
11248};
11249
11250static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
11251	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11252	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11253	{}
11254};
11255
11256static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
11257	/* Front Mic pin: input vref at 50% */
11258	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
11259	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11260	{}
11261};
11262
11263static struct hda_input_mux alc262_fujitsu_capture_source = {
11264	.num_items = 3,
11265	.items = {
11266		{ "Mic", 0x0 },
11267		{ "Int Mic", 0x1 },
11268		{ "CD", 0x4 },
11269	},
11270};
11271
11272static struct hda_input_mux alc262_HP_capture_source = {
11273	.num_items = 5,
11274	.items = {
11275		{ "Mic", 0x0 },
11276		{ "Front Mic", 0x1 },
11277		{ "Line", 0x2 },
11278		{ "CD", 0x4 },
11279		{ "AUX IN", 0x6 },
11280	},
11281};
11282
11283static struct hda_input_mux alc262_HP_D7000_capture_source = {
11284	.num_items = 4,
11285	.items = {
11286		{ "Mic", 0x0 },
11287		{ "Front Mic", 0x2 },
11288		{ "Line", 0x1 },
11289		{ "CD", 0x4 },
11290	},
11291};
11292
11293/* mute/unmute internal speaker according to the hp jacks and mute state */
11294static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
11295{
11296	struct alc_spec *spec = codec->spec;
11297	unsigned int mute;
11298
11299	if (force || !spec->sense_updated) {
11300		spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
11301				     snd_hda_jack_detect(codec, 0x1b);
11302		spec->sense_updated = 1;
11303	}
11304	/* unmute internal speaker only if both HPs are unplugged and
11305	 * master switch is on
11306	 */
11307	if (spec->jack_present)
11308		mute = HDA_AMP_MUTE;
11309	else
11310		mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
11311	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11312				 HDA_AMP_MUTE, mute);
11313}
11314
11315/* unsolicited event for HP jack sensing */
11316static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
11317				       unsigned int res)
11318{
11319	if ((res >> 26) != ALC_HP_EVENT)
11320		return;
11321	alc262_fujitsu_automute(codec, 1);
11322}
11323
11324static void alc262_fujitsu_init_hook(struct hda_codec *codec)
11325{
11326	alc262_fujitsu_automute(codec, 1);
11327}
11328
11329/* bind volumes of both NID 0x0c and 0x0d */
11330static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
11331	.ops = &snd_hda_bind_vol,
11332	.values = {
11333		HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
11334		HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
11335		0
11336	},
11337};
11338
11339/* mute/unmute internal speaker according to the hp jack and mute state */
11340static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
11341{
11342	struct alc_spec *spec = codec->spec;
11343	unsigned int mute;
11344
11345	if (force || !spec->sense_updated) {
11346		spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
11347		spec->sense_updated = 1;
11348	}
11349	if (spec->jack_present) {
11350		/* mute internal speaker */
11351		snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11352					 HDA_AMP_MUTE, HDA_AMP_MUTE);
11353		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11354					 HDA_AMP_MUTE, HDA_AMP_MUTE);
11355	} else {
11356		/* unmute internal speaker if necessary */
11357		mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
11358		snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11359					 HDA_AMP_MUTE, mute);
11360		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11361					 HDA_AMP_MUTE, mute);
11362	}
11363}
11364
11365/* unsolicited event for HP jack sensing */
11366static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
11367				       unsigned int res)
11368{
11369	if ((res >> 26) != ALC_HP_EVENT)
11370		return;
11371	alc262_lenovo_3000_automute(codec, 1);
11372}
11373
11374static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
11375				  int dir, int idx, long *valp)
11376{
11377	int i, change = 0;
11378
11379	for (i = 0; i < 2; i++, valp++)
11380		change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
11381						   HDA_AMP_MUTE,
11382						   *valp ? 0 : HDA_AMP_MUTE);
11383	return change;
11384}
11385
11386/* bind hp and internal speaker mute (with plug check) */
11387static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
11388					 struct snd_ctl_elem_value *ucontrol)
11389{
11390	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11391	long *valp = ucontrol->value.integer.value;
11392	int change;
11393
11394	change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11395	change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11396	if (change)
11397		alc262_fujitsu_automute(codec, 0);
11398	return change;
11399}
11400
11401static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
11402	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11403	{
11404		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11405		.name = "Master Playback Switch",
11406		.subdevice = HDA_SUBDEV_AMP_FLAG,
11407		.info = snd_hda_mixer_amp_switch_info,
11408		.get = snd_hda_mixer_amp_switch_get,
11409		.put = alc262_fujitsu_master_sw_put,
11410		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11411	},
11412	{
11413		.iface = NID_MAPPING,
11414		.name = "Master Playback Switch",
11415		.private_value = 0x1b,
11416	},
11417	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11418	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11419	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11420	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11421	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11422	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11423	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11424	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11425	{ } /* end */
11426};
11427
11428/* bind hp and internal speaker mute (with plug check) */
11429static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
11430					 struct snd_ctl_elem_value *ucontrol)
11431{
11432	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11433	long *valp = ucontrol->value.integer.value;
11434	int change;
11435
11436	change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11437	if (change)
11438		alc262_lenovo_3000_automute(codec, 0);
11439	return change;
11440}
11441
11442static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
11443	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11444	{
11445		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11446		.name = "Master Playback Switch",
11447		.subdevice = HDA_SUBDEV_AMP_FLAG,
11448		.info = snd_hda_mixer_amp_switch_info,
11449		.get = snd_hda_mixer_amp_switch_get,
11450		.put = alc262_lenovo_3000_master_sw_put,
11451		.private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
11452	},
11453	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11454	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11455	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11456	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11457	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11458	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11459	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11460	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11461	{ } /* end */
11462};
11463
11464static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11465	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11466	ALC262_HIPPO_MASTER_SWITCH,
11467	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11468	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11469	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11470	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11471	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11472	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11473	{ } /* end */
11474};
11475
11476/* additional init verbs for Benq laptops */
11477static struct hda_verb alc262_EAPD_verbs[] = {
11478	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11479	{0x20, AC_VERB_SET_PROC_COEF,  0x3070},
11480	{}
11481};
11482
11483static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11484	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11485	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11486
11487	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11488	{0x20, AC_VERB_SET_PROC_COEF,  0x3050},
11489	{}
11490};
11491
11492/* Samsung Q1 Ultra Vista model setup */
11493static struct snd_kcontrol_new alc262_ultra_mixer[] = {
11494	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11495	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11496	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11497	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11498	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
11499	HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
11500	{ } /* end */
11501};
11502
11503static struct hda_verb alc262_ultra_verbs[] = {
11504	/* output mixer */
11505	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11506	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11507	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11508	/* speaker */
11509	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11510	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11511	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11512	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11513	/* HP */
11514	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11515	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11516	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11517	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11518	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11519	/* internal mic */
11520	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11521	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11522	/* ADC, choose mic */
11523	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11524	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11525	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11526	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11527	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11528	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11529	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11530	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11531	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11532	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
11533	{}
11534};
11535
11536/* mute/unmute internal speaker according to the hp jack and mute state */
11537static void alc262_ultra_automute(struct hda_codec *codec)
11538{
11539	struct alc_spec *spec = codec->spec;
11540	unsigned int mute;
11541
11542	mute = 0;
11543	/* auto-mute only when HP is used as HP */
11544	if (!spec->cur_mux[0]) {
11545		spec->jack_present = snd_hda_jack_detect(codec, 0x15);
11546		if (spec->jack_present)
11547			mute = HDA_AMP_MUTE;
11548	}
11549	/* mute/unmute internal speaker */
11550	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11551				 HDA_AMP_MUTE, mute);
11552	/* mute/unmute HP */
11553	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11554				 HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
11555}
11556
11557/* unsolicited event for HP jack sensing */
11558static void alc262_ultra_unsol_event(struct hda_codec *codec,
11559				       unsigned int res)
11560{
11561	if ((res >> 26) != ALC880_HP_EVENT)
11562		return;
11563	alc262_ultra_automute(codec);
11564}
11565
11566static struct hda_input_mux alc262_ultra_capture_source = {
11567	.num_items = 2,
11568	.items = {
11569		{ "Mic", 0x1 },
11570		{ "Headphone", 0x7 },
11571	},
11572};
11573
11574static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
11575				     struct snd_ctl_elem_value *ucontrol)
11576{
11577	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11578	struct alc_spec *spec = codec->spec;
11579	int ret;
11580
11581	ret = alc_mux_enum_put(kcontrol, ucontrol);
11582	if (!ret)
11583		return 0;
11584	/* reprogram the HP pin as mic or HP according to the input source */
11585	snd_hda_codec_write_cache(codec, 0x15, 0,
11586				  AC_VERB_SET_PIN_WIDGET_CONTROL,
11587				  spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
11588	alc262_ultra_automute(codec); /* mute/unmute HP */
11589	return ret;
11590}
11591
11592static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
11593	HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
11594	HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
11595	{
11596		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11597		.name = "Capture Source",
11598		.info = alc_mux_enum_info,
11599		.get = alc_mux_enum_get,
11600		.put = alc262_ultra_mux_enum_put,
11601	},
11602	{
11603		.iface = NID_MAPPING,
11604		.name = "Capture Source",
11605		.private_value = 0x15,
11606	},
11607	{ } /* end */
11608};
11609
11610/* We use two mixers depending on the output pin; 0x16 is a mono output
11611 * and thus it's bound with a different mixer.
11612 * This function returns which mixer amp should be used.
11613 */
11614static int alc262_check_volbit(hda_nid_t nid)
11615{
11616	if (!nid)
11617		return 0;
11618	else if (nid == 0x16)
11619		return 2;
11620	else
11621		return 1;
11622}
11623
11624static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
11625				  const char *pfx, int *vbits)
11626{
11627	unsigned long val;
11628	int vbit;
11629
11630	vbit = alc262_check_volbit(nid);
11631	if (!vbit)
11632		return 0;
11633	if (*vbits & vbit) /* a volume control for this mixer already there */
11634		return 0;
11635	*vbits |= vbit;
11636	if (vbit == 2)
11637		val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
11638	else
11639		val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
11640	return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val);
11641}
11642
11643static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
11644				 const char *pfx)
11645{
11646	unsigned long val;
11647
11648	if (!nid)
11649		return 0;
11650	if (nid == 0x16)
11651		val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
11652	else
11653		val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
11654	return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val);
11655}
11656
11657/* add playback controls from the parsed DAC table */
11658static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
11659					     const struct auto_pin_cfg *cfg)
11660{
11661	const char *pfx;
11662	int vbits;
11663	int err;
11664
11665	spec->multiout.num_dacs = 1;	/* only use one dac */
11666	spec->multiout.dac_nids = spec->private_dac_nids;
11667	spec->multiout.dac_nids[0] = 2;
11668
11669	if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
11670		pfx = "Master";
11671	else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11672		pfx = "Speaker";
11673	else
11674		pfx = "Front";
11675	err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
11676	if (err < 0)
11677		return err;
11678	err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
11679	if (err < 0)
11680		return err;
11681	err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
11682	if (err < 0)
11683		return err;
11684
11685	vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
11686		alc262_check_volbit(cfg->speaker_pins[0]) |
11687		alc262_check_volbit(cfg->hp_pins[0]);
11688	if (vbits == 1 || vbits == 2)
11689		pfx = "Master"; /* only one mixer is used */
11690	else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11691		pfx = "Speaker";
11692	else
11693		pfx = "Front";
11694	vbits = 0;
11695	err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
11696	if (err < 0)
11697		return err;
11698	err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
11699				     &vbits);
11700	if (err < 0)
11701		return err;
11702	err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
11703				     &vbits);
11704	if (err < 0)
11705		return err;
11706	return 0;
11707}
11708
11709#define alc262_auto_create_input_ctls \
11710	alc882_auto_create_input_ctls
11711
11712/*
11713 * generic initialization of ADC, input mixers and output mixers
11714 */
11715static struct hda_verb alc262_volume_init_verbs[] = {
11716	/*
11717	 * Unmute ADC0-2 and set the default input to mic-in
11718	 */
11719	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11720	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11721	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11722	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11723	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11724	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11725
11726	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11727	 * mixer widget
11728	 * Note: PASD motherboards uses the Line In 2 as the input for
11729	 * front panel mic (mic 2)
11730	 */
11731	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11732	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11733	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11734	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11735	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11736	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11737
11738	/*
11739	 * Set up output mixers (0x0c - 0x0f)
11740	 */
11741	/* set vol=0 to output mixers */
11742	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11743	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11744	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11745
11746	/* set up input amps for analog loopback */
11747	/* Amp Indices: DAC = 0, mixer = 1 */
11748	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11749	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11750	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11751	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11752	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11753	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11754
11755	/* FIXME: use matrix-type input source selection */
11756	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11757	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11758	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11759	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11760	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11761	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11762	/* Input mixer2 */
11763	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11764	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11765	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11766	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11767	/* Input mixer3 */
11768	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11769	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11770	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11771	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11772
11773	{ }
11774};
11775
11776static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11777	/*
11778	 * Unmute ADC0-2 and set the default input to mic-in
11779	 */
11780	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11781	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11782	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11783	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11784	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11785	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11786
11787	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11788	 * mixer widget
11789	 * Note: PASD motherboards uses the Line In 2 as the input for
11790	 * front panel mic (mic 2)
11791	 */
11792	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11793	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11794	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11795	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11796	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11797	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11798	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11799        {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11800
11801	/*
11802	 * Set up output mixers (0x0c - 0x0e)
11803	 */
11804	/* set vol=0 to output mixers */
11805	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11806	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11807	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11808
11809	/* set up input amps for analog loopback */
11810	/* Amp Indices: DAC = 0, mixer = 1 */
11811	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11812	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11813	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11814	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11815	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11816	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11817
11818	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11819	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11820	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11821
11822	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11823	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11824
11825	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11826	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11827
11828	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11829	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11830        {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11831	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11832	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11833
11834	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11835	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11836        {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11837	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11838	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11839	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11840
11841
11842	/* FIXME: use matrix-type input source selection */
11843	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
11844	/* Input mixer1: only unmute Mic */
11845	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11846	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11847	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11848	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11849	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11850	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11851	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11852	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11853	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11854	/* Input mixer2 */
11855	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11856	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11857	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11858	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11859	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11860	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11861	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11862	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11863	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11864	/* Input mixer3 */
11865	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11866	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11867	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11868	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11869	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11870	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11871	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11872	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11873	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11874
11875	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11876
11877	{ }
11878};
11879
11880static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
11881	/*
11882	 * Unmute ADC0-2 and set the default input to mic-in
11883	 */
11884	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11885	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11886	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11887	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11888	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11889	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11890
11891	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11892	 * mixer widget
11893	 * Note: PASD motherboards uses the Line In 2 as the input for front
11894	 * panel mic (mic 2)
11895	 */
11896	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11897	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11898	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11899	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11900	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11901	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11902	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11903	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11904	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11905	/*
11906	 * Set up output mixers (0x0c - 0x0e)
11907	 */
11908	/* set vol=0 to output mixers */
11909	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11910	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11911	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11912
11913	/* set up input amps for analog loopback */
11914	/* Amp Indices: DAC = 0, mixer = 1 */
11915	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11916	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11917	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11918	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11919	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11920	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11921
11922
11923	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* HP */
11924	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Mono */
11925	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* rear MIC */
11926	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* Line in */
11927	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* Front MIC */
11928	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Line out */
11929	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* CD in */
11930
11931	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11932	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11933
11934	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11935	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11936
11937	/* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
11938	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11939	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11940	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
11941	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11942	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11943
11944	/* FIXME: use matrix-type input source selection */
11945	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11946	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11947	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
11948	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
11949	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
11950	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
11951	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
11952        /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))},  */
11953	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
11954	/* Input mixer2 */
11955	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11956	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11957	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11958	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11959	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11960        /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11961	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11962	/* Input mixer3 */
11963	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11964	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11965	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11966	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11967	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11968        /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11969	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11970
11971	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11972
11973	{ }
11974};
11975
11976static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
11977
11978	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Front Speaker */
11979	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11980	{0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
11981
11982	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* MIC jack */
11983	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* Front MIC */
11984	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11985	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11986
11987	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* HP  jack */
11988	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11989	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11990	{}
11991};
11992
11993
11994#ifdef CONFIG_SND_HDA_POWER_SAVE
11995#define alc262_loopbacks	alc880_loopbacks
11996#endif
11997
11998/* pcm configuration: identical with ALC880 */
11999#define alc262_pcm_analog_playback	alc880_pcm_analog_playback
12000#define alc262_pcm_analog_capture	alc880_pcm_analog_capture
12001#define alc262_pcm_digital_playback	alc880_pcm_digital_playback
12002#define alc262_pcm_digital_capture	alc880_pcm_digital_capture
12003
12004/*
12005 * BIOS auto configuration
12006 */
12007static int alc262_parse_auto_config(struct hda_codec *codec)
12008{
12009	struct alc_spec *spec = codec->spec;
12010	int err;
12011	static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
12012
12013	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12014					   alc262_ignore);
12015	if (err < 0)
12016		return err;
12017	if (!spec->autocfg.line_outs) {
12018		if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
12019			spec->multiout.max_channels = 2;
12020			spec->no_analog = 1;
12021			goto dig_only;
12022		}
12023		return 0; /* can't find valid BIOS pin config */
12024	}
12025	err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
12026	if (err < 0)
12027		return err;
12028	err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
12029	if (err < 0)
12030		return err;
12031
12032	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
12033
12034 dig_only:
12035	if (spec->autocfg.dig_outs) {
12036		spec->multiout.dig_out_nid = ALC262_DIGOUT_NID;
12037		spec->dig_out_type = spec->autocfg.dig_out_type[0];
12038	}
12039	if (spec->autocfg.dig_in_pin)
12040		spec->dig_in_nid = ALC262_DIGIN_NID;
12041
12042	if (spec->kctls.list)
12043		add_mixer(spec, spec->kctls.list);
12044
12045	add_verb(spec, alc262_volume_init_verbs);
12046	spec->num_mux_defs = 1;
12047	spec->input_mux = &spec->private_imux[0];
12048
12049	err = alc_auto_add_mic_boost(codec);
12050	if (err < 0)
12051		return err;
12052
12053	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
12054
12055	return 1;
12056}
12057
12058#define alc262_auto_init_multi_out	alc882_auto_init_multi_out
12059#define alc262_auto_init_hp_out		alc882_auto_init_hp_out
12060#define alc262_auto_init_analog_input	alc882_auto_init_analog_input
12061#define alc262_auto_init_input_src	alc882_auto_init_input_src
12062
12063
12064/* init callback for auto-configuration model -- overriding the default init */
12065static void alc262_auto_init(struct hda_codec *codec)
12066{
12067	struct alc_spec *spec = codec->spec;
12068	alc262_auto_init_multi_out(codec);
12069	alc262_auto_init_hp_out(codec);
12070	alc262_auto_init_analog_input(codec);
12071	alc262_auto_init_input_src(codec);
12072	if (spec->unsol_event)
12073		alc_inithook(codec);
12074}
12075
12076/*
12077 * configuration and preset
12078 */
12079static const char *alc262_models[ALC262_MODEL_LAST] = {
12080	[ALC262_BASIC]		= "basic",
12081	[ALC262_HIPPO]		= "hippo",
12082	[ALC262_HIPPO_1]	= "hippo_1",
12083	[ALC262_FUJITSU]	= "fujitsu",
12084	[ALC262_HP_BPC]		= "hp-bpc",
12085	[ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
12086	[ALC262_HP_TC_T5735]	= "hp-tc-t5735",
12087	[ALC262_HP_RP5700]	= "hp-rp5700",
12088	[ALC262_BENQ_ED8]	= "benq",
12089	[ALC262_BENQ_T31]	= "benq-t31",
12090	[ALC262_SONY_ASSAMD]	= "sony-assamd",
12091	[ALC262_TOSHIBA_S06]	= "toshiba-s06",
12092	[ALC262_TOSHIBA_RX1]	= "toshiba-rx1",
12093	[ALC262_ULTRA]		= "ultra",
12094	[ALC262_LENOVO_3000]	= "lenovo-3000",
12095	[ALC262_NEC]		= "nec",
12096	[ALC262_TYAN]		= "tyan",
12097	[ALC262_AUTO]		= "auto",
12098};
12099
12100static struct snd_pci_quirk alc262_cfg_tbl[] = {
12101	SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
12102	SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
12103	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
12104			   ALC262_HP_BPC),
12105	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
12106			   ALC262_HP_BPC),
12107	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
12108			   ALC262_HP_BPC),
12109	SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
12110	SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
12111	SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
12112	SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
12113	SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
12114	SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
12115	SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
12116	SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
12117	SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
12118	SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
12119	SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
12120	SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
12121		      ALC262_HP_TC_T5735),
12122	SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
12123	SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
12124	SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
12125	SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
12126	SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
12127	SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
12128	SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
12129	SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
12130#if 0 /* disable the quirk since model=auto works better in recent versions */
12131	SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
12132			   ALC262_SONY_ASSAMD),
12133#endif
12134	SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
12135		      ALC262_TOSHIBA_RX1),
12136	SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
12137	SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
12138	SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
12139	SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
12140	SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
12141			   ALC262_ULTRA),
12142	SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
12143	SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
12144	SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
12145	SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
12146	SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
12147	{}
12148};
12149
12150static struct alc_config_preset alc262_presets[] = {
12151	[ALC262_BASIC] = {
12152		.mixers = { alc262_base_mixer },
12153		.init_verbs = { alc262_init_verbs },
12154		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12155		.dac_nids = alc262_dac_nids,
12156		.hp_nid = 0x03,
12157		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12158		.channel_mode = alc262_modes,
12159		.input_mux = &alc262_capture_source,
12160	},
12161	[ALC262_HIPPO] = {
12162		.mixers = { alc262_hippo_mixer },
12163		.init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
12164		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12165		.dac_nids = alc262_dac_nids,
12166		.hp_nid = 0x03,
12167		.dig_out_nid = ALC262_DIGOUT_NID,
12168		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12169		.channel_mode = alc262_modes,
12170		.input_mux = &alc262_capture_source,
12171		.unsol_event = alc262_hippo_unsol_event,
12172		.setup = alc262_hippo_setup,
12173		.init_hook = alc262_hippo_automute,
12174	},
12175	[ALC262_HIPPO_1] = {
12176		.mixers = { alc262_hippo1_mixer },
12177		.init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
12178		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12179		.dac_nids = alc262_dac_nids,
12180		.hp_nid = 0x02,
12181		.dig_out_nid = ALC262_DIGOUT_NID,
12182		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12183		.channel_mode = alc262_modes,
12184		.input_mux = &alc262_capture_source,
12185		.unsol_event = alc262_hippo_unsol_event,
12186		.setup = alc262_hippo1_setup,
12187		.init_hook = alc262_hippo_automute,
12188	},
12189	[ALC262_FUJITSU] = {
12190		.mixers = { alc262_fujitsu_mixer },
12191		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12192				alc262_fujitsu_unsol_verbs },
12193		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12194		.dac_nids = alc262_dac_nids,
12195		.hp_nid = 0x03,
12196		.dig_out_nid = ALC262_DIGOUT_NID,
12197		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12198		.channel_mode = alc262_modes,
12199		.input_mux = &alc262_fujitsu_capture_source,
12200		.unsol_event = alc262_fujitsu_unsol_event,
12201		.init_hook = alc262_fujitsu_init_hook,
12202	},
12203	[ALC262_HP_BPC] = {
12204		.mixers = { alc262_HP_BPC_mixer },
12205		.init_verbs = { alc262_HP_BPC_init_verbs },
12206		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12207		.dac_nids = alc262_dac_nids,
12208		.hp_nid = 0x03,
12209		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12210		.channel_mode = alc262_modes,
12211		.input_mux = &alc262_HP_capture_source,
12212		.unsol_event = alc262_hp_bpc_unsol_event,
12213		.init_hook = alc262_hp_bpc_automute,
12214	},
12215	[ALC262_HP_BPC_D7000_WF] = {
12216		.mixers = { alc262_HP_BPC_WildWest_mixer },
12217		.init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12218		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12219		.dac_nids = alc262_dac_nids,
12220		.hp_nid = 0x03,
12221		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12222		.channel_mode = alc262_modes,
12223		.input_mux = &alc262_HP_D7000_capture_source,
12224		.unsol_event = alc262_hp_wildwest_unsol_event,
12225		.init_hook = alc262_hp_wildwest_automute,
12226	},
12227	[ALC262_HP_BPC_D7000_WL] = {
12228		.mixers = { alc262_HP_BPC_WildWest_mixer,
12229			    alc262_HP_BPC_WildWest_option_mixer },
12230		.init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12231		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12232		.dac_nids = alc262_dac_nids,
12233		.hp_nid = 0x03,
12234		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12235		.channel_mode = alc262_modes,
12236		.input_mux = &alc262_HP_D7000_capture_source,
12237		.unsol_event = alc262_hp_wildwest_unsol_event,
12238		.init_hook = alc262_hp_wildwest_automute,
12239	},
12240	[ALC262_HP_TC_T5735] = {
12241		.mixers = { alc262_hp_t5735_mixer },
12242		.init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
12243		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12244		.dac_nids = alc262_dac_nids,
12245		.hp_nid = 0x03,
12246		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12247		.channel_mode = alc262_modes,
12248		.input_mux = &alc262_capture_source,
12249		.unsol_event = alc_sku_unsol_event,
12250		.setup = alc262_hp_t5735_setup,
12251		.init_hook = alc_inithook,
12252	},
12253	[ALC262_HP_RP5700] = {
12254		.mixers = { alc262_hp_rp5700_mixer },
12255		.init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
12256		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12257		.dac_nids = alc262_dac_nids,
12258		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12259		.channel_mode = alc262_modes,
12260		.input_mux = &alc262_hp_rp5700_capture_source,
12261        },
12262	[ALC262_BENQ_ED8] = {
12263		.mixers = { alc262_base_mixer },
12264		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
12265		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12266		.dac_nids = alc262_dac_nids,
12267		.hp_nid = 0x03,
12268		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12269		.channel_mode = alc262_modes,
12270		.input_mux = &alc262_capture_source,
12271	},
12272	[ALC262_SONY_ASSAMD] = {
12273		.mixers = { alc262_sony_mixer },
12274		.init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
12275		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12276		.dac_nids = alc262_dac_nids,
12277		.hp_nid = 0x02,
12278		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12279		.channel_mode = alc262_modes,
12280		.input_mux = &alc262_capture_source,
12281		.unsol_event = alc262_hippo_unsol_event,
12282		.setup = alc262_hippo_setup,
12283		.init_hook = alc262_hippo_automute,
12284	},
12285	[ALC262_BENQ_T31] = {
12286		.mixers = { alc262_benq_t31_mixer },
12287		.init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
12288				alc_hp15_unsol_verbs },
12289		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12290		.dac_nids = alc262_dac_nids,
12291		.hp_nid = 0x03,
12292		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12293		.channel_mode = alc262_modes,
12294		.input_mux = &alc262_capture_source,
12295		.unsol_event = alc262_hippo_unsol_event,
12296		.setup = alc262_hippo_setup,
12297		.init_hook = alc262_hippo_automute,
12298	},
12299	[ALC262_ULTRA] = {
12300		.mixers = { alc262_ultra_mixer },
12301		.cap_mixer = alc262_ultra_capture_mixer,
12302		.init_verbs = { alc262_ultra_verbs },
12303		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12304		.dac_nids = alc262_dac_nids,
12305		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12306		.channel_mode = alc262_modes,
12307		.input_mux = &alc262_ultra_capture_source,
12308		.adc_nids = alc262_adc_nids, /* ADC0 */
12309		.capsrc_nids = alc262_capsrc_nids,
12310		.num_adc_nids = 1, /* single ADC */
12311		.unsol_event = alc262_ultra_unsol_event,
12312		.init_hook = alc262_ultra_automute,
12313	},
12314	[ALC262_LENOVO_3000] = {
12315		.mixers = { alc262_lenovo_3000_mixer },
12316		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12317				alc262_lenovo_3000_unsol_verbs,
12318				alc262_lenovo_3000_init_verbs },
12319		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12320		.dac_nids = alc262_dac_nids,
12321		.hp_nid = 0x03,
12322		.dig_out_nid = ALC262_DIGOUT_NID,
12323		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12324		.channel_mode = alc262_modes,
12325		.input_mux = &alc262_fujitsu_capture_source,
12326		.unsol_event = alc262_lenovo_3000_unsol_event,
12327	},
12328	[ALC262_NEC] = {
12329		.mixers = { alc262_nec_mixer },
12330		.init_verbs = { alc262_nec_verbs },
12331		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12332		.dac_nids = alc262_dac_nids,
12333		.hp_nid = 0x03,
12334		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12335		.channel_mode = alc262_modes,
12336		.input_mux = &alc262_capture_source,
12337	},
12338	[ALC262_TOSHIBA_S06] = {
12339		.mixers = { alc262_toshiba_s06_mixer },
12340		.init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
12341							alc262_eapd_verbs },
12342		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12343		.capsrc_nids = alc262_dmic_capsrc_nids,
12344		.dac_nids = alc262_dac_nids,
12345		.adc_nids = alc262_dmic_adc_nids, /* ADC0 */
12346		.num_adc_nids = 1, /* single ADC */
12347		.dig_out_nid = ALC262_DIGOUT_NID,
12348		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12349		.channel_mode = alc262_modes,
12350		.unsol_event = alc_sku_unsol_event,
12351		.setup = alc262_toshiba_s06_setup,
12352		.init_hook = alc_inithook,
12353	},
12354	[ALC262_TOSHIBA_RX1] = {
12355		.mixers = { alc262_toshiba_rx1_mixer },
12356		.init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
12357		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12358		.dac_nids = alc262_dac_nids,
12359		.hp_nid = 0x03,
12360		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12361		.channel_mode = alc262_modes,
12362		.input_mux = &alc262_capture_source,
12363		.unsol_event = alc262_hippo_unsol_event,
12364		.setup = alc262_hippo_setup,
12365		.init_hook = alc262_hippo_automute,
12366	},
12367	[ALC262_TYAN] = {
12368		.mixers = { alc262_tyan_mixer },
12369		.init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
12370		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12371		.dac_nids = alc262_dac_nids,
12372		.hp_nid = 0x02,
12373		.dig_out_nid = ALC262_DIGOUT_NID,
12374		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12375		.channel_mode = alc262_modes,
12376		.input_mux = &alc262_capture_source,
12377		.unsol_event = alc_automute_amp_unsol_event,
12378		.setup = alc262_tyan_setup,
12379		.init_hook = alc_automute_amp,
12380	},
12381};
12382
12383static int patch_alc262(struct hda_codec *codec)
12384{
12385	struct alc_spec *spec;
12386	int board_config;
12387	int err;
12388
12389	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
12390	if (spec == NULL)
12391		return -ENOMEM;
12392
12393	codec->spec = spec;
12394#if 0
12395	/* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
12396	 * under-run
12397	 */
12398	{
12399	int tmp;
12400	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12401	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
12402	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12403	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
12404	}
12405#endif
12406	alc_auto_parse_customize_define(codec);
12407
12408	alc_fix_pll_init(codec, 0x20, 0x0a, 10);
12409
12410	board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
12411						  alc262_models,
12412						  alc262_cfg_tbl);
12413
12414	if (board_config < 0) {
12415		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12416		       codec->chip_name);
12417		board_config = ALC262_AUTO;
12418	}
12419
12420	if (board_config == ALC262_AUTO) {
12421		/* automatic parse from the BIOS config */
12422		err = alc262_parse_auto_config(codec);
12423		if (err < 0) {
12424			alc_free(codec);
12425			return err;
12426		} else if (!err) {
12427			printk(KERN_INFO
12428			       "hda_codec: Cannot set up configuration "
12429			       "from BIOS.  Using base mode...\n");
12430			board_config = ALC262_BASIC;
12431		}
12432	}
12433
12434	if (!spec->no_analog) {
12435		err = snd_hda_attach_beep_device(codec, 0x1);
12436		if (err < 0) {
12437			alc_free(codec);
12438			return err;
12439		}
12440	}
12441
12442	if (board_config != ALC262_AUTO)
12443		setup_preset(codec, &alc262_presets[board_config]);
12444
12445	spec->stream_analog_playback = &alc262_pcm_analog_playback;
12446	spec->stream_analog_capture = &alc262_pcm_analog_capture;
12447
12448	spec->stream_digital_playback = &alc262_pcm_digital_playback;
12449	spec->stream_digital_capture = &alc262_pcm_digital_capture;
12450
12451	if (!spec->adc_nids && spec->input_mux) {
12452		int i;
12453		/* check whether the digital-mic has to be supported */
12454		for (i = 0; i < spec->input_mux->num_items; i++) {
12455			if (spec->input_mux->items[i].index >= 9)
12456				break;
12457		}
12458		if (i < spec->input_mux->num_items) {
12459			/* use only ADC0 */
12460			spec->adc_nids = alc262_dmic_adc_nids;
12461			spec->num_adc_nids = 1;
12462			spec->capsrc_nids = alc262_dmic_capsrc_nids;
12463		} else {
12464			/* all analog inputs */
12465			/* check whether NID 0x07 is valid */
12466			unsigned int wcap = get_wcaps(codec, 0x07);
12467
12468			/* get type */
12469			wcap = get_wcaps_type(wcap);
12470			if (wcap != AC_WID_AUD_IN) {
12471				spec->adc_nids = alc262_adc_nids_alt;
12472				spec->num_adc_nids =
12473					ARRAY_SIZE(alc262_adc_nids_alt);
12474				spec->capsrc_nids = alc262_capsrc_nids_alt;
12475			} else {
12476				spec->adc_nids = alc262_adc_nids;
12477				spec->num_adc_nids =
12478					ARRAY_SIZE(alc262_adc_nids);
12479				spec->capsrc_nids = alc262_capsrc_nids;
12480			}
12481		}
12482	}
12483	if (!spec->cap_mixer && !spec->no_analog)
12484		set_capture_mixer(codec);
12485	if (!spec->no_analog && spec->cdefine.enable_pcbeep)
12486		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12487
12488	spec->vmaster_nid = 0x0c;
12489
12490	codec->patch_ops = alc_patch_ops;
12491	if (board_config == ALC262_AUTO)
12492		spec->init_hook = alc262_auto_init;
12493#ifdef CONFIG_SND_HDA_POWER_SAVE
12494	if (!spec->loopback.amplist)
12495		spec->loopback.amplist = alc262_loopbacks;
12496#endif
12497
12498	return 0;
12499}
12500
12501/*
12502 *  ALC268 channel source setting (2 channel)
12503 */
12504#define ALC268_DIGOUT_NID	ALC880_DIGOUT_NID
12505#define alc268_modes		alc260_modes
12506
12507static hda_nid_t alc268_dac_nids[2] = {
12508	/* front, hp */
12509	0x02, 0x03
12510};
12511
12512static hda_nid_t alc268_adc_nids[2] = {
12513	/* ADC0-1 */
12514	0x08, 0x07
12515};
12516
12517static hda_nid_t alc268_adc_nids_alt[1] = {
12518	/* ADC0 */
12519	0x08
12520};
12521
12522static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
12523
12524static struct snd_kcontrol_new alc268_base_mixer[] = {
12525	/* output mixer control */
12526	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12527	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12528	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12529	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12530	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12531	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12532	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12533	{ }
12534};
12535
12536static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
12537	/* output mixer control */
12538	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12539	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12540	ALC262_HIPPO_MASTER_SWITCH,
12541	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12542	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12543	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12544	{ }
12545};
12546
12547/* bind Beep switches of both NID 0x0f and 0x10 */
12548static struct hda_bind_ctls alc268_bind_beep_sw = {
12549	.ops = &snd_hda_bind_sw,
12550	.values = {
12551		HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
12552		HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
12553		0
12554	},
12555};
12556
12557static struct snd_kcontrol_new alc268_beep_mixer[] = {
12558	HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
12559	HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
12560	{ }
12561};
12562
12563static struct hda_verb alc268_eapd_verbs[] = {
12564	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
12565	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
12566	{ }
12567};
12568
12569/* Toshiba specific */
12570static struct hda_verb alc268_toshiba_verbs[] = {
12571	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12572	{ } /* end */
12573};
12574
12575/* Acer specific */
12576/* bind volumes of both NID 0x02 and 0x03 */
12577static struct hda_bind_ctls alc268_acer_bind_master_vol = {
12578	.ops = &snd_hda_bind_vol,
12579	.values = {
12580		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
12581		HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
12582		0
12583	},
12584};
12585
12586/* mute/unmute internal speaker according to the hp jack and mute state */
12587static void alc268_acer_automute(struct hda_codec *codec, int force)
12588{
12589	struct alc_spec *spec = codec->spec;
12590	unsigned int mute;
12591
12592	if (force || !spec->sense_updated) {
12593		spec->jack_present = snd_hda_jack_detect(codec, 0x14);
12594		spec->sense_updated = 1;
12595	}
12596	if (spec->jack_present)
12597		mute = HDA_AMP_MUTE; /* mute internal speaker */
12598	else /* unmute internal speaker if necessary */
12599		mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
12600	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
12601				 HDA_AMP_MUTE, mute);
12602}
12603
12604
12605/* bind hp and internal speaker mute (with plug check) */
12606static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
12607				     struct snd_ctl_elem_value *ucontrol)
12608{
12609	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
12610	long *valp = ucontrol->value.integer.value;
12611	int change;
12612
12613	change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
12614	if (change)
12615		alc268_acer_automute(codec, 0);
12616	return change;
12617}
12618
12619static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
12620	/* output mixer control */
12621	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12622	{
12623		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12624		.name = "Master Playback Switch",
12625		.subdevice = HDA_SUBDEV_AMP_FLAG,
12626		.info = snd_hda_mixer_amp_switch_info,
12627		.get = snd_hda_mixer_amp_switch_get,
12628		.put = alc268_acer_master_sw_put,
12629		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12630	},
12631	HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
12632	{ }
12633};
12634
12635static struct snd_kcontrol_new alc268_acer_mixer[] = {
12636	/* output mixer control */
12637	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12638	{
12639		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12640		.name = "Master Playback Switch",
12641		.subdevice = HDA_SUBDEV_AMP_FLAG,
12642		.info = snd_hda_mixer_amp_switch_info,
12643		.get = snd_hda_mixer_amp_switch_get,
12644		.put = alc268_acer_master_sw_put,
12645		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12646	},
12647	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12648	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12649	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12650	{ }
12651};
12652
12653static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
12654	/* output mixer control */
12655	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12656	{
12657		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12658		.name = "Master Playback Switch",
12659		.subdevice = HDA_SUBDEV_AMP_FLAG,
12660		.info = snd_hda_mixer_amp_switch_info,
12661		.get = snd_hda_mixer_amp_switch_get,
12662		.put = alc268_acer_master_sw_put,
12663		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12664	},
12665	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12666	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12667	{ }
12668};
12669
12670static struct hda_verb alc268_acer_aspire_one_verbs[] = {
12671	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12672	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12673	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12674	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12675	{0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
12676	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
12677	{ }
12678};
12679
12680static struct hda_verb alc268_acer_verbs[] = {
12681	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
12682	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12683	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12684	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
12685	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12686	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12687	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12688	{ }
12689};
12690
12691/* unsolicited event for HP jack sensing */
12692#define alc268_toshiba_unsol_event	alc262_hippo_unsol_event
12693#define alc268_toshiba_setup		alc262_hippo_setup
12694#define alc268_toshiba_automute		alc262_hippo_automute
12695
12696static void alc268_acer_unsol_event(struct hda_codec *codec,
12697				       unsigned int res)
12698{
12699	if ((res >> 26) != ALC880_HP_EVENT)
12700		return;
12701	alc268_acer_automute(codec, 1);
12702}
12703
12704static void alc268_acer_init_hook(struct hda_codec *codec)
12705{
12706	alc268_acer_automute(codec, 1);
12707}
12708
12709/* toggle speaker-output according to the hp-jack state */
12710static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
12711{
12712	unsigned int present;
12713	unsigned char bits;
12714
12715	present = snd_hda_jack_detect(codec, 0x15);
12716	bits = present ? HDA_AMP_MUTE : 0;
12717	snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
12718				 HDA_AMP_MUTE, bits);
12719	snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
12720				 HDA_AMP_MUTE, bits);
12721}
12722
12723static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
12724				    unsigned int res)
12725{
12726	switch (res >> 26) {
12727	case ALC880_HP_EVENT:
12728		alc268_aspire_one_speaker_automute(codec);
12729		break;
12730	case ALC880_MIC_EVENT:
12731		alc_mic_automute(codec);
12732		break;
12733	}
12734}
12735
12736static void alc268_acer_lc_setup(struct hda_codec *codec)
12737{
12738	struct alc_spec *spec = codec->spec;
12739	spec->ext_mic.pin = 0x18;
12740	spec->ext_mic.mux_idx = 0;
12741	spec->int_mic.pin = 0x12;
12742	spec->int_mic.mux_idx = 6;
12743	spec->auto_mic = 1;
12744}
12745
12746static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12747{
12748	alc268_aspire_one_speaker_automute(codec);
12749	alc_mic_automute(codec);
12750}
12751
12752static struct snd_kcontrol_new alc268_dell_mixer[] = {
12753	/* output mixer control */
12754	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12755	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12756	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12757	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12758	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12759	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12760	{ }
12761};
12762
12763static struct hda_verb alc268_dell_verbs[] = {
12764	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12765	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12766	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12767	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12768	{ }
12769};
12770
12771/* mute/unmute internal speaker according to the hp jack and mute state */
12772static void alc268_dell_setup(struct hda_codec *codec)
12773{
12774	struct alc_spec *spec = codec->spec;
12775
12776	spec->autocfg.hp_pins[0] = 0x15;
12777	spec->autocfg.speaker_pins[0] = 0x14;
12778	spec->ext_mic.pin = 0x18;
12779	spec->ext_mic.mux_idx = 0;
12780	spec->int_mic.pin = 0x19;
12781	spec->int_mic.mux_idx = 1;
12782	spec->auto_mic = 1;
12783}
12784
12785static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12786	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12787	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12788	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12789	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12790	HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12791	HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12792	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12793	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12794	{ }
12795};
12796
12797static struct hda_verb alc267_quanta_il1_verbs[] = {
12798	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12799	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12800	{ }
12801};
12802
12803static void alc267_quanta_il1_setup(struct hda_codec *codec)
12804{
12805	struct alc_spec *spec = codec->spec;
12806	spec->autocfg.hp_pins[0] = 0x15;
12807	spec->autocfg.speaker_pins[0] = 0x14;
12808	spec->ext_mic.pin = 0x18;
12809	spec->ext_mic.mux_idx = 0;
12810	spec->int_mic.pin = 0x19;
12811	spec->int_mic.mux_idx = 1;
12812	spec->auto_mic = 1;
12813}
12814
12815/*
12816 * generic initialization of ADC, input mixers and output mixers
12817 */
12818static struct hda_verb alc268_base_init_verbs[] = {
12819	/* Unmute DAC0-1 and set vol = 0 */
12820	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12821	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12822
12823	/*
12824	 * Set up output mixers (0x0c - 0x0e)
12825	 */
12826	/* set vol=0 to output mixers */
12827	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12828        {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
12829
12830	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12831	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12832
12833	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12834	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
12835	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12836	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12837	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12838	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12839	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12840	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12841
12842	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12843	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12844	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12845	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12846	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12847
12848	/* set PCBEEP vol = 0, mute connections */
12849	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12850	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12851	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12852
12853	/* Unmute Selector 23h,24h and set the default input to mic-in */
12854
12855	{0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
12856	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12857	{0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
12858	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12859
12860	{ }
12861};
12862
12863/*
12864 * generic initialization of ADC, input mixers and output mixers
12865 */
12866static struct hda_verb alc268_volume_init_verbs[] = {
12867	/* set output DAC */
12868	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12869	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12870
12871	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12872	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12873	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12874	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12875	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12876
12877	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12878	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12879	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12880
12881	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12882	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12883
12884	/* set PCBEEP vol = 0, mute connections */
12885	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12886	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12887	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12888
12889	{ }
12890};
12891
12892static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
12893	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12894	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12895	{ } /* end */
12896};
12897
12898static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
12899	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12900	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12901	_DEFINE_CAPSRC(1),
12902	{ } /* end */
12903};
12904
12905static struct snd_kcontrol_new alc268_capture_mixer[] = {
12906	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12907	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12908	HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
12909	HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
12910	_DEFINE_CAPSRC(2),
12911	{ } /* end */
12912};
12913
12914static struct hda_input_mux alc268_capture_source = {
12915	.num_items = 4,
12916	.items = {
12917		{ "Mic", 0x0 },
12918		{ "Front Mic", 0x1 },
12919		{ "Line", 0x2 },
12920		{ "CD", 0x3 },
12921	},
12922};
12923
12924static struct hda_input_mux alc268_acer_capture_source = {
12925	.num_items = 3,
12926	.items = {
12927		{ "Mic", 0x0 },
12928		{ "Internal Mic", 0x1 },
12929		{ "Line", 0x2 },
12930	},
12931};
12932
12933static struct hda_input_mux alc268_acer_dmic_capture_source = {
12934	.num_items = 3,
12935	.items = {
12936		{ "Mic", 0x0 },
12937		{ "Internal Mic", 0x6 },
12938		{ "Line", 0x2 },
12939	},
12940};
12941
12942#ifdef CONFIG_SND_DEBUG
12943static struct snd_kcontrol_new alc268_test_mixer[] = {
12944	/* Volume widgets */
12945	HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12946	HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12947	HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
12948	HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
12949	HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
12950	HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
12951	HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
12952	HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
12953	HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
12954	HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
12955	HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
12956	HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
12957	HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
12958	/* The below appears problematic on some hardwares */
12959	/*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
12960	HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12961	HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
12962	HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
12963	HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
12964
12965	/* Modes for retasking pin widgets */
12966	ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
12967	ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
12968	ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
12969	ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
12970
12971	/* Controls for GPIO pins, assuming they are configured as outputs */
12972	ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
12973	ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
12974	ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
12975	ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
12976
12977	/* Switches to allow the digital SPDIF output pin to be enabled.
12978	 * The ALC268 does not have an SPDIF input.
12979	 */
12980	ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
12981
12982	/* A switch allowing EAPD to be enabled.  Some laptops seem to use
12983	 * this output to turn on an external amplifier.
12984	 */
12985	ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
12986	ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
12987
12988	{ } /* end */
12989};
12990#endif
12991
12992/* create input playback/capture controls for the given pin */
12993static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
12994				    const char *ctlname, int idx)
12995{
12996	hda_nid_t dac;
12997	int err;
12998
12999	switch (nid) {
13000	case 0x14:
13001	case 0x16:
13002		dac = 0x02;
13003		break;
13004	case 0x15:
13005	case 0x21: /* ALC269vb has this pin, too */
13006		dac = 0x03;
13007		break;
13008	default:
13009		return 0;
13010	}
13011	if (spec->multiout.dac_nids[0] != dac &&
13012	    spec->multiout.dac_nids[1] != dac) {
13013		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
13014				  HDA_COMPOSE_AMP_VAL(dac, 3, idx,
13015						      HDA_OUTPUT));
13016		if (err < 0)
13017			return err;
13018		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
13019	}
13020
13021	if (nid != 0x16)
13022		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
13023			  HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
13024	else /* mono */
13025		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
13026			  HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
13027	if (err < 0)
13028		return err;
13029	return 0;
13030}
13031
13032/* add playback controls from the parsed DAC table */
13033static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
13034					     const struct auto_pin_cfg *cfg)
13035{
13036	hda_nid_t nid;
13037	int err;
13038
13039	spec->multiout.dac_nids = spec->private_dac_nids;
13040
13041	nid = cfg->line_out_pins[0];
13042	if (nid) {
13043		const char *name;
13044		if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
13045			name = "Speaker";
13046		else
13047			name = "Front";
13048		err = alc268_new_analog_output(spec, nid, name, 0);
13049		if (err < 0)
13050			return err;
13051	}
13052
13053	nid = cfg->speaker_pins[0];
13054	if (nid == 0x1d) {
13055		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
13056				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
13057		if (err < 0)
13058			return err;
13059	} else {
13060		err = alc268_new_analog_output(spec, nid, "Speaker", 0);
13061		if (err < 0)
13062			return err;
13063	}
13064	nid = cfg->hp_pins[0];
13065	if (nid) {
13066		err = alc268_new_analog_output(spec, nid, "Headphone", 0);
13067		if (err < 0)
13068			return err;
13069	}
13070
13071	nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
13072	if (nid == 0x16) {
13073		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
13074				  HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
13075		if (err < 0)
13076			return err;
13077	}
13078	return 0;
13079}
13080
13081/* create playback/capture controls for input pins */
13082static int alc268_auto_create_input_ctls(struct hda_codec *codec,
13083						const struct auto_pin_cfg *cfg)
13084{
13085	return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
13086}
13087
13088static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
13089					      hda_nid_t nid, int pin_type)
13090{
13091	int idx;
13092
13093	alc_set_pin_output(codec, nid, pin_type);
13094	if (nid == 0x14 || nid == 0x16)
13095		idx = 0;
13096	else
13097		idx = 1;
13098	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
13099}
13100
13101static void alc268_auto_init_multi_out(struct hda_codec *codec)
13102{
13103	struct alc_spec *spec = codec->spec;
13104	hda_nid_t nid = spec->autocfg.line_out_pins[0];
13105	if (nid) {
13106		int pin_type = get_pin_type(spec->autocfg.line_out_type);
13107		alc268_auto_set_output_and_unmute(codec, nid, pin_type);
13108	}
13109}
13110
13111static void alc268_auto_init_hp_out(struct hda_codec *codec)
13112{
13113	struct alc_spec *spec = codec->spec;
13114	hda_nid_t pin;
13115
13116	pin = spec->autocfg.hp_pins[0];
13117	if (pin)
13118		alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
13119	pin = spec->autocfg.speaker_pins[0];
13120	if (pin)
13121		alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
13122}
13123
13124static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
13125{
13126	struct alc_spec *spec = codec->spec;
13127	hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
13128	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
13129	hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
13130	unsigned int	dac_vol1, dac_vol2;
13131
13132	if (line_nid == 0x1d || speaker_nid == 0x1d) {
13133		snd_hda_codec_write(codec, speaker_nid, 0,
13134				    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
13135		/* mute mixer inputs from 0x1d */
13136		snd_hda_codec_write(codec, 0x0f, 0,
13137				    AC_VERB_SET_AMP_GAIN_MUTE,
13138				    AMP_IN_UNMUTE(1));
13139		snd_hda_codec_write(codec, 0x10, 0,
13140				    AC_VERB_SET_AMP_GAIN_MUTE,
13141				    AMP_IN_UNMUTE(1));
13142	} else {
13143		/* unmute mixer inputs from 0x1d */
13144		snd_hda_codec_write(codec, 0x0f, 0,
13145				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13146		snd_hda_codec_write(codec, 0x10, 0,
13147				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13148	}
13149
13150	dac_vol1 = dac_vol2 = 0xb000 | 0x40;	/* set max volume  */
13151	if (line_nid == 0x14)
13152		dac_vol2 = AMP_OUT_ZERO;
13153	else if (line_nid == 0x15)
13154		dac_vol1 = AMP_OUT_ZERO;
13155	if (hp_nid == 0x14)
13156		dac_vol2 = AMP_OUT_ZERO;
13157	else if (hp_nid == 0x15)
13158		dac_vol1 = AMP_OUT_ZERO;
13159	if (line_nid != 0x16 || hp_nid != 0x16 ||
13160	    spec->autocfg.line_out_pins[1] != 0x16 ||
13161	    spec->autocfg.line_out_pins[2] != 0x16)
13162		dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
13163
13164	snd_hda_codec_write(codec, 0x02, 0,
13165			    AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
13166	snd_hda_codec_write(codec, 0x03, 0,
13167			    AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
13168}
13169
13170/* pcm configuration: identical with ALC880 */
13171#define alc268_pcm_analog_playback	alc880_pcm_analog_playback
13172#define alc268_pcm_analog_capture	alc880_pcm_analog_capture
13173#define alc268_pcm_analog_alt_capture	alc880_pcm_analog_alt_capture
13174#define alc268_pcm_digital_playback	alc880_pcm_digital_playback
13175
13176/*
13177 * BIOS auto configuration
13178 */
13179static int alc268_parse_auto_config(struct hda_codec *codec)
13180{
13181	struct alc_spec *spec = codec->spec;
13182	int err;
13183	static hda_nid_t alc268_ignore[] = { 0 };
13184
13185	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13186					   alc268_ignore);
13187	if (err < 0)
13188		return err;
13189	if (!spec->autocfg.line_outs) {
13190		if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
13191			spec->multiout.max_channels = 2;
13192			spec->no_analog = 1;
13193			goto dig_only;
13194		}
13195		return 0; /* can't find valid BIOS pin config */
13196	}
13197	err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
13198	if (err < 0)
13199		return err;
13200	err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
13201	if (err < 0)
13202		return err;
13203
13204	spec->multiout.max_channels = 2;
13205
13206 dig_only:
13207	/* digital only support output */
13208	if (spec->autocfg.dig_outs) {
13209		spec->multiout.dig_out_nid = ALC268_DIGOUT_NID;
13210		spec->dig_out_type = spec->autocfg.dig_out_type[0];
13211	}
13212	if (spec->kctls.list)
13213		add_mixer(spec, spec->kctls.list);
13214
13215	if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
13216		add_mixer(spec, alc268_beep_mixer);
13217
13218	add_verb(spec, alc268_volume_init_verbs);
13219	spec->num_mux_defs = 2;
13220	spec->input_mux = &spec->private_imux[0];
13221
13222	err = alc_auto_add_mic_boost(codec);
13223	if (err < 0)
13224		return err;
13225
13226	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
13227
13228	return 1;
13229}
13230
13231#define alc268_auto_init_analog_input	alc882_auto_init_analog_input
13232
13233/* init callback for auto-configuration model -- overriding the default init */
13234static void alc268_auto_init(struct hda_codec *codec)
13235{
13236	struct alc_spec *spec = codec->spec;
13237	alc268_auto_init_multi_out(codec);
13238	alc268_auto_init_hp_out(codec);
13239	alc268_auto_init_mono_speaker_out(codec);
13240	alc268_auto_init_analog_input(codec);
13241	if (spec->unsol_event)
13242		alc_inithook(codec);
13243}
13244
13245/*
13246 * configuration and preset
13247 */
13248static const char *alc268_models[ALC268_MODEL_LAST] = {
13249	[ALC267_QUANTA_IL1]	= "quanta-il1",
13250	[ALC268_3ST]		= "3stack",
13251	[ALC268_TOSHIBA]	= "toshiba",
13252	[ALC268_ACER]		= "acer",
13253	[ALC268_ACER_DMIC]	= "acer-dmic",
13254	[ALC268_ACER_ASPIRE_ONE]	= "acer-aspire",
13255	[ALC268_DELL]		= "dell",
13256	[ALC268_ZEPTO]		= "zepto",
13257#ifdef CONFIG_SND_DEBUG
13258	[ALC268_TEST]		= "test",
13259#endif
13260	[ALC268_AUTO]		= "auto",
13261};
13262
13263static struct snd_pci_quirk alc268_cfg_tbl[] = {
13264	SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
13265	SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
13266	SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
13267	SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
13268	SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
13269	SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
13270						ALC268_ACER_ASPIRE_ONE),
13271	SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
13272	SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
13273			"Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
13274	/* almost compatible with toshiba but with optional digital outs;
13275	 * auto-probing seems working fine
13276	 */
13277	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
13278			   ALC268_AUTO),
13279	SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
13280	SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
13281	SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
13282	SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
13283	SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
13284	SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
13285	{}
13286};
13287
13288/* Toshiba laptops have no unique PCI SSID but only codec SSID */
13289static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
13290	SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
13291	SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
13292	SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
13293			   ALC268_TOSHIBA),
13294	{}
13295};
13296
13297static struct alc_config_preset alc268_presets[] = {
13298	[ALC267_QUANTA_IL1] = {
13299		.mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
13300			    alc268_capture_nosrc_mixer },
13301		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13302				alc267_quanta_il1_verbs },
13303		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13304		.dac_nids = alc268_dac_nids,
13305		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13306		.adc_nids = alc268_adc_nids_alt,
13307		.hp_nid = 0x03,
13308		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13309		.channel_mode = alc268_modes,
13310		.unsol_event = alc_sku_unsol_event,
13311		.setup = alc267_quanta_il1_setup,
13312		.init_hook = alc_inithook,
13313	},
13314	[ALC268_3ST] = {
13315		.mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13316			    alc268_beep_mixer },
13317		.init_verbs = { alc268_base_init_verbs },
13318		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13319		.dac_nids = alc268_dac_nids,
13320                .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13321                .adc_nids = alc268_adc_nids_alt,
13322		.capsrc_nids = alc268_capsrc_nids,
13323		.hp_nid = 0x03,
13324		.dig_out_nid = ALC268_DIGOUT_NID,
13325		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13326		.channel_mode = alc268_modes,
13327		.input_mux = &alc268_capture_source,
13328	},
13329	[ALC268_TOSHIBA] = {
13330		.mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
13331			    alc268_beep_mixer },
13332		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13333				alc268_toshiba_verbs },
13334		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13335		.dac_nids = alc268_dac_nids,
13336		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13337		.adc_nids = alc268_adc_nids_alt,
13338		.capsrc_nids = alc268_capsrc_nids,
13339		.hp_nid = 0x03,
13340		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13341		.channel_mode = alc268_modes,
13342		.input_mux = &alc268_capture_source,
13343		.unsol_event = alc268_toshiba_unsol_event,
13344		.setup = alc268_toshiba_setup,
13345		.init_hook = alc268_toshiba_automute,
13346	},
13347	[ALC268_ACER] = {
13348		.mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
13349			    alc268_beep_mixer },
13350		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13351				alc268_acer_verbs },
13352		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13353		.dac_nids = alc268_dac_nids,
13354		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13355		.adc_nids = alc268_adc_nids_alt,
13356		.capsrc_nids = alc268_capsrc_nids,
13357		.hp_nid = 0x02,
13358		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13359		.channel_mode = alc268_modes,
13360		.input_mux = &alc268_acer_capture_source,
13361		.unsol_event = alc268_acer_unsol_event,
13362		.init_hook = alc268_acer_init_hook,
13363	},
13364	[ALC268_ACER_DMIC] = {
13365		.mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
13366			    alc268_beep_mixer },
13367		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13368				alc268_acer_verbs },
13369		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13370		.dac_nids = alc268_dac_nids,
13371		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13372		.adc_nids = alc268_adc_nids_alt,
13373		.capsrc_nids = alc268_capsrc_nids,
13374		.hp_nid = 0x02,
13375		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13376		.channel_mode = alc268_modes,
13377		.input_mux = &alc268_acer_dmic_capture_source,
13378		.unsol_event = alc268_acer_unsol_event,
13379		.init_hook = alc268_acer_init_hook,
13380	},
13381	[ALC268_ACER_ASPIRE_ONE] = {
13382		.mixers = { alc268_acer_aspire_one_mixer,
13383			    alc268_beep_mixer,
13384			    alc268_capture_nosrc_mixer },
13385		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13386				alc268_acer_aspire_one_verbs },
13387		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13388		.dac_nids = alc268_dac_nids,
13389		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13390		.adc_nids = alc268_adc_nids_alt,
13391		.capsrc_nids = alc268_capsrc_nids,
13392		.hp_nid = 0x03,
13393		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13394		.channel_mode = alc268_modes,
13395		.unsol_event = alc268_acer_lc_unsol_event,
13396		.setup = alc268_acer_lc_setup,
13397		.init_hook = alc268_acer_lc_init_hook,
13398	},
13399	[ALC268_DELL] = {
13400		.mixers = { alc268_dell_mixer, alc268_beep_mixer,
13401			    alc268_capture_nosrc_mixer },
13402		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13403				alc268_dell_verbs },
13404		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13405		.dac_nids = alc268_dac_nids,
13406		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13407		.adc_nids = alc268_adc_nids_alt,
13408		.capsrc_nids = alc268_capsrc_nids,
13409		.hp_nid = 0x02,
13410		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13411		.channel_mode = alc268_modes,
13412		.unsol_event = alc_sku_unsol_event,
13413		.setup = alc268_dell_setup,
13414		.init_hook = alc_inithook,
13415	},
13416	[ALC268_ZEPTO] = {
13417		.mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13418			    alc268_beep_mixer },
13419		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13420				alc268_toshiba_verbs },
13421		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13422		.dac_nids = alc268_dac_nids,
13423		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13424		.adc_nids = alc268_adc_nids_alt,
13425		.capsrc_nids = alc268_capsrc_nids,
13426		.hp_nid = 0x03,
13427		.dig_out_nid = ALC268_DIGOUT_NID,
13428		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13429		.channel_mode = alc268_modes,
13430		.input_mux = &alc268_capture_source,
13431		.setup = alc268_toshiba_setup,
13432		.init_hook = alc268_toshiba_automute,
13433	},
13434#ifdef CONFIG_SND_DEBUG
13435	[ALC268_TEST] = {
13436		.mixers = { alc268_test_mixer, alc268_capture_mixer },
13437		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13438				alc268_volume_init_verbs },
13439		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13440		.dac_nids = alc268_dac_nids,
13441		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13442		.adc_nids = alc268_adc_nids_alt,
13443		.capsrc_nids = alc268_capsrc_nids,
13444		.hp_nid = 0x03,
13445		.dig_out_nid = ALC268_DIGOUT_NID,
13446		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13447		.channel_mode = alc268_modes,
13448		.input_mux = &alc268_capture_source,
13449	},
13450#endif
13451};
13452
13453static int patch_alc268(struct hda_codec *codec)
13454{
13455	struct alc_spec *spec;
13456	int board_config;
13457	int i, has_beep, err;
13458
13459	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13460	if (spec == NULL)
13461		return -ENOMEM;
13462
13463	codec->spec = spec;
13464
13465	board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
13466						  alc268_models,
13467						  alc268_cfg_tbl);
13468
13469	if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
13470		board_config = snd_hda_check_board_codec_sid_config(codec,
13471			ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
13472
13473	if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
13474		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13475		       codec->chip_name);
13476		board_config = ALC268_AUTO;
13477	}
13478
13479	if (board_config == ALC268_AUTO) {
13480		/* automatic parse from the BIOS config */
13481		err = alc268_parse_auto_config(codec);
13482		if (err < 0) {
13483			alc_free(codec);
13484			return err;
13485		} else if (!err) {
13486			printk(KERN_INFO
13487			       "hda_codec: Cannot set up configuration "
13488			       "from BIOS.  Using base mode...\n");
13489			board_config = ALC268_3ST;
13490		}
13491	}
13492
13493	if (board_config != ALC268_AUTO)
13494		setup_preset(codec, &alc268_presets[board_config]);
13495
13496	spec->stream_analog_playback = &alc268_pcm_analog_playback;
13497	spec->stream_analog_capture = &alc268_pcm_analog_capture;
13498	spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
13499
13500	spec->stream_digital_playback = &alc268_pcm_digital_playback;
13501
13502	has_beep = 0;
13503	for (i = 0; i < spec->num_mixers; i++) {
13504		if (spec->mixers[i] == alc268_beep_mixer) {
13505			has_beep = 1;
13506			break;
13507		}
13508	}
13509
13510	if (has_beep) {
13511		err = snd_hda_attach_beep_device(codec, 0x1);
13512		if (err < 0) {
13513			alc_free(codec);
13514			return err;
13515		}
13516		if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
13517			/* override the amp caps for beep generator */
13518			snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
13519					  (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
13520					  (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
13521					  (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
13522					  (0 << AC_AMPCAP_MUTE_SHIFT));
13523	}
13524
13525	if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
13526		/* check whether NID 0x07 is valid */
13527		unsigned int wcap = get_wcaps(codec, 0x07);
13528		int i;
13529
13530		spec->capsrc_nids = alc268_capsrc_nids;
13531		/* get type */
13532		wcap = get_wcaps_type(wcap);
13533		if (spec->auto_mic ||
13534		    wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
13535			spec->adc_nids = alc268_adc_nids_alt;
13536			spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
13537			if (spec->auto_mic)
13538				fixup_automic_adc(codec);
13539			if (spec->auto_mic || spec->input_mux->num_items == 1)
13540				add_mixer(spec, alc268_capture_nosrc_mixer);
13541			else
13542				add_mixer(spec, alc268_capture_alt_mixer);
13543		} else {
13544			spec->adc_nids = alc268_adc_nids;
13545			spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
13546			add_mixer(spec, alc268_capture_mixer);
13547		}
13548		/* set default input source */
13549		for (i = 0; i < spec->num_adc_nids; i++)
13550			snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
13551				0, AC_VERB_SET_CONNECT_SEL,
13552				i < spec->num_mux_defs ?
13553				spec->input_mux[i].items[0].index :
13554				spec->input_mux->items[0].index);
13555	}
13556
13557	spec->vmaster_nid = 0x02;
13558
13559	codec->patch_ops = alc_patch_ops;
13560	if (board_config == ALC268_AUTO)
13561		spec->init_hook = alc268_auto_init;
13562
13563	return 0;
13564}
13565
13566/*
13567 *  ALC269 channel source setting (2 channel)
13568 */
13569#define ALC269_DIGOUT_NID	ALC880_DIGOUT_NID
13570
13571#define alc269_dac_nids		alc260_dac_nids
13572
13573static hda_nid_t alc269_adc_nids[1] = {
13574	/* ADC1 */
13575	0x08,
13576};
13577
13578static hda_nid_t alc269_capsrc_nids[1] = {
13579	0x23,
13580};
13581
13582static hda_nid_t alc269vb_adc_nids[1] = {
13583	/* ADC1 */
13584	0x09,
13585};
13586
13587static hda_nid_t alc269vb_capsrc_nids[1] = {
13588	0x22,
13589};
13590
13591static hda_nid_t alc269_adc_candidates[] = {
13592	0x08, 0x09, 0x07,
13593};
13594
13595#define alc269_modes		alc260_modes
13596#define alc269_capture_source	alc880_lg_lw_capture_source
13597
13598static struct snd_kcontrol_new alc269_base_mixer[] = {
13599	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13600	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13601	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
13602	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
13603	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13604	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13605	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13606	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13607	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13608	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
13609	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13610	HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
13611	{ } /* end */
13612};
13613
13614static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
13615	/* output mixer control */
13616	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13617	{
13618		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13619		.name = "Master Playback Switch",
13620		.subdevice = HDA_SUBDEV_AMP_FLAG,
13621		.info = snd_hda_mixer_amp_switch_info,
13622		.get = snd_hda_mixer_amp_switch_get,
13623		.put = alc268_acer_master_sw_put,
13624		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13625	},
13626	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13627	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13628	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13629	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13630	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13631	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13632	{ }
13633};
13634
13635static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
13636	/* output mixer control */
13637	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13638	{
13639		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13640		.name = "Master Playback Switch",
13641		.subdevice = HDA_SUBDEV_AMP_FLAG,
13642		.info = snd_hda_mixer_amp_switch_info,
13643		.get = snd_hda_mixer_amp_switch_get,
13644		.put = alc268_acer_master_sw_put,
13645		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13646	},
13647	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13648	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13649	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13650	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13651	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13652	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13653	HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
13654	HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
13655	HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
13656	{ }
13657};
13658
13659static struct snd_kcontrol_new alc269_laptop_mixer[] = {
13660	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13661	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13662	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13663	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13664	{ } /* end */
13665};
13666
13667static struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
13668	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13669	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13670	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
13671	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13672	{ } /* end */
13673};
13674
13675/* capture mixer elements */
13676static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
13677	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13678	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13679	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13680	HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13681	{ } /* end */
13682};
13683
13684static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
13685	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13686	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13687	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13688	{ } /* end */
13689};
13690
13691static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
13692	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13693	HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13694	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13695	HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13696	{ } /* end */
13697};
13698
13699static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
13700	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13701	HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13702	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13703	{ } /* end */
13704};
13705
13706/* FSC amilo */
13707#define alc269_fujitsu_mixer	alc269_laptop_mixer
13708
13709static struct hda_verb alc269_quanta_fl1_verbs[] = {
13710	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13711	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13712	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13713	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13714	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13715	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13716	{ }
13717};
13718
13719static struct hda_verb alc269_lifebook_verbs[] = {
13720	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13721	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
13722	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13723	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13724	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13725	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13726	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13727	{0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13728	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13729	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13730	{ }
13731};
13732
13733/* toggle speaker-output according to the hp-jack state */
13734static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
13735{
13736	unsigned int present;
13737	unsigned char bits;
13738
13739	present = snd_hda_jack_detect(codec, 0x15);
13740	bits = present ? HDA_AMP_MUTE : 0;
13741	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13742				 HDA_AMP_MUTE, bits);
13743	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13744				 HDA_AMP_MUTE, bits);
13745
13746	snd_hda_codec_write(codec, 0x20, 0,
13747			AC_VERB_SET_COEF_INDEX, 0x0c);
13748	snd_hda_codec_write(codec, 0x20, 0,
13749			AC_VERB_SET_PROC_COEF, 0x680);
13750
13751	snd_hda_codec_write(codec, 0x20, 0,
13752			AC_VERB_SET_COEF_INDEX, 0x0c);
13753	snd_hda_codec_write(codec, 0x20, 0,
13754			AC_VERB_SET_PROC_COEF, 0x480);
13755}
13756
13757/* toggle speaker-output according to the hp-jacks state */
13758static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
13759{
13760	unsigned int present;
13761	unsigned char bits;
13762
13763	/* Check laptop headphone socket */
13764	present = snd_hda_jack_detect(codec, 0x15);
13765
13766	/* Check port replicator headphone socket */
13767	present |= snd_hda_jack_detect(codec, 0x1a);
13768
13769	bits = present ? HDA_AMP_MUTE : 0;
13770	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13771				 HDA_AMP_MUTE, bits);
13772	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13773				 HDA_AMP_MUTE, bits);
13774
13775	snd_hda_codec_write(codec, 0x20, 0,
13776			AC_VERB_SET_COEF_INDEX, 0x0c);
13777	snd_hda_codec_write(codec, 0x20, 0,
13778			AC_VERB_SET_PROC_COEF, 0x680);
13779
13780	snd_hda_codec_write(codec, 0x20, 0,
13781			AC_VERB_SET_COEF_INDEX, 0x0c);
13782	snd_hda_codec_write(codec, 0x20, 0,
13783			AC_VERB_SET_PROC_COEF, 0x480);
13784}
13785
13786static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13787{
13788	unsigned int present_laptop;
13789	unsigned int present_dock;
13790
13791	present_laptop	= snd_hda_jack_detect(codec, 0x18);
13792	present_dock	= snd_hda_jack_detect(codec, 0x1b);
13793
13794	/* Laptop mic port overrides dock mic port, design decision */
13795	if (present_dock)
13796		snd_hda_codec_write(codec, 0x23, 0,
13797				AC_VERB_SET_CONNECT_SEL, 0x3);
13798	if (present_laptop)
13799		snd_hda_codec_write(codec, 0x23, 0,
13800				AC_VERB_SET_CONNECT_SEL, 0x0);
13801	if (!present_dock && !present_laptop)
13802		snd_hda_codec_write(codec, 0x23, 0,
13803				AC_VERB_SET_CONNECT_SEL, 0x1);
13804}
13805
13806static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
13807				    unsigned int res)
13808{
13809	switch (res >> 26) {
13810	case ALC880_HP_EVENT:
13811		alc269_quanta_fl1_speaker_automute(codec);
13812		break;
13813	case ALC880_MIC_EVENT:
13814		alc_mic_automute(codec);
13815		break;
13816	}
13817}
13818
13819static void alc269_lifebook_unsol_event(struct hda_codec *codec,
13820					unsigned int res)
13821{
13822	if ((res >> 26) == ALC880_HP_EVENT)
13823		alc269_lifebook_speaker_automute(codec);
13824	if ((res >> 26) == ALC880_MIC_EVENT)
13825		alc269_lifebook_mic_autoswitch(codec);
13826}
13827
13828static void alc269_quanta_fl1_setup(struct hda_codec *codec)
13829{
13830	struct alc_spec *spec = codec->spec;
13831	spec->autocfg.hp_pins[0] = 0x15;
13832	spec->autocfg.speaker_pins[0] = 0x14;
13833	spec->ext_mic.pin = 0x18;
13834	spec->ext_mic.mux_idx = 0;
13835	spec->int_mic.pin = 0x19;
13836	spec->int_mic.mux_idx = 1;
13837	spec->auto_mic = 1;
13838}
13839
13840static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
13841{
13842	alc269_quanta_fl1_speaker_automute(codec);
13843	alc_mic_automute(codec);
13844}
13845
13846static void alc269_lifebook_init_hook(struct hda_codec *codec)
13847{
13848	alc269_lifebook_speaker_automute(codec);
13849	alc269_lifebook_mic_autoswitch(codec);
13850}
13851
13852static struct hda_verb alc269_laptop_dmic_init_verbs[] = {
13853	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13854	{0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
13855	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13856	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13857	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13858	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13859	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13860	{}
13861};
13862
13863static struct hda_verb alc269_laptop_amic_init_verbs[] = {
13864	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13865	{0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
13866	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13867	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
13868	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13869	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13870	{}
13871};
13872
13873static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
13874	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13875	{0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
13876	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13877	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13878	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13879	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13880	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13881	{}
13882};
13883
13884static struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
13885	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13886	{0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
13887	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13888	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13889	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13890	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13891	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13892	{}
13893};
13894
13895/* toggle speaker-output according to the hp-jack state */
13896static void alc269_speaker_automute(struct hda_codec *codec)
13897{
13898	struct alc_spec *spec = codec->spec;
13899	unsigned int nid = spec->autocfg.hp_pins[0];
13900	unsigned int present;
13901	unsigned char bits;
13902
13903	present = snd_hda_jack_detect(codec, nid);
13904	bits = present ? HDA_AMP_MUTE : 0;
13905	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13906				 HDA_AMP_MUTE, bits);
13907	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13908				 HDA_AMP_MUTE, bits);
13909}
13910
13911/* unsolicited event for HP jack sensing */
13912static void alc269_laptop_unsol_event(struct hda_codec *codec,
13913				     unsigned int res)
13914{
13915	switch (res >> 26) {
13916	case ALC880_HP_EVENT:
13917		alc269_speaker_automute(codec);
13918		break;
13919	case ALC880_MIC_EVENT:
13920		alc_mic_automute(codec);
13921		break;
13922	}
13923}
13924
13925static void alc269_laptop_amic_setup(struct hda_codec *codec)
13926{
13927	struct alc_spec *spec = codec->spec;
13928	spec->autocfg.hp_pins[0] = 0x15;
13929	spec->autocfg.speaker_pins[0] = 0x14;
13930	spec->ext_mic.pin = 0x18;
13931	spec->ext_mic.mux_idx = 0;
13932	spec->int_mic.pin = 0x19;
13933	spec->int_mic.mux_idx = 1;
13934	spec->auto_mic = 1;
13935}
13936
13937static void alc269_laptop_dmic_setup(struct hda_codec *codec)
13938{
13939	struct alc_spec *spec = codec->spec;
13940	spec->autocfg.hp_pins[0] = 0x15;
13941	spec->autocfg.speaker_pins[0] = 0x14;
13942	spec->ext_mic.pin = 0x18;
13943	spec->ext_mic.mux_idx = 0;
13944	spec->int_mic.pin = 0x12;
13945	spec->int_mic.mux_idx = 5;
13946	spec->auto_mic = 1;
13947}
13948
13949static void alc269vb_laptop_amic_setup(struct hda_codec *codec)
13950{
13951	struct alc_spec *spec = codec->spec;
13952	spec->autocfg.hp_pins[0] = 0x21;
13953	spec->autocfg.speaker_pins[0] = 0x14;
13954	spec->ext_mic.pin = 0x18;
13955	spec->ext_mic.mux_idx = 0;
13956	spec->int_mic.pin = 0x19;
13957	spec->int_mic.mux_idx = 1;
13958	spec->auto_mic = 1;
13959}
13960
13961static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
13962{
13963	struct alc_spec *spec = codec->spec;
13964	spec->autocfg.hp_pins[0] = 0x21;
13965	spec->autocfg.speaker_pins[0] = 0x14;
13966	spec->ext_mic.pin = 0x18;
13967	spec->ext_mic.mux_idx = 0;
13968	spec->int_mic.pin = 0x12;
13969	spec->int_mic.mux_idx = 6;
13970	spec->auto_mic = 1;
13971}
13972
13973static void alc269_laptop_inithook(struct hda_codec *codec)
13974{
13975	alc269_speaker_automute(codec);
13976	alc_mic_automute(codec);
13977}
13978
13979/*
13980 * generic initialization of ADC, input mixers and output mixers
13981 */
13982static struct hda_verb alc269_init_verbs[] = {
13983	/*
13984	 * Unmute ADC0 and set the default input to mic-in
13985	 */
13986	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13987
13988	/*
13989	 * Set up output mixers (0x02 - 0x03)
13990	 */
13991	/* set vol=0 to output mixers */
13992	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13993	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13994
13995	/* set up input amps for analog loopback */
13996	/* Amp Indices: DAC = 0, mixer = 1 */
13997	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13998	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13999	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14000	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14001	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14002	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14003
14004	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14005	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14006	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14007	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14008	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14009	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14010	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14011
14012	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14013	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14014
14015	/* FIXME: use Mux-type input source selection */
14016	/* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14017	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14018	{0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
14019
14020	/* set EAPD */
14021	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14022	{ }
14023};
14024
14025static struct hda_verb alc269vb_init_verbs[] = {
14026	/*
14027	 * Unmute ADC0 and set the default input to mic-in
14028	 */
14029	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14030
14031	/*
14032	 * Set up output mixers (0x02 - 0x03)
14033	 */
14034	/* set vol=0 to output mixers */
14035	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14036	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14037
14038	/* set up input amps for analog loopback */
14039	/* Amp Indices: DAC = 0, mixer = 1 */
14040	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14041	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14042	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14043	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14044	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14045	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14046
14047	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14048	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14049	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14050	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14051	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14052	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14053	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14054
14055	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14056	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14057
14058	/* FIXME: use Mux-type input source selection */
14059	/* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14060	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14061	{0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
14062
14063	/* set EAPD */
14064	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14065	{ }
14066};
14067
14068#define alc269_auto_create_multi_out_ctls \
14069	alc268_auto_create_multi_out_ctls
14070#define alc269_auto_create_input_ctls \
14071	alc268_auto_create_input_ctls
14072
14073#ifdef CONFIG_SND_HDA_POWER_SAVE
14074#define alc269_loopbacks	alc880_loopbacks
14075#endif
14076
14077/* pcm configuration: identical with ALC880 */
14078#define alc269_pcm_analog_playback	alc880_pcm_analog_playback
14079#define alc269_pcm_analog_capture	alc880_pcm_analog_capture
14080#define alc269_pcm_digital_playback	alc880_pcm_digital_playback
14081#define alc269_pcm_digital_capture	alc880_pcm_digital_capture
14082
14083static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
14084	.substreams = 1,
14085	.channels_min = 2,
14086	.channels_max = 8,
14087	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14088	/* NID is set in alc_build_pcms */
14089	.ops = {
14090		.open = alc880_playback_pcm_open,
14091		.prepare = alc880_playback_pcm_prepare,
14092		.cleanup = alc880_playback_pcm_cleanup
14093	},
14094};
14095
14096static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
14097	.substreams = 1,
14098	.channels_min = 2,
14099	.channels_max = 2,
14100	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14101	/* NID is set in alc_build_pcms */
14102};
14103
14104#ifdef CONFIG_SND_HDA_POWER_SAVE
14105static int alc269_mic2_for_mute_led(struct hda_codec *codec)
14106{
14107	switch (codec->subsystem_id) {
14108	case 0x103c1586:
14109		return 1;
14110	}
14111	return 0;
14112}
14113
14114static int alc269_mic2_mute_check_ps(struct hda_codec *codec, hda_nid_t nid)
14115{
14116	/* update mute-LED according to the speaker mute state */
14117	if (nid == 0x01 || nid == 0x14) {
14118		int pinval;
14119		if (snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0) &
14120		    HDA_AMP_MUTE)
14121			pinval = 0x24;
14122		else
14123			pinval = 0x20;
14124		/* mic2 vref pin is used for mute LED control */
14125		snd_hda_codec_update_cache(codec, 0x19, 0,
14126					   AC_VERB_SET_PIN_WIDGET_CONTROL,
14127					   pinval);
14128	}
14129	return alc_check_power_status(codec, nid);
14130}
14131#endif /* CONFIG_SND_HDA_POWER_SAVE */
14132
14133/*
14134 * BIOS auto configuration
14135 */
14136static int alc269_parse_auto_config(struct hda_codec *codec)
14137{
14138	struct alc_spec *spec = codec->spec;
14139	int err;
14140	static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
14141
14142	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14143					   alc269_ignore);
14144	if (err < 0)
14145		return err;
14146
14147	err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
14148	if (err < 0)
14149		return err;
14150	err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
14151	if (err < 0)
14152		return err;
14153
14154	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
14155
14156	if (spec->autocfg.dig_outs)
14157		spec->multiout.dig_out_nid = ALC269_DIGOUT_NID;
14158
14159	if (spec->kctls.list)
14160		add_mixer(spec, spec->kctls.list);
14161
14162	if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010) {
14163		add_verb(spec, alc269vb_init_verbs);
14164		alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21);
14165	} else {
14166		add_verb(spec, alc269_init_verbs);
14167		alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
14168	}
14169
14170	spec->num_mux_defs = 1;
14171	spec->input_mux = &spec->private_imux[0];
14172	fillup_priv_adc_nids(codec, alc269_adc_candidates,
14173			     sizeof(alc269_adc_candidates));
14174
14175	/* set default input source */
14176	snd_hda_codec_write_cache(codec, spec->capsrc_nids[0],
14177				  0, AC_VERB_SET_CONNECT_SEL,
14178				  spec->input_mux->items[0].index);
14179
14180	err = alc_auto_add_mic_boost(codec);
14181	if (err < 0)
14182		return err;
14183
14184	if (!spec->cap_mixer && !spec->no_analog)
14185		set_capture_mixer(codec);
14186
14187	return 1;
14188}
14189
14190#define alc269_auto_init_multi_out	alc268_auto_init_multi_out
14191#define alc269_auto_init_hp_out		alc268_auto_init_hp_out
14192#define alc269_auto_init_analog_input	alc882_auto_init_analog_input
14193
14194
14195/* init callback for auto-configuration model -- overriding the default init */
14196static void alc269_auto_init(struct hda_codec *codec)
14197{
14198	struct alc_spec *spec = codec->spec;
14199	alc269_auto_init_multi_out(codec);
14200	alc269_auto_init_hp_out(codec);
14201	alc269_auto_init_analog_input(codec);
14202	if (spec->unsol_event)
14203		alc_inithook(codec);
14204}
14205
14206enum {
14207	ALC269_FIXUP_SONY_VAIO,
14208};
14209
14210static const struct hda_verb alc269_sony_vaio_fixup_verbs[] = {
14211	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
14212	{}
14213};
14214
14215static const struct alc_fixup alc269_fixups[] = {
14216	[ALC269_FIXUP_SONY_VAIO] = {
14217		.verbs = alc269_sony_vaio_fixup_verbs
14218	},
14219};
14220
14221static struct snd_pci_quirk alc269_fixup_tbl[] = {
14222	SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
14223	{}
14224};
14225
14226
14227/*
14228 * configuration and preset
14229 */
14230static const char *alc269_models[ALC269_MODEL_LAST] = {
14231	[ALC269_BASIC]			= "basic",
14232	[ALC269_QUANTA_FL1]		= "quanta",
14233	[ALC269_AMIC]			= "laptop-amic",
14234	[ALC269_DMIC]			= "laptop-dmic",
14235	[ALC269_FUJITSU]		= "fujitsu",
14236	[ALC269_LIFEBOOK]		= "lifebook",
14237	[ALC269_AUTO]			= "auto",
14238};
14239
14240static struct snd_pci_quirk alc269_cfg_tbl[] = {
14241	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
14242	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
14243		      ALC269_AMIC),
14244	SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
14245	SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
14246	SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
14247	SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
14248	SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
14249	SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
14250	SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
14251	SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
14252	SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
14253	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC),
14254	SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
14255	SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
14256	SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
14257	SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
14258	SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
14259	SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
14260	SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
14261	SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
14262	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
14263	SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
14264	SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
14265	SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
14266	SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
14267	SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
14268	SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
14269	SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
14270	SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
14271	SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
14272	SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
14273	SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
14274	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
14275	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
14276	SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
14277	SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
14278	SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
14279	SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
14280	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
14281		      ALC269_DMIC),
14282	SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
14283		      ALC269_DMIC),
14284	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
14285	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
14286	SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),
14287	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
14288	SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
14289	SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
14290	SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC),
14291	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC),
14292	SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC),
14293	SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC),
14294	{}
14295};
14296
14297static struct alc_config_preset alc269_presets[] = {
14298	[ALC269_BASIC] = {
14299		.mixers = { alc269_base_mixer },
14300		.init_verbs = { alc269_init_verbs },
14301		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14302		.dac_nids = alc269_dac_nids,
14303		.hp_nid = 0x03,
14304		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14305		.channel_mode = alc269_modes,
14306		.input_mux = &alc269_capture_source,
14307	},
14308	[ALC269_QUANTA_FL1] = {
14309		.mixers = { alc269_quanta_fl1_mixer },
14310		.init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
14311		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14312		.dac_nids = alc269_dac_nids,
14313		.hp_nid = 0x03,
14314		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14315		.channel_mode = alc269_modes,
14316		.input_mux = &alc269_capture_source,
14317		.unsol_event = alc269_quanta_fl1_unsol_event,
14318		.setup = alc269_quanta_fl1_setup,
14319		.init_hook = alc269_quanta_fl1_init_hook,
14320	},
14321	[ALC269_AMIC] = {
14322		.mixers = { alc269_laptop_mixer },
14323		.cap_mixer = alc269_laptop_analog_capture_mixer,
14324		.init_verbs = { alc269_init_verbs,
14325				alc269_laptop_amic_init_verbs },
14326		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14327		.dac_nids = alc269_dac_nids,
14328		.hp_nid = 0x03,
14329		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14330		.channel_mode = alc269_modes,
14331		.unsol_event = alc269_laptop_unsol_event,
14332		.setup = alc269_laptop_amic_setup,
14333		.init_hook = alc269_laptop_inithook,
14334	},
14335	[ALC269_DMIC] = {
14336		.mixers = { alc269_laptop_mixer },
14337		.cap_mixer = alc269_laptop_digital_capture_mixer,
14338		.init_verbs = { alc269_init_verbs,
14339				alc269_laptop_dmic_init_verbs },
14340		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14341		.dac_nids = alc269_dac_nids,
14342		.hp_nid = 0x03,
14343		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14344		.channel_mode = alc269_modes,
14345		.unsol_event = alc269_laptop_unsol_event,
14346		.setup = alc269_laptop_dmic_setup,
14347		.init_hook = alc269_laptop_inithook,
14348	},
14349	[ALC269VB_AMIC] = {
14350		.mixers = { alc269vb_laptop_mixer },
14351		.cap_mixer = alc269vb_laptop_analog_capture_mixer,
14352		.init_verbs = { alc269vb_init_verbs,
14353				alc269vb_laptop_amic_init_verbs },
14354		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14355		.dac_nids = alc269_dac_nids,
14356		.hp_nid = 0x03,
14357		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14358		.channel_mode = alc269_modes,
14359		.unsol_event = alc269_laptop_unsol_event,
14360		.setup = alc269vb_laptop_amic_setup,
14361		.init_hook = alc269_laptop_inithook,
14362	},
14363	[ALC269VB_DMIC] = {
14364		.mixers = { alc269vb_laptop_mixer },
14365		.cap_mixer = alc269vb_laptop_digital_capture_mixer,
14366		.init_verbs = { alc269vb_init_verbs,
14367				alc269vb_laptop_dmic_init_verbs },
14368		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14369		.dac_nids = alc269_dac_nids,
14370		.hp_nid = 0x03,
14371		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14372		.channel_mode = alc269_modes,
14373		.unsol_event = alc269_laptop_unsol_event,
14374		.setup = alc269vb_laptop_dmic_setup,
14375		.init_hook = alc269_laptop_inithook,
14376	},
14377	[ALC269_FUJITSU] = {
14378		.mixers = { alc269_fujitsu_mixer },
14379		.cap_mixer = alc269_laptop_digital_capture_mixer,
14380		.init_verbs = { alc269_init_verbs,
14381				alc269_laptop_dmic_init_verbs },
14382		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14383		.dac_nids = alc269_dac_nids,
14384		.hp_nid = 0x03,
14385		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14386		.channel_mode = alc269_modes,
14387		.unsol_event = alc269_laptop_unsol_event,
14388		.setup = alc269_laptop_dmic_setup,
14389		.init_hook = alc269_laptop_inithook,
14390	},
14391	[ALC269_LIFEBOOK] = {
14392		.mixers = { alc269_lifebook_mixer },
14393		.init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
14394		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14395		.dac_nids = alc269_dac_nids,
14396		.hp_nid = 0x03,
14397		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14398		.channel_mode = alc269_modes,
14399		.input_mux = &alc269_capture_source,
14400		.unsol_event = alc269_lifebook_unsol_event,
14401		.init_hook = alc269_lifebook_init_hook,
14402	},
14403};
14404
14405static int patch_alc269(struct hda_codec *codec)
14406{
14407	struct alc_spec *spec;
14408	int board_config;
14409	int err;
14410	int is_alc269vb = 0;
14411
14412	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14413	if (spec == NULL)
14414		return -ENOMEM;
14415
14416	codec->spec = spec;
14417
14418	alc_auto_parse_customize_define(codec);
14419
14420	if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){
14421		if (codec->bus->pci->subsystem_vendor == 0x1025 &&
14422		    spec->cdefine.platform_type == 1)
14423			alc_codec_rename(codec, "ALC271X");
14424		else
14425			alc_codec_rename(codec, "ALC259");
14426		is_alc269vb = 1;
14427	} else
14428		alc_fix_pll_init(codec, 0x20, 0x04, 15);
14429
14430	board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
14431						  alc269_models,
14432						  alc269_cfg_tbl);
14433
14434	if (board_config < 0) {
14435		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14436		       codec->chip_name);
14437		board_config = ALC269_AUTO;
14438	}
14439
14440	if (board_config == ALC269_AUTO)
14441		alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 1);
14442
14443	if (board_config == ALC269_AUTO) {
14444		/* automatic parse from the BIOS config */
14445		err = alc269_parse_auto_config(codec);
14446		if (err < 0) {
14447			alc_free(codec);
14448			return err;
14449		} else if (!err) {
14450			printk(KERN_INFO
14451			       "hda_codec: Cannot set up configuration "
14452			       "from BIOS.  Using base mode...\n");
14453			board_config = ALC269_BASIC;
14454		}
14455	}
14456
14457	err = snd_hda_attach_beep_device(codec, 0x1);
14458	if (err < 0) {
14459		alc_free(codec);
14460		return err;
14461	}
14462
14463	if (board_config != ALC269_AUTO)
14464		setup_preset(codec, &alc269_presets[board_config]);
14465
14466	if (board_config == ALC269_QUANTA_FL1) {
14467		/* Due to a hardware problem on Lenovo Ideadpad, we need to
14468		 * fix the sample rate of analog I/O to 44.1kHz
14469		 */
14470		spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
14471		spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
14472	} else {
14473		spec->stream_analog_playback = &alc269_pcm_analog_playback;
14474		spec->stream_analog_capture = &alc269_pcm_analog_capture;
14475	}
14476	spec->stream_digital_playback = &alc269_pcm_digital_playback;
14477	spec->stream_digital_capture = &alc269_pcm_digital_capture;
14478
14479	if (!spec->adc_nids) { /* wasn't filled automatically? use default */
14480		if (!is_alc269vb) {
14481			spec->adc_nids = alc269_adc_nids;
14482			spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
14483			spec->capsrc_nids = alc269_capsrc_nids;
14484		} else {
14485			spec->adc_nids = alc269vb_adc_nids;
14486			spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids);
14487			spec->capsrc_nids = alc269vb_capsrc_nids;
14488		}
14489	}
14490
14491	if (!spec->cap_mixer)
14492		set_capture_mixer(codec);
14493	if (spec->cdefine.enable_pcbeep)
14494		set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
14495
14496	if (board_config == ALC269_AUTO)
14497		alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 0);
14498
14499	spec->vmaster_nid = 0x02;
14500
14501	codec->patch_ops = alc_patch_ops;
14502	if (board_config == ALC269_AUTO)
14503		spec->init_hook = alc269_auto_init;
14504#ifdef CONFIG_SND_HDA_POWER_SAVE
14505	if (!spec->loopback.amplist)
14506		spec->loopback.amplist = alc269_loopbacks;
14507	if (alc269_mic2_for_mute_led(codec))
14508		codec->patch_ops.check_power_status = alc269_mic2_mute_check_ps;
14509#endif
14510
14511	return 0;
14512}
14513
14514/*
14515 *  ALC861 channel source setting (2/6 channel selection for 3-stack)
14516 */
14517
14518/*
14519 * set the path ways for 2 channel output
14520 * need to set the codec line out and mic 1 pin widgets to inputs
14521 */
14522static struct hda_verb alc861_threestack_ch2_init[] = {
14523	/* set pin widget 1Ah (line in) for input */
14524	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14525	/* set pin widget 18h (mic1/2) for input, for mic also enable
14526	 * the vref
14527	 */
14528	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14529
14530	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14531#if 0
14532	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14533	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14534#endif
14535	{ } /* end */
14536};
14537/*
14538 * 6ch mode
14539 * need to set the codec line out and mic 1 pin widgets to outputs
14540 */
14541static struct hda_verb alc861_threestack_ch6_init[] = {
14542	/* set pin widget 1Ah (line in) for output (Back Surround)*/
14543	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14544	/* set pin widget 18h (mic1) for output (CLFE)*/
14545	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14546
14547	{ 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14548	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14549
14550	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14551#if 0
14552	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14553	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14554#endif
14555	{ } /* end */
14556};
14557
14558static struct hda_channel_mode alc861_threestack_modes[2] = {
14559	{ 2, alc861_threestack_ch2_init },
14560	{ 6, alc861_threestack_ch6_init },
14561};
14562/* Set mic1 as input and unmute the mixer */
14563static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
14564	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14565	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14566	{ } /* end */
14567};
14568/* Set mic1 as output and mute mixer */
14569static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
14570	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14571	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14572	{ } /* end */
14573};
14574
14575static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
14576	{ 2, alc861_uniwill_m31_ch2_init },
14577	{ 4, alc861_uniwill_m31_ch4_init },
14578};
14579
14580/* Set mic1 and line-in as input and unmute the mixer */
14581static struct hda_verb alc861_asus_ch2_init[] = {
14582	/* set pin widget 1Ah (line in) for input */
14583	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14584	/* set pin widget 18h (mic1/2) for input, for mic also enable
14585	 * the vref
14586	 */
14587	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14588
14589	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14590#if 0
14591	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14592	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14593#endif
14594	{ } /* end */
14595};
14596/* Set mic1 nad line-in as output and mute mixer */
14597static struct hda_verb alc861_asus_ch6_init[] = {
14598	/* set pin widget 1Ah (line in) for output (Back Surround)*/
14599	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14600	/* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14601	/* set pin widget 18h (mic1) for output (CLFE)*/
14602	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14603	/* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14604	{ 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14605	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14606
14607	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14608#if 0
14609	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14610	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14611#endif
14612	{ } /* end */
14613};
14614
14615static struct hda_channel_mode alc861_asus_modes[2] = {
14616	{ 2, alc861_asus_ch2_init },
14617	{ 6, alc861_asus_ch6_init },
14618};
14619
14620/* patch-ALC861 */
14621
14622static struct snd_kcontrol_new alc861_base_mixer[] = {
14623        /* output mixer control */
14624	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14625	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14626	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14627	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14628	HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14629
14630        /*Input mixer control */
14631	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14632	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14633	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14634	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14635	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14636	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14637	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14638	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14639	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14640	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14641
14642	{ } /* end */
14643};
14644
14645static struct snd_kcontrol_new alc861_3ST_mixer[] = {
14646        /* output mixer control */
14647	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14648	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14649	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14650	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14651	/*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14652
14653	/* Input mixer control */
14654	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14655	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14656	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14657	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14658	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14659	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14660	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14661	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14662	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14663	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14664
14665	{
14666		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14667		.name = "Channel Mode",
14668		.info = alc_ch_mode_info,
14669		.get = alc_ch_mode_get,
14670		.put = alc_ch_mode_put,
14671                .private_value = ARRAY_SIZE(alc861_threestack_modes),
14672	},
14673	{ } /* end */
14674};
14675
14676static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
14677        /* output mixer control */
14678	HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14679	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14680	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14681
14682	{ } /* end */
14683};
14684
14685static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
14686        /* output mixer control */
14687	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14688	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14689	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14690	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14691	/*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14692
14693	/* Input mixer control */
14694	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14695	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14696	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14697	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14698	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14699	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14700	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14701	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14702	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14703	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14704
14705	{
14706		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14707		.name = "Channel Mode",
14708		.info = alc_ch_mode_info,
14709		.get = alc_ch_mode_get,
14710		.put = alc_ch_mode_put,
14711                .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
14712	},
14713	{ } /* end */
14714};
14715
14716static struct snd_kcontrol_new alc861_asus_mixer[] = {
14717        /* output mixer control */
14718	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14719	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14720	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14721	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14722	HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14723
14724	/* Input mixer control */
14725	HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14726	HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
14727	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14728	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14729	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14730	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14731	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14732	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14733	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14734	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
14735
14736	{
14737		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14738		.name = "Channel Mode",
14739		.info = alc_ch_mode_info,
14740		.get = alc_ch_mode_get,
14741		.put = alc_ch_mode_put,
14742                .private_value = ARRAY_SIZE(alc861_asus_modes),
14743	},
14744	{ }
14745};
14746
14747/* additional mixer */
14748static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
14749	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14750	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14751	{ }
14752};
14753
14754/*
14755 * generic initialization of ADC, input mixers and output mixers
14756 */
14757static struct hda_verb alc861_base_init_verbs[] = {
14758	/*
14759	 * Unmute ADC0 and set the default input to mic-in
14760	 */
14761	/* port-A for surround (rear panel) */
14762	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14763	{ 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
14764	/* port-B for mic-in (rear panel) with vref */
14765	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14766	/* port-C for line-in (rear panel) */
14767	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14768	/* port-D for Front */
14769	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14770	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14771	/* port-E for HP out (front panel) */
14772	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14773	/* route front PCM to HP */
14774	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14775	/* port-F for mic-in (front panel) with vref */
14776	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14777	/* port-G for CLFE (rear panel) */
14778	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14779	{ 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14780	/* port-H for side (rear panel) */
14781	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14782	{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
14783	/* CD-in */
14784	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14785	/* route front mic to ADC1*/
14786	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14787	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14788
14789	/* Unmute DAC0~3 & spdif out*/
14790	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14791	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14792	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14793	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14794	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14795
14796	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14797	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14798        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14799	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14800        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14801
14802	/* Unmute Stereo Mixer 15 */
14803	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14804	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14805	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14806	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14807
14808	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14809	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14810	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14811	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14812	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14813	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14814	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14815	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14816	/* hp used DAC 3 (Front) */
14817	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14818        {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14819
14820	{ }
14821};
14822
14823static struct hda_verb alc861_threestack_init_verbs[] = {
14824	/*
14825	 * Unmute ADC0 and set the default input to mic-in
14826	 */
14827	/* port-A for surround (rear panel) */
14828	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14829	/* port-B for mic-in (rear panel) with vref */
14830	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14831	/* port-C for line-in (rear panel) */
14832	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14833	/* port-D for Front */
14834	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14835	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14836	/* port-E for HP out (front panel) */
14837	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14838	/* route front PCM to HP */
14839	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14840	/* port-F for mic-in (front panel) with vref */
14841	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14842	/* port-G for CLFE (rear panel) */
14843	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14844	/* port-H for side (rear panel) */
14845	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14846	/* CD-in */
14847	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14848	/* route front mic to ADC1*/
14849	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14850	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14851	/* Unmute DAC0~3 & spdif out*/
14852	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14853	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14854	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14855	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14856	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14857
14858	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14859	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14860        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14861	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14862        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14863
14864	/* Unmute Stereo Mixer 15 */
14865	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14866	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14867	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14868	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14869
14870	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14871	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14872	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14873	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14874	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14875	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14876	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14877	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14878	/* hp used DAC 3 (Front) */
14879	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14880        {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14881	{ }
14882};
14883
14884static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
14885	/*
14886	 * Unmute ADC0 and set the default input to mic-in
14887	 */
14888	/* port-A for surround (rear panel) */
14889	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14890	/* port-B for mic-in (rear panel) with vref */
14891	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14892	/* port-C for line-in (rear panel) */
14893	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14894	/* port-D for Front */
14895	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14896	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14897	/* port-E for HP out (front panel) */
14898	/* this has to be set to VREF80 */
14899	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14900	/* route front PCM to HP */
14901	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14902	/* port-F for mic-in (front panel) with vref */
14903	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14904	/* port-G for CLFE (rear panel) */
14905	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14906	/* port-H for side (rear panel) */
14907	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14908	/* CD-in */
14909	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14910	/* route front mic to ADC1*/
14911	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14912	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14913	/* Unmute DAC0~3 & spdif out*/
14914	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14915	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14916	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14917	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14918	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14919
14920	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14921	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14922        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14923	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14924        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14925
14926	/* Unmute Stereo Mixer 15 */
14927	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14928	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14929	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14930	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14931
14932	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14933	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14934	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14935	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14936	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14937	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14938	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14939	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14940	/* hp used DAC 3 (Front) */
14941	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14942        {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14943	{ }
14944};
14945
14946static struct hda_verb alc861_asus_init_verbs[] = {
14947	/*
14948	 * Unmute ADC0 and set the default input to mic-in
14949	 */
14950	/* port-A for surround (rear panel)
14951	 * according to codec#0 this is the HP jack
14952	 */
14953	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
14954	/* route front PCM to HP */
14955	{ 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
14956	/* port-B for mic-in (rear panel) with vref */
14957	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14958	/* port-C for line-in (rear panel) */
14959	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14960	/* port-D for Front */
14961	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14962	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14963	/* port-E for HP out (front panel) */
14964	/* this has to be set to VREF80 */
14965	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14966	/* route front PCM to HP */
14967	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14968	/* port-F for mic-in (front panel) with vref */
14969	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14970	/* port-G for CLFE (rear panel) */
14971	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14972	/* port-H for side (rear panel) */
14973	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14974	/* CD-in */
14975	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14976	/* route front mic to ADC1*/
14977	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14978	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14979	/* Unmute DAC0~3 & spdif out*/
14980	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14981	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14982	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14983	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14984	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14985	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14986	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14987        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14988	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14989        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14990
14991	/* Unmute Stereo Mixer 15 */
14992	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14993	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14994	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14995	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14996
14997	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14998	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14999	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15000	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15001	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15002	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15003	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15004	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15005	/* hp used DAC 3 (Front) */
15006	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15007	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15008	{ }
15009};
15010
15011/* additional init verbs for ASUS laptops */
15012static struct hda_verb alc861_asus_laptop_init_verbs[] = {
15013	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
15014	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
15015	{ }
15016};
15017
15018/*
15019 * generic initialization of ADC, input mixers and output mixers
15020 */
15021static struct hda_verb alc861_auto_init_verbs[] = {
15022	/*
15023	 * Unmute ADC0 and set the default input to mic-in
15024	 */
15025	/* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
15026	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15027
15028	/* Unmute DAC0~3 & spdif out*/
15029	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15030	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15031	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15032	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15033	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15034
15035	/* Unmute Mixer 14 (mic) 1c (Line in)*/
15036	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15037	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15038	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15039	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15040
15041	/* Unmute Stereo Mixer 15 */
15042	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15043	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15044	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15045	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
15046
15047	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15048	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15049	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15050	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15051	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15052	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15053	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15054	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15055
15056	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15057	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15058	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15059	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15060	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15061	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15062	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15063	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15064
15065	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},	/* set Mic 1 */
15066
15067	{ }
15068};
15069
15070static struct hda_verb alc861_toshiba_init_verbs[] = {
15071	{0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15072
15073	{ }
15074};
15075
15076/* toggle speaker-output according to the hp-jack state */
15077static void alc861_toshiba_automute(struct hda_codec *codec)
15078{
15079	unsigned int present = snd_hda_jack_detect(codec, 0x0f);
15080
15081	snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
15082				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
15083	snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
15084				 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
15085}
15086
15087static void alc861_toshiba_unsol_event(struct hda_codec *codec,
15088				       unsigned int res)
15089{
15090	if ((res >> 26) == ALC880_HP_EVENT)
15091		alc861_toshiba_automute(codec);
15092}
15093
15094/* pcm configuration: identical with ALC880 */
15095#define alc861_pcm_analog_playback	alc880_pcm_analog_playback
15096#define alc861_pcm_analog_capture	alc880_pcm_analog_capture
15097#define alc861_pcm_digital_playback	alc880_pcm_digital_playback
15098#define alc861_pcm_digital_capture	alc880_pcm_digital_capture
15099
15100
15101#define ALC861_DIGOUT_NID	0x07
15102
15103static struct hda_channel_mode alc861_8ch_modes[1] = {
15104	{ 8, NULL }
15105};
15106
15107static hda_nid_t alc861_dac_nids[4] = {
15108	/* front, surround, clfe, side */
15109	0x03, 0x06, 0x05, 0x04
15110};
15111
15112static hda_nid_t alc660_dac_nids[3] = {
15113	/* front, clfe, surround */
15114	0x03, 0x05, 0x06
15115};
15116
15117static hda_nid_t alc861_adc_nids[1] = {
15118	/* ADC0-2 */
15119	0x08,
15120};
15121
15122static struct hda_input_mux alc861_capture_source = {
15123	.num_items = 5,
15124	.items = {
15125		{ "Mic", 0x0 },
15126		{ "Front Mic", 0x3 },
15127		{ "Line", 0x1 },
15128		{ "CD", 0x4 },
15129		{ "Mixer", 0x5 },
15130	},
15131};
15132
15133static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
15134{
15135	struct alc_spec *spec = codec->spec;
15136	hda_nid_t mix, srcs[5];
15137	int i, j, num;
15138
15139	if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
15140		return 0;
15141	num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15142	if (num < 0)
15143		return 0;
15144	for (i = 0; i < num; i++) {
15145		unsigned int type;
15146		type = get_wcaps_type(get_wcaps(codec, srcs[i]));
15147		if (type != AC_WID_AUD_OUT)
15148			continue;
15149		for (j = 0; j < spec->multiout.num_dacs; j++)
15150			if (spec->multiout.dac_nids[j] == srcs[i])
15151				break;
15152		if (j >= spec->multiout.num_dacs)
15153			return srcs[i];
15154	}
15155	return 0;
15156}
15157
15158/* fill in the dac_nids table from the parsed pin configuration */
15159static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
15160				     const struct auto_pin_cfg *cfg)
15161{
15162	struct alc_spec *spec = codec->spec;
15163	int i;
15164	hda_nid_t nid, dac;
15165
15166	spec->multiout.dac_nids = spec->private_dac_nids;
15167	for (i = 0; i < cfg->line_outs; i++) {
15168		nid = cfg->line_out_pins[i];
15169		dac = alc861_look_for_dac(codec, nid);
15170		if (!dac)
15171			continue;
15172		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
15173	}
15174	return 0;
15175}
15176
15177static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
15178				hda_nid_t nid, unsigned int chs)
15179{
15180	return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx,
15181			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
15182}
15183
15184/* add playback controls from the parsed DAC table */
15185static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
15186					     const struct auto_pin_cfg *cfg)
15187{
15188	struct alc_spec *spec = codec->spec;
15189	static const char *chname[4] = {
15190		"Front", "Surround", NULL /*CLFE*/, "Side"
15191	};
15192	hda_nid_t nid;
15193	int i, err;
15194
15195	if (cfg->line_outs == 1) {
15196		const char *pfx = NULL;
15197		if (!cfg->hp_outs)
15198			pfx = "Master";
15199		else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
15200			pfx = "Speaker";
15201		if (pfx) {
15202			nid = spec->multiout.dac_nids[0];
15203			return alc861_create_out_sw(codec, pfx, nid, 3);
15204		}
15205	}
15206
15207	for (i = 0; i < cfg->line_outs; i++) {
15208		nid = spec->multiout.dac_nids[i];
15209		if (!nid)
15210			continue;
15211		if (i == 2) {
15212			/* Center/LFE */
15213			err = alc861_create_out_sw(codec, "Center", nid, 1);
15214			if (err < 0)
15215				return err;
15216			err = alc861_create_out_sw(codec, "LFE", nid, 2);
15217			if (err < 0)
15218				return err;
15219		} else {
15220			err = alc861_create_out_sw(codec, chname[i], nid, 3);
15221			if (err < 0)
15222				return err;
15223		}
15224	}
15225	return 0;
15226}
15227
15228static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
15229{
15230	struct alc_spec *spec = codec->spec;
15231	int err;
15232	hda_nid_t nid;
15233
15234	if (!pin)
15235		return 0;
15236
15237	if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
15238		nid = alc861_look_for_dac(codec, pin);
15239		if (nid) {
15240			err = alc861_create_out_sw(codec, "Headphone", nid, 3);
15241			if (err < 0)
15242				return err;
15243			spec->multiout.hp_nid = nid;
15244		}
15245	}
15246	return 0;
15247}
15248
15249/* create playback/capture controls for input pins */
15250static int alc861_auto_create_input_ctls(struct hda_codec *codec,
15251						const struct auto_pin_cfg *cfg)
15252{
15253	return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
15254}
15255
15256static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
15257					      hda_nid_t nid,
15258					      int pin_type, hda_nid_t dac)
15259{
15260	hda_nid_t mix, srcs[5];
15261	int i, num;
15262
15263	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
15264			    pin_type);
15265	snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15266			    AMP_OUT_UNMUTE);
15267	if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
15268		return;
15269	num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15270	if (num < 0)
15271		return;
15272	for (i = 0; i < num; i++) {
15273		unsigned int mute;
15274		if (srcs[i] == dac || srcs[i] == 0x15)
15275			mute = AMP_IN_UNMUTE(i);
15276		else
15277			mute = AMP_IN_MUTE(i);
15278		snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15279				    mute);
15280	}
15281}
15282
15283static void alc861_auto_init_multi_out(struct hda_codec *codec)
15284{
15285	struct alc_spec *spec = codec->spec;
15286	int i;
15287
15288	for (i = 0; i < spec->autocfg.line_outs; i++) {
15289		hda_nid_t nid = spec->autocfg.line_out_pins[i];
15290		int pin_type = get_pin_type(spec->autocfg.line_out_type);
15291		if (nid)
15292			alc861_auto_set_output_and_unmute(codec, nid, pin_type,
15293							  spec->multiout.dac_nids[i]);
15294	}
15295}
15296
15297static void alc861_auto_init_hp_out(struct hda_codec *codec)
15298{
15299	struct alc_spec *spec = codec->spec;
15300
15301	if (spec->autocfg.hp_outs)
15302		alc861_auto_set_output_and_unmute(codec,
15303						  spec->autocfg.hp_pins[0],
15304						  PIN_HP,
15305						  spec->multiout.hp_nid);
15306	if (spec->autocfg.speaker_outs)
15307		alc861_auto_set_output_and_unmute(codec,
15308						  spec->autocfg.speaker_pins[0],
15309						  PIN_OUT,
15310						  spec->multiout.dac_nids[0]);
15311}
15312
15313static void alc861_auto_init_analog_input(struct hda_codec *codec)
15314{
15315	struct alc_spec *spec = codec->spec;
15316	int i;
15317
15318	for (i = 0; i < AUTO_PIN_LAST; i++) {
15319		hda_nid_t nid = spec->autocfg.input_pins[i];
15320		if (nid >= 0x0c && nid <= 0x11)
15321			alc_set_input_pin(codec, nid, i);
15322	}
15323}
15324
15325/* parse the BIOS configuration and set up the alc_spec */
15326/* return 1 if successful, 0 if the proper config is not found,
15327 * or a negative error code
15328 */
15329static int alc861_parse_auto_config(struct hda_codec *codec)
15330{
15331	struct alc_spec *spec = codec->spec;
15332	int err;
15333	static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
15334
15335	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15336					   alc861_ignore);
15337	if (err < 0)
15338		return err;
15339	if (!spec->autocfg.line_outs)
15340		return 0; /* can't find valid BIOS pin config */
15341
15342	err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
15343	if (err < 0)
15344		return err;
15345	err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
15346	if (err < 0)
15347		return err;
15348	err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
15349	if (err < 0)
15350		return err;
15351	err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
15352	if (err < 0)
15353		return err;
15354
15355	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15356
15357	if (spec->autocfg.dig_outs)
15358		spec->multiout.dig_out_nid = ALC861_DIGOUT_NID;
15359
15360	if (spec->kctls.list)
15361		add_mixer(spec, spec->kctls.list);
15362
15363	add_verb(spec, alc861_auto_init_verbs);
15364
15365	spec->num_mux_defs = 1;
15366	spec->input_mux = &spec->private_imux[0];
15367
15368	spec->adc_nids = alc861_adc_nids;
15369	spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
15370	set_capture_mixer(codec);
15371
15372	alc_ssid_check(codec, 0x0e, 0x0f, 0x0b, 0);
15373
15374	return 1;
15375}
15376
15377/* additional initialization for auto-configuration model */
15378static void alc861_auto_init(struct hda_codec *codec)
15379{
15380	struct alc_spec *spec = codec->spec;
15381	alc861_auto_init_multi_out(codec);
15382	alc861_auto_init_hp_out(codec);
15383	alc861_auto_init_analog_input(codec);
15384	if (spec->unsol_event)
15385		alc_inithook(codec);
15386}
15387
15388#ifdef CONFIG_SND_HDA_POWER_SAVE
15389static struct hda_amp_list alc861_loopbacks[] = {
15390	{ 0x15, HDA_INPUT, 0 },
15391	{ 0x15, HDA_INPUT, 1 },
15392	{ 0x15, HDA_INPUT, 2 },
15393	{ 0x15, HDA_INPUT, 3 },
15394	{ } /* end */
15395};
15396#endif
15397
15398
15399/*
15400 * configuration and preset
15401 */
15402static const char *alc861_models[ALC861_MODEL_LAST] = {
15403	[ALC861_3ST]		= "3stack",
15404	[ALC660_3ST]		= "3stack-660",
15405	[ALC861_3ST_DIG]	= "3stack-dig",
15406	[ALC861_6ST_DIG]	= "6stack-dig",
15407	[ALC861_UNIWILL_M31]	= "uniwill-m31",
15408	[ALC861_TOSHIBA]	= "toshiba",
15409	[ALC861_ASUS]		= "asus",
15410	[ALC861_ASUS_LAPTOP]	= "asus-laptop",
15411	[ALC861_AUTO]		= "auto",
15412};
15413
15414static struct snd_pci_quirk alc861_cfg_tbl[] = {
15415	SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
15416	SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15417	SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15418	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
15419	SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
15420	SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
15421	SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
15422	/* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
15423	 *        Any other models that need this preset?
15424	 */
15425	/* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
15426	SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
15427	SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
15428	SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
15429	SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
15430	SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
15431	/* FIXME: the below seems conflict */
15432	/* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
15433	SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
15434	SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
15435	{}
15436};
15437
15438static struct alc_config_preset alc861_presets[] = {
15439	[ALC861_3ST] = {
15440		.mixers = { alc861_3ST_mixer },
15441		.init_verbs = { alc861_threestack_init_verbs },
15442		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15443		.dac_nids = alc861_dac_nids,
15444		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15445		.channel_mode = alc861_threestack_modes,
15446		.need_dac_fix = 1,
15447		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15448		.adc_nids = alc861_adc_nids,
15449		.input_mux = &alc861_capture_source,
15450	},
15451	[ALC861_3ST_DIG] = {
15452		.mixers = { alc861_base_mixer },
15453		.init_verbs = { alc861_threestack_init_verbs },
15454		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15455		.dac_nids = alc861_dac_nids,
15456		.dig_out_nid = ALC861_DIGOUT_NID,
15457		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15458		.channel_mode = alc861_threestack_modes,
15459		.need_dac_fix = 1,
15460		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15461		.adc_nids = alc861_adc_nids,
15462		.input_mux = &alc861_capture_source,
15463	},
15464	[ALC861_6ST_DIG] = {
15465		.mixers = { alc861_base_mixer },
15466		.init_verbs = { alc861_base_init_verbs },
15467		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15468		.dac_nids = alc861_dac_nids,
15469		.dig_out_nid = ALC861_DIGOUT_NID,
15470		.num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
15471		.channel_mode = alc861_8ch_modes,
15472		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15473		.adc_nids = alc861_adc_nids,
15474		.input_mux = &alc861_capture_source,
15475	},
15476	[ALC660_3ST] = {
15477		.mixers = { alc861_3ST_mixer },
15478		.init_verbs = { alc861_threestack_init_verbs },
15479		.num_dacs = ARRAY_SIZE(alc660_dac_nids),
15480		.dac_nids = alc660_dac_nids,
15481		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15482		.channel_mode = alc861_threestack_modes,
15483		.need_dac_fix = 1,
15484		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15485		.adc_nids = alc861_adc_nids,
15486		.input_mux = &alc861_capture_source,
15487	},
15488	[ALC861_UNIWILL_M31] = {
15489		.mixers = { alc861_uniwill_m31_mixer },
15490		.init_verbs = { alc861_uniwill_m31_init_verbs },
15491		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15492		.dac_nids = alc861_dac_nids,
15493		.dig_out_nid = ALC861_DIGOUT_NID,
15494		.num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
15495		.channel_mode = alc861_uniwill_m31_modes,
15496		.need_dac_fix = 1,
15497		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15498		.adc_nids = alc861_adc_nids,
15499		.input_mux = &alc861_capture_source,
15500	},
15501	[ALC861_TOSHIBA] = {
15502		.mixers = { alc861_toshiba_mixer },
15503		.init_verbs = { alc861_base_init_verbs,
15504				alc861_toshiba_init_verbs },
15505		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15506		.dac_nids = alc861_dac_nids,
15507		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15508		.channel_mode = alc883_3ST_2ch_modes,
15509		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15510		.adc_nids = alc861_adc_nids,
15511		.input_mux = &alc861_capture_source,
15512		.unsol_event = alc861_toshiba_unsol_event,
15513		.init_hook = alc861_toshiba_automute,
15514	},
15515	[ALC861_ASUS] = {
15516		.mixers = { alc861_asus_mixer },
15517		.init_verbs = { alc861_asus_init_verbs },
15518		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15519		.dac_nids = alc861_dac_nids,
15520		.dig_out_nid = ALC861_DIGOUT_NID,
15521		.num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
15522		.channel_mode = alc861_asus_modes,
15523		.need_dac_fix = 1,
15524		.hp_nid = 0x06,
15525		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15526		.adc_nids = alc861_adc_nids,
15527		.input_mux = &alc861_capture_source,
15528	},
15529	[ALC861_ASUS_LAPTOP] = {
15530		.mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
15531		.init_verbs = { alc861_asus_init_verbs,
15532				alc861_asus_laptop_init_verbs },
15533		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15534		.dac_nids = alc861_dac_nids,
15535		.dig_out_nid = ALC861_DIGOUT_NID,
15536		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15537		.channel_mode = alc883_3ST_2ch_modes,
15538		.need_dac_fix = 1,
15539		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15540		.adc_nids = alc861_adc_nids,
15541		.input_mux = &alc861_capture_source,
15542	},
15543};
15544
15545/* Pin config fixes */
15546enum {
15547	PINFIX_FSC_AMILO_PI1505,
15548};
15549
15550static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = {
15551	{ 0x0b, 0x0221101f }, /* HP */
15552	{ 0x0f, 0x90170310 }, /* speaker */
15553	{ }
15554};
15555
15556static const struct alc_fixup alc861_fixups[] = {
15557	[PINFIX_FSC_AMILO_PI1505] = {
15558		.pins = alc861_fsc_amilo_pi1505_pinfix
15559	},
15560};
15561
15562static struct snd_pci_quirk alc861_fixup_tbl[] = {
15563	SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
15564	{}
15565};
15566
15567static int patch_alc861(struct hda_codec *codec)
15568{
15569	struct alc_spec *spec;
15570	int board_config;
15571	int err;
15572
15573	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
15574	if (spec == NULL)
15575		return -ENOMEM;
15576
15577	codec->spec = spec;
15578
15579        board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
15580						  alc861_models,
15581						  alc861_cfg_tbl);
15582
15583	if (board_config < 0) {
15584		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15585		       codec->chip_name);
15586		board_config = ALC861_AUTO;
15587	}
15588
15589	if (board_config == ALC861_AUTO)
15590		alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 1);
15591
15592	if (board_config == ALC861_AUTO) {
15593		/* automatic parse from the BIOS config */
15594		err = alc861_parse_auto_config(codec);
15595		if (err < 0) {
15596			alc_free(codec);
15597			return err;
15598		} else if (!err) {
15599			printk(KERN_INFO
15600			       "hda_codec: Cannot set up configuration "
15601			       "from BIOS.  Using base mode...\n");
15602		   board_config = ALC861_3ST_DIG;
15603		}
15604	}
15605
15606	err = snd_hda_attach_beep_device(codec, 0x23);
15607	if (err < 0) {
15608		alc_free(codec);
15609		return err;
15610	}
15611
15612	if (board_config != ALC861_AUTO)
15613		setup_preset(codec, &alc861_presets[board_config]);
15614
15615	spec->stream_analog_playback = &alc861_pcm_analog_playback;
15616	spec->stream_analog_capture = &alc861_pcm_analog_capture;
15617
15618	spec->stream_digital_playback = &alc861_pcm_digital_playback;
15619	spec->stream_digital_capture = &alc861_pcm_digital_capture;
15620
15621	if (!spec->cap_mixer)
15622		set_capture_mixer(codec);
15623	set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
15624
15625	spec->vmaster_nid = 0x03;
15626
15627	if (board_config == ALC861_AUTO)
15628		alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 0);
15629
15630	codec->patch_ops = alc_patch_ops;
15631	if (board_config == ALC861_AUTO) {
15632		spec->init_hook = alc861_auto_init;
15633#ifdef CONFIG_SND_HDA_POWER_SAVE
15634		spec->power_hook = alc_power_eapd;
15635#endif
15636	}
15637#ifdef CONFIG_SND_HDA_POWER_SAVE
15638	if (!spec->loopback.amplist)
15639		spec->loopback.amplist = alc861_loopbacks;
15640#endif
15641
15642	return 0;
15643}
15644
15645/*
15646 * ALC861-VD support
15647 *
15648 * Based on ALC882
15649 *
15650 * In addition, an independent DAC
15651 */
15652#define ALC861VD_DIGOUT_NID	0x06
15653
15654static hda_nid_t alc861vd_dac_nids[4] = {
15655	/* front, surr, clfe, side surr */
15656	0x02, 0x03, 0x04, 0x05
15657};
15658
15659/* dac_nids for ALC660vd are in a different order - according to
15660 * Realtek's driver.
15661 * This should probably result in a different mixer for 6stack models
15662 * of ALC660vd codecs, but for now there is only 3stack mixer
15663 * - and it is the same as in 861vd.
15664 * adc_nids in ALC660vd are (is) the same as in 861vd
15665 */
15666static hda_nid_t alc660vd_dac_nids[3] = {
15667	/* front, rear, clfe, rear_surr */
15668	0x02, 0x04, 0x03
15669};
15670
15671static hda_nid_t alc861vd_adc_nids[1] = {
15672	/* ADC0 */
15673	0x09,
15674};
15675
15676static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
15677
15678/* input MUX */
15679/* FIXME: should be a matrix-type input source selection */
15680static struct hda_input_mux alc861vd_capture_source = {
15681	.num_items = 4,
15682	.items = {
15683		{ "Mic", 0x0 },
15684		{ "Front Mic", 0x1 },
15685		{ "Line", 0x2 },
15686		{ "CD", 0x4 },
15687	},
15688};
15689
15690static struct hda_input_mux alc861vd_dallas_capture_source = {
15691	.num_items = 2,
15692	.items = {
15693		{ "Ext Mic", 0x0 },
15694		{ "Int Mic", 0x1 },
15695	},
15696};
15697
15698static struct hda_input_mux alc861vd_hp_capture_source = {
15699	.num_items = 2,
15700	.items = {
15701		{ "Front Mic", 0x0 },
15702		{ "ATAPI Mic", 0x1 },
15703	},
15704};
15705
15706/*
15707 * 2ch mode
15708 */
15709static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
15710	{ 2, NULL }
15711};
15712
15713/*
15714 * 6ch mode
15715 */
15716static struct hda_verb alc861vd_6stack_ch6_init[] = {
15717	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15718	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15719	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15720	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15721	{ } /* end */
15722};
15723
15724/*
15725 * 8ch mode
15726 */
15727static struct hda_verb alc861vd_6stack_ch8_init[] = {
15728	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15729	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15730	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15731	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15732	{ } /* end */
15733};
15734
15735static struct hda_channel_mode alc861vd_6stack_modes[2] = {
15736	{ 6, alc861vd_6stack_ch6_init },
15737	{ 8, alc861vd_6stack_ch8_init },
15738};
15739
15740static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
15741	{
15742		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15743		.name = "Channel Mode",
15744		.info = alc_ch_mode_info,
15745		.get = alc_ch_mode_get,
15746		.put = alc_ch_mode_put,
15747	},
15748	{ } /* end */
15749};
15750
15751/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
15752 *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
15753 */
15754static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
15755	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15756	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15757
15758	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15759	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
15760
15761	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
15762				HDA_OUTPUT),
15763	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
15764				HDA_OUTPUT),
15765	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
15766	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
15767
15768	HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
15769	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
15770
15771	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15772
15773	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15774	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15775	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15776
15777	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15778	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15779	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15780
15781	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15782	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15783
15784	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15785	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15786
15787	{ } /* end */
15788};
15789
15790static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
15791	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15792	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15793
15794	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15795
15796	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15797	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15798	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15799
15800	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15801	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15802	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15803
15804	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15805	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15806
15807	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15808	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15809
15810	{ } /* end */
15811};
15812
15813static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
15814	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15815	/*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
15816	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
15817
15818	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15819
15820	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15821	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15822	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15823
15824	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15825	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15826	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15827
15828	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15829	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15830
15831	{ } /* end */
15832};
15833
15834/* Pin assignment: Speaker=0x14, HP = 0x15,
15835 *                 Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
15836 */
15837static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
15838	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15839	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
15840	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15841	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15842	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
15843	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15844	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15845	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
15846	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15847	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15848	{ } /* end */
15849};
15850
15851/* Pin assignment: Speaker=0x14, Line-out = 0x15,
15852 *                 Front Mic=0x18, ATAPI Mic = 0x19,
15853 */
15854static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
15855	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15856	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15857	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15858	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15859	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15860	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15861	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15862	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15863
15864	{ } /* end */
15865};
15866
15867/*
15868 * generic initialization of ADC, input mixers and output mixers
15869 */
15870static struct hda_verb alc861vd_volume_init_verbs[] = {
15871	/*
15872	 * Unmute ADC0 and set the default input to mic-in
15873	 */
15874	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15875	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15876
15877	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
15878	 * the analog-loopback mixer widget
15879	 */
15880	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
15881	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15882	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15883	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15884	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15885	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15886
15887	/* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
15888	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15889	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15890	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15891	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
15892
15893	/*
15894	 * Set up output mixers (0x02 - 0x05)
15895	 */
15896	/* set vol=0 to output mixers */
15897	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15898	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15899	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15900	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15901
15902	/* set up input amps for analog loopback */
15903	/* Amp Indices: DAC = 0, mixer = 1 */
15904	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15905	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15906	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15907	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15908	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15909	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15910	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15911	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15912
15913	{ }
15914};
15915
15916/*
15917 * 3-stack pin configuration:
15918 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
15919 */
15920static struct hda_verb alc861vd_3stack_init_verbs[] = {
15921	/*
15922	 * Set pin mode and muting
15923	 */
15924	/* set front pin widgets 0x14 for output */
15925	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15926	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15927	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15928
15929	/* Mic (rear) pin: input vref at 80% */
15930	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15931	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15932	/* Front Mic pin: input vref at 80% */
15933	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15934	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15935	/* Line In pin: input */
15936	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15937	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15938	/* Line-2 In: Headphone output (output 0 - 0x0c) */
15939	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15940	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15941	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15942	/* CD pin widget for input */
15943	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15944
15945	{ }
15946};
15947
15948/*
15949 * 6-stack pin configuration:
15950 */
15951static struct hda_verb alc861vd_6stack_init_verbs[] = {
15952	/*
15953	 * Set pin mode and muting
15954	 */
15955	/* set front pin widgets 0x14 for output */
15956	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15957	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15958	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15959
15960	/* Rear Pin: output 1 (0x0d) */
15961	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15962	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15963	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
15964	/* CLFE Pin: output 2 (0x0e) */
15965	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15966	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15967	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
15968	/* Side Pin: output 3 (0x0f) */
15969	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15970	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15971	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
15972
15973	/* Mic (rear) pin: input vref at 80% */
15974	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15975	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15976	/* Front Mic pin: input vref at 80% */
15977	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15978	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15979	/* Line In pin: input */
15980	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15981	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15982	/* Line-2 In: Headphone output (output 0 - 0x0c) */
15983	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15984	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15985	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15986	/* CD pin widget for input */
15987	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15988
15989	{ }
15990};
15991
15992static struct hda_verb alc861vd_eapd_verbs[] = {
15993	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15994	{ }
15995};
15996
15997static struct hda_verb alc660vd_eapd_verbs[] = {
15998	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15999	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16000	{ }
16001};
16002
16003static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
16004	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16005	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16006	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
16007	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16008	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16009	{}
16010};
16011
16012static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
16013{
16014	unsigned int present;
16015	unsigned char bits;
16016
16017	present = snd_hda_jack_detect(codec, 0x18);
16018	bits = present ? HDA_AMP_MUTE : 0;
16019
16020	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
16021				 HDA_AMP_MUTE, bits);
16022}
16023
16024static void alc861vd_lenovo_setup(struct hda_codec *codec)
16025{
16026	struct alc_spec *spec = codec->spec;
16027	spec->autocfg.hp_pins[0] = 0x1b;
16028	spec->autocfg.speaker_pins[0] = 0x14;
16029}
16030
16031static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
16032{
16033	alc_automute_amp(codec);
16034	alc861vd_lenovo_mic_automute(codec);
16035}
16036
16037static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
16038					unsigned int res)
16039{
16040	switch (res >> 26) {
16041	case ALC880_MIC_EVENT:
16042		alc861vd_lenovo_mic_automute(codec);
16043		break;
16044	default:
16045		alc_automute_amp_unsol_event(codec, res);
16046		break;
16047	}
16048}
16049
16050static struct hda_verb alc861vd_dallas_verbs[] = {
16051	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16052	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16053	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16054	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16055
16056	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16057	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16058	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16059	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16060	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16061	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16062	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16063	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16064
16065	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16066	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16067	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16068	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16069	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16070	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16071	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16072	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16073
16074	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16075	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16076	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16077	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16078	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16079	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16080	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16081	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16082
16083	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16084	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16085	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16086	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16087
16088	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16089	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16090	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16091
16092	{ } /* end */
16093};
16094
16095/* toggle speaker-output according to the hp-jack state */
16096static void alc861vd_dallas_setup(struct hda_codec *codec)
16097{
16098	struct alc_spec *spec = codec->spec;
16099
16100	spec->autocfg.hp_pins[0] = 0x15;
16101	spec->autocfg.speaker_pins[0] = 0x14;
16102}
16103
16104#ifdef CONFIG_SND_HDA_POWER_SAVE
16105#define alc861vd_loopbacks	alc880_loopbacks
16106#endif
16107
16108/* pcm configuration: identical with ALC880 */
16109#define alc861vd_pcm_analog_playback	alc880_pcm_analog_playback
16110#define alc861vd_pcm_analog_capture	alc880_pcm_analog_capture
16111#define alc861vd_pcm_digital_playback	alc880_pcm_digital_playback
16112#define alc861vd_pcm_digital_capture	alc880_pcm_digital_capture
16113
16114/*
16115 * configuration and preset
16116 */
16117static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
16118	[ALC660VD_3ST]		= "3stack-660",
16119	[ALC660VD_3ST_DIG]	= "3stack-660-digout",
16120	[ALC660VD_ASUS_V1S]	= "asus-v1s",
16121	[ALC861VD_3ST]		= "3stack",
16122	[ALC861VD_3ST_DIG]	= "3stack-digout",
16123	[ALC861VD_6ST_DIG]	= "6stack-digout",
16124	[ALC861VD_LENOVO]	= "lenovo",
16125	[ALC861VD_DALLAS]	= "dallas",
16126	[ALC861VD_HP]		= "hp",
16127	[ALC861VD_AUTO]		= "auto",
16128};
16129
16130static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
16131	SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
16132	SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
16133	SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
16134	/*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
16135	SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
16136	SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
16137	SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
16138	SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
16139	/*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
16140	SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
16141	SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
16142	SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
16143	SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
16144	SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
16145	SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
16146	{}
16147};
16148
16149static struct alc_config_preset alc861vd_presets[] = {
16150	[ALC660VD_3ST] = {
16151		.mixers = { alc861vd_3st_mixer },
16152		.init_verbs = { alc861vd_volume_init_verbs,
16153				 alc861vd_3stack_init_verbs },
16154		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16155		.dac_nids = alc660vd_dac_nids,
16156		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16157		.channel_mode = alc861vd_3stack_2ch_modes,
16158		.input_mux = &alc861vd_capture_source,
16159	},
16160	[ALC660VD_3ST_DIG] = {
16161		.mixers = { alc861vd_3st_mixer },
16162		.init_verbs = { alc861vd_volume_init_verbs,
16163				 alc861vd_3stack_init_verbs },
16164		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16165		.dac_nids = alc660vd_dac_nids,
16166		.dig_out_nid = ALC861VD_DIGOUT_NID,
16167		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16168		.channel_mode = alc861vd_3stack_2ch_modes,
16169		.input_mux = &alc861vd_capture_source,
16170	},
16171	[ALC861VD_3ST] = {
16172		.mixers = { alc861vd_3st_mixer },
16173		.init_verbs = { alc861vd_volume_init_verbs,
16174				 alc861vd_3stack_init_verbs },
16175		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16176		.dac_nids = alc861vd_dac_nids,
16177		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16178		.channel_mode = alc861vd_3stack_2ch_modes,
16179		.input_mux = &alc861vd_capture_source,
16180	},
16181	[ALC861VD_3ST_DIG] = {
16182		.mixers = { alc861vd_3st_mixer },
16183		.init_verbs = { alc861vd_volume_init_verbs,
16184		 		 alc861vd_3stack_init_verbs },
16185		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16186		.dac_nids = alc861vd_dac_nids,
16187		.dig_out_nid = ALC861VD_DIGOUT_NID,
16188		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16189		.channel_mode = alc861vd_3stack_2ch_modes,
16190		.input_mux = &alc861vd_capture_source,
16191	},
16192	[ALC861VD_6ST_DIG] = {
16193		.mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
16194		.init_verbs = { alc861vd_volume_init_verbs,
16195				alc861vd_6stack_init_verbs },
16196		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16197		.dac_nids = alc861vd_dac_nids,
16198		.dig_out_nid = ALC861VD_DIGOUT_NID,
16199		.num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
16200		.channel_mode = alc861vd_6stack_modes,
16201		.input_mux = &alc861vd_capture_source,
16202	},
16203	[ALC861VD_LENOVO] = {
16204		.mixers = { alc861vd_lenovo_mixer },
16205		.init_verbs = { alc861vd_volume_init_verbs,
16206				alc861vd_3stack_init_verbs,
16207				alc861vd_eapd_verbs,
16208				alc861vd_lenovo_unsol_verbs },
16209		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16210		.dac_nids = alc660vd_dac_nids,
16211		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16212		.channel_mode = alc861vd_3stack_2ch_modes,
16213		.input_mux = &alc861vd_capture_source,
16214		.unsol_event = alc861vd_lenovo_unsol_event,
16215		.setup = alc861vd_lenovo_setup,
16216		.init_hook = alc861vd_lenovo_init_hook,
16217	},
16218	[ALC861VD_DALLAS] = {
16219		.mixers = { alc861vd_dallas_mixer },
16220		.init_verbs = { alc861vd_dallas_verbs },
16221		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16222		.dac_nids = alc861vd_dac_nids,
16223		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16224		.channel_mode = alc861vd_3stack_2ch_modes,
16225		.input_mux = &alc861vd_dallas_capture_source,
16226		.unsol_event = alc_automute_amp_unsol_event,
16227		.setup = alc861vd_dallas_setup,
16228		.init_hook = alc_automute_amp,
16229	},
16230	[ALC861VD_HP] = {
16231		.mixers = { alc861vd_hp_mixer },
16232		.init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
16233		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16234		.dac_nids = alc861vd_dac_nids,
16235		.dig_out_nid = ALC861VD_DIGOUT_NID,
16236		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16237		.channel_mode = alc861vd_3stack_2ch_modes,
16238		.input_mux = &alc861vd_hp_capture_source,
16239		.unsol_event = alc_automute_amp_unsol_event,
16240		.setup = alc861vd_dallas_setup,
16241		.init_hook = alc_automute_amp,
16242	},
16243	[ALC660VD_ASUS_V1S] = {
16244		.mixers = { alc861vd_lenovo_mixer },
16245		.init_verbs = { alc861vd_volume_init_verbs,
16246				alc861vd_3stack_init_verbs,
16247				alc861vd_eapd_verbs,
16248				alc861vd_lenovo_unsol_verbs },
16249		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16250		.dac_nids = alc660vd_dac_nids,
16251		.dig_out_nid = ALC861VD_DIGOUT_NID,
16252		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16253		.channel_mode = alc861vd_3stack_2ch_modes,
16254		.input_mux = &alc861vd_capture_source,
16255		.unsol_event = alc861vd_lenovo_unsol_event,
16256		.setup = alc861vd_lenovo_setup,
16257		.init_hook = alc861vd_lenovo_init_hook,
16258	},
16259};
16260
16261/*
16262 * BIOS auto configuration
16263 */
16264static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
16265						const struct auto_pin_cfg *cfg)
16266{
16267	return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
16268}
16269
16270
16271static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
16272				hda_nid_t nid, int pin_type, int dac_idx)
16273{
16274	alc_set_pin_output(codec, nid, pin_type);
16275}
16276
16277static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
16278{
16279	struct alc_spec *spec = codec->spec;
16280	int i;
16281
16282	for (i = 0; i <= HDA_SIDE; i++) {
16283		hda_nid_t nid = spec->autocfg.line_out_pins[i];
16284		int pin_type = get_pin_type(spec->autocfg.line_out_type);
16285		if (nid)
16286			alc861vd_auto_set_output_and_unmute(codec, nid,
16287							    pin_type, i);
16288	}
16289}
16290
16291
16292static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
16293{
16294	struct alc_spec *spec = codec->spec;
16295	hda_nid_t pin;
16296
16297	pin = spec->autocfg.hp_pins[0];
16298	if (pin) /* connect to front and use dac 0 */
16299		alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
16300	pin = spec->autocfg.speaker_pins[0];
16301	if (pin)
16302		alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
16303}
16304
16305#define ALC861VD_PIN_CD_NID		ALC880_PIN_CD_NID
16306
16307static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
16308{
16309	struct alc_spec *spec = codec->spec;
16310	int i;
16311
16312	for (i = 0; i < AUTO_PIN_LAST; i++) {
16313		hda_nid_t nid = spec->autocfg.input_pins[i];
16314		if (alc_is_input_pin(codec, nid)) {
16315			alc_set_input_pin(codec, nid, i);
16316			if (nid != ALC861VD_PIN_CD_NID &&
16317			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
16318				snd_hda_codec_write(codec, nid, 0,
16319						AC_VERB_SET_AMP_GAIN_MUTE,
16320						AMP_OUT_MUTE);
16321		}
16322	}
16323}
16324
16325#define alc861vd_auto_init_input_src	alc882_auto_init_input_src
16326
16327#define alc861vd_idx_to_mixer_vol(nid)		((nid) + 0x02)
16328#define alc861vd_idx_to_mixer_switch(nid)	((nid) + 0x0c)
16329
16330/* add playback controls from the parsed DAC table */
16331/* Based on ALC880 version. But ALC861VD has separate,
16332 * different NIDs for mute/unmute switch and volume control */
16333static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
16334					     const struct auto_pin_cfg *cfg)
16335{
16336	static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
16337	hda_nid_t nid_v, nid_s;
16338	int i, err;
16339
16340	for (i = 0; i < cfg->line_outs; i++) {
16341		if (!spec->multiout.dac_nids[i])
16342			continue;
16343		nid_v = alc861vd_idx_to_mixer_vol(
16344				alc880_dac_to_idx(
16345					spec->multiout.dac_nids[i]));
16346		nid_s = alc861vd_idx_to_mixer_switch(
16347				alc880_dac_to_idx(
16348					spec->multiout.dac_nids[i]));
16349
16350		if (i == 2) {
16351			/* Center/LFE */
16352			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16353					      "Center",
16354					  HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
16355							      HDA_OUTPUT));
16356			if (err < 0)
16357				return err;
16358			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16359					      "LFE",
16360					  HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
16361							      HDA_OUTPUT));
16362			if (err < 0)
16363				return err;
16364			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16365					     "Center",
16366					  HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
16367							      HDA_INPUT));
16368			if (err < 0)
16369				return err;
16370			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16371					     "LFE",
16372					  HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
16373							      HDA_INPUT));
16374			if (err < 0)
16375				return err;
16376		} else {
16377			const char *pfx;
16378			if (cfg->line_outs == 1 &&
16379			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
16380				if (!cfg->hp_pins)
16381					pfx = "Speaker";
16382				else
16383					pfx = "PCM";
16384			} else
16385				pfx = chname[i];
16386			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16387					  HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
16388							      HDA_OUTPUT));
16389			if (err < 0)
16390				return err;
16391			if (cfg->line_outs == 1 &&
16392			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
16393				pfx = "Speaker";
16394			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16395					  HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
16396							      HDA_INPUT));
16397			if (err < 0)
16398				return err;
16399		}
16400	}
16401	return 0;
16402}
16403
16404/* add playback controls for speaker and HP outputs */
16405/* Based on ALC880 version. But ALC861VD has separate,
16406 * different NIDs for mute/unmute switch and volume control */
16407static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
16408					hda_nid_t pin, const char *pfx)
16409{
16410	hda_nid_t nid_v, nid_s;
16411	int err;
16412
16413	if (!pin)
16414		return 0;
16415
16416	if (alc880_is_fixed_pin(pin)) {
16417		nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
16418		/* specify the DAC as the extra output */
16419		if (!spec->multiout.hp_nid)
16420			spec->multiout.hp_nid = nid_v;
16421		else
16422			spec->multiout.extra_out_nid[0] = nid_v;
16423		/* control HP volume/switch on the output mixer amp */
16424		nid_v = alc861vd_idx_to_mixer_vol(
16425				alc880_fixed_pin_idx(pin));
16426		nid_s = alc861vd_idx_to_mixer_switch(
16427				alc880_fixed_pin_idx(pin));
16428
16429		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16430				  HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
16431		if (err < 0)
16432			return err;
16433		err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16434				  HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
16435		if (err < 0)
16436			return err;
16437	} else if (alc880_is_multi_pin(pin)) {
16438		/* set manual connection */
16439		/* we have only a switch on HP-out PIN */
16440		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
16441				  HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
16442		if (err < 0)
16443			return err;
16444	}
16445	return 0;
16446}
16447
16448/* parse the BIOS configuration and set up the alc_spec
16449 * return 1 if successful, 0 if the proper config is not found,
16450 * or a negative error code
16451 * Based on ALC880 version - had to change it to override
16452 * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
16453static int alc861vd_parse_auto_config(struct hda_codec *codec)
16454{
16455	struct alc_spec *spec = codec->spec;
16456	int err;
16457	static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
16458
16459	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
16460					   alc861vd_ignore);
16461	if (err < 0)
16462		return err;
16463	if (!spec->autocfg.line_outs)
16464		return 0; /* can't find valid BIOS pin config */
16465
16466	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
16467	if (err < 0)
16468		return err;
16469	err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
16470	if (err < 0)
16471		return err;
16472	err = alc861vd_auto_create_extra_out(spec,
16473					     spec->autocfg.speaker_pins[0],
16474					     "Speaker");
16475	if (err < 0)
16476		return err;
16477	err = alc861vd_auto_create_extra_out(spec,
16478					     spec->autocfg.hp_pins[0],
16479					     "Headphone");
16480	if (err < 0)
16481		return err;
16482	err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
16483	if (err < 0)
16484		return err;
16485
16486	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
16487
16488	if (spec->autocfg.dig_outs)
16489		spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID;
16490
16491	if (spec->kctls.list)
16492		add_mixer(spec, spec->kctls.list);
16493
16494	add_verb(spec, alc861vd_volume_init_verbs);
16495
16496	spec->num_mux_defs = 1;
16497	spec->input_mux = &spec->private_imux[0];
16498
16499	err = alc_auto_add_mic_boost(codec);
16500	if (err < 0)
16501		return err;
16502
16503	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
16504
16505	return 1;
16506}
16507
16508/* additional initialization for auto-configuration model */
16509static void alc861vd_auto_init(struct hda_codec *codec)
16510{
16511	struct alc_spec *spec = codec->spec;
16512	alc861vd_auto_init_multi_out(codec);
16513	alc861vd_auto_init_hp_out(codec);
16514	alc861vd_auto_init_analog_input(codec);
16515	alc861vd_auto_init_input_src(codec);
16516	if (spec->unsol_event)
16517		alc_inithook(codec);
16518}
16519
16520enum {
16521	ALC660VD_FIX_ASUS_GPIO1
16522};
16523
16524/* reset GPIO1 */
16525static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
16526	{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
16527	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
16528	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
16529	{ }
16530};
16531
16532static const struct alc_fixup alc861vd_fixups[] = {
16533	[ALC660VD_FIX_ASUS_GPIO1] = {
16534		.verbs = alc660vd_fix_asus_gpio1_verbs,
16535	},
16536};
16537
16538static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
16539	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
16540	{}
16541};
16542
16543static int patch_alc861vd(struct hda_codec *codec)
16544{
16545	struct alc_spec *spec;
16546	int err, board_config;
16547
16548	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
16549	if (spec == NULL)
16550		return -ENOMEM;
16551
16552	codec->spec = spec;
16553
16554	board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
16555						  alc861vd_models,
16556						  alc861vd_cfg_tbl);
16557
16558	if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
16559		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
16560		       codec->chip_name);
16561		board_config = ALC861VD_AUTO;
16562	}
16563
16564	if (board_config == ALC861VD_AUTO)
16565		alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 1);
16566
16567	if (board_config == ALC861VD_AUTO) {
16568		/* automatic parse from the BIOS config */
16569		err = alc861vd_parse_auto_config(codec);
16570		if (err < 0) {
16571			alc_free(codec);
16572			return err;
16573		} else if (!err) {
16574			printk(KERN_INFO
16575			       "hda_codec: Cannot set up configuration "
16576			       "from BIOS.  Using base mode...\n");
16577			board_config = ALC861VD_3ST;
16578		}
16579	}
16580
16581	err = snd_hda_attach_beep_device(codec, 0x23);
16582	if (err < 0) {
16583		alc_free(codec);
16584		return err;
16585	}
16586
16587	if (board_config != ALC861VD_AUTO)
16588		setup_preset(codec, &alc861vd_presets[board_config]);
16589
16590	if (codec->vendor_id == 0x10ec0660) {
16591		/* always turn on EAPD */
16592		add_verb(spec, alc660vd_eapd_verbs);
16593	}
16594
16595	spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
16596	spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
16597
16598	spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
16599	spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
16600
16601	if (!spec->adc_nids) {
16602		spec->adc_nids = alc861vd_adc_nids;
16603		spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
16604	}
16605	if (!spec->capsrc_nids)
16606		spec->capsrc_nids = alc861vd_capsrc_nids;
16607
16608	set_capture_mixer(codec);
16609	set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
16610
16611	spec->vmaster_nid = 0x02;
16612
16613	if (board_config == ALC861VD_AUTO)
16614		alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 0);
16615
16616	codec->patch_ops = alc_patch_ops;
16617
16618	if (board_config == ALC861VD_AUTO)
16619		spec->init_hook = alc861vd_auto_init;
16620#ifdef CONFIG_SND_HDA_POWER_SAVE
16621	if (!spec->loopback.amplist)
16622		spec->loopback.amplist = alc861vd_loopbacks;
16623#endif
16624
16625	return 0;
16626}
16627
16628/*
16629 * ALC662 support
16630 *
16631 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
16632 * configuration.  Each pin widget can choose any input DACs and a mixer.
16633 * Each ADC is connected from a mixer of all inputs.  This makes possible
16634 * 6-channel independent captures.
16635 *
16636 * In addition, an independent DAC for the multi-playback (not used in this
16637 * driver yet).
16638 */
16639#define ALC662_DIGOUT_NID	0x06
16640#define ALC662_DIGIN_NID	0x0a
16641
16642static hda_nid_t alc662_dac_nids[4] = {
16643	/* front, rear, clfe, rear_surr */
16644	0x02, 0x03, 0x04
16645};
16646
16647static hda_nid_t alc272_dac_nids[2] = {
16648	0x02, 0x03
16649};
16650
16651static hda_nid_t alc662_adc_nids[2] = {
16652	/* ADC1-2 */
16653	0x09, 0x08
16654};
16655
16656static hda_nid_t alc272_adc_nids[1] = {
16657	/* ADC1-2 */
16658	0x08,
16659};
16660
16661static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
16662static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
16663
16664
16665/* input MUX */
16666/* FIXME: should be a matrix-type input source selection */
16667static struct hda_input_mux alc662_capture_source = {
16668	.num_items = 4,
16669	.items = {
16670		{ "Mic", 0x0 },
16671		{ "Front Mic", 0x1 },
16672		{ "Line", 0x2 },
16673		{ "CD", 0x4 },
16674	},
16675};
16676
16677static struct hda_input_mux alc662_lenovo_101e_capture_source = {
16678	.num_items = 2,
16679	.items = {
16680		{ "Mic", 0x1 },
16681		{ "Line", 0x2 },
16682	},
16683};
16684
16685static struct hda_input_mux alc663_capture_source = {
16686	.num_items = 3,
16687	.items = {
16688		{ "Mic", 0x0 },
16689		{ "Front Mic", 0x1 },
16690		{ "Line", 0x2 },
16691	},
16692};
16693
16694#if 0 /* set to 1 for testing other input sources below */
16695static struct hda_input_mux alc272_nc10_capture_source = {
16696	.num_items = 16,
16697	.items = {
16698		{ "Autoselect Mic", 0x0 },
16699		{ "Internal Mic", 0x1 },
16700		{ "In-0x02", 0x2 },
16701		{ "In-0x03", 0x3 },
16702		{ "In-0x04", 0x4 },
16703		{ "In-0x05", 0x5 },
16704		{ "In-0x06", 0x6 },
16705		{ "In-0x07", 0x7 },
16706		{ "In-0x08", 0x8 },
16707		{ "In-0x09", 0x9 },
16708		{ "In-0x0a", 0x0a },
16709		{ "In-0x0b", 0x0b },
16710		{ "In-0x0c", 0x0c },
16711		{ "In-0x0d", 0x0d },
16712		{ "In-0x0e", 0x0e },
16713		{ "In-0x0f", 0x0f },
16714	},
16715};
16716#endif
16717
16718/*
16719 * 2ch mode
16720 */
16721static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
16722	{ 2, NULL }
16723};
16724
16725/*
16726 * 2ch mode
16727 */
16728static struct hda_verb alc662_3ST_ch2_init[] = {
16729	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
16730	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16731	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
16732	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16733	{ } /* end */
16734};
16735
16736/*
16737 * 6ch mode
16738 */
16739static struct hda_verb alc662_3ST_ch6_init[] = {
16740	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16741	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16742	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
16743	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16744	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16745	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
16746	{ } /* end */
16747};
16748
16749static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
16750	{ 2, alc662_3ST_ch2_init },
16751	{ 6, alc662_3ST_ch6_init },
16752};
16753
16754/*
16755 * 2ch mode
16756 */
16757static struct hda_verb alc662_sixstack_ch6_init[] = {
16758	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16759	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16760	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16761	{ } /* end */
16762};
16763
16764/*
16765 * 6ch mode
16766 */
16767static struct hda_verb alc662_sixstack_ch8_init[] = {
16768	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16769	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16770	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16771	{ } /* end */
16772};
16773
16774static struct hda_channel_mode alc662_5stack_modes[2] = {
16775	{ 2, alc662_sixstack_ch6_init },
16776	{ 6, alc662_sixstack_ch8_init },
16777};
16778
16779/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
16780 *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
16781 */
16782
16783static struct snd_kcontrol_new alc662_base_mixer[] = {
16784	/* output mixer control */
16785	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
16786	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16787	HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
16788	HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16789	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16790	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16791	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16792	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16793	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16794
16795	/*Input mixer control */
16796	HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
16797	HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
16798	HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
16799	HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
16800	HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
16801	HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
16802	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
16803	HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
16804	{ } /* end */
16805};
16806
16807static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
16808	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16809	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16810	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16811	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16812	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16813	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16814	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16815	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16816	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16817	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16818	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16819	{ } /* end */
16820};
16821
16822static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
16823	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16824	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16825	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16826	HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16827	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16828	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16829	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16830	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16831	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16832	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16833	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16834	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16835	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16836	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16837	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16838	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16839	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16840	{ } /* end */
16841};
16842
16843static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
16844	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16845	HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
16846	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16847	HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
16848	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16849	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16850	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16851	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16852	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16853	{ } /* end */
16854};
16855
16856static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
16857	HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16858	ALC262_HIPPO_MASTER_SWITCH,
16859
16860	HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
16861	HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16862	HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16863
16864	HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
16865	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16866	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16867	{ } /* end */
16868};
16869
16870static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
16871	ALC262_HIPPO_MASTER_SWITCH,
16872	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16873	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16874	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16875	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16876	HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
16877	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16878	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16879	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16880	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16881	{ } /* end */
16882};
16883
16884static struct hda_bind_ctls alc663_asus_bind_master_vol = {
16885	.ops = &snd_hda_bind_vol,
16886	.values = {
16887		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16888		HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
16889		0
16890	},
16891};
16892
16893static struct hda_bind_ctls alc663_asus_one_bind_switch = {
16894	.ops = &snd_hda_bind_sw,
16895	.values = {
16896		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16897		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16898		0
16899	},
16900};
16901
16902static struct snd_kcontrol_new alc663_m51va_mixer[] = {
16903	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16904	HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
16905	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16906	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16907	{ } /* end */
16908};
16909
16910static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
16911	.ops = &snd_hda_bind_sw,
16912	.values = {
16913		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16914		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16915		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16916		0
16917	},
16918};
16919
16920static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
16921	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16922	HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
16923	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16924	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16925	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16926	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16927
16928	{ } /* end */
16929};
16930
16931static struct hda_bind_ctls alc663_asus_four_bind_switch = {
16932	.ops = &snd_hda_bind_sw,
16933	.values = {
16934		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16935		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16936		HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16937		0
16938	},
16939};
16940
16941static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
16942	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16943	HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
16944	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16945	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16946	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16947	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16948	{ } /* end */
16949};
16950
16951static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
16952	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16953	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16954	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16955	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16956	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16957	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16958	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16959	{ } /* end */
16960};
16961
16962static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
16963	.ops = &snd_hda_bind_vol,
16964	.values = {
16965		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16966		HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
16967		0
16968	},
16969};
16970
16971static struct hda_bind_ctls alc663_asus_two_bind_switch = {
16972	.ops = &snd_hda_bind_sw,
16973	.values = {
16974		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16975		HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
16976		0
16977	},
16978};
16979
16980static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
16981	HDA_BIND_VOL("Master Playback Volume",
16982				&alc663_asus_two_bind_master_vol),
16983	HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16984	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16985	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16986	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16987	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16988	{ } /* end */
16989};
16990
16991static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
16992	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16993	HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16994	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16995	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16996	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16997	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16998	{ } /* end */
16999};
17000
17001static struct snd_kcontrol_new alc663_g71v_mixer[] = {
17002	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17003	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17004	HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17005	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17006	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17007
17008	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17009	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17010	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17011	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17012	{ } /* end */
17013};
17014
17015static struct snd_kcontrol_new alc663_g50v_mixer[] = {
17016	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17017	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17018	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17019
17020	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17021	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17022	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17023	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17024	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17025	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17026	{ } /* end */
17027};
17028
17029static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
17030	.ops = &snd_hda_bind_sw,
17031	.values = {
17032		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17033		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
17034		HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17035		HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
17036		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
17037		0
17038	},
17039};
17040
17041static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
17042	.ops = &snd_hda_bind_sw,
17043	.values = {
17044		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17045		HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17046		0
17047	},
17048};
17049
17050static struct snd_kcontrol_new alc663_mode7_mixer[] = {
17051	HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17052	HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17053	HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17054	HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17055	HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17056	HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17057	HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17058	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17059	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17060	{ } /* end */
17061};
17062
17063static struct snd_kcontrol_new alc663_mode8_mixer[] = {
17064	HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17065	HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17066	HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17067	HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17068	HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17069	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17070	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17071	{ } /* end */
17072};
17073
17074
17075static struct snd_kcontrol_new alc662_chmode_mixer[] = {
17076	{
17077		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
17078		.name = "Channel Mode",
17079		.info = alc_ch_mode_info,
17080		.get = alc_ch_mode_get,
17081		.put = alc_ch_mode_put,
17082	},
17083	{ } /* end */
17084};
17085
17086static struct hda_verb alc662_init_verbs[] = {
17087	/* ADC: mute amp left and right */
17088	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17089	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
17090
17091	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17092	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17093	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17094	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17095	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17096	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17097
17098	/* Front Pin: output 0 (0x0c) */
17099	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17100	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17101
17102	/* Rear Pin: output 1 (0x0d) */
17103	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17104	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17105
17106	/* CLFE Pin: output 2 (0x0e) */
17107	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17108	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17109
17110	/* Mic (rear) pin: input vref at 80% */
17111	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17112	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17113	/* Front Mic pin: input vref at 80% */
17114	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17115	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17116	/* Line In pin: input */
17117	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17118	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17119	/* Line-2 In: Headphone output (output 0 - 0x0c) */
17120	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17121	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17122	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
17123	/* CD pin widget for input */
17124	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17125
17126	/* FIXME: use matrix-type input source selection */
17127	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
17128	/* Input mixer */
17129	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17130	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17131
17132	/* always trun on EAPD */
17133	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
17134	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
17135
17136	{ }
17137};
17138
17139static struct hda_verb alc663_init_verbs[] = {
17140	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17141	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17142	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17143	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17144	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17145	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17146	{ }
17147};
17148
17149static struct hda_verb alc272_init_verbs[] = {
17150	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17151	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17152	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17153	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17154	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17155	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17156	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17157	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17158	{ }
17159};
17160
17161static struct hda_verb alc662_sue_init_verbs[] = {
17162	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17163	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17164	{}
17165};
17166
17167static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
17168	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17169	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17170	{}
17171};
17172
17173/* Set Unsolicited Event*/
17174static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
17175	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17176	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17177	{}
17178};
17179
17180static struct hda_verb alc663_m51va_init_verbs[] = {
17181	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17182	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17183	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17184	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17185	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17186	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17187	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17188	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17189	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17190	{}
17191};
17192
17193static struct hda_verb alc663_21jd_amic_init_verbs[] = {
17194	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17195	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17196	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17197	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17198	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17199	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17200	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17201	{}
17202};
17203
17204static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
17205	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17206	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17207	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17208	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
17209	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17210	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17211	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17212	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17213	{}
17214};
17215
17216static struct hda_verb alc663_15jd_amic_init_verbs[] = {
17217	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17218	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17219	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17220	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17221	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17222	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17223	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17224	{}
17225};
17226
17227static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
17228	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17229	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17230	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17231	{0x21, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Headphone */
17232	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17233	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17234	{0x15, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Headphone */
17235	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17236	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17237	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17238	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17239	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17240	{}
17241};
17242
17243static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
17244	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17245	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17246	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17247	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17248	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17249	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17250	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17251	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17252	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17253	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17254	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17255	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17256	{}
17257};
17258
17259static struct hda_verb alc663_g71v_init_verbs[] = {
17260	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17261	/* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
17262	/* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
17263
17264	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17265	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17266	{0x21, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
17267
17268	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17269	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
17270	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17271	{}
17272};
17273
17274static struct hda_verb alc663_g50v_init_verbs[] = {
17275	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17276	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17277	{0x21, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
17278
17279	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17280	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17281	{}
17282};
17283
17284static struct hda_verb alc662_ecs_init_verbs[] = {
17285	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
17286	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17287	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17288	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17289	{}
17290};
17291
17292static struct hda_verb alc272_dell_zm1_init_verbs[] = {
17293	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17294	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17295	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17296	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17297	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17298	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17299	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17300	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17301	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17302	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17303	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17304	{}
17305};
17306
17307static struct hda_verb alc272_dell_init_verbs[] = {
17308	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17309	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17310	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17311	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17312	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17313	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17314	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17315	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17316	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17317	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17318	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17319	{}
17320};
17321
17322static struct hda_verb alc663_mode7_init_verbs[] = {
17323	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17324	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17325	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17326	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17327	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17328	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17329	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
17330	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17331	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17332	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17333	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17334	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17335	{0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17336	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17337	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17338	{}
17339};
17340
17341static struct hda_verb alc663_mode8_init_verbs[] = {
17342	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17343	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17344	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17345	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
17346	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17347	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17348	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17349	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17350	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17351	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17352	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17353	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17354	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17355	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17356	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17357	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17358	{}
17359};
17360
17361static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
17362	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
17363	HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
17364	{ } /* end */
17365};
17366
17367static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
17368	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
17369	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
17370	{ } /* end */
17371};
17372
17373static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
17374{
17375	unsigned int present;
17376	unsigned char bits;
17377
17378	present = snd_hda_jack_detect(codec, 0x14);
17379	bits = present ? HDA_AMP_MUTE : 0;
17380
17381	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17382				 HDA_AMP_MUTE, bits);
17383}
17384
17385static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
17386{
17387	unsigned int present;
17388	unsigned char bits;
17389
17390 	present = snd_hda_jack_detect(codec, 0x1b);
17391	bits = present ? HDA_AMP_MUTE : 0;
17392
17393	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17394				 HDA_AMP_MUTE, bits);
17395	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17396				 HDA_AMP_MUTE, bits);
17397}
17398
17399static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
17400					   unsigned int res)
17401{
17402	if ((res >> 26) == ALC880_HP_EVENT)
17403		alc662_lenovo_101e_all_automute(codec);
17404	if ((res >> 26) == ALC880_FRONT_EVENT)
17405		alc662_lenovo_101e_ispeaker_automute(codec);
17406}
17407
17408/* unsolicited event for HP jack sensing */
17409static void alc662_eeepc_unsol_event(struct hda_codec *codec,
17410				     unsigned int res)
17411{
17412	if ((res >> 26) == ALC880_MIC_EVENT)
17413		alc_mic_automute(codec);
17414	else
17415		alc262_hippo_unsol_event(codec, res);
17416}
17417
17418static void alc662_eeepc_setup(struct hda_codec *codec)
17419{
17420	struct alc_spec *spec = codec->spec;
17421
17422	alc262_hippo1_setup(codec);
17423	spec->ext_mic.pin = 0x18;
17424	spec->ext_mic.mux_idx = 0;
17425	spec->int_mic.pin = 0x19;
17426	spec->int_mic.mux_idx = 1;
17427	spec->auto_mic = 1;
17428}
17429
17430static void alc662_eeepc_inithook(struct hda_codec *codec)
17431{
17432	alc262_hippo_automute(codec);
17433	alc_mic_automute(codec);
17434}
17435
17436static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
17437{
17438	struct alc_spec *spec = codec->spec;
17439
17440	spec->autocfg.hp_pins[0] = 0x14;
17441	spec->autocfg.speaker_pins[0] = 0x1b;
17442}
17443
17444#define alc662_eeepc_ep20_inithook	alc262_hippo_master_update
17445
17446static void alc663_m51va_speaker_automute(struct hda_codec *codec)
17447{
17448	unsigned int present;
17449	unsigned char bits;
17450
17451	present = snd_hda_jack_detect(codec, 0x21);
17452	bits = present ? HDA_AMP_MUTE : 0;
17453	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17454				 HDA_AMP_MUTE, bits);
17455	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17456				 HDA_AMP_MUTE, bits);
17457}
17458
17459static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
17460{
17461	unsigned int present;
17462	unsigned char bits;
17463
17464	present = snd_hda_jack_detect(codec, 0x21);
17465	bits = present ? HDA_AMP_MUTE : 0;
17466	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17467				 HDA_AMP_MUTE, bits);
17468	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17469				 HDA_AMP_MUTE, bits);
17470	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
17471				 HDA_AMP_MUTE, bits);
17472	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17473				 HDA_AMP_MUTE, bits);
17474}
17475
17476static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
17477{
17478	unsigned int present;
17479	unsigned char bits;
17480
17481	present = snd_hda_jack_detect(codec, 0x15);
17482	bits = present ? HDA_AMP_MUTE : 0;
17483	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17484				 HDA_AMP_MUTE, bits);
17485	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17486				 HDA_AMP_MUTE, bits);
17487	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
17488				 HDA_AMP_MUTE, bits);
17489	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17490				 HDA_AMP_MUTE, bits);
17491}
17492
17493static void alc662_f5z_speaker_automute(struct hda_codec *codec)
17494{
17495	unsigned int present;
17496	unsigned char bits;
17497
17498	present = snd_hda_jack_detect(codec, 0x1b);
17499	bits = present ? 0 : PIN_OUT;
17500	snd_hda_codec_write(codec, 0x14, 0,
17501			 AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
17502}
17503
17504static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
17505{
17506	unsigned int present1, present2;
17507
17508	present1 = snd_hda_jack_detect(codec, 0x21);
17509	present2 = snd_hda_jack_detect(codec, 0x15);
17510
17511	if (present1 || present2) {
17512		snd_hda_codec_write_cache(codec, 0x14, 0,
17513			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17514	} else {
17515		snd_hda_codec_write_cache(codec, 0x14, 0,
17516			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17517	}
17518}
17519
17520static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
17521{
17522	unsigned int present1, present2;
17523
17524	present1 = snd_hda_jack_detect(codec, 0x1b);
17525	present2 = snd_hda_jack_detect(codec, 0x15);
17526
17527	if (present1 || present2) {
17528		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17529					 HDA_AMP_MUTE, HDA_AMP_MUTE);
17530		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17531					 HDA_AMP_MUTE, HDA_AMP_MUTE);
17532	} else {
17533		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17534					 HDA_AMP_MUTE, 0);
17535		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17536					 HDA_AMP_MUTE, 0);
17537	}
17538}
17539
17540static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
17541{
17542	unsigned int present1, present2;
17543
17544	present1 = snd_hda_codec_read(codec, 0x1b, 0,
17545			AC_VERB_GET_PIN_SENSE, 0)
17546			& AC_PINSENSE_PRESENCE;
17547	present2 = snd_hda_codec_read(codec, 0x21, 0,
17548			AC_VERB_GET_PIN_SENSE, 0)
17549			& AC_PINSENSE_PRESENCE;
17550
17551	if (present1 || present2) {
17552		snd_hda_codec_write_cache(codec, 0x14, 0,
17553			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17554		snd_hda_codec_write_cache(codec, 0x17, 0,
17555			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17556	} else {
17557		snd_hda_codec_write_cache(codec, 0x14, 0,
17558			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17559		snd_hda_codec_write_cache(codec, 0x17, 0,
17560			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17561	}
17562}
17563
17564static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
17565{
17566	unsigned int present1, present2;
17567
17568	present1 = snd_hda_codec_read(codec, 0x21, 0,
17569			AC_VERB_GET_PIN_SENSE, 0)
17570			& AC_PINSENSE_PRESENCE;
17571	present2 = snd_hda_codec_read(codec, 0x15, 0,
17572			AC_VERB_GET_PIN_SENSE, 0)
17573			& AC_PINSENSE_PRESENCE;
17574
17575	if (present1 || present2) {
17576		snd_hda_codec_write_cache(codec, 0x14, 0,
17577			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17578		snd_hda_codec_write_cache(codec, 0x17, 0,
17579			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17580	} else {
17581		snd_hda_codec_write_cache(codec, 0x14, 0,
17582			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17583		snd_hda_codec_write_cache(codec, 0x17, 0,
17584			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17585	}
17586}
17587
17588static void alc663_m51va_unsol_event(struct hda_codec *codec,
17589					   unsigned int res)
17590{
17591	switch (res >> 26) {
17592	case ALC880_HP_EVENT:
17593		alc663_m51va_speaker_automute(codec);
17594		break;
17595	case ALC880_MIC_EVENT:
17596		alc_mic_automute(codec);
17597		break;
17598	}
17599}
17600
17601static void alc663_m51va_setup(struct hda_codec *codec)
17602{
17603	struct alc_spec *spec = codec->spec;
17604	spec->ext_mic.pin = 0x18;
17605	spec->ext_mic.mux_idx = 0;
17606	spec->int_mic.pin = 0x12;
17607	spec->int_mic.mux_idx = 9;
17608	spec->auto_mic = 1;
17609}
17610
17611static void alc663_m51va_inithook(struct hda_codec *codec)
17612{
17613	alc663_m51va_speaker_automute(codec);
17614	alc_mic_automute(codec);
17615}
17616
17617/* ***************** Mode1 ******************************/
17618#define alc663_mode1_unsol_event	alc663_m51va_unsol_event
17619
17620static void alc663_mode1_setup(struct hda_codec *codec)
17621{
17622	struct alc_spec *spec = codec->spec;
17623	spec->ext_mic.pin = 0x18;
17624	spec->ext_mic.mux_idx = 0;
17625	spec->int_mic.pin = 0x19;
17626	spec->int_mic.mux_idx = 1;
17627	spec->auto_mic = 1;
17628}
17629
17630#define alc663_mode1_inithook		alc663_m51va_inithook
17631
17632/* ***************** Mode2 ******************************/
17633static void alc662_mode2_unsol_event(struct hda_codec *codec,
17634					   unsigned int res)
17635{
17636	switch (res >> 26) {
17637	case ALC880_HP_EVENT:
17638		alc662_f5z_speaker_automute(codec);
17639		break;
17640	case ALC880_MIC_EVENT:
17641		alc_mic_automute(codec);
17642		break;
17643	}
17644}
17645
17646#define alc662_mode2_setup	alc663_mode1_setup
17647
17648static void alc662_mode2_inithook(struct hda_codec *codec)
17649{
17650	alc662_f5z_speaker_automute(codec);
17651	alc_mic_automute(codec);
17652}
17653/* ***************** Mode3 ******************************/
17654static void alc663_mode3_unsol_event(struct hda_codec *codec,
17655					   unsigned int res)
17656{
17657	switch (res >> 26) {
17658	case ALC880_HP_EVENT:
17659		alc663_two_hp_m1_speaker_automute(codec);
17660		break;
17661	case ALC880_MIC_EVENT:
17662		alc_mic_automute(codec);
17663		break;
17664	}
17665}
17666
17667#define alc663_mode3_setup	alc663_mode1_setup
17668
17669static void alc663_mode3_inithook(struct hda_codec *codec)
17670{
17671	alc663_two_hp_m1_speaker_automute(codec);
17672	alc_mic_automute(codec);
17673}
17674/* ***************** Mode4 ******************************/
17675static void alc663_mode4_unsol_event(struct hda_codec *codec,
17676					   unsigned int res)
17677{
17678	switch (res >> 26) {
17679	case ALC880_HP_EVENT:
17680		alc663_21jd_two_speaker_automute(codec);
17681		break;
17682	case ALC880_MIC_EVENT:
17683		alc_mic_automute(codec);
17684		break;
17685	}
17686}
17687
17688#define alc663_mode4_setup	alc663_mode1_setup
17689
17690static void alc663_mode4_inithook(struct hda_codec *codec)
17691{
17692	alc663_21jd_two_speaker_automute(codec);
17693	alc_mic_automute(codec);
17694}
17695/* ***************** Mode5 ******************************/
17696static void alc663_mode5_unsol_event(struct hda_codec *codec,
17697					   unsigned int res)
17698{
17699	switch (res >> 26) {
17700	case ALC880_HP_EVENT:
17701		alc663_15jd_two_speaker_automute(codec);
17702		break;
17703	case ALC880_MIC_EVENT:
17704		alc_mic_automute(codec);
17705		break;
17706	}
17707}
17708
17709#define alc663_mode5_setup	alc663_mode1_setup
17710
17711static void alc663_mode5_inithook(struct hda_codec *codec)
17712{
17713	alc663_15jd_two_speaker_automute(codec);
17714	alc_mic_automute(codec);
17715}
17716/* ***************** Mode6 ******************************/
17717static void alc663_mode6_unsol_event(struct hda_codec *codec,
17718					   unsigned int res)
17719{
17720	switch (res >> 26) {
17721	case ALC880_HP_EVENT:
17722		alc663_two_hp_m2_speaker_automute(codec);
17723		break;
17724	case ALC880_MIC_EVENT:
17725		alc_mic_automute(codec);
17726		break;
17727	}
17728}
17729
17730#define alc663_mode6_setup	alc663_mode1_setup
17731
17732static void alc663_mode6_inithook(struct hda_codec *codec)
17733{
17734	alc663_two_hp_m2_speaker_automute(codec);
17735	alc_mic_automute(codec);
17736}
17737
17738/* ***************** Mode7 ******************************/
17739static void alc663_mode7_unsol_event(struct hda_codec *codec,
17740					   unsigned int res)
17741{
17742	switch (res >> 26) {
17743	case ALC880_HP_EVENT:
17744		alc663_two_hp_m7_speaker_automute(codec);
17745		break;
17746	case ALC880_MIC_EVENT:
17747		alc_mic_automute(codec);
17748		break;
17749	}
17750}
17751
17752#define alc663_mode7_setup	alc663_mode1_setup
17753
17754static void alc663_mode7_inithook(struct hda_codec *codec)
17755{
17756	alc663_two_hp_m7_speaker_automute(codec);
17757	alc_mic_automute(codec);
17758}
17759
17760/* ***************** Mode8 ******************************/
17761static void alc663_mode8_unsol_event(struct hda_codec *codec,
17762					   unsigned int res)
17763{
17764	switch (res >> 26) {
17765	case ALC880_HP_EVENT:
17766		alc663_two_hp_m8_speaker_automute(codec);
17767		break;
17768	case ALC880_MIC_EVENT:
17769		alc_mic_automute(codec);
17770		break;
17771	}
17772}
17773
17774#define alc663_mode8_setup	alc663_m51va_setup
17775
17776static void alc663_mode8_inithook(struct hda_codec *codec)
17777{
17778	alc663_two_hp_m8_speaker_automute(codec);
17779	alc_mic_automute(codec);
17780}
17781
17782static void alc663_g71v_hp_automute(struct hda_codec *codec)
17783{
17784	unsigned int present;
17785	unsigned char bits;
17786
17787	present = snd_hda_jack_detect(codec, 0x21);
17788	bits = present ? HDA_AMP_MUTE : 0;
17789	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17790				 HDA_AMP_MUTE, bits);
17791	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17792				 HDA_AMP_MUTE, bits);
17793}
17794
17795static void alc663_g71v_front_automute(struct hda_codec *codec)
17796{
17797	unsigned int present;
17798	unsigned char bits;
17799
17800	present = snd_hda_jack_detect(codec, 0x15);
17801	bits = present ? HDA_AMP_MUTE : 0;
17802	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17803				 HDA_AMP_MUTE, bits);
17804}
17805
17806static void alc663_g71v_unsol_event(struct hda_codec *codec,
17807					   unsigned int res)
17808{
17809	switch (res >> 26) {
17810	case ALC880_HP_EVENT:
17811		alc663_g71v_hp_automute(codec);
17812		break;
17813	case ALC880_FRONT_EVENT:
17814		alc663_g71v_front_automute(codec);
17815		break;
17816	case ALC880_MIC_EVENT:
17817		alc_mic_automute(codec);
17818		break;
17819	}
17820}
17821
17822#define alc663_g71v_setup	alc663_m51va_setup
17823
17824static void alc663_g71v_inithook(struct hda_codec *codec)
17825{
17826	alc663_g71v_front_automute(codec);
17827	alc663_g71v_hp_automute(codec);
17828	alc_mic_automute(codec);
17829}
17830
17831static void alc663_g50v_unsol_event(struct hda_codec *codec,
17832					   unsigned int res)
17833{
17834	switch (res >> 26) {
17835	case ALC880_HP_EVENT:
17836		alc663_m51va_speaker_automute(codec);
17837		break;
17838	case ALC880_MIC_EVENT:
17839		alc_mic_automute(codec);
17840		break;
17841	}
17842}
17843
17844#define alc663_g50v_setup	alc663_m51va_setup
17845
17846static void alc663_g50v_inithook(struct hda_codec *codec)
17847{
17848	alc663_m51va_speaker_automute(codec);
17849	alc_mic_automute(codec);
17850}
17851
17852static struct snd_kcontrol_new alc662_ecs_mixer[] = {
17853	HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17854	ALC262_HIPPO_MASTER_SWITCH,
17855
17856	HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
17857	HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
17858	HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
17859
17860	HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
17861	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17862	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17863	{ } /* end */
17864};
17865
17866static struct snd_kcontrol_new alc272_nc10_mixer[] = {
17867	/* Master Playback automatically created from Speaker and Headphone */
17868	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17869	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17870	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17871	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17872
17873	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17874	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17875	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
17876
17877	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17878	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17879	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
17880	{ } /* end */
17881};
17882
17883#ifdef CONFIG_SND_HDA_POWER_SAVE
17884#define alc662_loopbacks	alc880_loopbacks
17885#endif
17886
17887
17888/* pcm configuration: identical with ALC880 */
17889#define alc662_pcm_analog_playback	alc880_pcm_analog_playback
17890#define alc662_pcm_analog_capture	alc880_pcm_analog_capture
17891#define alc662_pcm_digital_playback	alc880_pcm_digital_playback
17892#define alc662_pcm_digital_capture	alc880_pcm_digital_capture
17893
17894/*
17895 * configuration and preset
17896 */
17897static const char *alc662_models[ALC662_MODEL_LAST] = {
17898	[ALC662_3ST_2ch_DIG]	= "3stack-dig",
17899	[ALC662_3ST_6ch_DIG]	= "3stack-6ch-dig",
17900	[ALC662_3ST_6ch]	= "3stack-6ch",
17901	[ALC662_5ST_DIG]	= "6stack-dig",
17902	[ALC662_LENOVO_101E]	= "lenovo-101e",
17903	[ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
17904	[ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
17905	[ALC662_ECS] = "ecs",
17906	[ALC663_ASUS_M51VA] = "m51va",
17907	[ALC663_ASUS_G71V] = "g71v",
17908	[ALC663_ASUS_H13] = "h13",
17909	[ALC663_ASUS_G50V] = "g50v",
17910	[ALC663_ASUS_MODE1] = "asus-mode1",
17911	[ALC662_ASUS_MODE2] = "asus-mode2",
17912	[ALC663_ASUS_MODE3] = "asus-mode3",
17913	[ALC663_ASUS_MODE4] = "asus-mode4",
17914	[ALC663_ASUS_MODE5] = "asus-mode5",
17915	[ALC663_ASUS_MODE6] = "asus-mode6",
17916	[ALC663_ASUS_MODE7] = "asus-mode7",
17917	[ALC663_ASUS_MODE8] = "asus-mode8",
17918	[ALC272_DELL]		= "dell",
17919	[ALC272_DELL_ZM1]	= "dell-zm1",
17920	[ALC272_SAMSUNG_NC10]	= "samsung-nc10",
17921	[ALC662_AUTO]		= "auto",
17922};
17923
17924static struct snd_pci_quirk alc662_cfg_tbl[] = {
17925	SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
17926	SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
17927	SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
17928	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
17929	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
17930	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1),
17931	SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
17932	SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
17933	SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
17934	SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
17935	SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
17936	SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
17937	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
17938	SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
17939	SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
17940	SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
17941	SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
17942	SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
17943	SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
17944	SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
17945	SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
17946	SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
17947	SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
17948	SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
17949	SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
17950	SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
17951	SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
17952	SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
17953	SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
17954	SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
17955	SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
17956	SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
17957	SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
17958	SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
17959	SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
17960	SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
17961	SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
17962	/*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
17963	SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
17964	SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
17965	SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
17966	SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1),
17967	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
17968	SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
17969	SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
17970	SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
17971	SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
17972	SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
17973	SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
17974	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
17975	SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
17976	SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
17977	SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
17978	/*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
17979	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
17980	SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
17981	SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
17982	SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
17983	SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
17984	SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
17985	SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
17986	SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
17987	SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
17988	SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
17989		      ALC662_3ST_6ch_DIG),
17990	SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
17991	SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
17992	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
17993		      ALC662_3ST_6ch_DIG),
17994	SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13),
17995	SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
17996	SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
17997	SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
17998	SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
17999					ALC662_3ST_6ch_DIG),
18000	SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
18001			   ALC663_ASUS_H13),
18002	{}
18003};
18004
18005static struct alc_config_preset alc662_presets[] = {
18006	[ALC662_3ST_2ch_DIG] = {
18007		.mixers = { alc662_3ST_2ch_mixer },
18008		.init_verbs = { alc662_init_verbs },
18009		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18010		.dac_nids = alc662_dac_nids,
18011		.dig_out_nid = ALC662_DIGOUT_NID,
18012		.dig_in_nid = ALC662_DIGIN_NID,
18013		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18014		.channel_mode = alc662_3ST_2ch_modes,
18015		.input_mux = &alc662_capture_source,
18016	},
18017	[ALC662_3ST_6ch_DIG] = {
18018		.mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18019		.init_verbs = { alc662_init_verbs },
18020		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18021		.dac_nids = alc662_dac_nids,
18022		.dig_out_nid = ALC662_DIGOUT_NID,
18023		.dig_in_nid = ALC662_DIGIN_NID,
18024		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18025		.channel_mode = alc662_3ST_6ch_modes,
18026		.need_dac_fix = 1,
18027		.input_mux = &alc662_capture_source,
18028	},
18029	[ALC662_3ST_6ch] = {
18030		.mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18031		.init_verbs = { alc662_init_verbs },
18032		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18033		.dac_nids = alc662_dac_nids,
18034		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18035		.channel_mode = alc662_3ST_6ch_modes,
18036		.need_dac_fix = 1,
18037		.input_mux = &alc662_capture_source,
18038	},
18039	[ALC662_5ST_DIG] = {
18040		.mixers = { alc662_base_mixer, alc662_chmode_mixer },
18041		.init_verbs = { alc662_init_verbs },
18042		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18043		.dac_nids = alc662_dac_nids,
18044		.dig_out_nid = ALC662_DIGOUT_NID,
18045		.dig_in_nid = ALC662_DIGIN_NID,
18046		.num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
18047		.channel_mode = alc662_5stack_modes,
18048		.input_mux = &alc662_capture_source,
18049	},
18050	[ALC662_LENOVO_101E] = {
18051		.mixers = { alc662_lenovo_101e_mixer },
18052		.init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
18053		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18054		.dac_nids = alc662_dac_nids,
18055		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18056		.channel_mode = alc662_3ST_2ch_modes,
18057		.input_mux = &alc662_lenovo_101e_capture_source,
18058		.unsol_event = alc662_lenovo_101e_unsol_event,
18059		.init_hook = alc662_lenovo_101e_all_automute,
18060	},
18061	[ALC662_ASUS_EEEPC_P701] = {
18062		.mixers = { alc662_eeepc_p701_mixer },
18063		.init_verbs = { alc662_init_verbs,
18064				alc662_eeepc_sue_init_verbs },
18065		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18066		.dac_nids = alc662_dac_nids,
18067		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18068		.channel_mode = alc662_3ST_2ch_modes,
18069		.unsol_event = alc662_eeepc_unsol_event,
18070		.setup = alc662_eeepc_setup,
18071		.init_hook = alc662_eeepc_inithook,
18072	},
18073	[ALC662_ASUS_EEEPC_EP20] = {
18074		.mixers = { alc662_eeepc_ep20_mixer,
18075			    alc662_chmode_mixer },
18076		.init_verbs = { alc662_init_verbs,
18077				alc662_eeepc_ep20_sue_init_verbs },
18078		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18079		.dac_nids = alc662_dac_nids,
18080		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18081		.channel_mode = alc662_3ST_6ch_modes,
18082		.input_mux = &alc662_lenovo_101e_capture_source,
18083		.unsol_event = alc662_eeepc_unsol_event,
18084		.setup = alc662_eeepc_ep20_setup,
18085		.init_hook = alc662_eeepc_ep20_inithook,
18086	},
18087	[ALC662_ECS] = {
18088		.mixers = { alc662_ecs_mixer },
18089		.init_verbs = { alc662_init_verbs,
18090				alc662_ecs_init_verbs },
18091		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18092		.dac_nids = alc662_dac_nids,
18093		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18094		.channel_mode = alc662_3ST_2ch_modes,
18095		.unsol_event = alc662_eeepc_unsol_event,
18096		.setup = alc662_eeepc_setup,
18097		.init_hook = alc662_eeepc_inithook,
18098	},
18099	[ALC663_ASUS_M51VA] = {
18100		.mixers = { alc663_m51va_mixer },
18101		.init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18102		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18103		.dac_nids = alc662_dac_nids,
18104		.dig_out_nid = ALC662_DIGOUT_NID,
18105		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18106		.channel_mode = alc662_3ST_2ch_modes,
18107		.unsol_event = alc663_m51va_unsol_event,
18108		.setup = alc663_m51va_setup,
18109		.init_hook = alc663_m51va_inithook,
18110	},
18111	[ALC663_ASUS_G71V] = {
18112		.mixers = { alc663_g71v_mixer },
18113		.init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
18114		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18115		.dac_nids = alc662_dac_nids,
18116		.dig_out_nid = ALC662_DIGOUT_NID,
18117		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18118		.channel_mode = alc662_3ST_2ch_modes,
18119		.unsol_event = alc663_g71v_unsol_event,
18120		.setup = alc663_g71v_setup,
18121		.init_hook = alc663_g71v_inithook,
18122	},
18123	[ALC663_ASUS_H13] = {
18124		.mixers = { alc663_m51va_mixer },
18125		.init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18126		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18127		.dac_nids = alc662_dac_nids,
18128		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18129		.channel_mode = alc662_3ST_2ch_modes,
18130		.unsol_event = alc663_m51va_unsol_event,
18131		.init_hook = alc663_m51va_inithook,
18132	},
18133	[ALC663_ASUS_G50V] = {
18134		.mixers = { alc663_g50v_mixer },
18135		.init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
18136		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18137		.dac_nids = alc662_dac_nids,
18138		.dig_out_nid = ALC662_DIGOUT_NID,
18139		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18140		.channel_mode = alc662_3ST_6ch_modes,
18141		.input_mux = &alc663_capture_source,
18142		.unsol_event = alc663_g50v_unsol_event,
18143		.setup = alc663_g50v_setup,
18144		.init_hook = alc663_g50v_inithook,
18145	},
18146	[ALC663_ASUS_MODE1] = {
18147		.mixers = { alc663_m51va_mixer },
18148		.cap_mixer = alc662_auto_capture_mixer,
18149		.init_verbs = { alc662_init_verbs,
18150				alc663_21jd_amic_init_verbs },
18151		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18152		.hp_nid = 0x03,
18153		.dac_nids = alc662_dac_nids,
18154		.dig_out_nid = ALC662_DIGOUT_NID,
18155		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18156		.channel_mode = alc662_3ST_2ch_modes,
18157		.unsol_event = alc663_mode1_unsol_event,
18158		.setup = alc663_mode1_setup,
18159		.init_hook = alc663_mode1_inithook,
18160	},
18161	[ALC662_ASUS_MODE2] = {
18162		.mixers = { alc662_1bjd_mixer },
18163		.cap_mixer = alc662_auto_capture_mixer,
18164		.init_verbs = { alc662_init_verbs,
18165				alc662_1bjd_amic_init_verbs },
18166		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18167		.dac_nids = alc662_dac_nids,
18168		.dig_out_nid = ALC662_DIGOUT_NID,
18169		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18170		.channel_mode = alc662_3ST_2ch_modes,
18171		.unsol_event = alc662_mode2_unsol_event,
18172		.setup = alc662_mode2_setup,
18173		.init_hook = alc662_mode2_inithook,
18174	},
18175	[ALC663_ASUS_MODE3] = {
18176		.mixers = { alc663_two_hp_m1_mixer },
18177		.cap_mixer = alc662_auto_capture_mixer,
18178		.init_verbs = { alc662_init_verbs,
18179				alc663_two_hp_amic_m1_init_verbs },
18180		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18181		.hp_nid = 0x03,
18182		.dac_nids = alc662_dac_nids,
18183		.dig_out_nid = ALC662_DIGOUT_NID,
18184		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18185		.channel_mode = alc662_3ST_2ch_modes,
18186		.unsol_event = alc663_mode3_unsol_event,
18187		.setup = alc663_mode3_setup,
18188		.init_hook = alc663_mode3_inithook,
18189	},
18190	[ALC663_ASUS_MODE4] = {
18191		.mixers = { alc663_asus_21jd_clfe_mixer },
18192		.cap_mixer = alc662_auto_capture_mixer,
18193		.init_verbs = { alc662_init_verbs,
18194				alc663_21jd_amic_init_verbs},
18195		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18196		.hp_nid = 0x03,
18197		.dac_nids = alc662_dac_nids,
18198		.dig_out_nid = ALC662_DIGOUT_NID,
18199		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18200		.channel_mode = alc662_3ST_2ch_modes,
18201		.unsol_event = alc663_mode4_unsol_event,
18202		.setup = alc663_mode4_setup,
18203		.init_hook = alc663_mode4_inithook,
18204	},
18205	[ALC663_ASUS_MODE5] = {
18206		.mixers = { alc663_asus_15jd_clfe_mixer },
18207		.cap_mixer = alc662_auto_capture_mixer,
18208		.init_verbs = { alc662_init_verbs,
18209				alc663_15jd_amic_init_verbs },
18210		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18211		.hp_nid = 0x03,
18212		.dac_nids = alc662_dac_nids,
18213		.dig_out_nid = ALC662_DIGOUT_NID,
18214		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18215		.channel_mode = alc662_3ST_2ch_modes,
18216		.unsol_event = alc663_mode5_unsol_event,
18217		.setup = alc663_mode5_setup,
18218		.init_hook = alc663_mode5_inithook,
18219	},
18220	[ALC663_ASUS_MODE6] = {
18221		.mixers = { alc663_two_hp_m2_mixer },
18222		.cap_mixer = alc662_auto_capture_mixer,
18223		.init_verbs = { alc662_init_verbs,
18224				alc663_two_hp_amic_m2_init_verbs },
18225		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18226		.hp_nid = 0x03,
18227		.dac_nids = alc662_dac_nids,
18228		.dig_out_nid = ALC662_DIGOUT_NID,
18229		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18230		.channel_mode = alc662_3ST_2ch_modes,
18231		.unsol_event = alc663_mode6_unsol_event,
18232		.setup = alc663_mode6_setup,
18233		.init_hook = alc663_mode6_inithook,
18234	},
18235	[ALC663_ASUS_MODE7] = {
18236		.mixers = { alc663_mode7_mixer },
18237		.cap_mixer = alc662_auto_capture_mixer,
18238		.init_verbs = { alc662_init_verbs,
18239				alc663_mode7_init_verbs },
18240		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18241		.hp_nid = 0x03,
18242		.dac_nids = alc662_dac_nids,
18243		.dig_out_nid = ALC662_DIGOUT_NID,
18244		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18245		.channel_mode = alc662_3ST_2ch_modes,
18246		.unsol_event = alc663_mode7_unsol_event,
18247		.setup = alc663_mode7_setup,
18248		.init_hook = alc663_mode7_inithook,
18249	},
18250	[ALC663_ASUS_MODE8] = {
18251		.mixers = { alc663_mode8_mixer },
18252		.cap_mixer = alc662_auto_capture_mixer,
18253		.init_verbs = { alc662_init_verbs,
18254				alc663_mode8_init_verbs },
18255		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18256		.hp_nid = 0x03,
18257		.dac_nids = alc662_dac_nids,
18258		.dig_out_nid = ALC662_DIGOUT_NID,
18259		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18260		.channel_mode = alc662_3ST_2ch_modes,
18261		.unsol_event = alc663_mode8_unsol_event,
18262		.setup = alc663_mode8_setup,
18263		.init_hook = alc663_mode8_inithook,
18264	},
18265	[ALC272_DELL] = {
18266		.mixers = { alc663_m51va_mixer },
18267		.cap_mixer = alc272_auto_capture_mixer,
18268		.init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
18269		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
18270		.dac_nids = alc662_dac_nids,
18271		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18272		.adc_nids = alc272_adc_nids,
18273		.num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
18274		.capsrc_nids = alc272_capsrc_nids,
18275		.channel_mode = alc662_3ST_2ch_modes,
18276		.unsol_event = alc663_m51va_unsol_event,
18277		.setup = alc663_m51va_setup,
18278		.init_hook = alc663_m51va_inithook,
18279	},
18280	[ALC272_DELL_ZM1] = {
18281		.mixers = { alc663_m51va_mixer },
18282		.cap_mixer = alc662_auto_capture_mixer,
18283		.init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
18284		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
18285		.dac_nids = alc662_dac_nids,
18286		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18287		.adc_nids = alc662_adc_nids,
18288		.num_adc_nids = 1,
18289		.capsrc_nids = alc662_capsrc_nids,
18290		.channel_mode = alc662_3ST_2ch_modes,
18291		.unsol_event = alc663_m51va_unsol_event,
18292		.setup = alc663_m51va_setup,
18293		.init_hook = alc663_m51va_inithook,
18294	},
18295	[ALC272_SAMSUNG_NC10] = {
18296		.mixers = { alc272_nc10_mixer },
18297		.init_verbs = { alc662_init_verbs,
18298				alc663_21jd_amic_init_verbs },
18299		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
18300		.dac_nids = alc272_dac_nids,
18301		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18302		.channel_mode = alc662_3ST_2ch_modes,
18303		/*.input_mux = &alc272_nc10_capture_source,*/
18304		.unsol_event = alc663_mode4_unsol_event,
18305		.setup = alc663_mode4_setup,
18306		.init_hook = alc663_mode4_inithook,
18307	},
18308};
18309
18310
18311/*
18312 * BIOS auto configuration
18313 */
18314
18315/* convert from MIX nid to DAC */
18316static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
18317{
18318	if (nid == 0x0f)
18319		return 0x02;
18320	else if (nid >= 0x0c && nid <= 0x0e)
18321		return nid - 0x0c + 0x02;
18322	else
18323		return 0;
18324}
18325
18326/* get MIX nid connected to the given pin targeted to DAC */
18327static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
18328				   hda_nid_t dac)
18329{
18330	hda_nid_t mix[4];
18331	int i, num;
18332
18333	num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
18334	for (i = 0; i < num; i++) {
18335		if (alc662_mix_to_dac(mix[i]) == dac)
18336			return mix[i];
18337	}
18338	return 0;
18339}
18340
18341/* look for an empty DAC slot */
18342static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
18343{
18344	struct alc_spec *spec = codec->spec;
18345	hda_nid_t srcs[5];
18346	int i, j, num;
18347
18348	num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
18349	if (num < 0)
18350		return 0;
18351	for (i = 0; i < num; i++) {
18352		hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
18353		if (!nid)
18354			continue;
18355		for (j = 0; j < spec->multiout.num_dacs; j++)
18356			if (spec->multiout.dac_nids[j] == nid)
18357				break;
18358		if (j >= spec->multiout.num_dacs)
18359			return nid;
18360	}
18361	return 0;
18362}
18363
18364/* fill in the dac_nids table from the parsed pin configuration */
18365static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
18366				     const struct auto_pin_cfg *cfg)
18367{
18368	struct alc_spec *spec = codec->spec;
18369	int i;
18370	hda_nid_t dac;
18371
18372	spec->multiout.dac_nids = spec->private_dac_nids;
18373	for (i = 0; i < cfg->line_outs; i++) {
18374		dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
18375		if (!dac)
18376			continue;
18377		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
18378	}
18379	return 0;
18380}
18381
18382static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
18383			      hda_nid_t nid, unsigned int chs)
18384{
18385	return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
18386			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
18387}
18388
18389static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
18390			     hda_nid_t nid, unsigned int chs)
18391{
18392	return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18393			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
18394}
18395
18396#define alc662_add_stereo_vol(spec, pfx, nid) \
18397	alc662_add_vol_ctl(spec, pfx, nid, 3)
18398#define alc662_add_stereo_sw(spec, pfx, nid) \
18399	alc662_add_sw_ctl(spec, pfx, nid, 3)
18400
18401/* add playback controls from the parsed DAC table */
18402static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
18403					     const struct auto_pin_cfg *cfg)
18404{
18405	struct alc_spec *spec = codec->spec;
18406	static const char *chname[4] = {
18407		"Front", "Surround", NULL /*CLFE*/, "Side"
18408	};
18409	hda_nid_t nid, mix;
18410	int i, err;
18411
18412	for (i = 0; i < cfg->line_outs; i++) {
18413		nid = spec->multiout.dac_nids[i];
18414		if (!nid)
18415			continue;
18416		mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
18417		if (!mix)
18418			continue;
18419		if (i == 2) {
18420			/* Center/LFE */
18421			err = alc662_add_vol_ctl(spec, "Center", nid, 1);
18422			if (err < 0)
18423				return err;
18424			err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
18425			if (err < 0)
18426				return err;
18427			err = alc662_add_sw_ctl(spec, "Center", mix, 1);
18428			if (err < 0)
18429				return err;
18430			err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
18431			if (err < 0)
18432				return err;
18433		} else {
18434			const char *pfx;
18435			if (cfg->line_outs == 1 &&
18436			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
18437				if (cfg->hp_outs)
18438					pfx = "Speaker";
18439				else
18440					pfx = "PCM";
18441			} else
18442				pfx = chname[i];
18443			err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18444			if (err < 0)
18445				return err;
18446			if (cfg->line_outs == 1 &&
18447			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
18448				pfx = "Speaker";
18449			err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18450			if (err < 0)
18451				return err;
18452		}
18453	}
18454	return 0;
18455}
18456
18457/* add playback controls for speaker and HP outputs */
18458/* return DAC nid if any new DAC is assigned */
18459static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
18460					const char *pfx)
18461{
18462	struct alc_spec *spec = codec->spec;
18463	hda_nid_t nid, mix;
18464	int err;
18465
18466	if (!pin)
18467		return 0;
18468	nid = alc662_look_for_dac(codec, pin);
18469	if (!nid) {
18470		/* the corresponding DAC is already occupied */
18471		if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
18472			return 0; /* no way */
18473		/* create a switch only */
18474		return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18475				   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
18476	}
18477
18478	mix = alc662_dac_to_mix(codec, pin, nid);
18479	if (!mix)
18480		return 0;
18481	err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18482	if (err < 0)
18483		return err;
18484	err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18485	if (err < 0)
18486		return err;
18487	return nid;
18488}
18489
18490/* create playback/capture controls for input pins */
18491#define alc662_auto_create_input_ctls \
18492	alc882_auto_create_input_ctls
18493
18494static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
18495					      hda_nid_t nid, int pin_type,
18496					      hda_nid_t dac)
18497{
18498	int i, num;
18499	hda_nid_t srcs[4];
18500
18501	alc_set_pin_output(codec, nid, pin_type);
18502	/* need the manual connection? */
18503	num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
18504	if (num <= 1)
18505		return;
18506	for (i = 0; i < num; i++) {
18507		if (alc662_mix_to_dac(srcs[i]) != dac)
18508			continue;
18509		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
18510		return;
18511	}
18512}
18513
18514static void alc662_auto_init_multi_out(struct hda_codec *codec)
18515{
18516	struct alc_spec *spec = codec->spec;
18517	int pin_type = get_pin_type(spec->autocfg.line_out_type);
18518	int i;
18519
18520	for (i = 0; i <= HDA_SIDE; i++) {
18521		hda_nid_t nid = spec->autocfg.line_out_pins[i];
18522		if (nid)
18523			alc662_auto_set_output_and_unmute(codec, nid, pin_type,
18524					spec->multiout.dac_nids[i]);
18525	}
18526}
18527
18528static void alc662_auto_init_hp_out(struct hda_codec *codec)
18529{
18530	struct alc_spec *spec = codec->spec;
18531	hda_nid_t pin;
18532
18533	pin = spec->autocfg.hp_pins[0];
18534	if (pin)
18535		alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
18536						  spec->multiout.hp_nid);
18537	pin = spec->autocfg.speaker_pins[0];
18538	if (pin)
18539		alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
18540					spec->multiout.extra_out_nid[0]);
18541}
18542
18543#define ALC662_PIN_CD_NID		ALC880_PIN_CD_NID
18544
18545static void alc662_auto_init_analog_input(struct hda_codec *codec)
18546{
18547	struct alc_spec *spec = codec->spec;
18548	int i;
18549
18550	for (i = 0; i < AUTO_PIN_LAST; i++) {
18551		hda_nid_t nid = spec->autocfg.input_pins[i];
18552		if (alc_is_input_pin(codec, nid)) {
18553			alc_set_input_pin(codec, nid, i);
18554			if (nid != ALC662_PIN_CD_NID &&
18555			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
18556				snd_hda_codec_write(codec, nid, 0,
18557						    AC_VERB_SET_AMP_GAIN_MUTE,
18558						    AMP_OUT_MUTE);
18559		}
18560	}
18561}
18562
18563#define alc662_auto_init_input_src	alc882_auto_init_input_src
18564
18565static int alc662_parse_auto_config(struct hda_codec *codec)
18566{
18567	struct alc_spec *spec = codec->spec;
18568	int err;
18569	static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
18570
18571	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
18572					   alc662_ignore);
18573	if (err < 0)
18574		return err;
18575	if (!spec->autocfg.line_outs)
18576		return 0; /* can't find valid BIOS pin config */
18577
18578	err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
18579	if (err < 0)
18580		return err;
18581	err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
18582	if (err < 0)
18583		return err;
18584	err = alc662_auto_create_extra_out(codec,
18585					   spec->autocfg.speaker_pins[0],
18586					   "Speaker");
18587	if (err < 0)
18588		return err;
18589	if (err)
18590		spec->multiout.extra_out_nid[0] = err;
18591	err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
18592					   "Headphone");
18593	if (err < 0)
18594		return err;
18595	if (err)
18596		spec->multiout.hp_nid = err;
18597	err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
18598	if (err < 0)
18599		return err;
18600
18601	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
18602
18603	if (spec->autocfg.dig_outs)
18604		spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
18605
18606	if (spec->kctls.list)
18607		add_mixer(spec, spec->kctls.list);
18608
18609	spec->num_mux_defs = 1;
18610	spec->input_mux = &spec->private_imux[0];
18611
18612	add_verb(spec, alc662_init_verbs);
18613	if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18614	    codec->vendor_id == 0x10ec0665)
18615		add_verb(spec, alc663_init_verbs);
18616
18617	if (codec->vendor_id == 0x10ec0272)
18618		add_verb(spec, alc272_init_verbs);
18619
18620	err = alc_auto_add_mic_boost(codec);
18621	if (err < 0)
18622		return err;
18623
18624	if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18625	    codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
18626	    alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0x21);
18627	else
18628	    alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
18629
18630	return 1;
18631}
18632
18633/* additional initialization for auto-configuration model */
18634static void alc662_auto_init(struct hda_codec *codec)
18635{
18636	struct alc_spec *spec = codec->spec;
18637	alc662_auto_init_multi_out(codec);
18638	alc662_auto_init_hp_out(codec);
18639	alc662_auto_init_analog_input(codec);
18640	alc662_auto_init_input_src(codec);
18641	if (spec->unsol_event)
18642		alc_inithook(codec);
18643}
18644
18645static int patch_alc662(struct hda_codec *codec)
18646{
18647	struct alc_spec *spec;
18648	int err, board_config;
18649
18650	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
18651	if (!spec)
18652		return -ENOMEM;
18653
18654	codec->spec = spec;
18655
18656	alc_auto_parse_customize_define(codec);
18657
18658	alc_fix_pll_init(codec, 0x20, 0x04, 15);
18659
18660	if (alc_read_coef_idx(codec, 0) == 0x8020)
18661		alc_codec_rename(codec, "ALC661");
18662	else if ((alc_read_coef_idx(codec, 0) & (1 << 14)) &&
18663		 codec->bus->pci->subsystem_vendor == 0x1025 &&
18664		 spec->cdefine.platform_type == 1)
18665		alc_codec_rename(codec, "ALC272X");
18666
18667	board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
18668						  alc662_models,
18669			  	                  alc662_cfg_tbl);
18670	if (board_config < 0) {
18671		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
18672		       codec->chip_name);
18673		board_config = ALC662_AUTO;
18674	}
18675
18676	if (board_config == ALC662_AUTO) {
18677		/* automatic parse from the BIOS config */
18678		err = alc662_parse_auto_config(codec);
18679		if (err < 0) {
18680			alc_free(codec);
18681			return err;
18682		} else if (!err) {
18683			printk(KERN_INFO
18684			       "hda_codec: Cannot set up configuration "
18685			       "from BIOS.  Using base mode...\n");
18686			board_config = ALC662_3ST_2ch_DIG;
18687		}
18688	}
18689
18690	err = snd_hda_attach_beep_device(codec, 0x1);
18691	if (err < 0) {
18692		alc_free(codec);
18693		return err;
18694	}
18695
18696	if (board_config != ALC662_AUTO)
18697		setup_preset(codec, &alc662_presets[board_config]);
18698
18699	spec->stream_analog_playback = &alc662_pcm_analog_playback;
18700	spec->stream_analog_capture = &alc662_pcm_analog_capture;
18701
18702	spec->stream_digital_playback = &alc662_pcm_digital_playback;
18703	spec->stream_digital_capture = &alc662_pcm_digital_capture;
18704
18705	if (!spec->adc_nids) {
18706		spec->adc_nids = alc662_adc_nids;
18707		spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
18708	}
18709	if (!spec->capsrc_nids)
18710		spec->capsrc_nids = alc662_capsrc_nids;
18711
18712	if (!spec->cap_mixer)
18713		set_capture_mixer(codec);
18714
18715	if (spec->cdefine.enable_pcbeep) {
18716		switch (codec->vendor_id) {
18717		case 0x10ec0662:
18718			set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
18719			break;
18720		case 0x10ec0272:
18721		case 0x10ec0663:
18722		case 0x10ec0665:
18723			set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
18724			break;
18725		case 0x10ec0273:
18726			set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
18727			break;
18728		}
18729	}
18730	spec->vmaster_nid = 0x02;
18731
18732	codec->patch_ops = alc_patch_ops;
18733	if (board_config == ALC662_AUTO)
18734		spec->init_hook = alc662_auto_init;
18735#ifdef CONFIG_SND_HDA_POWER_SAVE
18736	if (!spec->loopback.amplist)
18737		spec->loopback.amplist = alc662_loopbacks;
18738#endif
18739
18740	return 0;
18741}
18742
18743static int patch_alc888(struct hda_codec *codec)
18744{
18745	if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
18746		kfree(codec->chip_name);
18747		codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
18748		if (!codec->chip_name) {
18749			alc_free(codec);
18750			return -ENOMEM;
18751		}
18752		return patch_alc662(codec);
18753	}
18754	return patch_alc882(codec);
18755}
18756
18757/*
18758 * patch entries
18759 */
18760static struct hda_codec_preset snd_hda_preset_realtek[] = {
18761	{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
18762	{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
18763	{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
18764	{ .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
18765	{ .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
18766	{ .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
18767	{ .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
18768	{ .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
18769	{ .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
18770	  .patch = patch_alc861 },
18771	{ .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
18772	{ .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
18773	{ .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
18774	{ .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
18775	  .patch = patch_alc882 },
18776	{ .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
18777	  .patch = patch_alc662 },
18778	{ .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
18779	{ .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
18780	{ .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
18781	{ .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
18782	{ .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
18783	{ .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
18784	{ .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
18785	  .patch = patch_alc882 },
18786	{ .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
18787	  .patch = patch_alc882 },
18788	{ .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
18789	{ .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
18790	{ .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
18791	  .patch = patch_alc882 },
18792	{ .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
18793	{ .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
18794	{ .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
18795	{} /* terminator */
18796};
18797
18798MODULE_ALIAS("snd-hda-codec-id:10ec*");
18799
18800MODULE_LICENSE("GPL");
18801MODULE_DESCRIPTION("Realtek HD-audio codec");
18802
18803static struct hda_codec_preset_list realtek_list = {
18804	.preset = snd_hda_preset_realtek,
18805	.owner = THIS_MODULE,
18806};
18807
18808static int __init patch_realtek_init(void)
18809{
18810	return snd_hda_add_codec_preset(&realtek_list);
18811}
18812
18813static void __exit patch_realtek_exit(void)
18814{
18815	snd_hda_delete_codec_preset(&realtek_list);
18816}
18817
18818module_init(patch_realtek_init)
18819module_exit(patch_realtek_exit)
18820