patch_realtek.c revision 99ae28bea984df4c38234eb6d2f29a552def6c1b
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 <sound/jack.h>
32#include "hda_codec.h"
33#include "hda_local.h"
34#include "hda_beep.h"
35
36#define ALC880_FRONT_EVENT		0x01
37#define ALC880_DCVOL_EVENT		0x02
38#define ALC880_HP_EVENT			0x04
39#define ALC880_MIC_EVENT		0x08
40
41/* ALC880 board config type */
42enum {
43	ALC880_3ST,
44	ALC880_3ST_DIG,
45	ALC880_5ST,
46	ALC880_5ST_DIG,
47	ALC880_W810,
48	ALC880_Z71V,
49	ALC880_6ST,
50	ALC880_6ST_DIG,
51	ALC880_F1734,
52	ALC880_ASUS,
53	ALC880_ASUS_DIG,
54	ALC880_ASUS_W1V,
55	ALC880_ASUS_DIG2,
56	ALC880_FUJITSU,
57	ALC880_UNIWILL_DIG,
58	ALC880_UNIWILL,
59	ALC880_UNIWILL_P53,
60	ALC880_CLEVO,
61	ALC880_TCL_S700,
62	ALC880_LG,
63	ALC880_LG_LW,
64	ALC880_MEDION_RIM,
65#ifdef CONFIG_SND_DEBUG
66	ALC880_TEST,
67#endif
68	ALC880_AUTO,
69	ALC880_MODEL_LAST /* last tag */
70};
71
72/* ALC260 models */
73enum {
74	ALC260_BASIC,
75	ALC260_HP,
76	ALC260_HP_DC7600,
77	ALC260_HP_3013,
78	ALC260_FUJITSU_S702X,
79	ALC260_ACER,
80	ALC260_WILL,
81	ALC260_REPLACER_672V,
82	ALC260_FAVORIT100,
83#ifdef CONFIG_SND_DEBUG
84	ALC260_TEST,
85#endif
86	ALC260_AUTO,
87	ALC260_MODEL_LAST /* last tag */
88};
89
90/* ALC262 models */
91enum {
92	ALC262_BASIC,
93	ALC262_HIPPO,
94	ALC262_HIPPO_1,
95	ALC262_FUJITSU,
96	ALC262_HP_BPC,
97	ALC262_HP_BPC_D7000_WL,
98	ALC262_HP_BPC_D7000_WF,
99	ALC262_HP_TC_T5735,
100	ALC262_HP_RP5700,
101	ALC262_BENQ_ED8,
102	ALC262_SONY_ASSAMD,
103	ALC262_BENQ_T31,
104	ALC262_ULTRA,
105	ALC262_LENOVO_3000,
106	ALC262_NEC,
107	ALC262_TOSHIBA_S06,
108	ALC262_TOSHIBA_RX1,
109	ALC262_TYAN,
110	ALC262_AUTO,
111	ALC262_MODEL_LAST /* last tag */
112};
113
114/* ALC268 models */
115enum {
116	ALC267_QUANTA_IL1,
117	ALC268_3ST,
118	ALC268_TOSHIBA,
119	ALC268_ACER,
120	ALC268_ACER_DMIC,
121	ALC268_ACER_ASPIRE_ONE,
122	ALC268_DELL,
123	ALC268_ZEPTO,
124#ifdef CONFIG_SND_DEBUG
125	ALC268_TEST,
126#endif
127	ALC268_AUTO,
128	ALC268_MODEL_LAST /* last tag */
129};
130
131/* ALC269 models */
132enum {
133	ALC269_BASIC,
134	ALC269_QUANTA_FL1,
135	ALC269_AMIC,
136	ALC269_DMIC,
137	ALC269VB_AMIC,
138	ALC269VB_DMIC,
139	ALC269_FUJITSU,
140	ALC269_LIFEBOOK,
141	ALC271_ACER,
142	ALC269_AUTO,
143	ALC269_MODEL_LAST /* last tag */
144};
145
146/* ALC861 models */
147enum {
148	ALC861_3ST,
149	ALC660_3ST,
150	ALC861_3ST_DIG,
151	ALC861_6ST_DIG,
152	ALC861_UNIWILL_M31,
153	ALC861_TOSHIBA,
154	ALC861_ASUS,
155	ALC861_ASUS_LAPTOP,
156	ALC861_AUTO,
157	ALC861_MODEL_LAST,
158};
159
160/* ALC861-VD models */
161enum {
162	ALC660VD_3ST,
163	ALC660VD_3ST_DIG,
164	ALC660VD_ASUS_V1S,
165	ALC861VD_3ST,
166	ALC861VD_3ST_DIG,
167	ALC861VD_6ST_DIG,
168	ALC861VD_LENOVO,
169	ALC861VD_DALLAS,
170	ALC861VD_HP,
171	ALC861VD_AUTO,
172	ALC861VD_MODEL_LAST,
173};
174
175/* ALC662 models */
176enum {
177	ALC662_3ST_2ch_DIG,
178	ALC662_3ST_6ch_DIG,
179	ALC662_3ST_6ch,
180	ALC662_5ST_DIG,
181	ALC662_LENOVO_101E,
182	ALC662_ASUS_EEEPC_P701,
183	ALC662_ASUS_EEEPC_EP20,
184	ALC663_ASUS_M51VA,
185	ALC663_ASUS_G71V,
186	ALC663_ASUS_H13,
187	ALC663_ASUS_G50V,
188	ALC662_ECS,
189	ALC663_ASUS_MODE1,
190	ALC662_ASUS_MODE2,
191	ALC663_ASUS_MODE3,
192	ALC663_ASUS_MODE4,
193	ALC663_ASUS_MODE5,
194	ALC663_ASUS_MODE6,
195	ALC663_ASUS_MODE7,
196	ALC663_ASUS_MODE8,
197	ALC272_DELL,
198	ALC272_DELL_ZM1,
199	ALC272_SAMSUNG_NC10,
200	ALC662_AUTO,
201	ALC662_MODEL_LAST,
202};
203
204/* ALC882 models */
205enum {
206	ALC882_3ST_DIG,
207	ALC882_6ST_DIG,
208	ALC882_ARIMA,
209	ALC882_W2JC,
210	ALC882_TARGA,
211	ALC882_ASUS_A7J,
212	ALC882_ASUS_A7M,
213	ALC885_MACPRO,
214	ALC885_MBA21,
215	ALC885_MBP3,
216	ALC885_MB5,
217	ALC885_MACMINI3,
218	ALC885_IMAC24,
219	ALC885_IMAC91,
220	ALC883_3ST_2ch_DIG,
221	ALC883_3ST_6ch_DIG,
222	ALC883_3ST_6ch,
223	ALC883_6ST_DIG,
224	ALC883_TARGA_DIG,
225	ALC883_TARGA_2ch_DIG,
226	ALC883_TARGA_8ch_DIG,
227	ALC883_ACER,
228	ALC883_ACER_ASPIRE,
229	ALC888_ACER_ASPIRE_4930G,
230	ALC888_ACER_ASPIRE_6530G,
231	ALC888_ACER_ASPIRE_8930G,
232	ALC888_ACER_ASPIRE_7730G,
233	ALC883_MEDION,
234	ALC883_MEDION_MD2,
235	ALC883_MEDION_WIM2160,
236	ALC883_LAPTOP_EAPD,
237	ALC883_LENOVO_101E_2ch,
238	ALC883_LENOVO_NB0763,
239	ALC888_LENOVO_MS7195_DIG,
240	ALC888_LENOVO_SKY,
241	ALC883_HAIER_W66,
242	ALC888_3ST_HP,
243	ALC888_6ST_DELL,
244	ALC883_MITAC,
245	ALC883_CLEVO_M540R,
246	ALC883_CLEVO_M720,
247	ALC883_FUJITSU_PI2515,
248	ALC888_FUJITSU_XA3530,
249	ALC883_3ST_6ch_INTEL,
250	ALC889A_INTEL,
251	ALC889_INTEL,
252	ALC888_ASUS_M90V,
253	ALC888_ASUS_EEE1601,
254	ALC889A_MB31,
255	ALC1200_ASUS_P5Q,
256	ALC883_SONY_VAIO_TT,
257	ALC882_AUTO,
258	ALC882_MODEL_LAST,
259};
260
261/* ALC680 models */
262enum {
263	ALC680_BASE,
264	ALC680_AUTO,
265	ALC680_MODEL_LAST,
266};
267
268/* for GPIO Poll */
269#define GPIO_MASK	0x03
270
271/* extra amp-initialization sequence types */
272enum {
273	ALC_INIT_NONE,
274	ALC_INIT_DEFAULT,
275	ALC_INIT_GPIO1,
276	ALC_INIT_GPIO2,
277	ALC_INIT_GPIO3,
278};
279
280struct alc_mic_route {
281	hda_nid_t pin;
282	unsigned char mux_idx;
283	unsigned char amix_idx;
284};
285
286struct alc_jack {
287	hda_nid_t nid;
288	int type;
289	struct snd_jack *jack;
290};
291
292#define MUX_IDX_UNDEF	((unsigned char)-1)
293
294struct alc_customize_define {
295	unsigned int  sku_cfg;
296	unsigned char port_connectivity;
297	unsigned char check_sum;
298	unsigned char customization;
299	unsigned char external_amp;
300	unsigned int  enable_pcbeep:1;
301	unsigned int  platform_type:1;
302	unsigned int  swap:1;
303	unsigned int  override:1;
304};
305
306struct alc_spec {
307	/* codec parameterization */
308	struct snd_kcontrol_new *mixers[5];	/* mixer arrays */
309	unsigned int num_mixers;
310	struct snd_kcontrol_new *cap_mixer;	/* capture mixer */
311	unsigned int beep_amp;	/* beep amp value, set via set_beep_amp() */
312
313	const struct hda_verb *init_verbs[10];	/* initialization verbs
314						 * don't forget NULL
315						 * termination!
316						 */
317	unsigned int num_init_verbs;
318
319	char stream_name_analog[32];	/* analog PCM stream */
320	struct hda_pcm_stream *stream_analog_playback;
321	struct hda_pcm_stream *stream_analog_capture;
322	struct hda_pcm_stream *stream_analog_alt_playback;
323	struct hda_pcm_stream *stream_analog_alt_capture;
324
325	char stream_name_digital[32];	/* digital PCM stream */
326	struct hda_pcm_stream *stream_digital_playback;
327	struct hda_pcm_stream *stream_digital_capture;
328
329	/* playback */
330	struct hda_multi_out multiout;	/* playback set-up
331					 * max_channels, dacs must be set
332					 * dig_out_nid and hp_nid are optional
333					 */
334	hda_nid_t alt_dac_nid;
335	hda_nid_t slave_dig_outs[3];	/* optional - for auto-parsing */
336	int dig_out_type;
337
338	/* capture */
339	unsigned int num_adc_nids;
340	hda_nid_t *adc_nids;
341	hda_nid_t *capsrc_nids;
342	hda_nid_t dig_in_nid;		/* digital-in NID; optional */
343
344	/* capture setup for dynamic dual-adc switch */
345	unsigned int cur_adc_idx;
346	hda_nid_t cur_adc;
347	unsigned int cur_adc_stream_tag;
348	unsigned int cur_adc_format;
349
350	/* capture source */
351	unsigned int num_mux_defs;
352	const struct hda_input_mux *input_mux;
353	unsigned int cur_mux[3];
354	struct alc_mic_route ext_mic;
355	struct alc_mic_route int_mic;
356
357	/* channel model */
358	const struct hda_channel_mode *channel_mode;
359	int num_channel_mode;
360	int need_dac_fix;
361	int const_channel_count;
362	int ext_channel_count;
363
364	/* PCM information */
365	struct hda_pcm pcm_rec[3];	/* used in alc_build_pcms() */
366
367	/* jack detection */
368	struct snd_array jacks;
369
370	/* dynamic controls, init_verbs and input_mux */
371	struct auto_pin_cfg autocfg;
372	struct alc_customize_define cdefine;
373	struct snd_array kctls;
374	struct hda_input_mux private_imux[3];
375	hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
376	hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
377	hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
378
379	/* hooks */
380	void (*init_hook)(struct hda_codec *codec);
381	void (*unsol_event)(struct hda_codec *codec, unsigned int res);
382#ifdef CONFIG_SND_HDA_POWER_SAVE
383	void (*power_hook)(struct hda_codec *codec);
384#endif
385
386	/* for pin sensing */
387	unsigned int sense_updated: 1;
388	unsigned int jack_present: 1;
389	unsigned int master_sw: 1;
390	unsigned int auto_mic:1;
391
392	/* other flags */
393	unsigned int no_analog :1; /* digital I/O only */
394	unsigned int dual_adc_switch:1; /* switch ADCs (for ALC275) */
395	int init_amp;
396
397	/* for virtual master */
398	hda_nid_t vmaster_nid;
399#ifdef CONFIG_SND_HDA_POWER_SAVE
400	struct hda_loopback_check loopback;
401#endif
402
403	/* for PLL fix */
404	hda_nid_t pll_nid;
405	unsigned int pll_coef_idx, pll_coef_bit;
406};
407
408/*
409 * configuration template - to be copied to the spec instance
410 */
411struct alc_config_preset {
412	struct snd_kcontrol_new *mixers[5]; /* should be identical size
413					     * with spec
414					     */
415	struct snd_kcontrol_new *cap_mixer; /* capture mixer */
416	const struct hda_verb *init_verbs[5];
417	unsigned int num_dacs;
418	hda_nid_t *dac_nids;
419	hda_nid_t dig_out_nid;		/* optional */
420	hda_nid_t hp_nid;		/* optional */
421	hda_nid_t *slave_dig_outs;
422	unsigned int num_adc_nids;
423	hda_nid_t *adc_nids;
424	hda_nid_t *capsrc_nids;
425	hda_nid_t dig_in_nid;
426	unsigned int num_channel_mode;
427	const struct hda_channel_mode *channel_mode;
428	int need_dac_fix;
429	int const_channel_count;
430	unsigned int num_mux_defs;
431	const struct hda_input_mux *input_mux;
432	void (*unsol_event)(struct hda_codec *, unsigned int);
433	void (*setup)(struct hda_codec *);
434	void (*init_hook)(struct hda_codec *);
435#ifdef CONFIG_SND_HDA_POWER_SAVE
436	struct hda_amp_list *loopbacks;
437	void (*power_hook)(struct hda_codec *codec);
438#endif
439};
440
441
442/*
443 * input MUX handling
444 */
445static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
446			     struct snd_ctl_elem_info *uinfo)
447{
448	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
449	struct alc_spec *spec = codec->spec;
450	unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
451	if (mux_idx >= spec->num_mux_defs)
452		mux_idx = 0;
453	if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
454		mux_idx = 0;
455	return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
456}
457
458static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
459			    struct snd_ctl_elem_value *ucontrol)
460{
461	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
462	struct alc_spec *spec = codec->spec;
463	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
464
465	ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
466	return 0;
467}
468
469static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
470			    struct snd_ctl_elem_value *ucontrol)
471{
472	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
473	struct alc_spec *spec = codec->spec;
474	const struct hda_input_mux *imux;
475	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
476	unsigned int mux_idx;
477	hda_nid_t nid = spec->capsrc_nids ?
478		spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
479	unsigned int type;
480
481	mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
482	imux = &spec->input_mux[mux_idx];
483	if (!imux->num_items && mux_idx > 0)
484		imux = &spec->input_mux[0];
485
486	type = get_wcaps_type(get_wcaps(codec, nid));
487	if (type == AC_WID_AUD_MIX) {
488		/* Matrix-mixer style (e.g. ALC882) */
489		unsigned int *cur_val = &spec->cur_mux[adc_idx];
490		unsigned int i, idx;
491
492		idx = ucontrol->value.enumerated.item[0];
493		if (idx >= imux->num_items)
494			idx = imux->num_items - 1;
495		if (*cur_val == idx)
496			return 0;
497		for (i = 0; i < imux->num_items; i++) {
498			unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
499			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
500						 imux->items[i].index,
501						 HDA_AMP_MUTE, v);
502		}
503		*cur_val = idx;
504		return 1;
505	} else {
506		/* MUX style (e.g. ALC880) */
507		return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
508					     &spec->cur_mux[adc_idx]);
509	}
510}
511
512/*
513 * channel mode setting
514 */
515static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
516			    struct snd_ctl_elem_info *uinfo)
517{
518	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
519	struct alc_spec *spec = codec->spec;
520	return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
521				    spec->num_channel_mode);
522}
523
524static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
525			   struct snd_ctl_elem_value *ucontrol)
526{
527	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
528	struct alc_spec *spec = codec->spec;
529	return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
530				   spec->num_channel_mode,
531				   spec->ext_channel_count);
532}
533
534static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
535			   struct snd_ctl_elem_value *ucontrol)
536{
537	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
538	struct alc_spec *spec = codec->spec;
539	int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
540				      spec->num_channel_mode,
541				      &spec->ext_channel_count);
542	if (err >= 0 && !spec->const_channel_count) {
543		spec->multiout.max_channels = spec->ext_channel_count;
544		if (spec->need_dac_fix)
545			spec->multiout.num_dacs = spec->multiout.max_channels / 2;
546	}
547	return err;
548}
549
550/*
551 * Control the mode of pin widget settings via the mixer.  "pc" is used
552 * instead of "%" to avoid consequences of accidently treating the % as
553 * being part of a format specifier.  Maximum allowed length of a value is
554 * 63 characters plus NULL terminator.
555 *
556 * Note: some retasking pin complexes seem to ignore requests for input
557 * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
558 * are requested.  Therefore order this list so that this behaviour will not
559 * cause problems when mixer clients move through the enum sequentially.
560 * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
561 * March 2006.
562 */
563static char *alc_pin_mode_names[] = {
564	"Mic 50pc bias", "Mic 80pc bias",
565	"Line in", "Line out", "Headphone out",
566};
567static unsigned char alc_pin_mode_values[] = {
568	PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
569};
570/* The control can present all 5 options, or it can limit the options based
571 * in the pin being assumed to be exclusively an input or an output pin.  In
572 * addition, "input" pins may or may not process the mic bias option
573 * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
574 * accept requests for bias as of chip versions up to March 2006) and/or
575 * wiring in the computer.
576 */
577#define ALC_PIN_DIR_IN              0x00
578#define ALC_PIN_DIR_OUT             0x01
579#define ALC_PIN_DIR_INOUT           0x02
580#define ALC_PIN_DIR_IN_NOMICBIAS    0x03
581#define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
582
583/* Info about the pin modes supported by the different pin direction modes.
584 * For each direction the minimum and maximum values are given.
585 */
586static signed char alc_pin_mode_dir_info[5][2] = {
587	{ 0, 2 },    /* ALC_PIN_DIR_IN */
588	{ 3, 4 },    /* ALC_PIN_DIR_OUT */
589	{ 0, 4 },    /* ALC_PIN_DIR_INOUT */
590	{ 2, 2 },    /* ALC_PIN_DIR_IN_NOMICBIAS */
591	{ 2, 4 },    /* ALC_PIN_DIR_INOUT_NOMICBIAS */
592};
593#define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
594#define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
595#define alc_pin_mode_n_items(_dir) \
596	(alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
597
598static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
599			     struct snd_ctl_elem_info *uinfo)
600{
601	unsigned int item_num = uinfo->value.enumerated.item;
602	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
603
604	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
605	uinfo->count = 1;
606	uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
607
608	if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
609		item_num = alc_pin_mode_min(dir);
610	strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
611	return 0;
612}
613
614static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
615			    struct snd_ctl_elem_value *ucontrol)
616{
617	unsigned int i;
618	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
619	hda_nid_t nid = kcontrol->private_value & 0xffff;
620	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
621	long *valp = ucontrol->value.integer.value;
622	unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
623						 AC_VERB_GET_PIN_WIDGET_CONTROL,
624						 0x00);
625
626	/* Find enumerated value for current pinctl setting */
627	i = alc_pin_mode_min(dir);
628	while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
629		i++;
630	*valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
631	return 0;
632}
633
634static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
635			    struct snd_ctl_elem_value *ucontrol)
636{
637	signed int change;
638	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
639	hda_nid_t nid = kcontrol->private_value & 0xffff;
640	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
641	long val = *ucontrol->value.integer.value;
642	unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
643						 AC_VERB_GET_PIN_WIDGET_CONTROL,
644						 0x00);
645
646	if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
647		val = alc_pin_mode_min(dir);
648
649	change = pinctl != alc_pin_mode_values[val];
650	if (change) {
651		/* Set pin mode to that requested */
652		snd_hda_codec_write_cache(codec, nid, 0,
653					  AC_VERB_SET_PIN_WIDGET_CONTROL,
654					  alc_pin_mode_values[val]);
655
656		/* Also enable the retasking pin's input/output as required
657		 * for the requested pin mode.  Enum values of 2 or less are
658		 * input modes.
659		 *
660		 * Dynamically switching the input/output buffers probably
661		 * reduces noise slightly (particularly on input) so we'll
662		 * do it.  However, having both input and output buffers
663		 * enabled simultaneously doesn't seem to be problematic if
664		 * this turns out to be necessary in the future.
665		 */
666		if (val <= 2) {
667			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
668						 HDA_AMP_MUTE, HDA_AMP_MUTE);
669			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
670						 HDA_AMP_MUTE, 0);
671		} else {
672			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
673						 HDA_AMP_MUTE, HDA_AMP_MUTE);
674			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
675						 HDA_AMP_MUTE, 0);
676		}
677	}
678	return change;
679}
680
681#define ALC_PIN_MODE(xname, nid, dir) \
682	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
683	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
684	  .info = alc_pin_mode_info, \
685	  .get = alc_pin_mode_get, \
686	  .put = alc_pin_mode_put, \
687	  .private_value = nid | (dir<<16) }
688
689/* A switch control for ALC260 GPIO pins.  Multiple GPIOs can be ganged
690 * together using a mask with more than one bit set.  This control is
691 * currently used only by the ALC260 test model.  At this stage they are not
692 * needed for any "production" models.
693 */
694#ifdef CONFIG_SND_DEBUG
695#define alc_gpio_data_info	snd_ctl_boolean_mono_info
696
697static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
698			     struct snd_ctl_elem_value *ucontrol)
699{
700	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
701	hda_nid_t nid = kcontrol->private_value & 0xffff;
702	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
703	long *valp = ucontrol->value.integer.value;
704	unsigned int val = snd_hda_codec_read(codec, nid, 0,
705					      AC_VERB_GET_GPIO_DATA, 0x00);
706
707	*valp = (val & mask) != 0;
708	return 0;
709}
710static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
711			     struct snd_ctl_elem_value *ucontrol)
712{
713	signed int change;
714	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
715	hda_nid_t nid = kcontrol->private_value & 0xffff;
716	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
717	long val = *ucontrol->value.integer.value;
718	unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
719						    AC_VERB_GET_GPIO_DATA,
720						    0x00);
721
722	/* Set/unset the masked GPIO bit(s) as needed */
723	change = (val == 0 ? 0 : mask) != (gpio_data & mask);
724	if (val == 0)
725		gpio_data &= ~mask;
726	else
727		gpio_data |= mask;
728	snd_hda_codec_write_cache(codec, nid, 0,
729				  AC_VERB_SET_GPIO_DATA, gpio_data);
730
731	return change;
732}
733#define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
734	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
735	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
736	  .info = alc_gpio_data_info, \
737	  .get = alc_gpio_data_get, \
738	  .put = alc_gpio_data_put, \
739	  .private_value = nid | (mask<<16) }
740#endif   /* CONFIG_SND_DEBUG */
741
742/* A switch control to allow the enabling of the digital IO pins on the
743 * ALC260.  This is incredibly simplistic; the intention of this control is
744 * to provide something in the test model allowing digital outputs to be
745 * identified if present.  If models are found which can utilise these
746 * outputs a more complete mixer control can be devised for those models if
747 * necessary.
748 */
749#ifdef CONFIG_SND_DEBUG
750#define alc_spdif_ctrl_info	snd_ctl_boolean_mono_info
751
752static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
753			      struct snd_ctl_elem_value *ucontrol)
754{
755	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
756	hda_nid_t nid = kcontrol->private_value & 0xffff;
757	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
758	long *valp = ucontrol->value.integer.value;
759	unsigned int val = snd_hda_codec_read(codec, nid, 0,
760					      AC_VERB_GET_DIGI_CONVERT_1, 0x00);
761
762	*valp = (val & mask) != 0;
763	return 0;
764}
765static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
766			      struct snd_ctl_elem_value *ucontrol)
767{
768	signed int change;
769	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
770	hda_nid_t nid = kcontrol->private_value & 0xffff;
771	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
772	long val = *ucontrol->value.integer.value;
773	unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
774						    AC_VERB_GET_DIGI_CONVERT_1,
775						    0x00);
776
777	/* Set/unset the masked control bit(s) as needed */
778	change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
779	if (val==0)
780		ctrl_data &= ~mask;
781	else
782		ctrl_data |= mask;
783	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
784				  ctrl_data);
785
786	return change;
787}
788#define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
789	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
790	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
791	  .info = alc_spdif_ctrl_info, \
792	  .get = alc_spdif_ctrl_get, \
793	  .put = alc_spdif_ctrl_put, \
794	  .private_value = nid | (mask<<16) }
795#endif   /* CONFIG_SND_DEBUG */
796
797/* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
798 * Again, this is only used in the ALC26x test models to help identify when
799 * the EAPD line must be asserted for features to work.
800 */
801#ifdef CONFIG_SND_DEBUG
802#define alc_eapd_ctrl_info	snd_ctl_boolean_mono_info
803
804static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
805			      struct snd_ctl_elem_value *ucontrol)
806{
807	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
808	hda_nid_t nid = kcontrol->private_value & 0xffff;
809	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
810	long *valp = ucontrol->value.integer.value;
811	unsigned int val = snd_hda_codec_read(codec, nid, 0,
812					      AC_VERB_GET_EAPD_BTLENABLE, 0x00);
813
814	*valp = (val & mask) != 0;
815	return 0;
816}
817
818static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
819			      struct snd_ctl_elem_value *ucontrol)
820{
821	int change;
822	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
823	hda_nid_t nid = kcontrol->private_value & 0xffff;
824	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
825	long val = *ucontrol->value.integer.value;
826	unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
827						    AC_VERB_GET_EAPD_BTLENABLE,
828						    0x00);
829
830	/* Set/unset the masked control bit(s) as needed */
831	change = (!val ? 0 : mask) != (ctrl_data & mask);
832	if (!val)
833		ctrl_data &= ~mask;
834	else
835		ctrl_data |= mask;
836	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
837				  ctrl_data);
838
839	return change;
840}
841
842#define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
843	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
844	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
845	  .info = alc_eapd_ctrl_info, \
846	  .get = alc_eapd_ctrl_get, \
847	  .put = alc_eapd_ctrl_put, \
848	  .private_value = nid | (mask<<16) }
849#endif   /* CONFIG_SND_DEBUG */
850
851/*
852 * set up the input pin config (depending on the given auto-pin type)
853 */
854static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
855			      int auto_pin_type)
856{
857	unsigned int val = PIN_IN;
858
859	if (auto_pin_type == AUTO_PIN_MIC) {
860		unsigned int pincap;
861		unsigned int oldval;
862		oldval = snd_hda_codec_read(codec, nid, 0,
863					    AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
864		pincap = snd_hda_query_pin_caps(codec, nid);
865		pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
866		/* if the default pin setup is vref50, we give it priority */
867		if ((pincap & AC_PINCAP_VREF_80) && oldval != PIN_VREF50)
868			val = PIN_VREF80;
869		else if (pincap & AC_PINCAP_VREF_50)
870			val = PIN_VREF50;
871		else if (pincap & AC_PINCAP_VREF_100)
872			val = PIN_VREF100;
873		else if (pincap & AC_PINCAP_VREF_GRD)
874			val = PIN_VREFGRD;
875	}
876	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
877}
878
879/*
880 */
881static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
882{
883	if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
884		return;
885	spec->mixers[spec->num_mixers++] = mix;
886}
887
888static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
889{
890	if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
891		return;
892	spec->init_verbs[spec->num_init_verbs++] = verb;
893}
894
895/*
896 * set up from the preset table
897 */
898static void setup_preset(struct hda_codec *codec,
899			 const struct alc_config_preset *preset)
900{
901	struct alc_spec *spec = codec->spec;
902	int i;
903
904	for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
905		add_mixer(spec, preset->mixers[i]);
906	spec->cap_mixer = preset->cap_mixer;
907	for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
908	     i++)
909		add_verb(spec, preset->init_verbs[i]);
910
911	spec->channel_mode = preset->channel_mode;
912	spec->num_channel_mode = preset->num_channel_mode;
913	spec->need_dac_fix = preset->need_dac_fix;
914	spec->const_channel_count = preset->const_channel_count;
915
916	if (preset->const_channel_count)
917		spec->multiout.max_channels = preset->const_channel_count;
918	else
919		spec->multiout.max_channels = spec->channel_mode[0].channels;
920	spec->ext_channel_count = spec->channel_mode[0].channels;
921
922	spec->multiout.num_dacs = preset->num_dacs;
923	spec->multiout.dac_nids = preset->dac_nids;
924	spec->multiout.dig_out_nid = preset->dig_out_nid;
925	spec->multiout.slave_dig_outs = preset->slave_dig_outs;
926	spec->multiout.hp_nid = preset->hp_nid;
927
928	spec->num_mux_defs = preset->num_mux_defs;
929	if (!spec->num_mux_defs)
930		spec->num_mux_defs = 1;
931	spec->input_mux = preset->input_mux;
932
933	spec->num_adc_nids = preset->num_adc_nids;
934	spec->adc_nids = preset->adc_nids;
935	spec->capsrc_nids = preset->capsrc_nids;
936	spec->dig_in_nid = preset->dig_in_nid;
937
938	spec->unsol_event = preset->unsol_event;
939	spec->init_hook = preset->init_hook;
940#ifdef CONFIG_SND_HDA_POWER_SAVE
941	spec->power_hook = preset->power_hook;
942	spec->loopback.amplist = preset->loopbacks;
943#endif
944
945	if (preset->setup)
946		preset->setup(codec);
947}
948
949/* Enable GPIO mask and set output */
950static struct hda_verb alc_gpio1_init_verbs[] = {
951	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
952	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
953	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
954	{ }
955};
956
957static struct hda_verb alc_gpio2_init_verbs[] = {
958	{0x01, AC_VERB_SET_GPIO_MASK, 0x02},
959	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
960	{0x01, AC_VERB_SET_GPIO_DATA, 0x02},
961	{ }
962};
963
964static struct hda_verb alc_gpio3_init_verbs[] = {
965	{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
966	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
967	{0x01, AC_VERB_SET_GPIO_DATA, 0x03},
968	{ }
969};
970
971/*
972 * Fix hardware PLL issue
973 * On some codecs, the analog PLL gating control must be off while
974 * the default value is 1.
975 */
976static void alc_fix_pll(struct hda_codec *codec)
977{
978	struct alc_spec *spec = codec->spec;
979	unsigned int val;
980
981	if (!spec->pll_nid)
982		return;
983	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
984			    spec->pll_coef_idx);
985	val = snd_hda_codec_read(codec, spec->pll_nid, 0,
986				 AC_VERB_GET_PROC_COEF, 0);
987	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
988			    spec->pll_coef_idx);
989	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
990			    val & ~(1 << spec->pll_coef_bit));
991}
992
993static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
994			     unsigned int coef_idx, unsigned int coef_bit)
995{
996	struct alc_spec *spec = codec->spec;
997	spec->pll_nid = nid;
998	spec->pll_coef_idx = coef_idx;
999	spec->pll_coef_bit = coef_bit;
1000	alc_fix_pll(codec);
1001}
1002
1003#ifdef CONFIG_SND_HDA_INPUT_JACK
1004static void alc_free_jack_priv(struct snd_jack *jack)
1005{
1006	struct alc_jack *jacks = jack->private_data;
1007	jacks->nid = 0;
1008	jacks->jack = NULL;
1009}
1010
1011static int alc_add_jack(struct hda_codec *codec,
1012		hda_nid_t nid, int type)
1013{
1014	struct alc_spec *spec;
1015	struct alc_jack *jack;
1016	const char *name;
1017	int err;
1018
1019	spec = codec->spec;
1020	snd_array_init(&spec->jacks, sizeof(*jack), 32);
1021	jack = snd_array_new(&spec->jacks);
1022	if (!jack)
1023		return -ENOMEM;
1024
1025	jack->nid = nid;
1026	jack->type = type;
1027	name = (type == SND_JACK_HEADPHONE) ? "Headphone" : "Mic" ;
1028
1029	err = snd_jack_new(codec->bus->card, name, type, &jack->jack);
1030	if (err < 0)
1031		return err;
1032	jack->jack->private_data = jack;
1033	jack->jack->private_free = alc_free_jack_priv;
1034	return 0;
1035}
1036
1037static void alc_report_jack(struct hda_codec *codec, hda_nid_t nid)
1038{
1039	struct alc_spec *spec = codec->spec;
1040	struct alc_jack *jacks = spec->jacks.list;
1041
1042	if (jacks) {
1043		int i;
1044		for (i = 0; i < spec->jacks.used; i++) {
1045			if (jacks->nid == nid) {
1046				unsigned int present;
1047				present = snd_hda_jack_detect(codec, nid);
1048
1049				present = (present) ? jacks->type : 0;
1050
1051				snd_jack_report(jacks->jack, present);
1052			}
1053			jacks++;
1054		}
1055	}
1056}
1057
1058static int alc_init_jacks(struct hda_codec *codec)
1059{
1060	struct alc_spec *spec = codec->spec;
1061	int err;
1062	unsigned int hp_nid = spec->autocfg.hp_pins[0];
1063	unsigned int mic_nid = spec->ext_mic.pin;
1064
1065	err = alc_add_jack(codec, hp_nid, SND_JACK_HEADPHONE);
1066	if (err < 0)
1067		return err;
1068	alc_report_jack(codec, hp_nid);
1069
1070	err = alc_add_jack(codec, mic_nid, SND_JACK_MICROPHONE);
1071	if (err < 0)
1072		return err;
1073	alc_report_jack(codec, mic_nid);
1074
1075	return 0;
1076}
1077#else
1078static inline void alc_report_jack(struct hda_codec *codec, hda_nid_t nid)
1079{
1080}
1081
1082static inline int alc_init_jacks(struct hda_codec *codec)
1083{
1084	return 0;
1085}
1086#endif
1087
1088static void alc_automute_speaker(struct hda_codec *codec, int pinctl)
1089{
1090	struct alc_spec *spec = codec->spec;
1091	unsigned int mute;
1092	hda_nid_t nid;
1093	int i;
1094
1095	spec->jack_present = 0;
1096	for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1097		nid = spec->autocfg.hp_pins[i];
1098		if (!nid)
1099			break;
1100		if (snd_hda_jack_detect(codec, nid)) {
1101			spec->jack_present = 1;
1102			break;
1103		}
1104		alc_report_jack(codec, spec->autocfg.hp_pins[i]);
1105	}
1106
1107	mute = spec->jack_present ? HDA_AMP_MUTE : 0;
1108	/* Toggle internal speakers muting */
1109	for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1110		nid = spec->autocfg.speaker_pins[i];
1111		if (!nid)
1112			break;
1113		if (pinctl) {
1114			snd_hda_codec_write(codec, nid, 0,
1115				    AC_VERB_SET_PIN_WIDGET_CONTROL,
1116				    spec->jack_present ? 0 : PIN_OUT);
1117		} else {
1118			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1119					 HDA_AMP_MUTE, mute);
1120		}
1121	}
1122}
1123
1124static void alc_automute_pin(struct hda_codec *codec)
1125{
1126	alc_automute_speaker(codec, 1);
1127}
1128
1129static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
1130				hda_nid_t nid)
1131{
1132	hda_nid_t conn[HDA_MAX_NUM_INPUTS];
1133	int i, nums;
1134
1135	nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
1136	for (i = 0; i < nums; i++)
1137		if (conn[i] == nid)
1138			return i;
1139	return -1;
1140}
1141
1142/* switch the current ADC according to the jack state */
1143static void alc_dual_mic_adc_auto_switch(struct hda_codec *codec)
1144{
1145	struct alc_spec *spec = codec->spec;
1146	unsigned int present;
1147	hda_nid_t new_adc;
1148
1149	present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1150	if (present)
1151		spec->cur_adc_idx = 1;
1152	else
1153		spec->cur_adc_idx = 0;
1154	new_adc = spec->adc_nids[spec->cur_adc_idx];
1155	if (spec->cur_adc && spec->cur_adc != new_adc) {
1156		/* stream is running, let's swap the current ADC */
1157		__snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
1158		spec->cur_adc = new_adc;
1159		snd_hda_codec_setup_stream(codec, new_adc,
1160					   spec->cur_adc_stream_tag, 0,
1161					   spec->cur_adc_format);
1162	}
1163}
1164
1165static void alc_mic_automute(struct hda_codec *codec)
1166{
1167	struct alc_spec *spec = codec->spec;
1168	struct alc_mic_route *dead, *alive;
1169	unsigned int present, type;
1170	hda_nid_t cap_nid;
1171
1172	if (!spec->auto_mic)
1173		return;
1174	if (!spec->int_mic.pin || !spec->ext_mic.pin)
1175		return;
1176	if (snd_BUG_ON(!spec->adc_nids))
1177		return;
1178
1179	if (spec->dual_adc_switch) {
1180		alc_dual_mic_adc_auto_switch(codec);
1181		return;
1182	}
1183
1184	cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1185
1186	present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1187	if (present) {
1188		alive = &spec->ext_mic;
1189		dead = &spec->int_mic;
1190	} else {
1191		alive = &spec->int_mic;
1192		dead = &spec->ext_mic;
1193	}
1194
1195	type = get_wcaps_type(get_wcaps(codec, cap_nid));
1196	if (type == AC_WID_AUD_MIX) {
1197		/* Matrix-mixer style (e.g. ALC882) */
1198		snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1199					 alive->mux_idx,
1200					 HDA_AMP_MUTE, 0);
1201		snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1202					 dead->mux_idx,
1203					 HDA_AMP_MUTE, HDA_AMP_MUTE);
1204	} else {
1205		/* MUX style (e.g. ALC880) */
1206		snd_hda_codec_write_cache(codec, cap_nid, 0,
1207					  AC_VERB_SET_CONNECT_SEL,
1208					  alive->mux_idx);
1209	}
1210	alc_report_jack(codec, spec->ext_mic.pin);
1211
1212	/* FIXME: analog mixer */
1213}
1214
1215/* unsolicited event for HP jack sensing */
1216static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1217{
1218	if (codec->vendor_id == 0x10ec0880)
1219		res >>= 28;
1220	else
1221		res >>= 26;
1222	switch (res) {
1223	case ALC880_HP_EVENT:
1224		alc_automute_pin(codec);
1225		break;
1226	case ALC880_MIC_EVENT:
1227		alc_mic_automute(codec);
1228		break;
1229	}
1230}
1231
1232static void alc_inithook(struct hda_codec *codec)
1233{
1234	alc_automute_pin(codec);
1235	alc_mic_automute(codec);
1236}
1237
1238/* additional initialization for ALC888 variants */
1239static void alc888_coef_init(struct hda_codec *codec)
1240{
1241	unsigned int tmp;
1242
1243	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1244	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1245	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1246	if ((tmp & 0xf0) == 0x20)
1247		/* alc888S-VC */
1248		snd_hda_codec_read(codec, 0x20, 0,
1249				   AC_VERB_SET_PROC_COEF, 0x830);
1250	 else
1251		 /* alc888-VB */
1252		 snd_hda_codec_read(codec, 0x20, 0,
1253				    AC_VERB_SET_PROC_COEF, 0x3030);
1254}
1255
1256static void alc889_coef_init(struct hda_codec *codec)
1257{
1258	unsigned int tmp;
1259
1260	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1261	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1262	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1263	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1264}
1265
1266/* turn on/off EAPD control (only if available) */
1267static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
1268{
1269	if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
1270		return;
1271	if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
1272		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
1273				    on ? 2 : 0);
1274}
1275
1276static void alc_auto_init_amp(struct hda_codec *codec, int type)
1277{
1278	unsigned int tmp;
1279
1280	switch (type) {
1281	case ALC_INIT_GPIO1:
1282		snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1283		break;
1284	case ALC_INIT_GPIO2:
1285		snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1286		break;
1287	case ALC_INIT_GPIO3:
1288		snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1289		break;
1290	case ALC_INIT_DEFAULT:
1291		switch (codec->vendor_id) {
1292		case 0x10ec0260:
1293			set_eapd(codec, 0x0f, 1);
1294			set_eapd(codec, 0x10, 1);
1295			break;
1296		case 0x10ec0262:
1297		case 0x10ec0267:
1298		case 0x10ec0268:
1299		case 0x10ec0269:
1300		case 0x10ec0270:
1301		case 0x10ec0272:
1302		case 0x10ec0660:
1303		case 0x10ec0662:
1304		case 0x10ec0663:
1305		case 0x10ec0862:
1306		case 0x10ec0889:
1307			set_eapd(codec, 0x14, 1);
1308			set_eapd(codec, 0x15, 1);
1309			break;
1310		}
1311		switch (codec->vendor_id) {
1312		case 0x10ec0260:
1313			snd_hda_codec_write(codec, 0x1a, 0,
1314					    AC_VERB_SET_COEF_INDEX, 7);
1315			tmp = snd_hda_codec_read(codec, 0x1a, 0,
1316						 AC_VERB_GET_PROC_COEF, 0);
1317			snd_hda_codec_write(codec, 0x1a, 0,
1318					    AC_VERB_SET_COEF_INDEX, 7);
1319			snd_hda_codec_write(codec, 0x1a, 0,
1320					    AC_VERB_SET_PROC_COEF,
1321					    tmp | 0x2010);
1322			break;
1323		case 0x10ec0262:
1324		case 0x10ec0880:
1325		case 0x10ec0882:
1326		case 0x10ec0883:
1327		case 0x10ec0885:
1328		case 0x10ec0887:
1329		case 0x10ec0889:
1330			alc889_coef_init(codec);
1331			break;
1332		case 0x10ec0888:
1333			alc888_coef_init(codec);
1334			break;
1335#if 0 /* XXX: This may cause the silent output on speaker on some machines */
1336		case 0x10ec0267:
1337		case 0x10ec0268:
1338			snd_hda_codec_write(codec, 0x20, 0,
1339					    AC_VERB_SET_COEF_INDEX, 7);
1340			tmp = snd_hda_codec_read(codec, 0x20, 0,
1341						 AC_VERB_GET_PROC_COEF, 0);
1342			snd_hda_codec_write(codec, 0x20, 0,
1343					    AC_VERB_SET_COEF_INDEX, 7);
1344			snd_hda_codec_write(codec, 0x20, 0,
1345					    AC_VERB_SET_PROC_COEF,
1346					    tmp | 0x3000);
1347			break;
1348#endif /* XXX */
1349		}
1350		break;
1351	}
1352}
1353
1354static void alc_init_auto_hp(struct hda_codec *codec)
1355{
1356	struct alc_spec *spec = codec->spec;
1357	struct auto_pin_cfg *cfg = &spec->autocfg;
1358	int i;
1359
1360	if (!cfg->hp_pins[0]) {
1361		if (cfg->line_out_type != AUTO_PIN_HP_OUT)
1362			return;
1363	}
1364
1365	if (!cfg->speaker_pins[0]) {
1366		if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT)
1367			return;
1368		memcpy(cfg->speaker_pins, cfg->line_out_pins,
1369		       sizeof(cfg->speaker_pins));
1370		cfg->speaker_outs = cfg->line_outs;
1371	}
1372
1373	if (!cfg->hp_pins[0]) {
1374		memcpy(cfg->hp_pins, cfg->line_out_pins,
1375		       sizeof(cfg->hp_pins));
1376		cfg->hp_outs = cfg->line_outs;
1377	}
1378
1379	for (i = 0; i < cfg->hp_outs; i++) {
1380		snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1381			    cfg->hp_pins[i]);
1382		snd_hda_codec_write_cache(codec, cfg->hp_pins[i], 0,
1383				  AC_VERB_SET_UNSOLICITED_ENABLE,
1384				  AC_USRSP_EN | ALC880_HP_EVENT);
1385	}
1386	spec->unsol_event = alc_sku_unsol_event;
1387}
1388
1389static void alc_init_auto_mic(struct hda_codec *codec)
1390{
1391	struct alc_spec *spec = codec->spec;
1392	struct auto_pin_cfg *cfg = &spec->autocfg;
1393	hda_nid_t fixed, ext;
1394	int i;
1395
1396	/* there must be only two mic inputs exclusively */
1397	for (i = 0; i < cfg->num_inputs; i++)
1398		if (cfg->inputs[i].type >= AUTO_PIN_LINE_IN)
1399			return;
1400
1401	fixed = ext = 0;
1402	for (i = 0; i < cfg->num_inputs; i++) {
1403		hda_nid_t nid = cfg->inputs[i].pin;
1404		unsigned int defcfg;
1405		defcfg = snd_hda_codec_get_pincfg(codec, nid);
1406		switch (snd_hda_get_input_pin_attr(defcfg)) {
1407		case INPUT_PIN_ATTR_INT:
1408			if (fixed)
1409				return; /* already occupied */
1410			fixed = nid;
1411			break;
1412		case INPUT_PIN_ATTR_UNUSED:
1413			return; /* invalid entry */
1414		default:
1415			if (ext)
1416				return; /* already occupied */
1417			ext = nid;
1418			break;
1419		}
1420	}
1421	if (!ext || !fixed)
1422		return;
1423	if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1424		return; /* no unsol support */
1425	snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1426		    ext, fixed);
1427	spec->ext_mic.pin = ext;
1428	spec->int_mic.pin = fixed;
1429	spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1430	spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1431	spec->auto_mic = 1;
1432	snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1433				  AC_VERB_SET_UNSOLICITED_ENABLE,
1434				  AC_USRSP_EN | ALC880_MIC_EVENT);
1435	spec->unsol_event = alc_sku_unsol_event;
1436}
1437
1438static int alc_auto_parse_customize_define(struct hda_codec *codec)
1439{
1440	unsigned int ass, tmp, i;
1441	unsigned nid = 0;
1442	struct alc_spec *spec = codec->spec;
1443
1444	spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
1445
1446	ass = codec->subsystem_id & 0xffff;
1447	if (ass != codec->bus->pci->subsystem_device && (ass & 1))
1448		goto do_sku;
1449
1450	nid = 0x1d;
1451	if (codec->vendor_id == 0x10ec0260)
1452		nid = 0x17;
1453	ass = snd_hda_codec_get_pincfg(codec, nid);
1454
1455	if (!(ass & 1)) {
1456		printk(KERN_INFO "hda_codec: %s: SKU not ready 0x%08x\n",
1457		       codec->chip_name, ass);
1458		return -1;
1459	}
1460
1461	/* check sum */
1462	tmp = 0;
1463	for (i = 1; i < 16; i++) {
1464		if ((ass >> i) & 1)
1465			tmp++;
1466	}
1467	if (((ass >> 16) & 0xf) != tmp)
1468		return -1;
1469
1470	spec->cdefine.port_connectivity = ass >> 30;
1471	spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
1472	spec->cdefine.check_sum = (ass >> 16) & 0xf;
1473	spec->cdefine.customization = ass >> 8;
1474do_sku:
1475	spec->cdefine.sku_cfg = ass;
1476	spec->cdefine.external_amp = (ass & 0x38) >> 3;
1477	spec->cdefine.platform_type = (ass & 0x4) >> 2;
1478	spec->cdefine.swap = (ass & 0x2) >> 1;
1479	spec->cdefine.override = ass & 0x1;
1480
1481	snd_printd("SKU: Nid=0x%x sku_cfg=0x%08x\n",
1482		   nid, spec->cdefine.sku_cfg);
1483	snd_printd("SKU: port_connectivity=0x%x\n",
1484		   spec->cdefine.port_connectivity);
1485	snd_printd("SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
1486	snd_printd("SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
1487	snd_printd("SKU: customization=0x%08x\n", spec->cdefine.customization);
1488	snd_printd("SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
1489	snd_printd("SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
1490	snd_printd("SKU: swap=0x%x\n", spec->cdefine.swap);
1491	snd_printd("SKU: override=0x%x\n", spec->cdefine.override);
1492
1493	return 0;
1494}
1495
1496/* check subsystem ID and set up device-specific initialization;
1497 * return 1 if initialized, 0 if invalid SSID
1498 */
1499/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1500 *	31 ~ 16 :	Manufacture ID
1501 *	15 ~ 8	:	SKU ID
1502 *	7  ~ 0	:	Assembly ID
1503 *	port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1504 */
1505static int alc_subsystem_id(struct hda_codec *codec,
1506			    hda_nid_t porta, hda_nid_t porte,
1507			    hda_nid_t portd, hda_nid_t porti)
1508{
1509	unsigned int ass, tmp, i;
1510	unsigned nid;
1511	struct alc_spec *spec = codec->spec;
1512
1513	ass = codec->subsystem_id & 0xffff;
1514	if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1515		goto do_sku;
1516
1517	/* invalid SSID, check the special NID pin defcfg instead */
1518	/*
1519	 * 31~30	: port connectivity
1520	 * 29~21	: reserve
1521	 * 20		: PCBEEP input
1522	 * 19~16	: Check sum (15:1)
1523	 * 15~1		: Custom
1524	 * 0		: override
1525	*/
1526	nid = 0x1d;
1527	if (codec->vendor_id == 0x10ec0260)
1528		nid = 0x17;
1529	ass = snd_hda_codec_get_pincfg(codec, nid);
1530	snd_printd("realtek: No valid SSID, "
1531		   "checking pincfg 0x%08x for NID 0x%x\n",
1532		   ass, nid);
1533	if (!(ass & 1))
1534		return 0;
1535	if ((ass >> 30) != 1)	/* no physical connection */
1536		return 0;
1537
1538	/* check sum */
1539	tmp = 0;
1540	for (i = 1; i < 16; i++) {
1541		if ((ass >> i) & 1)
1542			tmp++;
1543	}
1544	if (((ass >> 16) & 0xf) != tmp)
1545		return 0;
1546do_sku:
1547	snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1548		   ass & 0xffff, codec->vendor_id);
1549	/*
1550	 * 0 : override
1551	 * 1 :	Swap Jack
1552	 * 2 : 0 --> Desktop, 1 --> Laptop
1553	 * 3~5 : External Amplifier control
1554	 * 7~6 : Reserved
1555	*/
1556	tmp = (ass & 0x38) >> 3;	/* external Amp control */
1557	switch (tmp) {
1558	case 1:
1559		spec->init_amp = ALC_INIT_GPIO1;
1560		break;
1561	case 3:
1562		spec->init_amp = ALC_INIT_GPIO2;
1563		break;
1564	case 7:
1565		spec->init_amp = ALC_INIT_GPIO3;
1566		break;
1567	case 5:
1568		spec->init_amp = ALC_INIT_DEFAULT;
1569		break;
1570	}
1571
1572	/* is laptop or Desktop and enable the function "Mute internal speaker
1573	 * when the external headphone out jack is plugged"
1574	 */
1575	if (!(ass & 0x8000))
1576		return 1;
1577	/*
1578	 * 10~8 : Jack location
1579	 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1580	 * 14~13: Resvered
1581	 * 15   : 1 --> enable the function "Mute internal speaker
1582	 *	        when the external headphone out jack is plugged"
1583	 */
1584	if (!spec->autocfg.hp_pins[0]) {
1585		hda_nid_t nid;
1586		tmp = (ass >> 11) & 0x3;	/* HP to chassis */
1587		if (tmp == 0)
1588			nid = porta;
1589		else if (tmp == 1)
1590			nid = porte;
1591		else if (tmp == 2)
1592			nid = portd;
1593		else if (tmp == 3)
1594			nid = porti;
1595		else
1596			return 1;
1597		for (i = 0; i < spec->autocfg.line_outs; i++)
1598			if (spec->autocfg.line_out_pins[i] == nid)
1599				return 1;
1600		spec->autocfg.hp_pins[0] = nid;
1601	}
1602
1603	alc_init_auto_hp(codec);
1604	alc_init_auto_mic(codec);
1605	return 1;
1606}
1607
1608static void alc_ssid_check(struct hda_codec *codec,
1609			   hda_nid_t porta, hda_nid_t porte,
1610			   hda_nid_t portd, hda_nid_t porti)
1611{
1612	if (!alc_subsystem_id(codec, porta, porte, portd, porti)) {
1613		struct alc_spec *spec = codec->spec;
1614		snd_printd("realtek: "
1615			   "Enable default setup for auto mode as fallback\n");
1616		spec->init_amp = ALC_INIT_DEFAULT;
1617		alc_init_auto_hp(codec);
1618		alc_init_auto_mic(codec);
1619	}
1620}
1621
1622/*
1623 * Fix-up pin default configurations and add default verbs
1624 */
1625
1626struct alc_pincfg {
1627	hda_nid_t nid;
1628	u32 val;
1629};
1630
1631struct alc_fixup {
1632	const struct alc_pincfg *pins;
1633	const struct hda_verb *verbs;
1634};
1635
1636static void alc_pick_fixup(struct hda_codec *codec,
1637			   const struct snd_pci_quirk *quirk,
1638			   const struct alc_fixup *fix,
1639			   int pre_init)
1640{
1641	const struct alc_pincfg *cfg;
1642
1643	quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1644	if (!quirk)
1645		return;
1646	fix += quirk->value;
1647	cfg = fix->pins;
1648	if (pre_init && cfg) {
1649#ifdef CONFIG_SND_DEBUG_VERBOSE
1650		snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n",
1651			    codec->chip_name, quirk->name);
1652#endif
1653		for (; cfg->nid; cfg++)
1654			snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1655	}
1656	if (!pre_init && fix->verbs) {
1657#ifdef CONFIG_SND_DEBUG_VERBOSE
1658		snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-verbs for %s\n",
1659			    codec->chip_name, quirk->name);
1660#endif
1661		add_verb(codec->spec, fix->verbs);
1662	}
1663}
1664
1665static int alc_read_coef_idx(struct hda_codec *codec,
1666			unsigned int coef_idx)
1667{
1668	unsigned int val;
1669	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1670		    		coef_idx);
1671	val = snd_hda_codec_read(codec, 0x20, 0,
1672			 	AC_VERB_GET_PROC_COEF, 0);
1673	return val;
1674}
1675
1676static void alc_write_coef_idx(struct hda_codec *codec, unsigned int coef_idx,
1677							unsigned int coef_val)
1678{
1679	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1680			    coef_idx);
1681	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF,
1682			    coef_val);
1683}
1684
1685/* set right pin controls for digital I/O */
1686static void alc_auto_init_digital(struct hda_codec *codec)
1687{
1688	struct alc_spec *spec = codec->spec;
1689	int i;
1690	hda_nid_t pin;
1691
1692	for (i = 0; i < spec->autocfg.dig_outs; i++) {
1693		pin = spec->autocfg.dig_out_pins[i];
1694		if (pin) {
1695			snd_hda_codec_write(codec, pin, 0,
1696					    AC_VERB_SET_PIN_WIDGET_CONTROL,
1697					    PIN_OUT);
1698		}
1699	}
1700	pin = spec->autocfg.dig_in_pin;
1701	if (pin)
1702		snd_hda_codec_write(codec, pin, 0,
1703				    AC_VERB_SET_PIN_WIDGET_CONTROL,
1704				    PIN_IN);
1705}
1706
1707/* parse digital I/Os and set up NIDs in BIOS auto-parse mode */
1708static void alc_auto_parse_digital(struct hda_codec *codec)
1709{
1710	struct alc_spec *spec = codec->spec;
1711	int i, err;
1712	hda_nid_t dig_nid;
1713
1714	/* support multiple SPDIFs; the secondary is set up as a slave */
1715	for (i = 0; i < spec->autocfg.dig_outs; i++) {
1716		err = snd_hda_get_connections(codec,
1717					      spec->autocfg.dig_out_pins[i],
1718					      &dig_nid, 1);
1719		if (err < 0)
1720			continue;
1721		if (!i) {
1722			spec->multiout.dig_out_nid = dig_nid;
1723			spec->dig_out_type = spec->autocfg.dig_out_type[0];
1724		} else {
1725			spec->multiout.slave_dig_outs = spec->slave_dig_outs;
1726			if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
1727				break;
1728			spec->slave_dig_outs[i - 1] = dig_nid;
1729		}
1730	}
1731
1732	if (spec->autocfg.dig_in_pin) {
1733		hda_nid_t dig_nid;
1734		err = snd_hda_get_connections(codec,
1735					      spec->autocfg.dig_in_pin,
1736					      &dig_nid, 1);
1737		if (err > 0)
1738			spec->dig_in_nid = dig_nid;
1739	}
1740}
1741
1742/*
1743 * ALC888
1744 */
1745
1746/*
1747 * 2ch mode
1748 */
1749static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1750/* Mic-in jack as mic in */
1751	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1752	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1753/* Line-in jack as Line in */
1754	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1755	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1756/* Line-Out as Front */
1757	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1758	{ } /* end */
1759};
1760
1761/*
1762 * 4ch mode
1763 */
1764static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1765/* Mic-in jack as mic in */
1766	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1767	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1768/* Line-in jack as Surround */
1769	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1770	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1771/* Line-Out as Front */
1772	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1773	{ } /* end */
1774};
1775
1776/*
1777 * 6ch mode
1778 */
1779static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1780/* Mic-in jack as CLFE */
1781	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1782	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1783/* Line-in jack as Surround */
1784	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1785	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1786/* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1787	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1788	{ } /* end */
1789};
1790
1791/*
1792 * 8ch mode
1793 */
1794static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1795/* Mic-in jack as CLFE */
1796	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1797	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1798/* Line-in jack as Surround */
1799	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1800	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1801/* Line-Out as Side */
1802	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1803	{ } /* end */
1804};
1805
1806static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1807	{ 2, alc888_4ST_ch2_intel_init },
1808	{ 4, alc888_4ST_ch4_intel_init },
1809	{ 6, alc888_4ST_ch6_intel_init },
1810	{ 8, alc888_4ST_ch8_intel_init },
1811};
1812
1813/*
1814 * ALC888 Fujitsu Siemens Amillo xa3530
1815 */
1816
1817static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1818/* Front Mic: set to PIN_IN (empty by default) */
1819	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1820/* Connect Internal HP to Front */
1821	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1822	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1823	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1824/* Connect Bass HP to Front */
1825	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1826	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1827	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1828/* Connect Line-Out side jack (SPDIF) to Side */
1829	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1830	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1831	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1832/* Connect Mic jack to CLFE */
1833	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1834	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1835	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1836/* Connect Line-in jack to Surround */
1837	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1838	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1839	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1840/* Connect HP out jack to Front */
1841	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1842	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1843	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1844/* Enable unsolicited event for HP jack and Line-out jack */
1845	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1846	{0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1847	{}
1848};
1849
1850static void alc_automute_amp(struct hda_codec *codec)
1851{
1852	alc_automute_speaker(codec, 0);
1853}
1854
1855static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1856					 unsigned int res)
1857{
1858	if (codec->vendor_id == 0x10ec0880)
1859		res >>= 28;
1860	else
1861		res >>= 26;
1862	if (res == ALC880_HP_EVENT)
1863		alc_automute_amp(codec);
1864}
1865
1866static void alc889_automute_setup(struct hda_codec *codec)
1867{
1868	struct alc_spec *spec = codec->spec;
1869
1870	spec->autocfg.hp_pins[0] = 0x15;
1871	spec->autocfg.speaker_pins[0] = 0x14;
1872	spec->autocfg.speaker_pins[1] = 0x16;
1873	spec->autocfg.speaker_pins[2] = 0x17;
1874	spec->autocfg.speaker_pins[3] = 0x19;
1875	spec->autocfg.speaker_pins[4] = 0x1a;
1876}
1877
1878static void alc889_intel_init_hook(struct hda_codec *codec)
1879{
1880	alc889_coef_init(codec);
1881	alc_automute_amp(codec);
1882}
1883
1884static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
1885{
1886	struct alc_spec *spec = codec->spec;
1887
1888	spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1889	spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1890	spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1891	spec->autocfg.speaker_pins[1] = 0x15; /* bass */
1892}
1893
1894/*
1895 * ALC888 Acer Aspire 4930G model
1896 */
1897
1898static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1899/* Front Mic: set to PIN_IN (empty by default) */
1900	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1901/* Unselect Front Mic by default in input mixer 3 */
1902	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1903/* Enable unsolicited event for HP jack */
1904	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1905/* Connect Internal HP to front */
1906	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1907	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1908	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1909/* Connect HP out to front */
1910	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1911	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1912	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1913	{ }
1914};
1915
1916/*
1917 * ALC888 Acer Aspire 6530G model
1918 */
1919
1920static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1921/* Route to built-in subwoofer as well as speakers */
1922	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1923	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1924	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1925	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1926/* Bias voltage on for external mic port */
1927	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
1928/* Front Mic: set to PIN_IN (empty by default) */
1929	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1930/* Unselect Front Mic by default in input mixer 3 */
1931	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1932/* Enable unsolicited event for HP jack */
1933	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1934/* Enable speaker output */
1935	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1936	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1937	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
1938/* Enable headphone output */
1939	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1940	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1941	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1942	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
1943	{ }
1944};
1945
1946/*
1947 * ALC889 Acer Aspire 8930G model
1948 */
1949
1950static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
1951/* Front Mic: set to PIN_IN (empty by default) */
1952	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1953/* Unselect Front Mic by default in input mixer 3 */
1954	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1955/* Enable unsolicited event for HP jack */
1956	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1957/* Connect Internal Front to Front */
1958	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1959	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1960	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1961/* Connect Internal Rear to Rear */
1962	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1963	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1964	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1965/* Connect Internal CLFE to CLFE */
1966	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1967	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1968	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1969/* Connect HP out to Front */
1970	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1971	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1972	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1973/* Enable all DACs */
1974/*  DAC DISABLE/MUTE 1? */
1975/*  setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1976	{0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1977	{0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1978/*  DAC DISABLE/MUTE 2? */
1979/*  some bit here disables the other DACs. Init=0x4900 */
1980	{0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1981	{0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1982/* DMIC fix
1983 * This laptop has a stereo digital microphone. The mics are only 1cm apart
1984 * which makes the stereo useless. However, either the mic or the ALC889
1985 * makes the signal become a difference/sum signal instead of standard
1986 * stereo, which is annoying. So instead we flip this bit which makes the
1987 * codec replicate the sum signal to both channels, turning it into a
1988 * normal mono mic.
1989 */
1990/*  DMIC_CONTROL? Init value = 0x0001 */
1991	{0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1992	{0x20, AC_VERB_SET_PROC_COEF, 0x0003},
1993	{ }
1994};
1995
1996static struct hda_input_mux alc888_2_capture_sources[2] = {
1997	/* Front mic only available on one ADC */
1998	{
1999		.num_items = 4,
2000		.items = {
2001			{ "Mic", 0x0 },
2002			{ "Line", 0x2 },
2003			{ "CD", 0x4 },
2004			{ "Front Mic", 0xb },
2005		},
2006	},
2007	{
2008		.num_items = 3,
2009		.items = {
2010			{ "Mic", 0x0 },
2011			{ "Line", 0x2 },
2012			{ "CD", 0x4 },
2013		},
2014	}
2015};
2016
2017static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
2018	/* Interal mic only available on one ADC */
2019	{
2020		.num_items = 5,
2021		.items = {
2022			{ "Ext Mic", 0x0 },
2023			{ "Line In", 0x2 },
2024			{ "CD", 0x4 },
2025			{ "Input Mix", 0xa },
2026			{ "Int Mic", 0xb },
2027		},
2028	},
2029	{
2030		.num_items = 4,
2031		.items = {
2032			{ "Ext Mic", 0x0 },
2033			{ "Line In", 0x2 },
2034			{ "CD", 0x4 },
2035			{ "Input Mix", 0xa },
2036		},
2037	}
2038};
2039
2040static struct hda_input_mux alc889_capture_sources[3] = {
2041	/* Digital mic only available on first "ADC" */
2042	{
2043		.num_items = 5,
2044		.items = {
2045			{ "Mic", 0x0 },
2046			{ "Line", 0x2 },
2047			{ "CD", 0x4 },
2048			{ "Front Mic", 0xb },
2049			{ "Input Mix", 0xa },
2050		},
2051	},
2052	{
2053		.num_items = 4,
2054		.items = {
2055			{ "Mic", 0x0 },
2056			{ "Line", 0x2 },
2057			{ "CD", 0x4 },
2058			{ "Input Mix", 0xa },
2059		},
2060	},
2061	{
2062		.num_items = 4,
2063		.items = {
2064			{ "Mic", 0x0 },
2065			{ "Line", 0x2 },
2066			{ "CD", 0x4 },
2067			{ "Input Mix", 0xa },
2068		},
2069	}
2070};
2071
2072static struct snd_kcontrol_new alc888_base_mixer[] = {
2073	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2074	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2075	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2076	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2077	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
2078		HDA_OUTPUT),
2079	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2080	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2081	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2082	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2083	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2084	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2085	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2086	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2087	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2088	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2089	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
2090	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2091	{ } /* end */
2092};
2093
2094static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
2095	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2096	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2097	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2098	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2099	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
2100		HDA_OUTPUT),
2101	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2102	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2103	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2104	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2105	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2106	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2107	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
2108	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2109	{ } /* end */
2110};
2111
2112
2113static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
2114{
2115	struct alc_spec *spec = codec->spec;
2116
2117	spec->autocfg.hp_pins[0] = 0x15;
2118	spec->autocfg.speaker_pins[0] = 0x14;
2119	spec->autocfg.speaker_pins[1] = 0x16;
2120	spec->autocfg.speaker_pins[2] = 0x17;
2121}
2122
2123static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
2124{
2125	struct alc_spec *spec = codec->spec;
2126
2127	spec->autocfg.hp_pins[0] = 0x15;
2128	spec->autocfg.speaker_pins[0] = 0x14;
2129	spec->autocfg.speaker_pins[1] = 0x16;
2130	spec->autocfg.speaker_pins[2] = 0x17;
2131}
2132
2133static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
2134{
2135	struct alc_spec *spec = codec->spec;
2136
2137	spec->autocfg.hp_pins[0] = 0x15;
2138	spec->autocfg.speaker_pins[0] = 0x14;
2139	spec->autocfg.speaker_pins[1] = 0x16;
2140	spec->autocfg.speaker_pins[2] = 0x1b;
2141}
2142
2143/*
2144 * ALC880 3-stack model
2145 *
2146 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
2147 * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
2148 *                 F-Mic = 0x1b, HP = 0x19
2149 */
2150
2151static hda_nid_t alc880_dac_nids[4] = {
2152	/* front, rear, clfe, rear_surr */
2153	0x02, 0x05, 0x04, 0x03
2154};
2155
2156static hda_nid_t alc880_adc_nids[3] = {
2157	/* ADC0-2 */
2158	0x07, 0x08, 0x09,
2159};
2160
2161/* The datasheet says the node 0x07 is connected from inputs,
2162 * but it shows zero connection in the real implementation on some devices.
2163 * Note: this is a 915GAV bug, fixed on 915GLV
2164 */
2165static hda_nid_t alc880_adc_nids_alt[2] = {
2166	/* ADC1-2 */
2167	0x08, 0x09,
2168};
2169
2170#define ALC880_DIGOUT_NID	0x06
2171#define ALC880_DIGIN_NID	0x0a
2172
2173static struct hda_input_mux alc880_capture_source = {
2174	.num_items = 4,
2175	.items = {
2176		{ "Mic", 0x0 },
2177		{ "Front Mic", 0x3 },
2178		{ "Line", 0x2 },
2179		{ "CD", 0x4 },
2180	},
2181};
2182
2183/* channel source setting (2/6 channel selection for 3-stack) */
2184/* 2ch mode */
2185static struct hda_verb alc880_threestack_ch2_init[] = {
2186	/* set line-in to input, mute it */
2187	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2188	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2189	/* set mic-in to input vref 80%, mute it */
2190	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
2191	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2192	{ } /* end */
2193};
2194
2195/* 6ch mode */
2196static struct hda_verb alc880_threestack_ch6_init[] = {
2197	/* set line-in to output, unmute it */
2198	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2199	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2200	/* set mic-in to output, unmute it */
2201	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2202	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2203	{ } /* end */
2204};
2205
2206static struct hda_channel_mode alc880_threestack_modes[2] = {
2207	{ 2, alc880_threestack_ch2_init },
2208	{ 6, alc880_threestack_ch6_init },
2209};
2210
2211static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
2212	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2213	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2214	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2215	HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
2216	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2217	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2218	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2219	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2220	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2221	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2222	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2223	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2224	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2225	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2226	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
2227	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
2228	HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
2229	{
2230		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2231		.name = "Channel Mode",
2232		.info = alc_ch_mode_info,
2233		.get = alc_ch_mode_get,
2234		.put = alc_ch_mode_put,
2235	},
2236	{ } /* end */
2237};
2238
2239/* capture mixer elements */
2240static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
2241			    struct snd_ctl_elem_info *uinfo)
2242{
2243	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2244	struct alc_spec *spec = codec->spec;
2245	int err;
2246
2247	mutex_lock(&codec->control_mutex);
2248	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2249						      HDA_INPUT);
2250	err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
2251	mutex_unlock(&codec->control_mutex);
2252	return err;
2253}
2254
2255static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
2256			   unsigned int size, unsigned int __user *tlv)
2257{
2258	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2259	struct alc_spec *spec = codec->spec;
2260	int err;
2261
2262	mutex_lock(&codec->control_mutex);
2263	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2264						      HDA_INPUT);
2265	err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
2266	mutex_unlock(&codec->control_mutex);
2267	return err;
2268}
2269
2270typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
2271			     struct snd_ctl_elem_value *ucontrol);
2272
2273static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
2274				 struct snd_ctl_elem_value *ucontrol,
2275				 getput_call_t func)
2276{
2277	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2278	struct alc_spec *spec = codec->spec;
2279	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2280	int err;
2281
2282	mutex_lock(&codec->control_mutex);
2283	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
2284						      3, 0, HDA_INPUT);
2285	err = func(kcontrol, ucontrol);
2286	mutex_unlock(&codec->control_mutex);
2287	return err;
2288}
2289
2290static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
2291			   struct snd_ctl_elem_value *ucontrol)
2292{
2293	return alc_cap_getput_caller(kcontrol, ucontrol,
2294				     snd_hda_mixer_amp_volume_get);
2295}
2296
2297static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
2298			   struct snd_ctl_elem_value *ucontrol)
2299{
2300	return alc_cap_getput_caller(kcontrol, ucontrol,
2301				     snd_hda_mixer_amp_volume_put);
2302}
2303
2304/* capture mixer elements */
2305#define alc_cap_sw_info		snd_ctl_boolean_stereo_info
2306
2307static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
2308			  struct snd_ctl_elem_value *ucontrol)
2309{
2310	return alc_cap_getput_caller(kcontrol, ucontrol,
2311				     snd_hda_mixer_amp_switch_get);
2312}
2313
2314static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2315			  struct snd_ctl_elem_value *ucontrol)
2316{
2317	return alc_cap_getput_caller(kcontrol, ucontrol,
2318				     snd_hda_mixer_amp_switch_put);
2319}
2320
2321#define _DEFINE_CAPMIX(num) \
2322	{ \
2323		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2324		.name = "Capture Switch", \
2325		.access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2326		.count = num, \
2327		.info = alc_cap_sw_info, \
2328		.get = alc_cap_sw_get, \
2329		.put = alc_cap_sw_put, \
2330	}, \
2331	{ \
2332		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2333		.name = "Capture Volume", \
2334		.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2335			   SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2336			   SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2337		.count = num, \
2338		.info = alc_cap_vol_info, \
2339		.get = alc_cap_vol_get, \
2340		.put = alc_cap_vol_put, \
2341		.tlv = { .c = alc_cap_vol_tlv }, \
2342	}
2343
2344#define _DEFINE_CAPSRC(num) \
2345	{ \
2346		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2347		/* .name = "Capture Source", */ \
2348		.name = "Input Source", \
2349		.count = num, \
2350		.info = alc_mux_enum_info, \
2351		.get = alc_mux_enum_get, \
2352		.put = alc_mux_enum_put, \
2353	}
2354
2355#define DEFINE_CAPMIX(num) \
2356static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2357	_DEFINE_CAPMIX(num),				      \
2358	_DEFINE_CAPSRC(num),				      \
2359	{ } /* end */					      \
2360}
2361
2362#define DEFINE_CAPMIX_NOSRC(num) \
2363static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2364	_DEFINE_CAPMIX(num),					    \
2365	{ } /* end */						    \
2366}
2367
2368/* up to three ADCs */
2369DEFINE_CAPMIX(1);
2370DEFINE_CAPMIX(2);
2371DEFINE_CAPMIX(3);
2372DEFINE_CAPMIX_NOSRC(1);
2373DEFINE_CAPMIX_NOSRC(2);
2374DEFINE_CAPMIX_NOSRC(3);
2375
2376/*
2377 * ALC880 5-stack model
2378 *
2379 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2380 *      Side = 0x02 (0xd)
2381 * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2382 *                 Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2383 */
2384
2385/* additional mixers to alc880_three_stack_mixer */
2386static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2387	HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2388	HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2389	{ } /* end */
2390};
2391
2392/* channel source setting (6/8 channel selection for 5-stack) */
2393/* 6ch mode */
2394static struct hda_verb alc880_fivestack_ch6_init[] = {
2395	/* set line-in to input, mute it */
2396	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2397	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2398	{ } /* end */
2399};
2400
2401/* 8ch mode */
2402static struct hda_verb alc880_fivestack_ch8_init[] = {
2403	/* set line-in to output, unmute it */
2404	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2405	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2406	{ } /* end */
2407};
2408
2409static struct hda_channel_mode alc880_fivestack_modes[2] = {
2410	{ 6, alc880_fivestack_ch6_init },
2411	{ 8, alc880_fivestack_ch8_init },
2412};
2413
2414
2415/*
2416 * ALC880 6-stack model
2417 *
2418 * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2419 *      Side = 0x05 (0x0f)
2420 * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2421 *   Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2422 */
2423
2424static hda_nid_t alc880_6st_dac_nids[4] = {
2425	/* front, rear, clfe, rear_surr */
2426	0x02, 0x03, 0x04, 0x05
2427};
2428
2429static struct hda_input_mux alc880_6stack_capture_source = {
2430	.num_items = 4,
2431	.items = {
2432		{ "Mic", 0x0 },
2433		{ "Front Mic", 0x1 },
2434		{ "Line", 0x2 },
2435		{ "CD", 0x4 },
2436	},
2437};
2438
2439/* fixed 8-channels */
2440static struct hda_channel_mode alc880_sixstack_modes[1] = {
2441	{ 8, NULL },
2442};
2443
2444static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2445	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2446	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2447	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2448	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2449	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2450	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2451	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2452	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2453	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2454	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2455	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2456	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2457	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2458	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2459	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2460	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2461	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2462	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2463	{
2464		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2465		.name = "Channel Mode",
2466		.info = alc_ch_mode_info,
2467		.get = alc_ch_mode_get,
2468		.put = alc_ch_mode_put,
2469	},
2470	{ } /* end */
2471};
2472
2473
2474/*
2475 * ALC880 W810 model
2476 *
2477 * W810 has rear IO for:
2478 * Front (DAC 02)
2479 * Surround (DAC 03)
2480 * Center/LFE (DAC 04)
2481 * Digital out (06)
2482 *
2483 * The system also has a pair of internal speakers, and a headphone jack.
2484 * These are both connected to Line2 on the codec, hence to DAC 02.
2485 *
2486 * There is a variable resistor to control the speaker or headphone
2487 * volume. This is a hardware-only device without a software API.
2488 *
2489 * Plugging headphones in will disable the internal speakers. This is
2490 * implemented in hardware, not via the driver using jack sense. In
2491 * a similar fashion, plugging into the rear socket marked "front" will
2492 * disable both the speakers and headphones.
2493 *
2494 * For input, there's a microphone jack, and an "audio in" jack.
2495 * These may not do anything useful with this driver yet, because I
2496 * haven't setup any initialization verbs for these yet...
2497 */
2498
2499static hda_nid_t alc880_w810_dac_nids[3] = {
2500	/* front, rear/surround, clfe */
2501	0x02, 0x03, 0x04
2502};
2503
2504/* fixed 6 channels */
2505static struct hda_channel_mode alc880_w810_modes[1] = {
2506	{ 6, NULL }
2507};
2508
2509/* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2510static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2511	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2512	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2513	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2514	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2515	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2516	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2517	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2518	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2519	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2520	{ } /* end */
2521};
2522
2523
2524/*
2525 * Z710V model
2526 *
2527 * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
2528 * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2529 *                 Line = 0x1a
2530 */
2531
2532static hda_nid_t alc880_z71v_dac_nids[1] = {
2533	0x02
2534};
2535#define ALC880_Z71V_HP_DAC	0x03
2536
2537/* fixed 2 channels */
2538static struct hda_channel_mode alc880_2_jack_modes[1] = {
2539	{ 2, NULL }
2540};
2541
2542static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2543	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2544	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2545	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2546	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
2547	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2548	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2549	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2550	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2551	{ } /* end */
2552};
2553
2554
2555/*
2556 * ALC880 F1734 model
2557 *
2558 * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2559 * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2560 */
2561
2562static hda_nid_t alc880_f1734_dac_nids[1] = {
2563	0x03
2564};
2565#define ALC880_F1734_HP_DAC	0x02
2566
2567static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2568	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2569	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2570	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2571	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2572	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2573	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2574	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2575	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2576	{ } /* end */
2577};
2578
2579static struct hda_input_mux alc880_f1734_capture_source = {
2580	.num_items = 2,
2581	.items = {
2582		{ "Mic", 0x1 },
2583		{ "CD", 0x4 },
2584	},
2585};
2586
2587
2588/*
2589 * ALC880 ASUS model
2590 *
2591 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2592 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2593 *  Mic = 0x18, Line = 0x1a
2594 */
2595
2596#define alc880_asus_dac_nids	alc880_w810_dac_nids	/* identical with w810 */
2597#define alc880_asus_modes	alc880_threestack_modes	/* 2/6 channel mode */
2598
2599static struct snd_kcontrol_new alc880_asus_mixer[] = {
2600	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2601	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2602	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2603	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2604	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2605	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2606	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2607	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2608	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2609	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2610	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2611	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2612	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2613	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2614	{
2615		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2616		.name = "Channel Mode",
2617		.info = alc_ch_mode_info,
2618		.get = alc_ch_mode_get,
2619		.put = alc_ch_mode_put,
2620	},
2621	{ } /* end */
2622};
2623
2624/*
2625 * ALC880 ASUS W1V model
2626 *
2627 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2628 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2629 *  Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2630 */
2631
2632/* additional mixers to alc880_asus_mixer */
2633static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2634	HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2635	HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2636	{ } /* end */
2637};
2638
2639/* TCL S700 */
2640static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2641	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2642	HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2643	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2644	HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2645	HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2646	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2647	HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2648	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2649	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
2650	{ } /* end */
2651};
2652
2653/* Uniwill */
2654static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2655	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2656	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2657	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2658	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2659	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2660	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2661	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2662	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2663	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2664	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2665	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2666	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2667	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2668	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2669	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2670	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2671	{
2672		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2673		.name = "Channel Mode",
2674		.info = alc_ch_mode_info,
2675		.get = alc_ch_mode_get,
2676		.put = alc_ch_mode_put,
2677	},
2678	{ } /* end */
2679};
2680
2681static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2682	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2683	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2684	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2685	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2686	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2687	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2688	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2689	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2690	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2691	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2692	{ } /* end */
2693};
2694
2695static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2696	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2697	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2698	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2699	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2700	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2701	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2702	{ } /* end */
2703};
2704
2705/*
2706 * virtual master controls
2707 */
2708
2709/*
2710 * slave controls for virtual master
2711 */
2712static const char *alc_slave_vols[] = {
2713	"Front Playback Volume",
2714	"Surround Playback Volume",
2715	"Center Playback Volume",
2716	"LFE Playback Volume",
2717	"Side Playback Volume",
2718	"Headphone Playback Volume",
2719	"Speaker Playback Volume",
2720	"Mono Playback Volume",
2721	"Line-Out Playback Volume",
2722	"PCM Playback Volume",
2723	NULL,
2724};
2725
2726static const char *alc_slave_sws[] = {
2727	"Front Playback Switch",
2728	"Surround Playback Switch",
2729	"Center Playback Switch",
2730	"LFE Playback Switch",
2731	"Side Playback Switch",
2732	"Headphone Playback Switch",
2733	"Speaker Playback Switch",
2734	"Mono Playback Switch",
2735	"IEC958 Playback Switch",
2736	"Line-Out Playback Switch",
2737	"PCM Playback Switch",
2738	NULL,
2739};
2740
2741/*
2742 * build control elements
2743 */
2744
2745#define NID_MAPPING		(-1)
2746
2747#define SUBDEV_SPEAKER_		(0 << 6)
2748#define SUBDEV_HP_		(1 << 6)
2749#define SUBDEV_LINE_		(2 << 6)
2750#define SUBDEV_SPEAKER(x)	(SUBDEV_SPEAKER_ | ((x) & 0x3f))
2751#define SUBDEV_HP(x)		(SUBDEV_HP_ | ((x) & 0x3f))
2752#define SUBDEV_LINE(x)		(SUBDEV_LINE_ | ((x) & 0x3f))
2753
2754static void alc_free_kctls(struct hda_codec *codec);
2755
2756#ifdef CONFIG_SND_HDA_INPUT_BEEP
2757/* additional beep mixers; the actual parameters are overwritten at build */
2758static struct snd_kcontrol_new alc_beep_mixer[] = {
2759	HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2760	HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
2761	{ } /* end */
2762};
2763#endif
2764
2765static int alc_build_controls(struct hda_codec *codec)
2766{
2767	struct alc_spec *spec = codec->spec;
2768	struct snd_kcontrol *kctl = NULL;
2769	struct snd_kcontrol_new *knew;
2770	int i, j, err;
2771	unsigned int u;
2772	hda_nid_t nid;
2773
2774	for (i = 0; i < spec->num_mixers; i++) {
2775		err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2776		if (err < 0)
2777			return err;
2778	}
2779	if (spec->cap_mixer) {
2780		err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2781		if (err < 0)
2782			return err;
2783	}
2784	if (spec->multiout.dig_out_nid) {
2785		err = snd_hda_create_spdif_out_ctls(codec,
2786						    spec->multiout.dig_out_nid);
2787		if (err < 0)
2788			return err;
2789		if (!spec->no_analog) {
2790			err = snd_hda_create_spdif_share_sw(codec,
2791							    &spec->multiout);
2792			if (err < 0)
2793				return err;
2794			spec->multiout.share_spdif = 1;
2795		}
2796	}
2797	if (spec->dig_in_nid) {
2798		err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2799		if (err < 0)
2800			return err;
2801	}
2802
2803#ifdef CONFIG_SND_HDA_INPUT_BEEP
2804	/* create beep controls if needed */
2805	if (spec->beep_amp) {
2806		struct snd_kcontrol_new *knew;
2807		for (knew = alc_beep_mixer; knew->name; knew++) {
2808			struct snd_kcontrol *kctl;
2809			kctl = snd_ctl_new1(knew, codec);
2810			if (!kctl)
2811				return -ENOMEM;
2812			kctl->private_value = spec->beep_amp;
2813			err = snd_hda_ctl_add(codec, 0, kctl);
2814			if (err < 0)
2815				return err;
2816		}
2817	}
2818#endif
2819
2820	/* if we have no master control, let's create it */
2821	if (!spec->no_analog &&
2822	    !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
2823		unsigned int vmaster_tlv[4];
2824		snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
2825					HDA_OUTPUT, vmaster_tlv);
2826		err = snd_hda_add_vmaster(codec, "Master Playback Volume",
2827					  vmaster_tlv, alc_slave_vols);
2828		if (err < 0)
2829			return err;
2830	}
2831	if (!spec->no_analog &&
2832	    !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2833		err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2834					  NULL, alc_slave_sws);
2835		if (err < 0)
2836			return err;
2837	}
2838
2839	/* assign Capture Source enums to NID */
2840	if (spec->capsrc_nids || spec->adc_nids) {
2841		kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
2842		if (!kctl)
2843			kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
2844		for (i = 0; kctl && i < kctl->count; i++) {
2845			hda_nid_t *nids = spec->capsrc_nids;
2846			if (!nids)
2847				nids = spec->adc_nids;
2848			err = snd_hda_add_nid(codec, kctl, i, nids[i]);
2849			if (err < 0)
2850				return err;
2851		}
2852	}
2853	if (spec->cap_mixer) {
2854		const char *kname = kctl ? kctl->id.name : NULL;
2855		for (knew = spec->cap_mixer; knew->name; knew++) {
2856			if (kname && strcmp(knew->name, kname) == 0)
2857				continue;
2858			kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2859			for (i = 0; kctl && i < kctl->count; i++) {
2860				err = snd_hda_add_nid(codec, kctl, i,
2861						      spec->adc_nids[i]);
2862				if (err < 0)
2863					return err;
2864			}
2865		}
2866	}
2867
2868	/* other nid->control mapping */
2869	for (i = 0; i < spec->num_mixers; i++) {
2870		for (knew = spec->mixers[i]; knew->name; knew++) {
2871			if (knew->iface != NID_MAPPING)
2872				continue;
2873			kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2874			if (kctl == NULL)
2875				continue;
2876			u = knew->subdevice;
2877			for (j = 0; j < 4; j++, u >>= 8) {
2878				nid = u & 0x3f;
2879				if (nid == 0)
2880					continue;
2881				switch (u & 0xc0) {
2882				case SUBDEV_SPEAKER_:
2883					nid = spec->autocfg.speaker_pins[nid];
2884					break;
2885				case SUBDEV_LINE_:
2886					nid = spec->autocfg.line_out_pins[nid];
2887					break;
2888				case SUBDEV_HP_:
2889					nid = spec->autocfg.hp_pins[nid];
2890					break;
2891				default:
2892					continue;
2893				}
2894				err = snd_hda_add_nid(codec, kctl, 0, nid);
2895				if (err < 0)
2896					return err;
2897			}
2898			u = knew->private_value;
2899			for (j = 0; j < 4; j++, u >>= 8) {
2900				nid = u & 0xff;
2901				if (nid == 0)
2902					continue;
2903				err = snd_hda_add_nid(codec, kctl, 0, nid);
2904				if (err < 0)
2905					return err;
2906			}
2907		}
2908	}
2909
2910	alc_free_kctls(codec); /* no longer needed */
2911
2912	return 0;
2913}
2914
2915
2916/*
2917 * initialize the codec volumes, etc
2918 */
2919
2920/*
2921 * generic initialization of ADC, input mixers and output mixers
2922 */
2923static struct hda_verb alc880_volume_init_verbs[] = {
2924	/*
2925	 * Unmute ADC0-2 and set the default input to mic-in
2926	 */
2927	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2928	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2929	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
2930	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2931	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
2932	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2933
2934	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2935	 * mixer widget
2936	 * Note: PASD motherboards uses the Line In 2 as the input for front
2937	 * panel mic (mic 2)
2938	 */
2939	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
2940	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2941	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2942	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2943	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2944	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2945	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2946	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2947
2948	/*
2949	 * Set up output mixers (0x0c - 0x0f)
2950	 */
2951	/* set vol=0 to output mixers */
2952	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2953	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2954	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2955	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2956	/* set up input amps for analog loopback */
2957	/* Amp Indices: DAC = 0, mixer = 1 */
2958	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2959	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2960	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2961	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2962	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2963	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2964	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2965	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2966
2967	{ }
2968};
2969
2970/*
2971 * 3-stack pin configuration:
2972 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2973 */
2974static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2975	/*
2976	 * preset connection lists of input pins
2977	 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2978	 */
2979	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2980	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2981	{0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2982
2983	/*
2984	 * Set pin mode and muting
2985	 */
2986	/* set front pin widgets 0x14 for output */
2987	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2988	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2989	/* Mic1 (rear panel) pin widget for input and vref at 80% */
2990	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2991	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2992	/* Mic2 (as headphone out) for HP output */
2993	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2994	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2995	/* Line In pin widget for input */
2996	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2997	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2998	/* Line2 (as front mic) pin widget for input and vref at 80% */
2999	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3000	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3001	/* CD pin widget for input */
3002	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3003
3004	{ }
3005};
3006
3007/*
3008 * 5-stack pin configuration:
3009 * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
3010 * line-in/side = 0x1a, f-mic = 0x1b
3011 */
3012static struct hda_verb alc880_pin_5stack_init_verbs[] = {
3013	/*
3014	 * preset connection lists of input pins
3015	 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
3016	 */
3017	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3018	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
3019
3020	/*
3021	 * Set pin mode and muting
3022	 */
3023	/* set pin widgets 0x14-0x17 for output */
3024	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3025	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3026	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3027	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3028	/* unmute pins for output (no gain on this amp) */
3029	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3030	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3031	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3032	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3033
3034	/* Mic1 (rear panel) pin widget for input and vref at 80% */
3035	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3036	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3037	/* Mic2 (as headphone out) for HP output */
3038	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3039	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3040	/* Line In pin widget for input */
3041	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3042	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3043	/* Line2 (as front mic) pin widget for input and vref at 80% */
3044	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3045	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3046	/* CD pin widget for input */
3047	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3048
3049	{ }
3050};
3051
3052/*
3053 * W810 pin configuration:
3054 * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
3055 */
3056static struct hda_verb alc880_pin_w810_init_verbs[] = {
3057	/* hphone/speaker input selector: front DAC */
3058	{0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
3059
3060	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3061	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3062	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3063	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3064	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3065	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3066
3067	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3068	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3069
3070	{ }
3071};
3072
3073/*
3074 * Z71V pin configuration:
3075 * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
3076 */
3077static struct hda_verb alc880_pin_z71v_init_verbs[] = {
3078	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3079	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3080	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3081	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3082
3083	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3084	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3085	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3086	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3087
3088	{ }
3089};
3090
3091/*
3092 * 6-stack pin configuration:
3093 * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
3094 * f-mic = 0x19, line = 0x1a, HP = 0x1b
3095 */
3096static struct hda_verb alc880_pin_6stack_init_verbs[] = {
3097	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3098
3099	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3100	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3101	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3102	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3103	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3104	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3105	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3106	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3107
3108	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3109	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3110	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3111	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3112	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3113	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3114	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3115	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3116	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3117
3118	{ }
3119};
3120
3121/*
3122 * Uniwill pin configuration:
3123 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
3124 * line = 0x1a
3125 */
3126static struct hda_verb alc880_uniwill_init_verbs[] = {
3127	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3128
3129	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3130	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3131	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3132	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3133	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3134	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3135	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3136	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3137	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3138	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3139	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3140	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3141	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3142	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3143
3144	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3145	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3146	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3147	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3148	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3149	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3150	/* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
3151	/* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
3152	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3153
3154	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3155	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
3156
3157	{ }
3158};
3159
3160/*
3161* Uniwill P53
3162* HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
3163 */
3164static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
3165	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3166
3167	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3168	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3169	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3170	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3171	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3172	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3173	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3174	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3175	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3176	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3177	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3178	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3179
3180	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3181	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3182	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3183	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3184	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3185	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3186
3187	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3188	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
3189
3190	{ }
3191};
3192
3193static struct hda_verb alc880_beep_init_verbs[] = {
3194	{ 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
3195	{ }
3196};
3197
3198/* auto-toggle front mic */
3199static void alc880_uniwill_mic_automute(struct hda_codec *codec)
3200{
3201 	unsigned int present;
3202	unsigned char bits;
3203
3204	present = snd_hda_jack_detect(codec, 0x18);
3205	bits = present ? HDA_AMP_MUTE : 0;
3206	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
3207}
3208
3209static void alc880_uniwill_setup(struct hda_codec *codec)
3210{
3211	struct alc_spec *spec = codec->spec;
3212
3213	spec->autocfg.hp_pins[0] = 0x14;
3214	spec->autocfg.speaker_pins[0] = 0x15;
3215	spec->autocfg.speaker_pins[0] = 0x16;
3216}
3217
3218static void alc880_uniwill_init_hook(struct hda_codec *codec)
3219{
3220	alc_automute_amp(codec);
3221	alc880_uniwill_mic_automute(codec);
3222}
3223
3224static void alc880_uniwill_unsol_event(struct hda_codec *codec,
3225				       unsigned int res)
3226{
3227	/* Looks like the unsol event is incompatible with the standard
3228	 * definition.  4bit tag is placed at 28 bit!
3229	 */
3230	switch (res >> 28) {
3231	case ALC880_MIC_EVENT:
3232		alc880_uniwill_mic_automute(codec);
3233		break;
3234	default:
3235		alc_automute_amp_unsol_event(codec, res);
3236		break;
3237	}
3238}
3239
3240static void alc880_uniwill_p53_setup(struct hda_codec *codec)
3241{
3242	struct alc_spec *spec = codec->spec;
3243
3244	spec->autocfg.hp_pins[0] = 0x14;
3245	spec->autocfg.speaker_pins[0] = 0x15;
3246}
3247
3248static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
3249{
3250	unsigned int present;
3251
3252	present = snd_hda_codec_read(codec, 0x21, 0,
3253				     AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
3254	present &= HDA_AMP_VOLMASK;
3255	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
3256				 HDA_AMP_VOLMASK, present);
3257	snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
3258				 HDA_AMP_VOLMASK, present);
3259}
3260
3261static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
3262					   unsigned int res)
3263{
3264	/* Looks like the unsol event is incompatible with the standard
3265	 * definition.  4bit tag is placed at 28 bit!
3266	 */
3267	if ((res >> 28) == ALC880_DCVOL_EVENT)
3268		alc880_uniwill_p53_dcvol_automute(codec);
3269	else
3270		alc_automute_amp_unsol_event(codec, res);
3271}
3272
3273/*
3274 * F1734 pin configuration:
3275 * HP = 0x14, speaker-out = 0x15, mic = 0x18
3276 */
3277static struct hda_verb alc880_pin_f1734_init_verbs[] = {
3278	{0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
3279	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3280	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3281	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3282	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3283
3284	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3285	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3286	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3287	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3288
3289	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3290	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3291	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
3292	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3293	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3294	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3295	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3296	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3297	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3298
3299	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
3300	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
3301
3302	{ }
3303};
3304
3305/*
3306 * ASUS pin configuration:
3307 * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
3308 */
3309static struct hda_verb alc880_pin_asus_init_verbs[] = {
3310	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3311	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3312	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3313	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3314
3315	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3316	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3317	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3318	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3319	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3320	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3321	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3322	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3323
3324	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3325	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3326	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3327	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3328	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3329	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3330	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3331	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3332	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3333
3334	{ }
3335};
3336
3337/* Enable GPIO mask and set output */
3338#define alc880_gpio1_init_verbs	alc_gpio1_init_verbs
3339#define alc880_gpio2_init_verbs	alc_gpio2_init_verbs
3340#define alc880_gpio3_init_verbs	alc_gpio3_init_verbs
3341
3342/* Clevo m520g init */
3343static struct hda_verb alc880_pin_clevo_init_verbs[] = {
3344	/* headphone output */
3345	{0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3346	/* line-out */
3347	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3348	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3349	/* Line-in */
3350	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3351	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3352	/* CD */
3353	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3354	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3355	/* Mic1 (rear panel) */
3356	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3357	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3358	/* Mic2 (front panel) */
3359	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3360	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3361	/* headphone */
3362	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3363	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3364        /* change to EAPD mode */
3365	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3366	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3367
3368	{ }
3369};
3370
3371static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
3372	/* change to EAPD mode */
3373	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3374	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3375
3376	/* Headphone output */
3377	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3378	/* Front output*/
3379	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3380	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
3381
3382	/* Line In pin widget for input */
3383	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3384	/* CD pin widget for input */
3385	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3386	/* Mic1 (rear panel) pin widget for input and vref at 80% */
3387	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3388
3389	/* change to EAPD mode */
3390	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3391	{0x20, AC_VERB_SET_PROC_COEF,  0x3070},
3392
3393	{ }
3394};
3395
3396/*
3397 * LG m1 express dual
3398 *
3399 * Pin assignment:
3400 *   Rear Line-In/Out (blue): 0x14
3401 *   Build-in Mic-In: 0x15
3402 *   Speaker-out: 0x17
3403 *   HP-Out (green): 0x1b
3404 *   Mic-In/Out (red): 0x19
3405 *   SPDIF-Out: 0x1e
3406 */
3407
3408/* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3409static hda_nid_t alc880_lg_dac_nids[3] = {
3410	0x05, 0x02, 0x03
3411};
3412
3413/* seems analog CD is not working */
3414static struct hda_input_mux alc880_lg_capture_source = {
3415	.num_items = 3,
3416	.items = {
3417		{ "Mic", 0x1 },
3418		{ "Line", 0x5 },
3419		{ "Internal Mic", 0x6 },
3420	},
3421};
3422
3423/* 2,4,6 channel modes */
3424static struct hda_verb alc880_lg_ch2_init[] = {
3425	/* set line-in and mic-in to input */
3426	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3427	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3428	{ }
3429};
3430
3431static struct hda_verb alc880_lg_ch4_init[] = {
3432	/* set line-in to out and mic-in to input */
3433	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3434	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3435	{ }
3436};
3437
3438static struct hda_verb alc880_lg_ch6_init[] = {
3439	/* set line-in and mic-in to output */
3440	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3441	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3442	{ }
3443};
3444
3445static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3446	{ 2, alc880_lg_ch2_init },
3447	{ 4, alc880_lg_ch4_init },
3448	{ 6, alc880_lg_ch6_init },
3449};
3450
3451static struct snd_kcontrol_new alc880_lg_mixer[] = {
3452	HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3453	HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3454	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3455	HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3456	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3457	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3458	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3459	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3460	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3461	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3462	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3463	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3464	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3465	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3466	{
3467		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3468		.name = "Channel Mode",
3469		.info = alc_ch_mode_info,
3470		.get = alc_ch_mode_get,
3471		.put = alc_ch_mode_put,
3472	},
3473	{ } /* end */
3474};
3475
3476static struct hda_verb alc880_lg_init_verbs[] = {
3477	/* set capture source to mic-in */
3478	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3479	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3480	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3481	/* mute all amp mixer inputs */
3482	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
3483	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3484	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3485	/* line-in to input */
3486	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3487	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3488	/* built-in mic */
3489	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3490	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3491	/* speaker-out */
3492	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3493	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3494	/* mic-in to input */
3495	{0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3496	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3497	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3498	/* HP-out */
3499	{0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3500	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3501	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3502	/* jack sense */
3503	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3504	{ }
3505};
3506
3507/* toggle speaker-output according to the hp-jack state */
3508static void alc880_lg_setup(struct hda_codec *codec)
3509{
3510	struct alc_spec *spec = codec->spec;
3511
3512	spec->autocfg.hp_pins[0] = 0x1b;
3513	spec->autocfg.speaker_pins[0] = 0x17;
3514}
3515
3516/*
3517 * LG LW20
3518 *
3519 * Pin assignment:
3520 *   Speaker-out: 0x14
3521 *   Mic-In: 0x18
3522 *   Built-in Mic-In: 0x19
3523 *   Line-In: 0x1b
3524 *   HP-Out: 0x1a
3525 *   SPDIF-Out: 0x1e
3526 */
3527
3528static struct hda_input_mux alc880_lg_lw_capture_source = {
3529	.num_items = 3,
3530	.items = {
3531		{ "Mic", 0x0 },
3532		{ "Internal Mic", 0x1 },
3533		{ "Line In", 0x2 },
3534	},
3535};
3536
3537#define alc880_lg_lw_modes alc880_threestack_modes
3538
3539static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3540	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3541	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3542	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3543	HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3544	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3545	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3546	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3547	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3548	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3549	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
3550	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3551	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3552	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3553	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
3554	{
3555		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3556		.name = "Channel Mode",
3557		.info = alc_ch_mode_info,
3558		.get = alc_ch_mode_get,
3559		.put = alc_ch_mode_put,
3560	},
3561	{ } /* end */
3562};
3563
3564static struct hda_verb alc880_lg_lw_init_verbs[] = {
3565	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3566	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3567	{0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3568
3569	/* set capture source to mic-in */
3570	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3571	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3572	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3573	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3574	/* speaker-out */
3575	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3576	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3577	/* HP-out */
3578	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3579	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3580	/* mic-in to input */
3581	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3582	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3583	/* built-in mic */
3584	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3585	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3586	/* jack sense */
3587	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3588	{ }
3589};
3590
3591/* toggle speaker-output according to the hp-jack state */
3592static void alc880_lg_lw_setup(struct hda_codec *codec)
3593{
3594	struct alc_spec *spec = codec->spec;
3595
3596	spec->autocfg.hp_pins[0] = 0x1b;
3597	spec->autocfg.speaker_pins[0] = 0x14;
3598}
3599
3600static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3601	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3602	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3603	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3604	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3605	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3606	HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3607	{ } /* end */
3608};
3609
3610static struct hda_input_mux alc880_medion_rim_capture_source = {
3611	.num_items = 2,
3612	.items = {
3613		{ "Mic", 0x0 },
3614		{ "Internal Mic", 0x1 },
3615	},
3616};
3617
3618static struct hda_verb alc880_medion_rim_init_verbs[] = {
3619	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3620
3621	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3622	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3623
3624	/* Mic1 (rear panel) pin widget for input and vref at 80% */
3625	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3626	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3627	/* Mic2 (as headphone out) for HP output */
3628	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3629	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3630	/* Internal Speaker */
3631	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3632	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3633
3634	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3635	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3636
3637	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3638	{ }
3639};
3640
3641/* toggle speaker-output according to the hp-jack state */
3642static void alc880_medion_rim_automute(struct hda_codec *codec)
3643{
3644	struct alc_spec *spec = codec->spec;
3645	alc_automute_amp(codec);
3646	/* toggle EAPD */
3647	if (spec->jack_present)
3648		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3649	else
3650		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3651}
3652
3653static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3654					  unsigned int res)
3655{
3656	/* Looks like the unsol event is incompatible with the standard
3657	 * definition.  4bit tag is placed at 28 bit!
3658	 */
3659	if ((res >> 28) == ALC880_HP_EVENT)
3660		alc880_medion_rim_automute(codec);
3661}
3662
3663static void alc880_medion_rim_setup(struct hda_codec *codec)
3664{
3665	struct alc_spec *spec = codec->spec;
3666
3667	spec->autocfg.hp_pins[0] = 0x14;
3668	spec->autocfg.speaker_pins[0] = 0x1b;
3669}
3670
3671#ifdef CONFIG_SND_HDA_POWER_SAVE
3672static struct hda_amp_list alc880_loopbacks[] = {
3673	{ 0x0b, HDA_INPUT, 0 },
3674	{ 0x0b, HDA_INPUT, 1 },
3675	{ 0x0b, HDA_INPUT, 2 },
3676	{ 0x0b, HDA_INPUT, 3 },
3677	{ 0x0b, HDA_INPUT, 4 },
3678	{ } /* end */
3679};
3680
3681static struct hda_amp_list alc880_lg_loopbacks[] = {
3682	{ 0x0b, HDA_INPUT, 1 },
3683	{ 0x0b, HDA_INPUT, 6 },
3684	{ 0x0b, HDA_INPUT, 7 },
3685	{ } /* end */
3686};
3687#endif
3688
3689/*
3690 * Common callbacks
3691 */
3692
3693static int alc_init(struct hda_codec *codec)
3694{
3695	struct alc_spec *spec = codec->spec;
3696	unsigned int i;
3697
3698	alc_fix_pll(codec);
3699	alc_auto_init_amp(codec, spec->init_amp);
3700
3701	for (i = 0; i < spec->num_init_verbs; i++)
3702		snd_hda_sequence_write(codec, spec->init_verbs[i]);
3703
3704	if (spec->init_hook)
3705		spec->init_hook(codec);
3706
3707#ifdef CONFIG_SND_HDA_POWER_SAVE
3708	if (codec->patch_ops.check_power_status)
3709		codec->patch_ops.check_power_status(codec, 0x01);
3710#endif
3711	return 0;
3712}
3713
3714static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3715{
3716	struct alc_spec *spec = codec->spec;
3717
3718	if (spec->unsol_event)
3719		spec->unsol_event(codec, res);
3720}
3721
3722#ifdef CONFIG_SND_HDA_POWER_SAVE
3723static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3724{
3725	struct alc_spec *spec = codec->spec;
3726	return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3727}
3728#endif
3729
3730/*
3731 * Analog playback callbacks
3732 */
3733static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3734				    struct hda_codec *codec,
3735				    struct snd_pcm_substream *substream)
3736{
3737	struct alc_spec *spec = codec->spec;
3738	return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3739					     hinfo);
3740}
3741
3742static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3743				       struct hda_codec *codec,
3744				       unsigned int stream_tag,
3745				       unsigned int format,
3746				       struct snd_pcm_substream *substream)
3747{
3748	struct alc_spec *spec = codec->spec;
3749	return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3750						stream_tag, format, substream);
3751}
3752
3753static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3754				       struct hda_codec *codec,
3755				       struct snd_pcm_substream *substream)
3756{
3757	struct alc_spec *spec = codec->spec;
3758	return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3759}
3760
3761/*
3762 * Digital out
3763 */
3764static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3765					struct hda_codec *codec,
3766					struct snd_pcm_substream *substream)
3767{
3768	struct alc_spec *spec = codec->spec;
3769	return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3770}
3771
3772static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3773					   struct hda_codec *codec,
3774					   unsigned int stream_tag,
3775					   unsigned int format,
3776					   struct snd_pcm_substream *substream)
3777{
3778	struct alc_spec *spec = codec->spec;
3779	return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3780					     stream_tag, format, substream);
3781}
3782
3783static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3784					   struct hda_codec *codec,
3785					   struct snd_pcm_substream *substream)
3786{
3787	struct alc_spec *spec = codec->spec;
3788	return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3789}
3790
3791static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3792					 struct hda_codec *codec,
3793					 struct snd_pcm_substream *substream)
3794{
3795	struct alc_spec *spec = codec->spec;
3796	return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3797}
3798
3799/*
3800 * Analog capture
3801 */
3802static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3803				      struct hda_codec *codec,
3804				      unsigned int stream_tag,
3805				      unsigned int format,
3806				      struct snd_pcm_substream *substream)
3807{
3808	struct alc_spec *spec = codec->spec;
3809
3810	snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3811				   stream_tag, 0, format);
3812	return 0;
3813}
3814
3815static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3816				      struct hda_codec *codec,
3817				      struct snd_pcm_substream *substream)
3818{
3819	struct alc_spec *spec = codec->spec;
3820
3821	snd_hda_codec_cleanup_stream(codec,
3822				     spec->adc_nids[substream->number + 1]);
3823	return 0;
3824}
3825
3826/* analog capture with dynamic dual-adc changes */
3827static int dualmic_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3828				       struct hda_codec *codec,
3829				       unsigned int stream_tag,
3830				       unsigned int format,
3831				       struct snd_pcm_substream *substream)
3832{
3833	struct alc_spec *spec = codec->spec;
3834	spec->cur_adc = spec->adc_nids[spec->cur_adc_idx];
3835	spec->cur_adc_stream_tag = stream_tag;
3836	spec->cur_adc_format = format;
3837	snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
3838	return 0;
3839}
3840
3841static int dualmic_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3842				       struct hda_codec *codec,
3843				       struct snd_pcm_substream *substream)
3844{
3845	struct alc_spec *spec = codec->spec;
3846	snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
3847	spec->cur_adc = 0;
3848	return 0;
3849}
3850
3851static struct hda_pcm_stream dualmic_pcm_analog_capture = {
3852	.substreams = 1,
3853	.channels_min = 2,
3854	.channels_max = 2,
3855	.nid = 0, /* fill later */
3856	.ops = {
3857		.prepare = dualmic_capture_pcm_prepare,
3858		.cleanup = dualmic_capture_pcm_cleanup
3859	},
3860};
3861
3862/*
3863 */
3864static struct hda_pcm_stream alc880_pcm_analog_playback = {
3865	.substreams = 1,
3866	.channels_min = 2,
3867	.channels_max = 8,
3868	/* NID is set in alc_build_pcms */
3869	.ops = {
3870		.open = alc880_playback_pcm_open,
3871		.prepare = alc880_playback_pcm_prepare,
3872		.cleanup = alc880_playback_pcm_cleanup
3873	},
3874};
3875
3876static struct hda_pcm_stream alc880_pcm_analog_capture = {
3877	.substreams = 1,
3878	.channels_min = 2,
3879	.channels_max = 2,
3880	/* NID is set in alc_build_pcms */
3881};
3882
3883static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3884	.substreams = 1,
3885	.channels_min = 2,
3886	.channels_max = 2,
3887	/* NID is set in alc_build_pcms */
3888};
3889
3890static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3891	.substreams = 2, /* can be overridden */
3892	.channels_min = 2,
3893	.channels_max = 2,
3894	/* NID is set in alc_build_pcms */
3895	.ops = {
3896		.prepare = alc880_alt_capture_pcm_prepare,
3897		.cleanup = alc880_alt_capture_pcm_cleanup
3898	},
3899};
3900
3901static struct hda_pcm_stream alc880_pcm_digital_playback = {
3902	.substreams = 1,
3903	.channels_min = 2,
3904	.channels_max = 2,
3905	/* NID is set in alc_build_pcms */
3906	.ops = {
3907		.open = alc880_dig_playback_pcm_open,
3908		.close = alc880_dig_playback_pcm_close,
3909		.prepare = alc880_dig_playback_pcm_prepare,
3910		.cleanup = alc880_dig_playback_pcm_cleanup
3911	},
3912};
3913
3914static struct hda_pcm_stream alc880_pcm_digital_capture = {
3915	.substreams = 1,
3916	.channels_min = 2,
3917	.channels_max = 2,
3918	/* NID is set in alc_build_pcms */
3919};
3920
3921/* Used by alc_build_pcms to flag that a PCM has no playback stream */
3922static struct hda_pcm_stream alc_pcm_null_stream = {
3923	.substreams = 0,
3924	.channels_min = 0,
3925	.channels_max = 0,
3926};
3927
3928static int alc_build_pcms(struct hda_codec *codec)
3929{
3930	struct alc_spec *spec = codec->spec;
3931	struct hda_pcm *info = spec->pcm_rec;
3932	int i;
3933
3934	codec->num_pcms = 1;
3935	codec->pcm_info = info;
3936
3937	if (spec->no_analog)
3938		goto skip_analog;
3939
3940	snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3941		 "%s Analog", codec->chip_name);
3942	info->name = spec->stream_name_analog;
3943
3944	if (spec->stream_analog_playback) {
3945		if (snd_BUG_ON(!spec->multiout.dac_nids))
3946			return -EINVAL;
3947		info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3948		info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3949	}
3950	if (spec->stream_analog_capture) {
3951		if (snd_BUG_ON(!spec->adc_nids))
3952			return -EINVAL;
3953		info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3954		info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3955	}
3956
3957	if (spec->channel_mode) {
3958		info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3959		for (i = 0; i < spec->num_channel_mode; i++) {
3960			if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3961				info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3962			}
3963		}
3964	}
3965
3966 skip_analog:
3967	/* SPDIF for stream index #1 */
3968	if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3969		snprintf(spec->stream_name_digital,
3970			 sizeof(spec->stream_name_digital),
3971			 "%s Digital", codec->chip_name);
3972		codec->num_pcms = 2;
3973	        codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3974		info = spec->pcm_rec + 1;
3975		info->name = spec->stream_name_digital;
3976		if (spec->dig_out_type)
3977			info->pcm_type = spec->dig_out_type;
3978		else
3979			info->pcm_type = HDA_PCM_TYPE_SPDIF;
3980		if (spec->multiout.dig_out_nid &&
3981		    spec->stream_digital_playback) {
3982			info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3983			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3984		}
3985		if (spec->dig_in_nid &&
3986		    spec->stream_digital_capture) {
3987			info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3988			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3989		}
3990		/* FIXME: do we need this for all Realtek codec models? */
3991		codec->spdif_status_reset = 1;
3992	}
3993
3994	if (spec->no_analog)
3995		return 0;
3996
3997	/* If the use of more than one ADC is requested for the current
3998	 * model, configure a second analog capture-only PCM.
3999	 */
4000	/* Additional Analaog capture for index #2 */
4001	if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
4002	    (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
4003		codec->num_pcms = 3;
4004		info = spec->pcm_rec + 2;
4005		info->name = spec->stream_name_analog;
4006		if (spec->alt_dac_nid) {
4007			info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
4008				*spec->stream_analog_alt_playback;
4009			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
4010				spec->alt_dac_nid;
4011		} else {
4012			info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
4013				alc_pcm_null_stream;
4014			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
4015		}
4016		if (spec->num_adc_nids > 1) {
4017			info->stream[SNDRV_PCM_STREAM_CAPTURE] =
4018				*spec->stream_analog_alt_capture;
4019			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
4020				spec->adc_nids[1];
4021			info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
4022				spec->num_adc_nids - 1;
4023		} else {
4024			info->stream[SNDRV_PCM_STREAM_CAPTURE] =
4025				alc_pcm_null_stream;
4026			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
4027		}
4028	}
4029
4030	return 0;
4031}
4032
4033static inline void alc_shutup(struct hda_codec *codec)
4034{
4035	snd_hda_shutup_pins(codec);
4036}
4037
4038static void alc_free_kctls(struct hda_codec *codec)
4039{
4040	struct alc_spec *spec = codec->spec;
4041
4042	if (spec->kctls.list) {
4043		struct snd_kcontrol_new *kctl = spec->kctls.list;
4044		int i;
4045		for (i = 0; i < spec->kctls.used; i++)
4046			kfree(kctl[i].name);
4047	}
4048	snd_array_free(&spec->kctls);
4049}
4050
4051static void alc_free(struct hda_codec *codec)
4052{
4053	struct alc_spec *spec = codec->spec;
4054
4055	if (!spec)
4056		return;
4057
4058	alc_shutup(codec);
4059	alc_free_kctls(codec);
4060	kfree(spec);
4061	snd_hda_detach_beep_device(codec);
4062}
4063
4064#ifdef CONFIG_SND_HDA_POWER_SAVE
4065static void alc_power_eapd(struct hda_codec *codec)
4066{
4067	/* We currently only handle front, HP */
4068	switch (codec->vendor_id) {
4069	case 0x10ec0260:
4070		set_eapd(codec, 0x0f, 0);
4071		set_eapd(codec, 0x10, 0);
4072		break;
4073	case 0x10ec0262:
4074	case 0x10ec0267:
4075	case 0x10ec0268:
4076	case 0x10ec0269:
4077	case 0x10ec0270:
4078	case 0x10ec0272:
4079	case 0x10ec0660:
4080	case 0x10ec0662:
4081	case 0x10ec0663:
4082	case 0x10ec0862:
4083	case 0x10ec0889:
4084		set_eapd(codec, 0x14, 0);
4085		set_eapd(codec, 0x15, 0);
4086		break;
4087	}
4088}
4089
4090static int alc_suspend(struct hda_codec *codec, pm_message_t state)
4091{
4092	struct alc_spec *spec = codec->spec;
4093	alc_shutup(codec);
4094	if (spec && spec->power_hook)
4095		spec->power_hook(codec);
4096	return 0;
4097}
4098#endif
4099
4100#ifdef SND_HDA_NEEDS_RESUME
4101static int alc_resume(struct hda_codec *codec)
4102{
4103	codec->patch_ops.init(codec);
4104	snd_hda_codec_resume_amp(codec);
4105	snd_hda_codec_resume_cache(codec);
4106#ifdef CONFIG_SND_HDA_POWER_SAVE
4107	if (codec->patch_ops.check_power_status)
4108		codec->patch_ops.check_power_status(codec, 0x01);
4109#endif
4110	return 0;
4111}
4112#endif
4113
4114/*
4115 */
4116static struct hda_codec_ops alc_patch_ops = {
4117	.build_controls = alc_build_controls,
4118	.build_pcms = alc_build_pcms,
4119	.init = alc_init,
4120	.free = alc_free,
4121	.unsol_event = alc_unsol_event,
4122#ifdef SND_HDA_NEEDS_RESUME
4123	.resume = alc_resume,
4124#endif
4125#ifdef CONFIG_SND_HDA_POWER_SAVE
4126	.suspend = alc_suspend,
4127	.check_power_status = alc_check_power_status,
4128#endif
4129	.reboot_notify = alc_shutup,
4130};
4131
4132/* replace the codec chip_name with the given string */
4133static int alc_codec_rename(struct hda_codec *codec, const char *name)
4134{
4135	kfree(codec->chip_name);
4136	codec->chip_name = kstrdup(name, GFP_KERNEL);
4137	if (!codec->chip_name) {
4138		alc_free(codec);
4139		return -ENOMEM;
4140	}
4141	return 0;
4142}
4143
4144/*
4145 * Test configuration for debugging
4146 *
4147 * Almost all inputs/outputs are enabled.  I/O pins can be configured via
4148 * enum controls.
4149 */
4150#ifdef CONFIG_SND_DEBUG
4151static hda_nid_t alc880_test_dac_nids[4] = {
4152	0x02, 0x03, 0x04, 0x05
4153};
4154
4155static struct hda_input_mux alc880_test_capture_source = {
4156	.num_items = 7,
4157	.items = {
4158		{ "In-1", 0x0 },
4159		{ "In-2", 0x1 },
4160		{ "In-3", 0x2 },
4161		{ "In-4", 0x3 },
4162		{ "CD", 0x4 },
4163		{ "Front", 0x5 },
4164		{ "Surround", 0x6 },
4165	},
4166};
4167
4168static struct hda_channel_mode alc880_test_modes[4] = {
4169	{ 2, NULL },
4170	{ 4, NULL },
4171	{ 6, NULL },
4172	{ 8, NULL },
4173};
4174
4175static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
4176				 struct snd_ctl_elem_info *uinfo)
4177{
4178	static char *texts[] = {
4179		"N/A", "Line Out", "HP Out",
4180		"In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
4181	};
4182	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4183	uinfo->count = 1;
4184	uinfo->value.enumerated.items = 8;
4185	if (uinfo->value.enumerated.item >= 8)
4186		uinfo->value.enumerated.item = 7;
4187	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
4188	return 0;
4189}
4190
4191static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
4192				struct snd_ctl_elem_value *ucontrol)
4193{
4194	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4195	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4196	unsigned int pin_ctl, item = 0;
4197
4198	pin_ctl = snd_hda_codec_read(codec, nid, 0,
4199				     AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4200	if (pin_ctl & AC_PINCTL_OUT_EN) {
4201		if (pin_ctl & AC_PINCTL_HP_EN)
4202			item = 2;
4203		else
4204			item = 1;
4205	} else if (pin_ctl & AC_PINCTL_IN_EN) {
4206		switch (pin_ctl & AC_PINCTL_VREFEN) {
4207		case AC_PINCTL_VREF_HIZ: item = 3; break;
4208		case AC_PINCTL_VREF_50:  item = 4; break;
4209		case AC_PINCTL_VREF_GRD: item = 5; break;
4210		case AC_PINCTL_VREF_80:  item = 6; break;
4211		case AC_PINCTL_VREF_100: item = 7; break;
4212		}
4213	}
4214	ucontrol->value.enumerated.item[0] = item;
4215	return 0;
4216}
4217
4218static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
4219				struct snd_ctl_elem_value *ucontrol)
4220{
4221	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4222	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4223	static unsigned int ctls[] = {
4224		0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
4225		AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
4226		AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
4227		AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
4228		AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
4229		AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
4230	};
4231	unsigned int old_ctl, new_ctl;
4232
4233	old_ctl = snd_hda_codec_read(codec, nid, 0,
4234				     AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4235	new_ctl = ctls[ucontrol->value.enumerated.item[0]];
4236	if (old_ctl != new_ctl) {
4237		int val;
4238		snd_hda_codec_write_cache(codec, nid, 0,
4239					  AC_VERB_SET_PIN_WIDGET_CONTROL,
4240					  new_ctl);
4241		val = ucontrol->value.enumerated.item[0] >= 3 ?
4242			HDA_AMP_MUTE : 0;
4243		snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
4244					 HDA_AMP_MUTE, val);
4245		return 1;
4246	}
4247	return 0;
4248}
4249
4250static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
4251				 struct snd_ctl_elem_info *uinfo)
4252{
4253	static char *texts[] = {
4254		"Front", "Surround", "CLFE", "Side"
4255	};
4256	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4257	uinfo->count = 1;
4258	uinfo->value.enumerated.items = 4;
4259	if (uinfo->value.enumerated.item >= 4)
4260		uinfo->value.enumerated.item = 3;
4261	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
4262	return 0;
4263}
4264
4265static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
4266				struct snd_ctl_elem_value *ucontrol)
4267{
4268	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4269	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4270	unsigned int sel;
4271
4272	sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
4273	ucontrol->value.enumerated.item[0] = sel & 3;
4274	return 0;
4275}
4276
4277static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
4278				struct snd_ctl_elem_value *ucontrol)
4279{
4280	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4281	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4282	unsigned int sel;
4283
4284	sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
4285	if (ucontrol->value.enumerated.item[0] != sel) {
4286		sel = ucontrol->value.enumerated.item[0] & 3;
4287		snd_hda_codec_write_cache(codec, nid, 0,
4288					  AC_VERB_SET_CONNECT_SEL, sel);
4289		return 1;
4290	}
4291	return 0;
4292}
4293
4294#define PIN_CTL_TEST(xname,nid) {			\
4295		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	\
4296			.name = xname,		       \
4297			.subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4298			.info = alc_test_pin_ctl_info, \
4299			.get = alc_test_pin_ctl_get,   \
4300			.put = alc_test_pin_ctl_put,   \
4301			.private_value = nid	       \
4302			}
4303
4304#define PIN_SRC_TEST(xname,nid) {			\
4305		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	\
4306			.name = xname,		       \
4307			.subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4308			.info = alc_test_pin_src_info, \
4309			.get = alc_test_pin_src_get,   \
4310			.put = alc_test_pin_src_put,   \
4311			.private_value = nid	       \
4312			}
4313
4314static struct snd_kcontrol_new alc880_test_mixer[] = {
4315	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
4316	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
4317	HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
4318	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
4319	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
4320	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
4321	HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
4322	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
4323	PIN_CTL_TEST("Front Pin Mode", 0x14),
4324	PIN_CTL_TEST("Surround Pin Mode", 0x15),
4325	PIN_CTL_TEST("CLFE Pin Mode", 0x16),
4326	PIN_CTL_TEST("Side Pin Mode", 0x17),
4327	PIN_CTL_TEST("In-1 Pin Mode", 0x18),
4328	PIN_CTL_TEST("In-2 Pin Mode", 0x19),
4329	PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
4330	PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
4331	PIN_SRC_TEST("In-1 Pin Source", 0x18),
4332	PIN_SRC_TEST("In-2 Pin Source", 0x19),
4333	PIN_SRC_TEST("In-3 Pin Source", 0x1a),
4334	PIN_SRC_TEST("In-4 Pin Source", 0x1b),
4335	HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
4336	HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
4337	HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
4338	HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
4339	HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
4340	HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
4341	HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
4342	HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
4343	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
4344	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
4345	{
4346		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4347		.name = "Channel Mode",
4348		.info = alc_ch_mode_info,
4349		.get = alc_ch_mode_get,
4350		.put = alc_ch_mode_put,
4351	},
4352	{ } /* end */
4353};
4354
4355static struct hda_verb alc880_test_init_verbs[] = {
4356	/* Unmute inputs of 0x0c - 0x0f */
4357	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4358	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4359	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4360	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4361	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4362	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4363	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4364	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4365	/* Vol output for 0x0c-0x0f */
4366	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4367	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4368	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4369	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4370	/* Set output pins 0x14-0x17 */
4371	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4372	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4373	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4374	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4375	/* Unmute output pins 0x14-0x17 */
4376	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4377	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4378	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4379	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4380	/* Set input pins 0x18-0x1c */
4381	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4382	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4383	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4384	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4385	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4386	/* Mute input pins 0x18-0x1b */
4387	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4388	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4389	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4390	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4391	/* ADC set up */
4392	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4393	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
4394	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4395	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
4396	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4397	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
4398	/* Analog input/passthru */
4399	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4400	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4401	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4402	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4403	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4404	{ }
4405};
4406#endif
4407
4408/*
4409 */
4410
4411static const char *alc880_models[ALC880_MODEL_LAST] = {
4412	[ALC880_3ST]		= "3stack",
4413	[ALC880_TCL_S700]	= "tcl",
4414	[ALC880_3ST_DIG]	= "3stack-digout",
4415	[ALC880_CLEVO]		= "clevo",
4416	[ALC880_5ST]		= "5stack",
4417	[ALC880_5ST_DIG]	= "5stack-digout",
4418	[ALC880_W810]		= "w810",
4419	[ALC880_Z71V]		= "z71v",
4420	[ALC880_6ST]		= "6stack",
4421	[ALC880_6ST_DIG]	= "6stack-digout",
4422	[ALC880_ASUS]		= "asus",
4423	[ALC880_ASUS_W1V]	= "asus-w1v",
4424	[ALC880_ASUS_DIG]	= "asus-dig",
4425	[ALC880_ASUS_DIG2]	= "asus-dig2",
4426	[ALC880_UNIWILL_DIG]	= "uniwill",
4427	[ALC880_UNIWILL_P53]	= "uniwill-p53",
4428	[ALC880_FUJITSU]	= "fujitsu",
4429	[ALC880_F1734]		= "F1734",
4430	[ALC880_LG]		= "lg",
4431	[ALC880_LG_LW]		= "lg-lw",
4432	[ALC880_MEDION_RIM]	= "medion",
4433#ifdef CONFIG_SND_DEBUG
4434	[ALC880_TEST]		= "test",
4435#endif
4436	[ALC880_AUTO]		= "auto",
4437};
4438
4439static struct snd_pci_quirk alc880_cfg_tbl[] = {
4440	SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
4441	SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
4442	SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
4443	SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
4444	SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
4445	SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
4446	SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
4447	SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
4448	SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
4449	SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
4450	SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
4451	SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
4452	SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
4453	SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
4454	SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
4455	SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
4456	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
4457	SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
4458	/* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
4459	SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
4460	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
4461	SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
4462	SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
4463	SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
4464	SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
4465	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
4466	SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
4467	SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
4468	SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
4469	SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
4470	SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
4471	SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
4472	SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
4473	SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
4474	SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
4475	SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
4476	SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
4477	SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
4478	SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
4479	SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
4480	SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
4481	SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
4482	SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
4483	SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
4484	SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
4485	SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
4486	SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
4487	SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
4488	SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
4489	SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_F1734),
4490	SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
4491	SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
4492	SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
4493	SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
4494	SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
4495	SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
4496	SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
4497	SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
4498	SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
4499	SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
4500	SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
4501	SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
4502	SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
4503	SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
4504	SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
4505	SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
4506	SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
4507	SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
4508	/* default Intel */
4509	SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
4510	SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
4511	SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
4512	{}
4513};
4514
4515/*
4516 * ALC880 codec presets
4517 */
4518static struct alc_config_preset alc880_presets[] = {
4519	[ALC880_3ST] = {
4520		.mixers = { alc880_three_stack_mixer },
4521		.init_verbs = { alc880_volume_init_verbs,
4522				alc880_pin_3stack_init_verbs },
4523		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4524		.dac_nids = alc880_dac_nids,
4525		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4526		.channel_mode = alc880_threestack_modes,
4527		.need_dac_fix = 1,
4528		.input_mux = &alc880_capture_source,
4529	},
4530	[ALC880_3ST_DIG] = {
4531		.mixers = { alc880_three_stack_mixer },
4532		.init_verbs = { alc880_volume_init_verbs,
4533				alc880_pin_3stack_init_verbs },
4534		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4535		.dac_nids = alc880_dac_nids,
4536		.dig_out_nid = ALC880_DIGOUT_NID,
4537		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4538		.channel_mode = alc880_threestack_modes,
4539		.need_dac_fix = 1,
4540		.input_mux = &alc880_capture_source,
4541	},
4542	[ALC880_TCL_S700] = {
4543		.mixers = { alc880_tcl_s700_mixer },
4544		.init_verbs = { alc880_volume_init_verbs,
4545				alc880_pin_tcl_S700_init_verbs,
4546				alc880_gpio2_init_verbs },
4547		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4548		.dac_nids = alc880_dac_nids,
4549		.adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4550		.num_adc_nids = 1, /* single ADC */
4551		.hp_nid = 0x03,
4552		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4553		.channel_mode = alc880_2_jack_modes,
4554		.input_mux = &alc880_capture_source,
4555	},
4556	[ALC880_5ST] = {
4557		.mixers = { alc880_three_stack_mixer,
4558			    alc880_five_stack_mixer},
4559		.init_verbs = { alc880_volume_init_verbs,
4560				alc880_pin_5stack_init_verbs },
4561		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4562		.dac_nids = alc880_dac_nids,
4563		.num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4564		.channel_mode = alc880_fivestack_modes,
4565		.input_mux = &alc880_capture_source,
4566	},
4567	[ALC880_5ST_DIG] = {
4568		.mixers = { alc880_three_stack_mixer,
4569			    alc880_five_stack_mixer },
4570		.init_verbs = { alc880_volume_init_verbs,
4571				alc880_pin_5stack_init_verbs },
4572		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4573		.dac_nids = alc880_dac_nids,
4574		.dig_out_nid = ALC880_DIGOUT_NID,
4575		.num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4576		.channel_mode = alc880_fivestack_modes,
4577		.input_mux = &alc880_capture_source,
4578	},
4579	[ALC880_6ST] = {
4580		.mixers = { alc880_six_stack_mixer },
4581		.init_verbs = { alc880_volume_init_verbs,
4582				alc880_pin_6stack_init_verbs },
4583		.num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4584		.dac_nids = alc880_6st_dac_nids,
4585		.num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4586		.channel_mode = alc880_sixstack_modes,
4587		.input_mux = &alc880_6stack_capture_source,
4588	},
4589	[ALC880_6ST_DIG] = {
4590		.mixers = { alc880_six_stack_mixer },
4591		.init_verbs = { alc880_volume_init_verbs,
4592				alc880_pin_6stack_init_verbs },
4593		.num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4594		.dac_nids = alc880_6st_dac_nids,
4595		.dig_out_nid = ALC880_DIGOUT_NID,
4596		.num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4597		.channel_mode = alc880_sixstack_modes,
4598		.input_mux = &alc880_6stack_capture_source,
4599	},
4600	[ALC880_W810] = {
4601		.mixers = { alc880_w810_base_mixer },
4602		.init_verbs = { alc880_volume_init_verbs,
4603				alc880_pin_w810_init_verbs,
4604				alc880_gpio2_init_verbs },
4605		.num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4606		.dac_nids = alc880_w810_dac_nids,
4607		.dig_out_nid = ALC880_DIGOUT_NID,
4608		.num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4609		.channel_mode = alc880_w810_modes,
4610		.input_mux = &alc880_capture_source,
4611	},
4612	[ALC880_Z71V] = {
4613		.mixers = { alc880_z71v_mixer },
4614		.init_verbs = { alc880_volume_init_verbs,
4615				alc880_pin_z71v_init_verbs },
4616		.num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4617		.dac_nids = alc880_z71v_dac_nids,
4618		.dig_out_nid = ALC880_DIGOUT_NID,
4619		.hp_nid = 0x03,
4620		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4621		.channel_mode = alc880_2_jack_modes,
4622		.input_mux = &alc880_capture_source,
4623	},
4624	[ALC880_F1734] = {
4625		.mixers = { alc880_f1734_mixer },
4626		.init_verbs = { alc880_volume_init_verbs,
4627				alc880_pin_f1734_init_verbs },
4628		.num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4629		.dac_nids = alc880_f1734_dac_nids,
4630		.hp_nid = 0x02,
4631		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4632		.channel_mode = alc880_2_jack_modes,
4633		.input_mux = &alc880_f1734_capture_source,
4634		.unsol_event = alc880_uniwill_p53_unsol_event,
4635		.setup = alc880_uniwill_p53_setup,
4636		.init_hook = alc_automute_amp,
4637	},
4638	[ALC880_ASUS] = {
4639		.mixers = { alc880_asus_mixer },
4640		.init_verbs = { alc880_volume_init_verbs,
4641				alc880_pin_asus_init_verbs,
4642				alc880_gpio1_init_verbs },
4643		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4644		.dac_nids = alc880_asus_dac_nids,
4645		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4646		.channel_mode = alc880_asus_modes,
4647		.need_dac_fix = 1,
4648		.input_mux = &alc880_capture_source,
4649	},
4650	[ALC880_ASUS_DIG] = {
4651		.mixers = { alc880_asus_mixer },
4652		.init_verbs = { alc880_volume_init_verbs,
4653				alc880_pin_asus_init_verbs,
4654				alc880_gpio1_init_verbs },
4655		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4656		.dac_nids = alc880_asus_dac_nids,
4657		.dig_out_nid = ALC880_DIGOUT_NID,
4658		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4659		.channel_mode = alc880_asus_modes,
4660		.need_dac_fix = 1,
4661		.input_mux = &alc880_capture_source,
4662	},
4663	[ALC880_ASUS_DIG2] = {
4664		.mixers = { alc880_asus_mixer },
4665		.init_verbs = { alc880_volume_init_verbs,
4666				alc880_pin_asus_init_verbs,
4667				alc880_gpio2_init_verbs }, /* use GPIO2 */
4668		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4669		.dac_nids = alc880_asus_dac_nids,
4670		.dig_out_nid = ALC880_DIGOUT_NID,
4671		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4672		.channel_mode = alc880_asus_modes,
4673		.need_dac_fix = 1,
4674		.input_mux = &alc880_capture_source,
4675	},
4676	[ALC880_ASUS_W1V] = {
4677		.mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
4678		.init_verbs = { alc880_volume_init_verbs,
4679				alc880_pin_asus_init_verbs,
4680				alc880_gpio1_init_verbs },
4681		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4682		.dac_nids = alc880_asus_dac_nids,
4683		.dig_out_nid = ALC880_DIGOUT_NID,
4684		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4685		.channel_mode = alc880_asus_modes,
4686		.need_dac_fix = 1,
4687		.input_mux = &alc880_capture_source,
4688	},
4689	[ALC880_UNIWILL_DIG] = {
4690		.mixers = { alc880_asus_mixer },
4691		.init_verbs = { alc880_volume_init_verbs,
4692				alc880_pin_asus_init_verbs },
4693		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4694		.dac_nids = alc880_asus_dac_nids,
4695		.dig_out_nid = ALC880_DIGOUT_NID,
4696		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4697		.channel_mode = alc880_asus_modes,
4698		.need_dac_fix = 1,
4699		.input_mux = &alc880_capture_source,
4700	},
4701	[ALC880_UNIWILL] = {
4702		.mixers = { alc880_uniwill_mixer },
4703		.init_verbs = { alc880_volume_init_verbs,
4704				alc880_uniwill_init_verbs },
4705		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4706		.dac_nids = alc880_asus_dac_nids,
4707		.dig_out_nid = ALC880_DIGOUT_NID,
4708		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4709		.channel_mode = alc880_threestack_modes,
4710		.need_dac_fix = 1,
4711		.input_mux = &alc880_capture_source,
4712		.unsol_event = alc880_uniwill_unsol_event,
4713		.setup = alc880_uniwill_setup,
4714		.init_hook = alc880_uniwill_init_hook,
4715	},
4716	[ALC880_UNIWILL_P53] = {
4717		.mixers = { alc880_uniwill_p53_mixer },
4718		.init_verbs = { alc880_volume_init_verbs,
4719				alc880_uniwill_p53_init_verbs },
4720		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4721		.dac_nids = alc880_asus_dac_nids,
4722		.num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4723		.channel_mode = alc880_threestack_modes,
4724		.input_mux = &alc880_capture_source,
4725		.unsol_event = alc880_uniwill_p53_unsol_event,
4726		.setup = alc880_uniwill_p53_setup,
4727		.init_hook = alc_automute_amp,
4728	},
4729	[ALC880_FUJITSU] = {
4730		.mixers = { alc880_fujitsu_mixer },
4731		.init_verbs = { alc880_volume_init_verbs,
4732				alc880_uniwill_p53_init_verbs,
4733	       			alc880_beep_init_verbs },
4734		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4735		.dac_nids = alc880_dac_nids,
4736		.dig_out_nid = ALC880_DIGOUT_NID,
4737		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4738		.channel_mode = alc880_2_jack_modes,
4739		.input_mux = &alc880_capture_source,
4740		.unsol_event = alc880_uniwill_p53_unsol_event,
4741		.setup = alc880_uniwill_p53_setup,
4742		.init_hook = alc_automute_amp,
4743	},
4744	[ALC880_CLEVO] = {
4745		.mixers = { alc880_three_stack_mixer },
4746		.init_verbs = { alc880_volume_init_verbs,
4747				alc880_pin_clevo_init_verbs },
4748		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4749		.dac_nids = alc880_dac_nids,
4750		.hp_nid = 0x03,
4751		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4752		.channel_mode = alc880_threestack_modes,
4753		.need_dac_fix = 1,
4754		.input_mux = &alc880_capture_source,
4755	},
4756	[ALC880_LG] = {
4757		.mixers = { alc880_lg_mixer },
4758		.init_verbs = { alc880_volume_init_verbs,
4759				alc880_lg_init_verbs },
4760		.num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4761		.dac_nids = alc880_lg_dac_nids,
4762		.dig_out_nid = ALC880_DIGOUT_NID,
4763		.num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4764		.channel_mode = alc880_lg_ch_modes,
4765		.need_dac_fix = 1,
4766		.input_mux = &alc880_lg_capture_source,
4767		.unsol_event = alc_automute_amp_unsol_event,
4768		.setup = alc880_lg_setup,
4769		.init_hook = alc_automute_amp,
4770#ifdef CONFIG_SND_HDA_POWER_SAVE
4771		.loopbacks = alc880_lg_loopbacks,
4772#endif
4773	},
4774	[ALC880_LG_LW] = {
4775		.mixers = { alc880_lg_lw_mixer },
4776		.init_verbs = { alc880_volume_init_verbs,
4777				alc880_lg_lw_init_verbs },
4778		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4779		.dac_nids = alc880_dac_nids,
4780		.dig_out_nid = ALC880_DIGOUT_NID,
4781		.num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4782		.channel_mode = alc880_lg_lw_modes,
4783		.input_mux = &alc880_lg_lw_capture_source,
4784		.unsol_event = alc_automute_amp_unsol_event,
4785		.setup = alc880_lg_lw_setup,
4786		.init_hook = alc_automute_amp,
4787	},
4788	[ALC880_MEDION_RIM] = {
4789		.mixers = { alc880_medion_rim_mixer },
4790		.init_verbs = { alc880_volume_init_verbs,
4791				alc880_medion_rim_init_verbs,
4792				alc_gpio2_init_verbs },
4793		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4794		.dac_nids = alc880_dac_nids,
4795		.dig_out_nid = ALC880_DIGOUT_NID,
4796		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4797		.channel_mode = alc880_2_jack_modes,
4798		.input_mux = &alc880_medion_rim_capture_source,
4799		.unsol_event = alc880_medion_rim_unsol_event,
4800		.setup = alc880_medion_rim_setup,
4801		.init_hook = alc880_medion_rim_automute,
4802	},
4803#ifdef CONFIG_SND_DEBUG
4804	[ALC880_TEST] = {
4805		.mixers = { alc880_test_mixer },
4806		.init_verbs = { alc880_test_init_verbs },
4807		.num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4808		.dac_nids = alc880_test_dac_nids,
4809		.dig_out_nid = ALC880_DIGOUT_NID,
4810		.num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4811		.channel_mode = alc880_test_modes,
4812		.input_mux = &alc880_test_capture_source,
4813	},
4814#endif
4815};
4816
4817/*
4818 * Automatic parse of I/O pins from the BIOS configuration
4819 */
4820
4821enum {
4822	ALC_CTL_WIDGET_VOL,
4823	ALC_CTL_WIDGET_MUTE,
4824	ALC_CTL_BIND_MUTE,
4825};
4826static struct snd_kcontrol_new alc880_control_templates[] = {
4827	HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4828	HDA_CODEC_MUTE(NULL, 0, 0, 0),
4829	HDA_BIND_MUTE(NULL, 0, 0, 0),
4830};
4831
4832/* add dynamic controls */
4833static int add_control(struct alc_spec *spec, int type, const char *name,
4834		       int cidx, unsigned long val)
4835{
4836	struct snd_kcontrol_new *knew;
4837
4838	snd_array_init(&spec->kctls, sizeof(*knew), 32);
4839	knew = snd_array_new(&spec->kctls);
4840	if (!knew)
4841		return -ENOMEM;
4842	*knew = alc880_control_templates[type];
4843	knew->name = kstrdup(name, GFP_KERNEL);
4844	if (!knew->name)
4845		return -ENOMEM;
4846	knew->index = cidx;
4847	if (get_amp_nid_(val))
4848		knew->subdevice = HDA_SUBDEV_AMP_FLAG;
4849	knew->private_value = val;
4850	return 0;
4851}
4852
4853static int add_control_with_pfx(struct alc_spec *spec, int type,
4854				const char *pfx, const char *dir,
4855				const char *sfx, int cidx, unsigned long val)
4856{
4857	char name[32];
4858	snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
4859	return add_control(spec, type, name, cidx, val);
4860}
4861
4862#define add_pb_vol_ctrl(spec, type, pfx, val)			\
4863	add_control_with_pfx(spec, type, pfx, "Playback", "Volume", 0, val)
4864#define add_pb_sw_ctrl(spec, type, pfx, val)			\
4865	add_control_with_pfx(spec, type, pfx, "Playback", "Switch", 0, val)
4866#define __add_pb_vol_ctrl(spec, type, pfx, cidx, val)			\
4867	add_control_with_pfx(spec, type, pfx, "Playback", "Volume", cidx, val)
4868#define __add_pb_sw_ctrl(spec, type, pfx, cidx, val)			\
4869	add_control_with_pfx(spec, type, pfx, "Playback", "Switch", cidx, val)
4870
4871#define alc880_is_fixed_pin(nid)	((nid) >= 0x14 && (nid) <= 0x17)
4872#define alc880_fixed_pin_idx(nid)	((nid) - 0x14)
4873#define alc880_is_multi_pin(nid)	((nid) >= 0x18)
4874#define alc880_multi_pin_idx(nid)	((nid) - 0x18)
4875#define alc880_idx_to_dac(nid)		((nid) + 0x02)
4876#define alc880_dac_to_idx(nid)		((nid) - 0x02)
4877#define alc880_idx_to_mixer(nid)	((nid) + 0x0c)
4878#define alc880_idx_to_selector(nid)	((nid) + 0x10)
4879#define ALC880_PIN_CD_NID		0x1c
4880
4881/* fill in the dac_nids table from the parsed pin configuration */
4882static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4883				     const struct auto_pin_cfg *cfg)
4884{
4885	hda_nid_t nid;
4886	int assigned[4];
4887	int i, j;
4888
4889	memset(assigned, 0, sizeof(assigned));
4890	spec->multiout.dac_nids = spec->private_dac_nids;
4891
4892	/* check the pins hardwired to audio widget */
4893	for (i = 0; i < cfg->line_outs; i++) {
4894		nid = cfg->line_out_pins[i];
4895		if (alc880_is_fixed_pin(nid)) {
4896			int idx = alc880_fixed_pin_idx(nid);
4897			spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
4898			assigned[idx] = 1;
4899		}
4900	}
4901	/* left pins can be connect to any audio widget */
4902	for (i = 0; i < cfg->line_outs; i++) {
4903		nid = cfg->line_out_pins[i];
4904		if (alc880_is_fixed_pin(nid))
4905			continue;
4906		/* search for an empty channel */
4907		for (j = 0; j < cfg->line_outs; j++) {
4908			if (!assigned[j]) {
4909				spec->multiout.dac_nids[i] =
4910					alc880_idx_to_dac(j);
4911				assigned[j] = 1;
4912				break;
4913			}
4914		}
4915	}
4916	spec->multiout.num_dacs = cfg->line_outs;
4917	return 0;
4918}
4919
4920/* add playback controls from the parsed DAC table */
4921static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4922					     const struct auto_pin_cfg *cfg)
4923{
4924	static const char *chname[4] = {
4925		"Front", "Surround", NULL /*CLFE*/, "Side"
4926	};
4927	hda_nid_t nid;
4928	int i, err;
4929
4930	for (i = 0; i < cfg->line_outs; i++) {
4931		if (!spec->multiout.dac_nids[i])
4932			continue;
4933		nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4934		if (i == 2) {
4935			/* Center/LFE */
4936			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4937					      "Center",
4938					  HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4939							      HDA_OUTPUT));
4940			if (err < 0)
4941				return err;
4942			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4943					      "LFE",
4944					  HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4945							      HDA_OUTPUT));
4946			if (err < 0)
4947				return err;
4948			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4949					     "Center",
4950					  HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4951							      HDA_INPUT));
4952			if (err < 0)
4953				return err;
4954			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4955					     "LFE",
4956					  HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4957							      HDA_INPUT));
4958			if (err < 0)
4959				return err;
4960		} else {
4961			const char *pfx;
4962			if (cfg->line_outs == 1 &&
4963			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4964				pfx = "Speaker";
4965			else
4966				pfx = chname[i];
4967			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4968					  HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4969							      HDA_OUTPUT));
4970			if (err < 0)
4971				return err;
4972			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4973					  HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4974							      HDA_INPUT));
4975			if (err < 0)
4976				return err;
4977		}
4978	}
4979	return 0;
4980}
4981
4982/* add playback controls for speaker and HP outputs */
4983static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4984					const char *pfx)
4985{
4986	hda_nid_t nid;
4987	int err;
4988
4989	if (!pin)
4990		return 0;
4991
4992	if (alc880_is_fixed_pin(pin)) {
4993		nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
4994		/* specify the DAC as the extra output */
4995		if (!spec->multiout.hp_nid)
4996			spec->multiout.hp_nid = nid;
4997		else
4998			spec->multiout.extra_out_nid[0] = nid;
4999		/* control HP volume/switch on the output mixer amp */
5000		nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
5001		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
5002				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
5003		if (err < 0)
5004			return err;
5005		err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
5006				  HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
5007		if (err < 0)
5008			return err;
5009	} else if (alc880_is_multi_pin(pin)) {
5010		/* set manual connection */
5011		/* we have only a switch on HP-out PIN */
5012		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
5013				  HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
5014		if (err < 0)
5015			return err;
5016	}
5017	return 0;
5018}
5019
5020/* create input playback/capture controls for the given pin */
5021static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
5022			    const char *ctlname, int ctlidx,
5023			    int idx, hda_nid_t mix_nid)
5024{
5025	int err;
5026
5027	err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname, ctlidx,
5028			  HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
5029	if (err < 0)
5030		return err;
5031	err = __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, ctlidx,
5032			  HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
5033	if (err < 0)
5034		return err;
5035	return 0;
5036}
5037
5038static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
5039{
5040	unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
5041	return (pincap & AC_PINCAP_IN) != 0;
5042}
5043
5044/* create playback/capture controls for input pins */
5045static int alc_auto_create_input_ctls(struct hda_codec *codec,
5046				      const struct auto_pin_cfg *cfg,
5047				      hda_nid_t mixer,
5048				      hda_nid_t cap1, hda_nid_t cap2)
5049{
5050	struct alc_spec *spec = codec->spec;
5051	struct hda_input_mux *imux = &spec->private_imux[0];
5052	int i, err, idx, type, type_idx = 0;
5053
5054	for (i = 0; i < cfg->num_inputs; i++) {
5055		hda_nid_t pin;
5056		const char *label;
5057
5058		pin = cfg->inputs[i].pin;
5059		if (!alc_is_input_pin(codec, pin))
5060			continue;
5061
5062		type = cfg->inputs[i].type;
5063		if (i > 0 && type == cfg->inputs[i - 1].type)
5064			type_idx++;
5065		else
5066			type_idx = 0;
5067		label = hda_get_autocfg_input_label(codec, cfg, i);
5068		if (mixer) {
5069			idx = get_connection_index(codec, mixer, pin);
5070			if (idx >= 0) {
5071				err = new_analog_input(spec, pin,
5072						       label, type_idx,
5073						       idx, mixer);
5074				if (err < 0)
5075					return err;
5076			}
5077		}
5078
5079		if (!cap1)
5080			continue;
5081		idx = get_connection_index(codec, cap1, pin);
5082		if (idx < 0 && cap2)
5083			idx = get_connection_index(codec, cap2, pin);
5084		if (idx >= 0)
5085			snd_hda_add_imux_item(imux, label, idx, NULL);
5086	}
5087	return 0;
5088}
5089
5090static int alc880_auto_create_input_ctls(struct hda_codec *codec,
5091						const struct auto_pin_cfg *cfg)
5092{
5093	return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
5094}
5095
5096static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
5097			       unsigned int pin_type)
5098{
5099	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5100			    pin_type);
5101	/* unmute pin */
5102	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
5103			    AMP_OUT_UNMUTE);
5104}
5105
5106static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
5107					      hda_nid_t nid, int pin_type,
5108					      int dac_idx)
5109{
5110	alc_set_pin_output(codec, nid, pin_type);
5111	/* need the manual connection? */
5112	if (alc880_is_multi_pin(nid)) {
5113		struct alc_spec *spec = codec->spec;
5114		int idx = alc880_multi_pin_idx(nid);
5115		snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
5116				    AC_VERB_SET_CONNECT_SEL,
5117				    alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
5118	}
5119}
5120
5121static int get_pin_type(int line_out_type)
5122{
5123	if (line_out_type == AUTO_PIN_HP_OUT)
5124		return PIN_HP;
5125	else
5126		return PIN_OUT;
5127}
5128
5129static void alc880_auto_init_multi_out(struct hda_codec *codec)
5130{
5131	struct alc_spec *spec = codec->spec;
5132	int i;
5133
5134	for (i = 0; i < spec->autocfg.line_outs; i++) {
5135		hda_nid_t nid = spec->autocfg.line_out_pins[i];
5136		int pin_type = get_pin_type(spec->autocfg.line_out_type);
5137		alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
5138	}
5139}
5140
5141static void alc880_auto_init_extra_out(struct hda_codec *codec)
5142{
5143	struct alc_spec *spec = codec->spec;
5144	hda_nid_t pin;
5145
5146	pin = spec->autocfg.speaker_pins[0];
5147	if (pin) /* connect to front */
5148		alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
5149	pin = spec->autocfg.hp_pins[0];
5150	if (pin) /* connect to front */
5151		alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
5152}
5153
5154static void alc880_auto_init_analog_input(struct hda_codec *codec)
5155{
5156	struct alc_spec *spec = codec->spec;
5157	struct auto_pin_cfg *cfg = &spec->autocfg;
5158	int i;
5159
5160	for (i = 0; i < cfg->num_inputs; i++) {
5161		hda_nid_t nid = cfg->inputs[i].pin;
5162		if (alc_is_input_pin(codec, nid)) {
5163			alc_set_input_pin(codec, nid, cfg->inputs[i].type);
5164			if (nid != ALC880_PIN_CD_NID &&
5165			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
5166				snd_hda_codec_write(codec, nid, 0,
5167						    AC_VERB_SET_AMP_GAIN_MUTE,
5168						    AMP_OUT_MUTE);
5169		}
5170	}
5171}
5172
5173static void alc880_auto_init_input_src(struct hda_codec *codec)
5174{
5175	struct alc_spec *spec = codec->spec;
5176	int c;
5177
5178	for (c = 0; c < spec->num_adc_nids; c++) {
5179		unsigned int mux_idx;
5180		const struct hda_input_mux *imux;
5181		mux_idx = c >= spec->num_mux_defs ? 0 : c;
5182		imux = &spec->input_mux[mux_idx];
5183		if (!imux->num_items && mux_idx > 0)
5184			imux = &spec->input_mux[0];
5185		if (imux)
5186			snd_hda_codec_write(codec, spec->adc_nids[c], 0,
5187					    AC_VERB_SET_CONNECT_SEL,
5188					    imux->items[0].index);
5189	}
5190}
5191
5192/* parse the BIOS configuration and set up the alc_spec */
5193/* return 1 if successful, 0 if the proper config is not found,
5194 * or a negative error code
5195 */
5196static int alc880_parse_auto_config(struct hda_codec *codec)
5197{
5198	struct alc_spec *spec = codec->spec;
5199	int err;
5200	static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
5201
5202	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
5203					   alc880_ignore);
5204	if (err < 0)
5205		return err;
5206	if (!spec->autocfg.line_outs)
5207		return 0; /* can't find valid BIOS pin config */
5208
5209	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
5210	if (err < 0)
5211		return err;
5212	err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
5213	if (err < 0)
5214		return err;
5215	err = alc880_auto_create_extra_out(spec,
5216					   spec->autocfg.speaker_pins[0],
5217					   "Speaker");
5218	if (err < 0)
5219		return err;
5220	err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
5221					   "Headphone");
5222	if (err < 0)
5223		return err;
5224	err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
5225	if (err < 0)
5226		return err;
5227
5228	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
5229
5230	alc_auto_parse_digital(codec);
5231
5232	if (spec->kctls.list)
5233		add_mixer(spec, spec->kctls.list);
5234
5235	add_verb(spec, alc880_volume_init_verbs);
5236
5237	spec->num_mux_defs = 1;
5238	spec->input_mux = &spec->private_imux[0];
5239
5240	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
5241
5242	return 1;
5243}
5244
5245/* additional initialization for auto-configuration model */
5246static void alc880_auto_init(struct hda_codec *codec)
5247{
5248	struct alc_spec *spec = codec->spec;
5249	alc880_auto_init_multi_out(codec);
5250	alc880_auto_init_extra_out(codec);
5251	alc880_auto_init_analog_input(codec);
5252	alc880_auto_init_input_src(codec);
5253	alc_auto_init_digital(codec);
5254	if (spec->unsol_event)
5255		alc_inithook(codec);
5256}
5257
5258/* check the ADC/MUX contains all input pins; some ADC/MUX contains only
5259 * one of two digital mic pins, e.g. on ALC272
5260 */
5261static void fixup_automic_adc(struct hda_codec *codec)
5262{
5263	struct alc_spec *spec = codec->spec;
5264	int i;
5265
5266	for (i = 0; i < spec->num_adc_nids; i++) {
5267		hda_nid_t cap = spec->capsrc_nids ?
5268			spec->capsrc_nids[i] : spec->adc_nids[i];
5269		int iidx, eidx;
5270
5271		iidx = get_connection_index(codec, cap, spec->int_mic.pin);
5272		if (iidx < 0)
5273			continue;
5274		eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
5275		if (eidx < 0)
5276			continue;
5277		spec->int_mic.mux_idx = iidx;
5278		spec->ext_mic.mux_idx = eidx;
5279		if (spec->capsrc_nids)
5280			spec->capsrc_nids += i;
5281		spec->adc_nids += i;
5282		spec->num_adc_nids = 1;
5283		return;
5284	}
5285	snd_printd(KERN_INFO "hda_codec: %s: "
5286		   "No ADC/MUX containing both 0x%x and 0x%x pins\n",
5287		   codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
5288	spec->auto_mic = 0; /* disable auto-mic to be sure */
5289}
5290
5291/* select or unmute the given capsrc route */
5292static void select_or_unmute_capsrc(struct hda_codec *codec, hda_nid_t cap,
5293				    int idx)
5294{
5295	if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
5296		snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
5297					 HDA_AMP_MUTE, 0);
5298	} else {
5299		snd_hda_codec_write_cache(codec, cap, 0,
5300					  AC_VERB_SET_CONNECT_SEL, idx);
5301	}
5302}
5303
5304/* set the default connection to that pin */
5305static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin)
5306{
5307	struct alc_spec *spec = codec->spec;
5308	int i;
5309
5310	for (i = 0; i < spec->num_adc_nids; i++) {
5311		hda_nid_t cap = spec->capsrc_nids ?
5312			spec->capsrc_nids[i] : spec->adc_nids[i];
5313		int idx;
5314
5315		idx = get_connection_index(codec, cap, pin);
5316		if (idx < 0)
5317			continue;
5318		select_or_unmute_capsrc(codec, cap, idx);
5319		return i; /* return the found index */
5320	}
5321	return -1; /* not found */
5322}
5323
5324/* choose the ADC/MUX containing the input pin and initialize the setup */
5325static void fixup_single_adc(struct hda_codec *codec)
5326{
5327	struct alc_spec *spec = codec->spec;
5328	struct auto_pin_cfg *cfg = &spec->autocfg;
5329	int i;
5330
5331	/* search for the input pin; there must be only one */
5332	if (cfg->num_inputs != 1)
5333		return;
5334	i = init_capsrc_for_pin(codec, cfg->inputs[0].pin);
5335	if (i >= 0) {
5336		/* use only this ADC */
5337		if (spec->capsrc_nids)
5338			spec->capsrc_nids += i;
5339		spec->adc_nids += i;
5340		spec->num_adc_nids = 1;
5341	}
5342}
5343
5344/* initialize dual adcs */
5345static void fixup_dual_adc_switch(struct hda_codec *codec)
5346{
5347	struct alc_spec *spec = codec->spec;
5348	init_capsrc_for_pin(codec, spec->ext_mic.pin);
5349	init_capsrc_for_pin(codec, spec->int_mic.pin);
5350}
5351
5352static void set_capture_mixer(struct hda_codec *codec)
5353{
5354	struct alc_spec *spec = codec->spec;
5355	static struct snd_kcontrol_new *caps[2][3] = {
5356		{ alc_capture_mixer_nosrc1,
5357		  alc_capture_mixer_nosrc2,
5358		  alc_capture_mixer_nosrc3 },
5359		{ alc_capture_mixer1,
5360		  alc_capture_mixer2,
5361		  alc_capture_mixer3 },
5362	};
5363	if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
5364		int mux = 0;
5365		int num_adcs = spec->num_adc_nids;
5366		if (spec->dual_adc_switch)
5367			fixup_dual_adc_switch(codec);
5368		else if (spec->auto_mic)
5369			fixup_automic_adc(codec);
5370		else if (spec->input_mux) {
5371			if (spec->input_mux->num_items > 1)
5372				mux = 1;
5373			else if (spec->input_mux->num_items == 1)
5374				fixup_single_adc(codec);
5375		}
5376		if (spec->dual_adc_switch)
5377			num_adcs = 1;
5378		spec->cap_mixer = caps[mux][num_adcs - 1];
5379	}
5380}
5381
5382/* fill adc_nids (and capsrc_nids) containing all active input pins */
5383static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids,
5384				 int num_nids)
5385{
5386	struct alc_spec *spec = codec->spec;
5387	struct auto_pin_cfg *cfg = &spec->autocfg;
5388	int n;
5389	hda_nid_t fallback_adc = 0, fallback_cap = 0;
5390
5391	for (n = 0; n < num_nids; n++) {
5392		hda_nid_t adc, cap;
5393		hda_nid_t conn[HDA_MAX_NUM_INPUTS];
5394		int nconns, i, j;
5395
5396		adc = nids[n];
5397		if (get_wcaps_type(get_wcaps(codec, adc)) != AC_WID_AUD_IN)
5398			continue;
5399		cap = adc;
5400		nconns = snd_hda_get_connections(codec, cap, conn,
5401						 ARRAY_SIZE(conn));
5402		if (nconns == 1) {
5403			cap = conn[0];
5404			nconns = snd_hda_get_connections(codec, cap, conn,
5405							 ARRAY_SIZE(conn));
5406		}
5407		if (nconns <= 0)
5408			continue;
5409		if (!fallback_adc) {
5410			fallback_adc = adc;
5411			fallback_cap = cap;
5412		}
5413		for (i = 0; i < cfg->num_inputs; i++) {
5414			hda_nid_t nid = cfg->inputs[i].pin;
5415			for (j = 0; j < nconns; j++) {
5416				if (conn[j] == nid)
5417					break;
5418			}
5419			if (j >= nconns)
5420				break;
5421		}
5422		if (i >= cfg->num_inputs) {
5423			int num_adcs = spec->num_adc_nids;
5424			spec->private_adc_nids[num_adcs] = adc;
5425			spec->private_capsrc_nids[num_adcs] = cap;
5426			spec->num_adc_nids++;
5427			spec->adc_nids = spec->private_adc_nids;
5428			if (adc != cap)
5429				spec->capsrc_nids = spec->private_capsrc_nids;
5430		}
5431	}
5432	if (!spec->num_adc_nids) {
5433		printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
5434		       " using fallback 0x%x\n",
5435		       codec->chip_name, fallback_adc);
5436		spec->private_adc_nids[0] = fallback_adc;
5437		spec->adc_nids = spec->private_adc_nids;
5438		if (fallback_adc != fallback_cap) {
5439			spec->private_capsrc_nids[0] = fallback_cap;
5440			spec->capsrc_nids = spec->private_adc_nids;
5441		}
5442	}
5443}
5444
5445#ifdef CONFIG_SND_HDA_INPUT_BEEP
5446#define set_beep_amp(spec, nid, idx, dir) \
5447	((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
5448
5449static struct snd_pci_quirk beep_white_list[] = {
5450	SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
5451	SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
5452	SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
5453	{}
5454};
5455
5456static inline int has_cdefine_beep(struct hda_codec *codec)
5457{
5458	struct alc_spec *spec = codec->spec;
5459	const struct snd_pci_quirk *q;
5460	q = snd_pci_quirk_lookup(codec->bus->pci, beep_white_list);
5461	if (q)
5462		return q->value;
5463	return spec->cdefine.enable_pcbeep;
5464}
5465#else
5466#define set_beep_amp(spec, nid, idx, dir) /* NOP */
5467#define has_cdefine_beep(codec)		0
5468#endif
5469
5470/*
5471 * OK, here we have finally the patch for ALC880
5472 */
5473
5474static int patch_alc880(struct hda_codec *codec)
5475{
5476	struct alc_spec *spec;
5477	int board_config;
5478	int err;
5479
5480	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5481	if (spec == NULL)
5482		return -ENOMEM;
5483
5484	codec->spec = spec;
5485
5486	board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
5487						  alc880_models,
5488						  alc880_cfg_tbl);
5489	if (board_config < 0) {
5490		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5491		       codec->chip_name);
5492		board_config = ALC880_AUTO;
5493	}
5494
5495	if (board_config == ALC880_AUTO) {
5496		/* automatic parse from the BIOS config */
5497		err = alc880_parse_auto_config(codec);
5498		if (err < 0) {
5499			alc_free(codec);
5500			return err;
5501		} else if (!err) {
5502			printk(KERN_INFO
5503			       "hda_codec: Cannot set up configuration "
5504			       "from BIOS.  Using 3-stack mode...\n");
5505			board_config = ALC880_3ST;
5506		}
5507	}
5508
5509	err = snd_hda_attach_beep_device(codec, 0x1);
5510	if (err < 0) {
5511		alc_free(codec);
5512		return err;
5513	}
5514
5515	if (board_config != ALC880_AUTO)
5516		setup_preset(codec, &alc880_presets[board_config]);
5517
5518	spec->stream_analog_playback = &alc880_pcm_analog_playback;
5519	spec->stream_analog_capture = &alc880_pcm_analog_capture;
5520	spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
5521
5522	spec->stream_digital_playback = &alc880_pcm_digital_playback;
5523	spec->stream_digital_capture = &alc880_pcm_digital_capture;
5524
5525	if (!spec->adc_nids && spec->input_mux) {
5526		/* check whether NID 0x07 is valid */
5527		unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
5528		/* get type */
5529		wcap = get_wcaps_type(wcap);
5530		if (wcap != AC_WID_AUD_IN) {
5531			spec->adc_nids = alc880_adc_nids_alt;
5532			spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
5533		} else {
5534			spec->adc_nids = alc880_adc_nids;
5535			spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
5536		}
5537	}
5538	set_capture_mixer(codec);
5539	set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
5540
5541	spec->vmaster_nid = 0x0c;
5542
5543	codec->patch_ops = alc_patch_ops;
5544	if (board_config == ALC880_AUTO)
5545		spec->init_hook = alc880_auto_init;
5546#ifdef CONFIG_SND_HDA_POWER_SAVE
5547	if (!spec->loopback.amplist)
5548		spec->loopback.amplist = alc880_loopbacks;
5549#endif
5550
5551	return 0;
5552}
5553
5554
5555/*
5556 * ALC260 support
5557 */
5558
5559static hda_nid_t alc260_dac_nids[1] = {
5560	/* front */
5561	0x02,
5562};
5563
5564static hda_nid_t alc260_adc_nids[1] = {
5565	/* ADC0 */
5566	0x04,
5567};
5568
5569static hda_nid_t alc260_adc_nids_alt[1] = {
5570	/* ADC1 */
5571	0x05,
5572};
5573
5574/* NIDs used when simultaneous access to both ADCs makes sense.  Note that
5575 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
5576 */
5577static hda_nid_t alc260_dual_adc_nids[2] = {
5578	/* ADC0, ADC1 */
5579	0x04, 0x05
5580};
5581
5582#define ALC260_DIGOUT_NID	0x03
5583#define ALC260_DIGIN_NID	0x06
5584
5585static struct hda_input_mux alc260_capture_source = {
5586	.num_items = 4,
5587	.items = {
5588		{ "Mic", 0x0 },
5589		{ "Front Mic", 0x1 },
5590		{ "Line", 0x2 },
5591		{ "CD", 0x4 },
5592	},
5593};
5594
5595/* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
5596 * headphone jack and the internal CD lines since these are the only pins at
5597 * which audio can appear.  For flexibility, also allow the option of
5598 * recording the mixer output on the second ADC (ADC0 doesn't have a
5599 * connection to the mixer output).
5600 */
5601static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5602	{
5603		.num_items = 3,
5604		.items = {
5605			{ "Mic/Line", 0x0 },
5606			{ "CD", 0x4 },
5607			{ "Headphone", 0x2 },
5608		},
5609	},
5610	{
5611		.num_items = 4,
5612		.items = {
5613			{ "Mic/Line", 0x0 },
5614			{ "CD", 0x4 },
5615			{ "Headphone", 0x2 },
5616			{ "Mixer", 0x5 },
5617		},
5618	},
5619
5620};
5621
5622/* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5623 * the Fujitsu S702x, but jacks are marked differently.
5624 */
5625static struct hda_input_mux alc260_acer_capture_sources[2] = {
5626	{
5627		.num_items = 4,
5628		.items = {
5629			{ "Mic", 0x0 },
5630			{ "Line", 0x2 },
5631			{ "CD", 0x4 },
5632			{ "Headphone", 0x5 },
5633		},
5634	},
5635	{
5636		.num_items = 5,
5637		.items = {
5638			{ "Mic", 0x0 },
5639			{ "Line", 0x2 },
5640			{ "CD", 0x4 },
5641			{ "Headphone", 0x6 },
5642			{ "Mixer", 0x5 },
5643		},
5644	},
5645};
5646
5647/* Maxdata Favorit 100XS */
5648static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5649	{
5650		.num_items = 2,
5651		.items = {
5652			{ "Line/Mic", 0x0 },
5653			{ "CD", 0x4 },
5654		},
5655	},
5656	{
5657		.num_items = 3,
5658		.items = {
5659			{ "Line/Mic", 0x0 },
5660			{ "CD", 0x4 },
5661			{ "Mixer", 0x5 },
5662		},
5663	},
5664};
5665
5666/*
5667 * This is just place-holder, so there's something for alc_build_pcms to look
5668 * at when it calculates the maximum number of channels. ALC260 has no mixer
5669 * element which allows changing the channel mode, so the verb list is
5670 * never used.
5671 */
5672static struct hda_channel_mode alc260_modes[1] = {
5673	{ 2, NULL },
5674};
5675
5676
5677/* Mixer combinations
5678 *
5679 * basic: base_output + input + pc_beep + capture
5680 * HP: base_output + input + capture_alt
5681 * HP_3013: hp_3013 + input + capture
5682 * fujitsu: fujitsu + capture
5683 * acer: acer + capture
5684 */
5685
5686static struct snd_kcontrol_new alc260_base_output_mixer[] = {
5687	HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5688	HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5689	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5690	HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5691	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5692	HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5693	{ } /* end */
5694};
5695
5696static struct snd_kcontrol_new alc260_input_mixer[] = {
5697	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5698	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5699	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5700	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5701	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5702	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5703	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5704	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
5705	{ } /* end */
5706};
5707
5708/* update HP, line and mono out pins according to the master switch */
5709static void alc260_hp_master_update(struct hda_codec *codec,
5710				    hda_nid_t hp, hda_nid_t line,
5711				    hda_nid_t mono)
5712{
5713	struct alc_spec *spec = codec->spec;
5714	unsigned int val = spec->master_sw ? PIN_HP : 0;
5715	/* change HP and line-out pins */
5716	snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5717			    val);
5718	snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5719			    val);
5720	/* mono (speaker) depending on the HP jack sense */
5721	val = (val && !spec->jack_present) ? PIN_OUT : 0;
5722	snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5723			    val);
5724}
5725
5726static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5727				   struct snd_ctl_elem_value *ucontrol)
5728{
5729	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5730	struct alc_spec *spec = codec->spec;
5731	*ucontrol->value.integer.value = spec->master_sw;
5732	return 0;
5733}
5734
5735static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5736				   struct snd_ctl_elem_value *ucontrol)
5737{
5738	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5739	struct alc_spec *spec = codec->spec;
5740	int val = !!*ucontrol->value.integer.value;
5741	hda_nid_t hp, line, mono;
5742
5743	if (val == spec->master_sw)
5744		return 0;
5745	spec->master_sw = val;
5746	hp = (kcontrol->private_value >> 16) & 0xff;
5747	line = (kcontrol->private_value >> 8) & 0xff;
5748	mono = kcontrol->private_value & 0xff;
5749	alc260_hp_master_update(codec, hp, line, mono);
5750	return 1;
5751}
5752
5753static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5754	{
5755		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5756		.name = "Master Playback Switch",
5757		.subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5758		.info = snd_ctl_boolean_mono_info,
5759		.get = alc260_hp_master_sw_get,
5760		.put = alc260_hp_master_sw_put,
5761		.private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5762	},
5763	HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5764	HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5765	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5766	HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5767	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5768			      HDA_OUTPUT),
5769	HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5770	{ } /* end */
5771};
5772
5773static struct hda_verb alc260_hp_unsol_verbs[] = {
5774	{0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5775	{},
5776};
5777
5778static void alc260_hp_automute(struct hda_codec *codec)
5779{
5780	struct alc_spec *spec = codec->spec;
5781
5782	spec->jack_present = snd_hda_jack_detect(codec, 0x10);
5783	alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5784}
5785
5786static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5787{
5788	if ((res >> 26) == ALC880_HP_EVENT)
5789		alc260_hp_automute(codec);
5790}
5791
5792static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5793	{
5794		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5795		.name = "Master Playback Switch",
5796		.subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5797		.info = snd_ctl_boolean_mono_info,
5798		.get = alc260_hp_master_sw_get,
5799		.put = alc260_hp_master_sw_put,
5800		.private_value = (0x15 << 16) | (0x10 << 8) | 0x11
5801	},
5802	HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5803	HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5804	HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5805	HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5806	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5807	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
5808	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5809	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
5810	{ } /* end */
5811};
5812
5813static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5814	.ops = &snd_hda_bind_vol,
5815	.values = {
5816		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5817		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5818		HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5819		0
5820	},
5821};
5822
5823static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5824	.ops = &snd_hda_bind_sw,
5825	.values = {
5826		HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5827		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5828		0
5829	},
5830};
5831
5832static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5833	HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5834	HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5835	HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5836	HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5837	{ } /* end */
5838};
5839
5840static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5841	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5842	{},
5843};
5844
5845static void alc260_hp_3013_automute(struct hda_codec *codec)
5846{
5847	struct alc_spec *spec = codec->spec;
5848
5849	spec->jack_present = snd_hda_jack_detect(codec, 0x15);
5850	alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
5851}
5852
5853static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5854				       unsigned int res)
5855{
5856	if ((res >> 26) == ALC880_HP_EVENT)
5857		alc260_hp_3013_automute(codec);
5858}
5859
5860static void alc260_hp_3012_automute(struct hda_codec *codec)
5861{
5862	unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
5863
5864	snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5865			    bits);
5866	snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5867			    bits);
5868	snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5869			    bits);
5870}
5871
5872static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5873				       unsigned int res)
5874{
5875	if ((res >> 26) == ALC880_HP_EVENT)
5876		alc260_hp_3012_automute(codec);
5877}
5878
5879/* Fujitsu S702x series laptops.  ALC260 pin usage: Mic/Line jack = 0x12,
5880 * HP jack = 0x14, CD audio =  0x16, internal speaker = 0x10.
5881 */
5882static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
5883	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5884	HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
5885	ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5886	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5887	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5888	HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5889	HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
5890	ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
5891	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5892	HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
5893	{ } /* end */
5894};
5895
5896/* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks.  Note that current
5897 * versions of the ALC260 don't act on requests to enable mic bias from NID
5898 * 0x0f (used to drive the headphone jack in these laptops).  The ALC260
5899 * datasheet doesn't mention this restriction.  At this stage it's not clear
5900 * whether this behaviour is intentional or is a hardware bug in chip
5901 * revisions available in early 2006.  Therefore for now allow the
5902 * "Headphone Jack Mode" control to span all choices, but if it turns out
5903 * that the lack of mic bias for this NID is intentional we could change the
5904 * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5905 *
5906 * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5907 * don't appear to make the mic bias available from the "line" jack, even
5908 * though the NID used for this jack (0x14) can supply it.  The theory is
5909 * that perhaps Acer have included blocking capacitors between the ALC260
5910 * and the output jack.  If this turns out to be the case for all such
5911 * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5912 * to ALC_PIN_DIR_INOUT_NOMICBIAS.
5913 *
5914 * The C20x Tablet series have a mono internal speaker which is controlled
5915 * via the chip's Mono sum widget and pin complex, so include the necessary
5916 * controls for such models.  On models without a "mono speaker" the control
5917 * won't do anything.
5918 */
5919static struct snd_kcontrol_new alc260_acer_mixer[] = {
5920	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5921	HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5922	ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5923	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5924			      HDA_OUTPUT),
5925	HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
5926			   HDA_INPUT),
5927	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5928	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5929	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5930	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5931	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5932	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5933	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5934	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5935	{ } /* end */
5936};
5937
5938/* Maxdata Favorit 100XS: one output and one input (0x12) jack
5939 */
5940static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5941	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5942	HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5943	ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5944	HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5945	HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5946	ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5947	{ } /* end */
5948};
5949
5950/* Packard bell V7900  ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5951 * Line In jack = 0x14, CD audio =  0x16, pc beep = 0x17.
5952 */
5953static struct snd_kcontrol_new alc260_will_mixer[] = {
5954	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5955	HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5956	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5957	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5958	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5959	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5960	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5961	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5962	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5963	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5964	{ } /* end */
5965};
5966
5967/* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5968 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5969 */
5970static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5971	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5972	HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5973	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5974	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5975	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5976	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5977	HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5978	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5979	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5980	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5981	{ } /* end */
5982};
5983
5984/*
5985 * initialization verbs
5986 */
5987static struct hda_verb alc260_init_verbs[] = {
5988	/* Line In pin widget for input */
5989	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5990	/* CD pin widget for input */
5991	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5992	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5993	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5994	/* Mic2 (front panel) pin widget for input and vref at 80% */
5995	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5996	/* LINE-2 is used for line-out in rear */
5997	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5998	/* select line-out */
5999	{0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
6000	/* LINE-OUT pin */
6001	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6002	/* enable HP */
6003	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6004	/* enable Mono */
6005	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6006	/* mute capture amp left and right */
6007	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6008	/* set connection select to line in (default select for this ADC) */
6009	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
6010	/* mute capture amp left and right */
6011	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6012	/* set connection select to line in (default select for this ADC) */
6013	{0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
6014	/* set vol=0 Line-Out mixer amp left and right */
6015	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6016	/* unmute pin widget amp left and right (no gain on this amp) */
6017	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6018	/* set vol=0 HP mixer amp left and right */
6019	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6020	/* unmute pin widget amp left and right (no gain on this amp) */
6021	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6022	/* set vol=0 Mono mixer amp left and right */
6023	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6024	/* unmute pin widget amp left and right (no gain on this amp) */
6025	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6026	/* unmute LINE-2 out pin */
6027	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6028	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
6029	 * Line In 2 = 0x03
6030	 */
6031	/* mute analog inputs */
6032	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6033	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6034	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6035	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6036	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6037	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
6038	/* mute Front out path */
6039	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6040	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6041	/* mute Headphone out path */
6042	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6043	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6044	/* mute Mono out path */
6045	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6046	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6047	{ }
6048};
6049
6050#if 0 /* should be identical with alc260_init_verbs? */
6051static struct hda_verb alc260_hp_init_verbs[] = {
6052	/* Headphone and output */
6053	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
6054	/* mono output */
6055	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
6056	/* Mic1 (rear panel) pin widget for input and vref at 80% */
6057	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
6058	/* Mic2 (front panel) pin widget for input and vref at 80% */
6059	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
6060	/* Line In pin widget for input */
6061	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
6062	/* Line-2 pin widget for output */
6063	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
6064	/* CD pin widget for input */
6065	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
6066	/* unmute amp left and right */
6067	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
6068	/* set connection select to line in (default select for this ADC) */
6069	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
6070	/* unmute Line-Out mixer amp left and right (volume = 0) */
6071	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
6072	/* mute pin widget amp left and right (no gain on this amp) */
6073	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
6074	/* unmute HP mixer amp left and right (volume = 0) */
6075	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
6076	/* mute pin widget amp left and right (no gain on this amp) */
6077	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
6078	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
6079	 * Line In 2 = 0x03
6080	 */
6081	/* mute analog inputs */
6082	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6083	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6084	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6085	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6086	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6087	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
6088	/* Unmute Front out path */
6089	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6090	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6091	/* Unmute Headphone out path */
6092	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6093	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6094	/* Unmute Mono out path */
6095	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6096	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6097	{ }
6098};
6099#endif
6100
6101static struct hda_verb alc260_hp_3013_init_verbs[] = {
6102	/* Line out and output */
6103	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
6104	/* mono output */
6105	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
6106	/* Mic1 (rear panel) pin widget for input and vref at 80% */
6107	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
6108	/* Mic2 (front panel) pin widget for input and vref at 80% */
6109	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
6110	/* Line In pin widget for input */
6111	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
6112	/* Headphone pin widget for output */
6113	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
6114	/* CD pin widget for input */
6115	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
6116	/* unmute amp left and right */
6117	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
6118	/* set connection select to line in (default select for this ADC) */
6119	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
6120	/* unmute Line-Out mixer amp left and right (volume = 0) */
6121	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
6122	/* mute pin widget amp left and right (no gain on this amp) */
6123	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
6124	/* unmute HP mixer amp left and right (volume = 0) */
6125	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
6126	/* mute pin widget amp left and right (no gain on this amp) */
6127	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
6128	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
6129	 * Line In 2 = 0x03
6130	 */
6131	/* mute analog inputs */
6132	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6133	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6134	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6135	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6136	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6137	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
6138	/* Unmute Front out path */
6139	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6140	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6141	/* Unmute Headphone out path */
6142	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6143	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6144	/* Unmute Mono out path */
6145	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6146	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6147	{ }
6148};
6149
6150/* Initialisation sequence for ALC260 as configured in Fujitsu S702x
6151 * laptops.  ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
6152 * audio = 0x16, internal speaker = 0x10.
6153 */
6154static struct hda_verb alc260_fujitsu_init_verbs[] = {
6155	/* Disable all GPIOs */
6156	{0x01, AC_VERB_SET_GPIO_MASK, 0},
6157	/* Internal speaker is connected to headphone pin */
6158	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6159	/* Headphone/Line-out jack connects to Line1 pin; make it an output */
6160	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6161	/* Mic/Line-in jack is connected to mic1 pin, so make it an input */
6162	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6163	/* Ensure all other unused pins are disabled and muted. */
6164	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6165	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6166	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6167	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6168	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6169	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6170	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6171	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6172
6173	/* Disable digital (SPDIF) pins */
6174	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6175	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6176
6177	/* Ensure Line1 pin widget takes its input from the OUT1 sum bus
6178	 * when acting as an output.
6179	 */
6180	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6181
6182	/* Start with output sum widgets muted and their output gains at min */
6183	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6184	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6185	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6186	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6187	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6188	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6189	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6190	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6191	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6192
6193	/* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
6194	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6195	/* Unmute Line1 pin widget output buffer since it starts as an output.
6196	 * If the pin mode is changed by the user the pin mode control will
6197	 * take care of enabling the pin's input/output buffers as needed.
6198	 * Therefore there's no need to enable the input buffer at this
6199	 * stage.
6200	 */
6201	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6202	/* Unmute input buffer of pin widget used for Line-in (no equiv
6203	 * mixer ctrl)
6204	 */
6205	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6206
6207	/* Mute capture amp left and right */
6208	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6209	/* Set ADC connection select to match default mixer setting - line
6210	 * in (on mic1 pin)
6211	 */
6212	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6213
6214	/* Do the same for the second ADC: mute capture input amp and
6215	 * set ADC connection to line in (on mic1 pin)
6216	 */
6217	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6218	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6219
6220	/* Mute all inputs to mixer widget (even unconnected ones) */
6221	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6222	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6223	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6224	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6225	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6226	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6227	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6228	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6229
6230	{ }
6231};
6232
6233/* Initialisation sequence for ALC260 as configured in Acer TravelMate and
6234 * similar laptops (adapted from Fujitsu init verbs).
6235 */
6236static struct hda_verb alc260_acer_init_verbs[] = {
6237	/* On TravelMate laptops, GPIO 0 enables the internal speaker and
6238	 * the headphone jack.  Turn this on and rely on the standard mute
6239	 * methods whenever the user wants to turn these outputs off.
6240	 */
6241	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6242	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6243	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
6244	/* Internal speaker/Headphone jack is connected to Line-out pin */
6245	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6246	/* Internal microphone/Mic jack is connected to Mic1 pin */
6247	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
6248	/* Line In jack is connected to Line1 pin */
6249	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6250	/* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
6251	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6252	/* Ensure all other unused pins are disabled and muted. */
6253	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6254	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6255	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6256	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6257	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6258	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6259	/* Disable digital (SPDIF) pins */
6260	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6261	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6262
6263	/* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
6264	 * bus when acting as outputs.
6265	 */
6266	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6267	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6268
6269	/* Start with output sum widgets muted and their output gains at min */
6270	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6271	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6272	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6273	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6274	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6275	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6276	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6277	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6278	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6279
6280	/* Unmute Line-out pin widget amp left and right
6281	 * (no equiv mixer ctrl)
6282	 */
6283	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6284	/* Unmute mono pin widget amp output (no equiv mixer ctrl) */
6285	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6286	/* Unmute Mic1 and Line1 pin widget input buffers since they start as
6287	 * inputs. If the pin mode is changed by the user the pin mode control
6288	 * will take care of enabling the pin's input/output buffers as needed.
6289	 * Therefore there's no need to enable the input buffer at this
6290	 * stage.
6291	 */
6292	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6293	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6294
6295	/* Mute capture amp left and right */
6296	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6297	/* Set ADC connection select to match default mixer setting - mic
6298	 * (on mic1 pin)
6299	 */
6300	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6301
6302	/* Do similar with the second ADC: mute capture input amp and
6303	 * set ADC connection to mic to match ALSA's default state.
6304	 */
6305	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6306	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6307
6308	/* Mute all inputs to mixer widget (even unconnected ones) */
6309	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6310	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6311	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6312	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6313	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6314	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6315	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6316	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6317
6318	{ }
6319};
6320
6321/* Initialisation sequence for Maxdata Favorit 100XS
6322 * (adapted from Acer init verbs).
6323 */
6324static struct hda_verb alc260_favorit100_init_verbs[] = {
6325	/* GPIO 0 enables the output jack.
6326	 * Turn this on and rely on the standard mute
6327	 * methods whenever the user wants to turn these outputs off.
6328	 */
6329	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6330	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6331	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
6332	/* Line/Mic input jack is connected to Mic1 pin */
6333	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
6334	/* Ensure all other unused pins are disabled and muted. */
6335	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6336	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6337	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6338	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6339	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6340	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6341	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6342	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6343	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6344	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6345	/* Disable digital (SPDIF) pins */
6346	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6347	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6348
6349	/* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
6350	 * bus when acting as outputs.
6351	 */
6352	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6353	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6354
6355	/* Start with output sum widgets muted and their output gains at min */
6356	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6357	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6358	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6359	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6360	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6361	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6362	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6363	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6364	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6365
6366	/* Unmute Line-out pin widget amp left and right
6367	 * (no equiv mixer ctrl)
6368	 */
6369	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6370	/* Unmute Mic1 and Line1 pin widget input buffers since they start as
6371	 * inputs. If the pin mode is changed by the user the pin mode control
6372	 * will take care of enabling the pin's input/output buffers as needed.
6373	 * Therefore there's no need to enable the input buffer at this
6374	 * stage.
6375	 */
6376	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6377
6378	/* Mute capture amp left and right */
6379	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6380	/* Set ADC connection select to match default mixer setting - mic
6381	 * (on mic1 pin)
6382	 */
6383	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6384
6385	/* Do similar with the second ADC: mute capture input amp and
6386	 * set ADC connection to mic to match ALSA's default state.
6387	 */
6388	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6389	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6390
6391	/* Mute all inputs to mixer widget (even unconnected ones) */
6392	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6393	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6394	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6395	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6396	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6397	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6398	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6399	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6400
6401	{ }
6402};
6403
6404static struct hda_verb alc260_will_verbs[] = {
6405	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6406	{0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
6407	{0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
6408	{0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6409	{0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6410	{0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
6411	{}
6412};
6413
6414static struct hda_verb alc260_replacer_672v_verbs[] = {
6415	{0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6416	{0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6417	{0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
6418
6419	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6420	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6421	{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6422
6423	{0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6424	{}
6425};
6426
6427/* toggle speaker-output according to the hp-jack state */
6428static void alc260_replacer_672v_automute(struct hda_codec *codec)
6429{
6430        unsigned int present;
6431
6432	/* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
6433	present = snd_hda_jack_detect(codec, 0x0f);
6434	if (present) {
6435		snd_hda_codec_write_cache(codec, 0x01, 0,
6436					  AC_VERB_SET_GPIO_DATA, 1);
6437		snd_hda_codec_write_cache(codec, 0x0f, 0,
6438					  AC_VERB_SET_PIN_WIDGET_CONTROL,
6439					  PIN_HP);
6440	} else {
6441		snd_hda_codec_write_cache(codec, 0x01, 0,
6442					  AC_VERB_SET_GPIO_DATA, 0);
6443		snd_hda_codec_write_cache(codec, 0x0f, 0,
6444					  AC_VERB_SET_PIN_WIDGET_CONTROL,
6445					  PIN_OUT);
6446	}
6447}
6448
6449static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
6450                                       unsigned int res)
6451{
6452        if ((res >> 26) == ALC880_HP_EVENT)
6453                alc260_replacer_672v_automute(codec);
6454}
6455
6456static struct hda_verb alc260_hp_dc7600_verbs[] = {
6457	{0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
6458	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6459	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6460	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6461	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6462	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6463	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
6464	{0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6465	{0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6466	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6467	{}
6468};
6469
6470/* Test configuration for debugging, modelled after the ALC880 test
6471 * configuration.
6472 */
6473#ifdef CONFIG_SND_DEBUG
6474static hda_nid_t alc260_test_dac_nids[1] = {
6475	0x02,
6476};
6477static hda_nid_t alc260_test_adc_nids[2] = {
6478	0x04, 0x05,
6479};
6480/* For testing the ALC260, each input MUX needs its own definition since
6481 * the signal assignments are different.  This assumes that the first ADC
6482 * is NID 0x04.
6483 */
6484static struct hda_input_mux alc260_test_capture_sources[2] = {
6485	{
6486		.num_items = 7,
6487		.items = {
6488			{ "MIC1 pin", 0x0 },
6489			{ "MIC2 pin", 0x1 },
6490			{ "LINE1 pin", 0x2 },
6491			{ "LINE2 pin", 0x3 },
6492			{ "CD pin", 0x4 },
6493			{ "LINE-OUT pin", 0x5 },
6494			{ "HP-OUT pin", 0x6 },
6495		},
6496        },
6497	{
6498		.num_items = 8,
6499		.items = {
6500			{ "MIC1 pin", 0x0 },
6501			{ "MIC2 pin", 0x1 },
6502			{ "LINE1 pin", 0x2 },
6503			{ "LINE2 pin", 0x3 },
6504			{ "CD pin", 0x4 },
6505			{ "Mixer", 0x5 },
6506			{ "LINE-OUT pin", 0x6 },
6507			{ "HP-OUT pin", 0x7 },
6508		},
6509        },
6510};
6511static struct snd_kcontrol_new alc260_test_mixer[] = {
6512	/* Output driver widgets */
6513	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
6514	HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
6515	HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6516	HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
6517	HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6518	HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
6519
6520	/* Modes for retasking pin widgets
6521	 * Note: the ALC260 doesn't seem to act on requests to enable mic
6522         * bias from NIDs 0x0f and 0x10.  The ALC260 datasheet doesn't
6523         * mention this restriction.  At this stage it's not clear whether
6524         * this behaviour is intentional or is a hardware bug in chip
6525         * revisions available at least up until early 2006.  Therefore for
6526         * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
6527         * choices, but if it turns out that the lack of mic bias for these
6528         * NIDs is intentional we could change their modes from
6529         * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
6530	 */
6531	ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
6532	ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
6533	ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
6534	ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
6535	ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
6536	ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
6537
6538	/* Loopback mixer controls */
6539	HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
6540	HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
6541	HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
6542	HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
6543	HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
6544	HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
6545	HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
6546	HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
6547	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6548	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
6549	HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
6550	HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
6551	HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
6552	HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
6553
6554	/* Controls for GPIO pins, assuming they are configured as outputs */
6555	ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
6556	ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
6557	ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
6558	ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
6559
6560	/* Switches to allow the digital IO pins to be enabled.  The datasheet
6561	 * is ambigious as to which NID is which; testing on laptops which
6562	 * make this output available should provide clarification.
6563	 */
6564	ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
6565	ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
6566
6567	/* A switch allowing EAPD to be enabled.  Some laptops seem to use
6568	 * this output to turn on an external amplifier.
6569	 */
6570	ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
6571	ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
6572
6573	{ } /* end */
6574};
6575static struct hda_verb alc260_test_init_verbs[] = {
6576	/* Enable all GPIOs as outputs with an initial value of 0 */
6577	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
6578	{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6579	{0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
6580
6581	/* Enable retasking pins as output, initially without power amp */
6582	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6583	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6584	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6585	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6586	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6587	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6588
6589	/* Disable digital (SPDIF) pins initially, but users can enable
6590	 * them via a mixer switch.  In the case of SPDIF-out, this initverb
6591	 * payload also sets the generation to 0, output to be in "consumer"
6592	 * PCM format, copyright asserted, no pre-emphasis and no validity
6593	 * control.
6594	 */
6595	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6596	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6597
6598	/* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
6599	 * OUT1 sum bus when acting as an output.
6600	 */
6601	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6602	{0x0c, AC_VERB_SET_CONNECT_SEL, 0},
6603	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6604	{0x0e, AC_VERB_SET_CONNECT_SEL, 0},
6605
6606	/* Start with output sum widgets muted and their output gains at min */
6607	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6608	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6609	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6610	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6611	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6612	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6613	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6614	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6615	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6616
6617	/* Unmute retasking pin widget output buffers since the default
6618	 * state appears to be output.  As the pin mode is changed by the
6619	 * user the pin mode control will take care of enabling the pin's
6620	 * input/output buffers as needed.
6621	 */
6622	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6623	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6624	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6625	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6626	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6627	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6628	/* Also unmute the mono-out pin widget */
6629	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6630
6631	/* Mute capture amp left and right */
6632	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6633	/* Set ADC connection select to match default mixer setting (mic1
6634	 * pin)
6635	 */
6636	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6637
6638	/* Do the same for the second ADC: mute capture input amp and
6639	 * set ADC connection to mic1 pin
6640	 */
6641	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6642	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6643
6644	/* Mute all inputs to mixer widget (even unconnected ones) */
6645	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6646	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6647	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6648	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6649	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6650	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6651	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6652	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6653
6654	{ }
6655};
6656#endif
6657
6658#define alc260_pcm_analog_playback	alc880_pcm_analog_alt_playback
6659#define alc260_pcm_analog_capture	alc880_pcm_analog_capture
6660
6661#define alc260_pcm_digital_playback	alc880_pcm_digital_playback
6662#define alc260_pcm_digital_capture	alc880_pcm_digital_capture
6663
6664/*
6665 * for BIOS auto-configuration
6666 */
6667
6668static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
6669					const char *pfx, int *vol_bits)
6670{
6671	hda_nid_t nid_vol;
6672	unsigned long vol_val, sw_val;
6673	int err;
6674
6675	if (nid >= 0x0f && nid < 0x11) {
6676		nid_vol = nid - 0x7;
6677		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6678		sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6679	} else if (nid == 0x11) {
6680		nid_vol = nid - 0x7;
6681		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6682		sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6683	} else if (nid >= 0x12 && nid <= 0x15) {
6684		nid_vol = 0x08;
6685		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6686		sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6687	} else
6688		return 0; /* N/A */
6689
6690	if (!(*vol_bits & (1 << nid_vol))) {
6691		/* first control for the volume widget */
6692		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
6693		if (err < 0)
6694			return err;
6695		*vol_bits |= (1 << nid_vol);
6696	}
6697	err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
6698	if (err < 0)
6699		return err;
6700	return 1;
6701}
6702
6703/* add playback controls from the parsed DAC table */
6704static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6705					     const struct auto_pin_cfg *cfg)
6706{
6707	hda_nid_t nid;
6708	int err;
6709	int vols = 0;
6710
6711	spec->multiout.num_dacs = 1;
6712	spec->multiout.dac_nids = spec->private_dac_nids;
6713	spec->multiout.dac_nids[0] = 0x02;
6714
6715	nid = cfg->line_out_pins[0];
6716	if (nid) {
6717		const char *pfx;
6718		if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6719			pfx = "Master";
6720		else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6721			pfx = "Speaker";
6722		else
6723			pfx = "Front";
6724		err = alc260_add_playback_controls(spec, nid, pfx, &vols);
6725		if (err < 0)
6726			return err;
6727	}
6728
6729	nid = cfg->speaker_pins[0];
6730	if (nid) {
6731		err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
6732		if (err < 0)
6733			return err;
6734	}
6735
6736	nid = cfg->hp_pins[0];
6737	if (nid) {
6738		err = alc260_add_playback_controls(spec, nid, "Headphone",
6739						   &vols);
6740		if (err < 0)
6741			return err;
6742	}
6743	return 0;
6744}
6745
6746/* create playback/capture controls for input pins */
6747static int alc260_auto_create_input_ctls(struct hda_codec *codec,
6748						const struct auto_pin_cfg *cfg)
6749{
6750	return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
6751}
6752
6753static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6754					      hda_nid_t nid, int pin_type,
6755					      int sel_idx)
6756{
6757	alc_set_pin_output(codec, nid, pin_type);
6758	/* need the manual connection? */
6759	if (nid >= 0x12) {
6760		int idx = nid - 0x12;
6761		snd_hda_codec_write(codec, idx + 0x0b, 0,
6762				    AC_VERB_SET_CONNECT_SEL, sel_idx);
6763	}
6764}
6765
6766static void alc260_auto_init_multi_out(struct hda_codec *codec)
6767{
6768	struct alc_spec *spec = codec->spec;
6769	hda_nid_t nid;
6770
6771	nid = spec->autocfg.line_out_pins[0];
6772	if (nid) {
6773		int pin_type = get_pin_type(spec->autocfg.line_out_type);
6774		alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6775	}
6776
6777	nid = spec->autocfg.speaker_pins[0];
6778	if (nid)
6779		alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6780
6781	nid = spec->autocfg.hp_pins[0];
6782	if (nid)
6783		alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
6784}
6785
6786#define ALC260_PIN_CD_NID		0x16
6787static void alc260_auto_init_analog_input(struct hda_codec *codec)
6788{
6789	struct alc_spec *spec = codec->spec;
6790	struct auto_pin_cfg *cfg = &spec->autocfg;
6791	int i;
6792
6793	for (i = 0; i < cfg->num_inputs; i++) {
6794		hda_nid_t nid = cfg->inputs[i].pin;
6795		if (nid >= 0x12) {
6796			alc_set_input_pin(codec, nid, cfg->inputs[i].type);
6797			if (nid != ALC260_PIN_CD_NID &&
6798			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
6799				snd_hda_codec_write(codec, nid, 0,
6800						    AC_VERB_SET_AMP_GAIN_MUTE,
6801						    AMP_OUT_MUTE);
6802		}
6803	}
6804}
6805
6806#define alc260_auto_init_input_src	alc880_auto_init_input_src
6807
6808/*
6809 * generic initialization of ADC, input mixers and output mixers
6810 */
6811static struct hda_verb alc260_volume_init_verbs[] = {
6812	/*
6813	 * Unmute ADC0-1 and set the default input to mic-in
6814	 */
6815	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6816	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6817	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6818	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6819
6820	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6821	 * mixer widget
6822	 * Note: PASD motherboards uses the Line In 2 as the input for
6823	 * front panel mic (mic 2)
6824	 */
6825	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
6826	/* mute analog inputs */
6827	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6828	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6829	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6830	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6831	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6832
6833	/*
6834	 * Set up output mixers (0x08 - 0x0a)
6835	 */
6836	/* set vol=0 to output mixers */
6837	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6838	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6839	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6840	/* set up input amps for analog loopback */
6841	/* Amp Indices: DAC = 0, mixer = 1 */
6842	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6843	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6844	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6845	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6846	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6847	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6848
6849	{ }
6850};
6851
6852static int alc260_parse_auto_config(struct hda_codec *codec)
6853{
6854	struct alc_spec *spec = codec->spec;
6855	int err;
6856	static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6857
6858	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6859					   alc260_ignore);
6860	if (err < 0)
6861		return err;
6862	err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6863	if (err < 0)
6864		return err;
6865	if (!spec->kctls.list)
6866		return 0; /* can't find valid BIOS pin config */
6867	err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
6868	if (err < 0)
6869		return err;
6870
6871	spec->multiout.max_channels = 2;
6872
6873	if (spec->autocfg.dig_outs)
6874		spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
6875	if (spec->kctls.list)
6876		add_mixer(spec, spec->kctls.list);
6877
6878	add_verb(spec, alc260_volume_init_verbs);
6879
6880	spec->num_mux_defs = 1;
6881	spec->input_mux = &spec->private_imux[0];
6882
6883	alc_ssid_check(codec, 0x10, 0x15, 0x0f, 0);
6884
6885	return 1;
6886}
6887
6888/* additional initialization for auto-configuration model */
6889static void alc260_auto_init(struct hda_codec *codec)
6890{
6891	struct alc_spec *spec = codec->spec;
6892	alc260_auto_init_multi_out(codec);
6893	alc260_auto_init_analog_input(codec);
6894	alc260_auto_init_input_src(codec);
6895	alc_auto_init_digital(codec);
6896	if (spec->unsol_event)
6897		alc_inithook(codec);
6898}
6899
6900#ifdef CONFIG_SND_HDA_POWER_SAVE
6901static struct hda_amp_list alc260_loopbacks[] = {
6902	{ 0x07, HDA_INPUT, 0 },
6903	{ 0x07, HDA_INPUT, 1 },
6904	{ 0x07, HDA_INPUT, 2 },
6905	{ 0x07, HDA_INPUT, 3 },
6906	{ 0x07, HDA_INPUT, 4 },
6907	{ } /* end */
6908};
6909#endif
6910
6911/*
6912 * Pin config fixes
6913 */
6914enum {
6915	PINFIX_HP_DC5750,
6916};
6917
6918static const struct alc_fixup alc260_fixups[] = {
6919	[PINFIX_HP_DC5750] = {
6920		.pins = (const struct alc_pincfg[]) {
6921			{ 0x11, 0x90130110 }, /* speaker */
6922			{ }
6923		}
6924	},
6925};
6926
6927static struct snd_pci_quirk alc260_fixup_tbl[] = {
6928	SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", PINFIX_HP_DC5750),
6929	{}
6930};
6931
6932/*
6933 * ALC260 configurations
6934 */
6935static const char *alc260_models[ALC260_MODEL_LAST] = {
6936	[ALC260_BASIC]		= "basic",
6937	[ALC260_HP]		= "hp",
6938	[ALC260_HP_3013]	= "hp-3013",
6939	[ALC260_HP_DC7600]	= "hp-dc7600",
6940	[ALC260_FUJITSU_S702X]	= "fujitsu",
6941	[ALC260_ACER]		= "acer",
6942	[ALC260_WILL]		= "will",
6943	[ALC260_REPLACER_672V]	= "replacer",
6944	[ALC260_FAVORIT100]	= "favorit100",
6945#ifdef CONFIG_SND_DEBUG
6946	[ALC260_TEST]		= "test",
6947#endif
6948	[ALC260_AUTO]		= "auto",
6949};
6950
6951static struct snd_pci_quirk alc260_cfg_tbl[] = {
6952	SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
6953	SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
6954	SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
6955	SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
6956	SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
6957	SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
6958	SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
6959	SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
6960	SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
6961	SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6962	SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6963	SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6964	SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6965	SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6966	SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6967	SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6968	SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6969	SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
6970	SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
6971	SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
6972	{}
6973};
6974
6975static struct alc_config_preset alc260_presets[] = {
6976	[ALC260_BASIC] = {
6977		.mixers = { alc260_base_output_mixer,
6978			    alc260_input_mixer },
6979		.init_verbs = { alc260_init_verbs },
6980		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6981		.dac_nids = alc260_dac_nids,
6982		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6983		.adc_nids = alc260_dual_adc_nids,
6984		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6985		.channel_mode = alc260_modes,
6986		.input_mux = &alc260_capture_source,
6987	},
6988	[ALC260_HP] = {
6989		.mixers = { alc260_hp_output_mixer,
6990			    alc260_input_mixer },
6991		.init_verbs = { alc260_init_verbs,
6992				alc260_hp_unsol_verbs },
6993		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6994		.dac_nids = alc260_dac_nids,
6995		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6996		.adc_nids = alc260_adc_nids_alt,
6997		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6998		.channel_mode = alc260_modes,
6999		.input_mux = &alc260_capture_source,
7000		.unsol_event = alc260_hp_unsol_event,
7001		.init_hook = alc260_hp_automute,
7002	},
7003	[ALC260_HP_DC7600] = {
7004		.mixers = { alc260_hp_dc7600_mixer,
7005			    alc260_input_mixer },
7006		.init_verbs = { alc260_init_verbs,
7007				alc260_hp_dc7600_verbs },
7008		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
7009		.dac_nids = alc260_dac_nids,
7010		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
7011		.adc_nids = alc260_adc_nids_alt,
7012		.num_channel_mode = ARRAY_SIZE(alc260_modes),
7013		.channel_mode = alc260_modes,
7014		.input_mux = &alc260_capture_source,
7015		.unsol_event = alc260_hp_3012_unsol_event,
7016		.init_hook = alc260_hp_3012_automute,
7017	},
7018	[ALC260_HP_3013] = {
7019		.mixers = { alc260_hp_3013_mixer,
7020			    alc260_input_mixer },
7021		.init_verbs = { alc260_hp_3013_init_verbs,
7022				alc260_hp_3013_unsol_verbs },
7023		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
7024		.dac_nids = alc260_dac_nids,
7025		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
7026		.adc_nids = alc260_adc_nids_alt,
7027		.num_channel_mode = ARRAY_SIZE(alc260_modes),
7028		.channel_mode = alc260_modes,
7029		.input_mux = &alc260_capture_source,
7030		.unsol_event = alc260_hp_3013_unsol_event,
7031		.init_hook = alc260_hp_3013_automute,
7032	},
7033	[ALC260_FUJITSU_S702X] = {
7034		.mixers = { alc260_fujitsu_mixer },
7035		.init_verbs = { alc260_fujitsu_init_verbs },
7036		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
7037		.dac_nids = alc260_dac_nids,
7038		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
7039		.adc_nids = alc260_dual_adc_nids,
7040		.num_channel_mode = ARRAY_SIZE(alc260_modes),
7041		.channel_mode = alc260_modes,
7042		.num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
7043		.input_mux = alc260_fujitsu_capture_sources,
7044	},
7045	[ALC260_ACER] = {
7046		.mixers = { alc260_acer_mixer },
7047		.init_verbs = { alc260_acer_init_verbs },
7048		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
7049		.dac_nids = alc260_dac_nids,
7050		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
7051		.adc_nids = alc260_dual_adc_nids,
7052		.num_channel_mode = ARRAY_SIZE(alc260_modes),
7053		.channel_mode = alc260_modes,
7054		.num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
7055		.input_mux = alc260_acer_capture_sources,
7056	},
7057	[ALC260_FAVORIT100] = {
7058		.mixers = { alc260_favorit100_mixer },
7059		.init_verbs = { alc260_favorit100_init_verbs },
7060		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
7061		.dac_nids = alc260_dac_nids,
7062		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
7063		.adc_nids = alc260_dual_adc_nids,
7064		.num_channel_mode = ARRAY_SIZE(alc260_modes),
7065		.channel_mode = alc260_modes,
7066		.num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
7067		.input_mux = alc260_favorit100_capture_sources,
7068	},
7069	[ALC260_WILL] = {
7070		.mixers = { alc260_will_mixer },
7071		.init_verbs = { alc260_init_verbs, alc260_will_verbs },
7072		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
7073		.dac_nids = alc260_dac_nids,
7074		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
7075		.adc_nids = alc260_adc_nids,
7076		.dig_out_nid = ALC260_DIGOUT_NID,
7077		.num_channel_mode = ARRAY_SIZE(alc260_modes),
7078		.channel_mode = alc260_modes,
7079		.input_mux = &alc260_capture_source,
7080	},
7081	[ALC260_REPLACER_672V] = {
7082		.mixers = { alc260_replacer_672v_mixer },
7083		.init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
7084		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
7085		.dac_nids = alc260_dac_nids,
7086		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
7087		.adc_nids = alc260_adc_nids,
7088		.dig_out_nid = ALC260_DIGOUT_NID,
7089		.num_channel_mode = ARRAY_SIZE(alc260_modes),
7090		.channel_mode = alc260_modes,
7091		.input_mux = &alc260_capture_source,
7092		.unsol_event = alc260_replacer_672v_unsol_event,
7093		.init_hook = alc260_replacer_672v_automute,
7094	},
7095#ifdef CONFIG_SND_DEBUG
7096	[ALC260_TEST] = {
7097		.mixers = { alc260_test_mixer },
7098		.init_verbs = { alc260_test_init_verbs },
7099		.num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
7100		.dac_nids = alc260_test_dac_nids,
7101		.num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
7102		.adc_nids = alc260_test_adc_nids,
7103		.num_channel_mode = ARRAY_SIZE(alc260_modes),
7104		.channel_mode = alc260_modes,
7105		.num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
7106		.input_mux = alc260_test_capture_sources,
7107	},
7108#endif
7109};
7110
7111static int patch_alc260(struct hda_codec *codec)
7112{
7113	struct alc_spec *spec;
7114	int err, board_config;
7115
7116	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
7117	if (spec == NULL)
7118		return -ENOMEM;
7119
7120	codec->spec = spec;
7121
7122	board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
7123						  alc260_models,
7124						  alc260_cfg_tbl);
7125	if (board_config < 0) {
7126		snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
7127			   codec->chip_name);
7128		board_config = ALC260_AUTO;
7129	}
7130
7131	if (board_config == ALC260_AUTO)
7132		alc_pick_fixup(codec, alc260_fixup_tbl, alc260_fixups, 1);
7133
7134	if (board_config == ALC260_AUTO) {
7135		/* automatic parse from the BIOS config */
7136		err = alc260_parse_auto_config(codec);
7137		if (err < 0) {
7138			alc_free(codec);
7139			return err;
7140		} else if (!err) {
7141			printk(KERN_INFO
7142			       "hda_codec: Cannot set up configuration "
7143			       "from BIOS.  Using base mode...\n");
7144			board_config = ALC260_BASIC;
7145		}
7146	}
7147
7148	err = snd_hda_attach_beep_device(codec, 0x1);
7149	if (err < 0) {
7150		alc_free(codec);
7151		return err;
7152	}
7153
7154	if (board_config != ALC260_AUTO)
7155		setup_preset(codec, &alc260_presets[board_config]);
7156
7157	spec->stream_analog_playback = &alc260_pcm_analog_playback;
7158	spec->stream_analog_capture = &alc260_pcm_analog_capture;
7159	spec->stream_analog_alt_capture = &alc260_pcm_analog_capture;
7160
7161	spec->stream_digital_playback = &alc260_pcm_digital_playback;
7162	spec->stream_digital_capture = &alc260_pcm_digital_capture;
7163
7164	if (!spec->adc_nids && spec->input_mux) {
7165		/* check whether NID 0x04 is valid */
7166		unsigned int wcap = get_wcaps(codec, 0x04);
7167		wcap = get_wcaps_type(wcap);
7168		/* get type */
7169		if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
7170			spec->adc_nids = alc260_adc_nids_alt;
7171			spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
7172		} else {
7173			spec->adc_nids = alc260_adc_nids;
7174			spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
7175		}
7176	}
7177	set_capture_mixer(codec);
7178	set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
7179
7180	if (board_config == ALC260_AUTO)
7181		alc_pick_fixup(codec, alc260_fixup_tbl, alc260_fixups, 0);
7182
7183	spec->vmaster_nid = 0x08;
7184
7185	codec->patch_ops = alc_patch_ops;
7186	if (board_config == ALC260_AUTO)
7187		spec->init_hook = alc260_auto_init;
7188#ifdef CONFIG_SND_HDA_POWER_SAVE
7189	if (!spec->loopback.amplist)
7190		spec->loopback.amplist = alc260_loopbacks;
7191#endif
7192
7193	return 0;
7194}
7195
7196
7197/*
7198 * ALC882/883/885/888/889 support
7199 *
7200 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
7201 * configuration.  Each pin widget can choose any input DACs and a mixer.
7202 * Each ADC is connected from a mixer of all inputs.  This makes possible
7203 * 6-channel independent captures.
7204 *
7205 * In addition, an independent DAC for the multi-playback (not used in this
7206 * driver yet).
7207 */
7208#define ALC882_DIGOUT_NID	0x06
7209#define ALC882_DIGIN_NID	0x0a
7210#define ALC883_DIGOUT_NID	ALC882_DIGOUT_NID
7211#define ALC883_DIGIN_NID	ALC882_DIGIN_NID
7212#define ALC1200_DIGOUT_NID	0x10
7213
7214
7215static struct hda_channel_mode alc882_ch_modes[1] = {
7216	{ 8, NULL }
7217};
7218
7219/* DACs */
7220static hda_nid_t alc882_dac_nids[4] = {
7221	/* front, rear, clfe, rear_surr */
7222	0x02, 0x03, 0x04, 0x05
7223};
7224#define alc883_dac_nids		alc882_dac_nids
7225
7226/* ADCs */
7227#define alc882_adc_nids		alc880_adc_nids
7228#define alc882_adc_nids_alt	alc880_adc_nids_alt
7229#define alc883_adc_nids		alc882_adc_nids_alt
7230static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
7231static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
7232#define alc889_adc_nids		alc880_adc_nids
7233
7234static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
7235static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
7236#define alc883_capsrc_nids	alc882_capsrc_nids_alt
7237static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
7238#define alc889_capsrc_nids	alc882_capsrc_nids
7239
7240/* input MUX */
7241/* FIXME: should be a matrix-type input source selection */
7242
7243static struct hda_input_mux alc882_capture_source = {
7244	.num_items = 4,
7245	.items = {
7246		{ "Mic", 0x0 },
7247		{ "Front Mic", 0x1 },
7248		{ "Line", 0x2 },
7249		{ "CD", 0x4 },
7250	},
7251};
7252
7253#define alc883_capture_source	alc882_capture_source
7254
7255static struct hda_input_mux alc889_capture_source = {
7256	.num_items = 3,
7257	.items = {
7258		{ "Front Mic", 0x0 },
7259		{ "Mic", 0x3 },
7260		{ "Line", 0x2 },
7261	},
7262};
7263
7264static struct hda_input_mux mb5_capture_source = {
7265	.num_items = 3,
7266	.items = {
7267		{ "Mic", 0x1 },
7268		{ "Line", 0x7 },
7269		{ "CD", 0x4 },
7270	},
7271};
7272
7273static struct hda_input_mux macmini3_capture_source = {
7274	.num_items = 2,
7275	.items = {
7276		{ "Line", 0x2 },
7277		{ "CD", 0x4 },
7278	},
7279};
7280
7281static struct hda_input_mux alc883_3stack_6ch_intel = {
7282	.num_items = 4,
7283	.items = {
7284		{ "Mic", 0x1 },
7285		{ "Front Mic", 0x0 },
7286		{ "Line", 0x2 },
7287		{ "CD", 0x4 },
7288	},
7289};
7290
7291static struct hda_input_mux alc883_lenovo_101e_capture_source = {
7292	.num_items = 2,
7293	.items = {
7294		{ "Mic", 0x1 },
7295		{ "Line", 0x2 },
7296	},
7297};
7298
7299static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
7300	.num_items = 4,
7301	.items = {
7302		{ "Mic", 0x0 },
7303		{ "Int Mic", 0x1 },
7304		{ "Line", 0x2 },
7305		{ "CD", 0x4 },
7306	},
7307};
7308
7309static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
7310	.num_items = 2,
7311	.items = {
7312		{ "Mic", 0x0 },
7313		{ "Int Mic", 0x1 },
7314	},
7315};
7316
7317static struct hda_input_mux alc883_lenovo_sky_capture_source = {
7318	.num_items = 3,
7319	.items = {
7320		{ "Mic", 0x0 },
7321		{ "Front Mic", 0x1 },
7322		{ "Line", 0x4 },
7323	},
7324};
7325
7326static struct hda_input_mux alc883_asus_eee1601_capture_source = {
7327	.num_items = 2,
7328	.items = {
7329		{ "Mic", 0x0 },
7330		{ "Line", 0x2 },
7331	},
7332};
7333
7334static struct hda_input_mux alc889A_mb31_capture_source = {
7335	.num_items = 2,
7336	.items = {
7337		{ "Mic", 0x0 },
7338		/* Front Mic (0x01) unused */
7339		{ "Line", 0x2 },
7340		/* Line 2 (0x03) unused */
7341		/* CD (0x04) unused? */
7342	},
7343};
7344
7345static struct hda_input_mux alc889A_imac91_capture_source = {
7346	.num_items = 2,
7347	.items = {
7348		{ "Mic", 0x01 },
7349		{ "Line", 0x2 }, /* Not sure! */
7350	},
7351};
7352
7353/*
7354 * 2ch mode
7355 */
7356static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
7357	{ 2, NULL }
7358};
7359
7360/*
7361 * 2ch mode
7362 */
7363static struct hda_verb alc882_3ST_ch2_init[] = {
7364	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7365	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7366	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7367	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7368	{ } /* end */
7369};
7370
7371/*
7372 * 4ch mode
7373 */
7374static struct hda_verb alc882_3ST_ch4_init[] = {
7375	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7376	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7377	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7378	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7379	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7380	{ } /* end */
7381};
7382
7383/*
7384 * 6ch mode
7385 */
7386static struct hda_verb alc882_3ST_ch6_init[] = {
7387	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7388	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7389	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7390	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7391	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7392	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7393	{ } /* end */
7394};
7395
7396static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
7397	{ 2, alc882_3ST_ch2_init },
7398	{ 4, alc882_3ST_ch4_init },
7399	{ 6, alc882_3ST_ch6_init },
7400};
7401
7402#define alc883_3ST_6ch_modes	alc882_3ST_6ch_modes
7403
7404/*
7405 * 2ch mode
7406 */
7407static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
7408	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
7409	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7410	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7411	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7412	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7413	{ } /* end */
7414};
7415
7416/*
7417 * 4ch mode
7418 */
7419static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
7420	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7421	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7422	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7423	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7424	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7425	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7426	{ } /* end */
7427};
7428
7429/*
7430 * 6ch mode
7431 */
7432static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
7433	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7434	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7435	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7436	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7437	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7438	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7439	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7440	{ } /* end */
7441};
7442
7443static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
7444	{ 2, alc883_3ST_ch2_clevo_init },
7445	{ 4, alc883_3ST_ch4_clevo_init },
7446	{ 6, alc883_3ST_ch6_clevo_init },
7447};
7448
7449
7450/*
7451 * 6ch mode
7452 */
7453static struct hda_verb alc882_sixstack_ch6_init[] = {
7454	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7455	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7456	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7457	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7458	{ } /* end */
7459};
7460
7461/*
7462 * 8ch mode
7463 */
7464static struct hda_verb alc882_sixstack_ch8_init[] = {
7465	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7466	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7467	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7468	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7469	{ } /* end */
7470};
7471
7472static struct hda_channel_mode alc882_sixstack_modes[2] = {
7473	{ 6, alc882_sixstack_ch6_init },
7474	{ 8, alc882_sixstack_ch8_init },
7475};
7476
7477
7478/* Macbook Air 2,1 */
7479
7480static struct hda_channel_mode alc885_mba21_ch_modes[1] = {
7481      { 2, NULL },
7482};
7483
7484/*
7485 * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
7486 */
7487
7488/*
7489 * 2ch mode
7490 */
7491static struct hda_verb alc885_mbp_ch2_init[] = {
7492	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7493	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7494	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7495	{ } /* end */
7496};
7497
7498/*
7499 * 4ch mode
7500 */
7501static struct hda_verb alc885_mbp_ch4_init[] = {
7502	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7503	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7504	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7505	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7506	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7507	{ } /* end */
7508};
7509
7510static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
7511	{ 2, alc885_mbp_ch2_init },
7512	{ 4, alc885_mbp_ch4_init },
7513};
7514
7515/*
7516 * 2ch
7517 * Speakers/Woofer/HP = Front
7518 * LineIn = Input
7519 */
7520static struct hda_verb alc885_mb5_ch2_init[] = {
7521	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7522	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7523	{ } /* end */
7524};
7525
7526/*
7527 * 6ch mode
7528 * Speakers/HP = Front
7529 * Woofer = LFE
7530 * LineIn = Surround
7531 */
7532static struct hda_verb alc885_mb5_ch6_init[] = {
7533	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7534	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7535	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7536	{ } /* end */
7537};
7538
7539static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
7540	{ 2, alc885_mb5_ch2_init },
7541	{ 6, alc885_mb5_ch6_init },
7542};
7543
7544#define alc885_macmini3_6ch_modes	alc885_mb5_6ch_modes
7545
7546/*
7547 * 2ch mode
7548 */
7549static struct hda_verb alc883_4ST_ch2_init[] = {
7550	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7551	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7552	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7553	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7554	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7555	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7556	{ } /* end */
7557};
7558
7559/*
7560 * 4ch mode
7561 */
7562static struct hda_verb alc883_4ST_ch4_init[] = {
7563	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7564	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7565	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7566	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7567	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7568	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7569	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7570	{ } /* end */
7571};
7572
7573/*
7574 * 6ch mode
7575 */
7576static struct hda_verb alc883_4ST_ch6_init[] = {
7577	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7578	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7579	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7580	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7581	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7582	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7583	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7584	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7585	{ } /* end */
7586};
7587
7588/*
7589 * 8ch mode
7590 */
7591static struct hda_verb alc883_4ST_ch8_init[] = {
7592	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7593	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7594	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7595	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7596	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7597	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7598	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7599	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7600	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7601	{ } /* end */
7602};
7603
7604static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
7605	{ 2, alc883_4ST_ch2_init },
7606	{ 4, alc883_4ST_ch4_init },
7607	{ 6, alc883_4ST_ch6_init },
7608	{ 8, alc883_4ST_ch8_init },
7609};
7610
7611
7612/*
7613 * 2ch mode
7614 */
7615static struct hda_verb alc883_3ST_ch2_intel_init[] = {
7616	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7617	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7618	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7619	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7620	{ } /* end */
7621};
7622
7623/*
7624 * 4ch mode
7625 */
7626static struct hda_verb alc883_3ST_ch4_intel_init[] = {
7627	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7628	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7629	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7630	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7631	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7632	{ } /* end */
7633};
7634
7635/*
7636 * 6ch mode
7637 */
7638static struct hda_verb alc883_3ST_ch6_intel_init[] = {
7639	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7640	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7641	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
7642	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7643	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7644	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7645	{ } /* end */
7646};
7647
7648static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7649	{ 2, alc883_3ST_ch2_intel_init },
7650	{ 4, alc883_3ST_ch4_intel_init },
7651	{ 6, alc883_3ST_ch6_intel_init },
7652};
7653
7654/*
7655 * 2ch mode
7656 */
7657static struct hda_verb alc889_ch2_intel_init[] = {
7658	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7659	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
7660	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
7661	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
7662	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7663	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7664	{ } /* end */
7665};
7666
7667/*
7668 * 6ch mode
7669 */
7670static struct hda_verb alc889_ch6_intel_init[] = {
7671	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7672	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7673	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7674	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7675	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7676	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7677	{ } /* end */
7678};
7679
7680/*
7681 * 8ch mode
7682 */
7683static struct hda_verb alc889_ch8_intel_init[] = {
7684	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7685	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7686	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7687	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7688	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
7689	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7690	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7691	{ } /* end */
7692};
7693
7694static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7695	{ 2, alc889_ch2_intel_init },
7696	{ 6, alc889_ch6_intel_init },
7697	{ 8, alc889_ch8_intel_init },
7698};
7699
7700/*
7701 * 6ch mode
7702 */
7703static struct hda_verb alc883_sixstack_ch6_init[] = {
7704	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7705	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7706	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7707	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7708	{ } /* end */
7709};
7710
7711/*
7712 * 8ch mode
7713 */
7714static struct hda_verb alc883_sixstack_ch8_init[] = {
7715	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7716	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7717	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7718	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7719	{ } /* end */
7720};
7721
7722static struct hda_channel_mode alc883_sixstack_modes[2] = {
7723	{ 6, alc883_sixstack_ch6_init },
7724	{ 8, alc883_sixstack_ch8_init },
7725};
7726
7727
7728/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7729 *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7730 */
7731static struct snd_kcontrol_new alc882_base_mixer[] = {
7732	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7733	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7734	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7735	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7736	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7737	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7738	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7739	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7740	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7741	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7742	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7743	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7744	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7745	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7746	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7747	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7748	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7749	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7750	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7751	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7752	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7753	{ } /* end */
7754};
7755
7756/* Macbook Air 2,1 same control for HP and internal Speaker */
7757
7758static struct snd_kcontrol_new alc885_mba21_mixer[] = {
7759      HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7760      HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
7761     { }
7762};
7763
7764
7765static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7766	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7767	HDA_BIND_MUTE   ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7768	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7769	HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7770	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7771	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7772	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7773	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7774	HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7775	HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
7776	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7777	{ } /* end */
7778};
7779
7780static struct snd_kcontrol_new alc885_mb5_mixer[] = {
7781	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7782	HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7783	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7784	HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7785	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7786	HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7787	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7788	HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7789	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7790	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
7791	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7792	HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7793	HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7794	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7795	{ } /* end */
7796};
7797
7798static struct snd_kcontrol_new alc885_macmini3_mixer[] = {
7799	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7800	HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7801	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7802	HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7803	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7804	HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7805	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7806	HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7807	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7808	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
7809	HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7810	{ } /* end */
7811};
7812
7813static struct snd_kcontrol_new alc885_imac91_mixer[] = {
7814	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7815	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7816	{ } /* end */
7817};
7818
7819
7820static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7821	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7822	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7823	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7824	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7825	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7826	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7827	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7828	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7829	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7830	{ } /* end */
7831};
7832
7833static struct snd_kcontrol_new alc882_targa_mixer[] = {
7834	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7835	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7836	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7837	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7838	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7839	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7840	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7841	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7842	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7843	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7844	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7845	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7846	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7847	{ } /* end */
7848};
7849
7850/* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7851 *                 Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7852 */
7853static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7854	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7855	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7856	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7857	HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7858	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7859	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7860	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7861	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7862	HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7863	HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7864	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7865	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7866	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7867	{ } /* end */
7868};
7869
7870static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7871	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7872	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7873	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7874	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7875	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7876	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7877	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7878	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7879	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7880	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7881	{ } /* end */
7882};
7883
7884static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7885	{
7886		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7887		.name = "Channel Mode",
7888		.info = alc_ch_mode_info,
7889		.get = alc_ch_mode_get,
7890		.put = alc_ch_mode_put,
7891	},
7892	{ } /* end */
7893};
7894
7895static struct hda_verb alc882_base_init_verbs[] = {
7896	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7897	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7898	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7899	/* Rear mixer */
7900	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7901	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7902	/* CLFE mixer */
7903	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7904	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7905	/* Side mixer */
7906	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7907	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7908
7909	/* Front Pin: output 0 (0x0c) */
7910	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7911	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7912	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7913	/* Rear Pin: output 1 (0x0d) */
7914	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7915	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7916	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7917	/* CLFE Pin: output 2 (0x0e) */
7918	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7919	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7920	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7921	/* Side Pin: output 3 (0x0f) */
7922	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7923	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7924	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7925	/* Mic (rear) pin: input vref at 80% */
7926	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7927	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7928	/* Front Mic pin: input vref at 80% */
7929	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7930	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7931	/* Line In pin: input */
7932	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7933	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7934	/* Line-2 In: Headphone output (output 0 - 0x0c) */
7935	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7936	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7937	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
7938	/* CD pin widget for input */
7939	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7940
7941	/* FIXME: use matrix-type input source selection */
7942	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7943	/* Input mixer2 */
7944	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7945	/* Input mixer3 */
7946	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7947	/* ADC2: mute amp left and right */
7948	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7949	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7950	/* ADC3: mute amp left and right */
7951	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7952	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7953
7954	{ }
7955};
7956
7957static struct hda_verb alc882_adc1_init_verbs[] = {
7958	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7959	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7960	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7961	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7962	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7963	/* ADC1: mute amp left and right */
7964	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7965	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7966	{ }
7967};
7968
7969static struct hda_verb alc882_eapd_verbs[] = {
7970	/* change to EAPD mode */
7971	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7972	{0x20, AC_VERB_SET_PROC_COEF, 0x3060},
7973	{ }
7974};
7975
7976static struct hda_verb alc889_eapd_verbs[] = {
7977	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7978	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7979	{ }
7980};
7981
7982static struct hda_verb alc_hp15_unsol_verbs[] = {
7983	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7984	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7985	{}
7986};
7987
7988static struct hda_verb alc885_init_verbs[] = {
7989	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7990	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7991	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7992	/* Rear mixer */
7993	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7994	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7995	/* CLFE mixer */
7996	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7997	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7998	/* Side mixer */
7999	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8000	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8001
8002	/* Front HP Pin: output 0 (0x0c) */
8003	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8004	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8005	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8006	/* Front Pin: output 0 (0x0c) */
8007	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8008	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8009	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8010	/* Rear Pin: output 1 (0x0d) */
8011	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8012	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8013	{0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
8014	/* CLFE Pin: output 2 (0x0e) */
8015	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8016	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8017	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
8018	/* Side Pin: output 3 (0x0f) */
8019	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8020	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8021	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8022	/* Mic (rear) pin: input vref at 80% */
8023	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8024	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8025	/* Front Mic pin: input vref at 80% */
8026	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8027	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8028	/* Line In pin: input */
8029	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
8030	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8031
8032	/* Mixer elements: 0x18, , 0x1a, 0x1b */
8033	/* Input mixer1 */
8034	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8035	/* Input mixer2 */
8036	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8037	/* Input mixer3 */
8038	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8039	/* ADC2: mute amp left and right */
8040	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8041	/* ADC3: mute amp left and right */
8042	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8043
8044	{ }
8045};
8046
8047static struct hda_verb alc885_init_input_verbs[] = {
8048	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8049	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
8050	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
8051	{ }
8052};
8053
8054
8055/* Unmute Selector 24h and set the default input to front mic */
8056static struct hda_verb alc889_init_input_verbs[] = {
8057	{0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
8058	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8059	{ }
8060};
8061
8062
8063#define alc883_init_verbs	alc882_base_init_verbs
8064
8065/* Mac Pro test */
8066static struct snd_kcontrol_new alc882_macpro_mixer[] = {
8067	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8068	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8069	HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
8070	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
8071	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
8072	/* FIXME: this looks suspicious...
8073	HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
8074	HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
8075	*/
8076	{ } /* end */
8077};
8078
8079static struct hda_verb alc882_macpro_init_verbs[] = {
8080	/* Front mixer: unmute input/output amp left and right (volume = 0) */
8081	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8082	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8083	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8084	/* Front Pin: output 0 (0x0c) */
8085	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8086	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8087	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8088	/* Front Mic pin: input vref at 80% */
8089	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8090	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8091	/* Speaker:  output */
8092	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8093	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8094	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
8095	/* Headphone output (output 0 - 0x0c) */
8096	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8097	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8098	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8099
8100	/* FIXME: use matrix-type input source selection */
8101	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8102	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
8103	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8104	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8105	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8106	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8107	/* Input mixer2 */
8108	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8109	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8110	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8111	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8112	/* Input mixer3 */
8113	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8114	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8115	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8116	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8117	/* ADC1: mute amp left and right */
8118	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8119	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8120	/* ADC2: mute amp left and right */
8121	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8122	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8123	/* ADC3: mute amp left and right */
8124	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8125	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8126
8127	{ }
8128};
8129
8130/* Macbook 5,1 */
8131static struct hda_verb alc885_mb5_init_verbs[] = {
8132	/* DACs */
8133	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8134	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8135	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8136	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8137	/* Front mixer */
8138	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8139	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8140	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8141	/* Surround mixer */
8142	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8143	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8144	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8145	/* LFE mixer */
8146	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8147	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8148	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8149	/* HP mixer */
8150	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8151	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8152	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8153	/* Front Pin (0x0c) */
8154	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
8155	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8156	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8157	/* LFE Pin (0x0e) */
8158	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
8159	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8160	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
8161	/* HP Pin (0x0f) */
8162	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8163	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8164	{0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
8165	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8166	/* Front Mic pin: input vref at 80% */
8167	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8168	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8169	/* Line In pin */
8170	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
8171	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8172
8173	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0x1)},
8174	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x7)},
8175	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x4)},
8176	{ }
8177};
8178
8179/* Macmini 3,1 */
8180static struct hda_verb alc885_macmini3_init_verbs[] = {
8181	/* DACs */
8182	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8183	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8184	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8185	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8186	/* Front mixer */
8187	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8188	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8189	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8190	/* Surround mixer */
8191	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8192	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8193	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8194	/* LFE mixer */
8195	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8196	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8197	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8198	/* HP mixer */
8199	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8200	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8201	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8202	/* Front Pin (0x0c) */
8203	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
8204	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8205	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8206	/* LFE Pin (0x0e) */
8207	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
8208	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8209	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
8210	/* HP Pin (0x0f) */
8211	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8212	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8213	{0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
8214	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8215	/* Line In pin */
8216	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
8217	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8218
8219	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8220	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8221	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8222	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8223	{ }
8224};
8225
8226
8227static struct hda_verb alc885_mba21_init_verbs[] = {
8228	/*Internal and HP Speaker Mixer*/
8229	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8230	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8231	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8232	/*Internal Speaker Pin (0x0c)*/
8233	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8234	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8235	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8236	/* HP Pin: output 0 (0x0e) */
8237	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
8238	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8239	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8240	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
8241	/* Line in (is hp when jack connected)*/
8242	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
8243	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8244
8245	{ }
8246 };
8247
8248
8249/* Macbook Pro rev3 */
8250static struct hda_verb alc885_mbp3_init_verbs[] = {
8251	/* Front mixer: unmute input/output amp left and right (volume = 0) */
8252	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8253	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8254	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8255	/* Rear mixer */
8256	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8257	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8258	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8259	/* HP mixer */
8260	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8261	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8262	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8263	/* Front Pin: output 0 (0x0c) */
8264	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8265	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8266	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8267	/* HP Pin: output 0 (0x0e) */
8268	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
8269	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8270	{0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
8271	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8272	/* Mic (rear) pin: input vref at 80% */
8273	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8274	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8275	/* Front Mic pin: input vref at 80% */
8276	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8277	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8278	/* Line In pin: use output 1 when in LineOut mode */
8279	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
8280	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8281	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8282
8283	/* FIXME: use matrix-type input source selection */
8284	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8285	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
8286	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8287	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8288	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8289	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8290	/* Input mixer2 */
8291	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8292	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8293	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8294	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8295	/* Input mixer3 */
8296	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8297	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8298	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8299	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8300	/* ADC1: mute amp left and right */
8301	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8302	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8303	/* ADC2: mute amp left and right */
8304	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8305	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8306	/* ADC3: mute amp left and right */
8307	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8308	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8309
8310	{ }
8311};
8312
8313/* iMac 9,1 */
8314static struct hda_verb alc885_imac91_init_verbs[] = {
8315	/* Internal Speaker Pin (0x0c) */
8316	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8317	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8318	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8319	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8320	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8321	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8322	/* HP Pin: Rear */
8323	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8324	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8325	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8326	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
8327	/* Line in Rear */
8328	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
8329	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8330	/* Front Mic pin: input vref at 80% */
8331	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8332	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8333	/* Rear mixer */
8334	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8335	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8336	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8337	/* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
8338	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8339	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8340	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8341	/* 0x24 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8342	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8343	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8344	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8345	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8346	/* 0x23 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8347	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8348	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8349	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8350	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8351	/* 0x22 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8352	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8353	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8354	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8355	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8356	/* 0x07 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8357	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8358	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8359	/* 0x08 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8360	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8361	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8362	/* 0x09 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8363	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8364	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8365	{ }
8366};
8367
8368/* iMac 24 mixer. */
8369static struct snd_kcontrol_new alc885_imac24_mixer[] = {
8370	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8371	HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
8372	{ } /* end */
8373};
8374
8375/* iMac 24 init verbs. */
8376static struct hda_verb alc885_imac24_init_verbs[] = {
8377	/* Internal speakers: output 0 (0x0c) */
8378	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8379	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8380	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8381	/* Internal speakers: output 0 (0x0c) */
8382	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8383	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8384	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8385	/* Headphone: output 0 (0x0c) */
8386	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8387	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8388	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8389	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8390	/* Front Mic: input vref at 80% */
8391	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8392	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8393	{ }
8394};
8395
8396/* Toggle speaker-output according to the hp-jack state */
8397static void alc885_imac24_setup(struct hda_codec *codec)
8398{
8399	struct alc_spec *spec = codec->spec;
8400
8401	spec->autocfg.hp_pins[0] = 0x14;
8402	spec->autocfg.speaker_pins[0] = 0x18;
8403	spec->autocfg.speaker_pins[1] = 0x1a;
8404}
8405
8406#define alc885_mb5_setup	alc885_imac24_setup
8407#define alc885_macmini3_setup	alc885_imac24_setup
8408
8409/* Macbook Air 2,1 */
8410static void alc885_mba21_setup(struct hda_codec *codec)
8411{
8412       struct alc_spec *spec = codec->spec;
8413
8414       spec->autocfg.hp_pins[0] = 0x14;
8415       spec->autocfg.speaker_pins[0] = 0x18;
8416}
8417
8418
8419
8420static void alc885_mbp3_setup(struct hda_codec *codec)
8421{
8422	struct alc_spec *spec = codec->spec;
8423
8424	spec->autocfg.hp_pins[0] = 0x15;
8425	spec->autocfg.speaker_pins[0] = 0x14;
8426}
8427
8428static void alc885_imac91_setup(struct hda_codec *codec)
8429{
8430	struct alc_spec *spec = codec->spec;
8431
8432	spec->autocfg.hp_pins[0] = 0x14;
8433	spec->autocfg.speaker_pins[0] = 0x18;
8434	spec->autocfg.speaker_pins[1] = 0x1a;
8435}
8436
8437static struct hda_verb alc882_targa_verbs[] = {
8438	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8439	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8440
8441	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8442	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8443
8444	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8445	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8446	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8447
8448	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8449	{ } /* end */
8450};
8451
8452/* toggle speaker-output according to the hp-jack state */
8453static void alc882_targa_automute(struct hda_codec *codec)
8454{
8455	struct alc_spec *spec = codec->spec;
8456	alc_automute_amp(codec);
8457	snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
8458				  spec->jack_present ? 1 : 3);
8459}
8460
8461static void alc882_targa_setup(struct hda_codec *codec)
8462{
8463	struct alc_spec *spec = codec->spec;
8464
8465	spec->autocfg.hp_pins[0] = 0x14;
8466	spec->autocfg.speaker_pins[0] = 0x1b;
8467}
8468
8469static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
8470{
8471	if ((res >> 26) == ALC880_HP_EVENT)
8472		alc882_targa_automute(codec);
8473}
8474
8475static struct hda_verb alc882_asus_a7j_verbs[] = {
8476	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8477	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8478
8479	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8480	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8481	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8482
8483	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8484	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8485	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8486
8487	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8488	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8489	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8490	{ } /* end */
8491};
8492
8493static struct hda_verb alc882_asus_a7m_verbs[] = {
8494	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8495	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8496
8497	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8498	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8499	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8500
8501	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8502	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8503	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8504
8505	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8506	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8507	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8508 	{ } /* end */
8509};
8510
8511static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
8512{
8513	unsigned int gpiostate, gpiomask, gpiodir;
8514
8515	gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
8516				       AC_VERB_GET_GPIO_DATA, 0);
8517
8518	if (!muted)
8519		gpiostate |= (1 << pin);
8520	else
8521		gpiostate &= ~(1 << pin);
8522
8523	gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
8524				      AC_VERB_GET_GPIO_MASK, 0);
8525	gpiomask |= (1 << pin);
8526
8527	gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
8528				     AC_VERB_GET_GPIO_DIRECTION, 0);
8529	gpiodir |= (1 << pin);
8530
8531
8532	snd_hda_codec_write(codec, codec->afg, 0,
8533			    AC_VERB_SET_GPIO_MASK, gpiomask);
8534	snd_hda_codec_write(codec, codec->afg, 0,
8535			    AC_VERB_SET_GPIO_DIRECTION, gpiodir);
8536
8537	msleep(1);
8538
8539	snd_hda_codec_write(codec, codec->afg, 0,
8540			    AC_VERB_SET_GPIO_DATA, gpiostate);
8541}
8542
8543/* set up GPIO at initialization */
8544static void alc885_macpro_init_hook(struct hda_codec *codec)
8545{
8546	alc882_gpio_mute(codec, 0, 0);
8547	alc882_gpio_mute(codec, 1, 0);
8548}
8549
8550/* set up GPIO and update auto-muting at initialization */
8551static void alc885_imac24_init_hook(struct hda_codec *codec)
8552{
8553	alc885_macpro_init_hook(codec);
8554	alc_automute_amp(codec);
8555}
8556
8557/*
8558 * generic initialization of ADC, input mixers and output mixers
8559 */
8560static struct hda_verb alc883_auto_init_verbs[] = {
8561	/*
8562	 * Unmute ADC0-2 and set the default input to mic-in
8563	 */
8564	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8565	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8566	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8567	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8568
8569	/*
8570	 * Set up output mixers (0x0c - 0x0f)
8571	 */
8572	/* set vol=0 to output mixers */
8573	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8574	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8575	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8576	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8577	/* set up input amps for analog loopback */
8578	/* Amp Indices: DAC = 0, mixer = 1 */
8579	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8580	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8581	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8582	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8583	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8584	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8585	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8586	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8587	{0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8588	{0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8589
8590	/* FIXME: use matrix-type input source selection */
8591	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8592	/* Input mixer2 */
8593	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8594	/* Input mixer3 */
8595	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8596	{ }
8597};
8598
8599/* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
8600static struct hda_verb alc889A_mb31_ch2_init[] = {
8601	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8602	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8603	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8604	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8605	{ } /* end */
8606};
8607
8608/* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
8609static struct hda_verb alc889A_mb31_ch4_init[] = {
8610	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8611	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8612	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8613	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8614	{ } /* end */
8615};
8616
8617/* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
8618static struct hda_verb alc889A_mb31_ch5_init[] = {
8619	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as rear */
8620	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8621	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8622	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8623	{ } /* end */
8624};
8625
8626/* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
8627static struct hda_verb alc889A_mb31_ch6_init[] = {
8628	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as front */
8629	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Subwoofer off */
8630	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8631	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8632	{ } /* end */
8633};
8634
8635static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
8636	{ 2, alc889A_mb31_ch2_init },
8637	{ 4, alc889A_mb31_ch4_init },
8638	{ 5, alc889A_mb31_ch5_init },
8639	{ 6, alc889A_mb31_ch6_init },
8640};
8641
8642static struct hda_verb alc883_medion_eapd_verbs[] = {
8643        /* eanable EAPD on medion laptop */
8644	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8645	{0x20, AC_VERB_SET_PROC_COEF, 0x3070},
8646	{ }
8647};
8648
8649#define alc883_base_mixer	alc882_base_mixer
8650
8651static struct snd_kcontrol_new alc883_mitac_mixer[] = {
8652	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8653	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8654	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8655	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8656	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8657	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8658	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8659	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8660	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8661	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8662	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8663	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8664	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8665	{ } /* end */
8666};
8667
8668static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
8669	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8670	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8671	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8672	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8673	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8674	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8675	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8676	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8677	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8678	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8679	{ } /* end */
8680};
8681
8682static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8683	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8684	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8685	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8686	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8687	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8688	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8689	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8690	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8691	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8692	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8693	{ } /* end */
8694};
8695
8696static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8697	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8698	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8699	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8700	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8701	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8702	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8703	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8704	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8705	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8706	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8707	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8708	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8709	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8710	{ } /* end */
8711};
8712
8713static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8714	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8715	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8716	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8717	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8718	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8719	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8720	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8721	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8722	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8723	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8724	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8725	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8726	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8727	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8728	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8729	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8730	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8731	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8732	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8733	{ } /* end */
8734};
8735
8736static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8737	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8738	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8739	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8740	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8741	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8742			      HDA_OUTPUT),
8743	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8744	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8745	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8746	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8747	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8748	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8749	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8750	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8751	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8752	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8753	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8754	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8755	HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8756	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8757	{ } /* end */
8758};
8759
8760static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8761	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8762	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8763	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8764	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8765	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8766			      HDA_OUTPUT),
8767	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8768	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8769	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8770	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8771	HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
8772	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8773	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8774	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8775	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
8776	HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
8777	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
8778	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8779	HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8780	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8781	{ } /* end */
8782};
8783
8784static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
8785	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8786	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8787	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8788	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8789	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8790	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8791	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8792	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8793	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8794	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8795	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8796	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8797	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8798	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8799	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8800	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8801	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8802	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8803	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8804	{ } /* end */
8805};
8806
8807static struct snd_kcontrol_new alc883_targa_mixer[] = {
8808	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8809	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8810	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8811	HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8812	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8813	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8814	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8815	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8816	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8817	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8818	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8819	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8820	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8821	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8822	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8823	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8824	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8825	{ } /* end */
8826};
8827
8828static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
8829	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8830	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8831	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8832	HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8833	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8834	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8835	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8836	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8837	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8838	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8839	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8840	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8841	{ } /* end */
8842};
8843
8844static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
8845	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8846	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8847	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8848	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8849	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8850	{ } /* end */
8851};
8852
8853static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
8854	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8855	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8856	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8857	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8858	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8859	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8860	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8861	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8862	{ } /* end */
8863};
8864
8865static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
8866	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8867	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
8868	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8869	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8870	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8871	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8872	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8873	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8874	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8875	{ } /* end */
8876};
8877
8878static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8879	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8880	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8881	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8882	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8883	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8884	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8885	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8886	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8887	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8888	{ } /* end */
8889};
8890
8891static struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = {
8892	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8893	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8894	HDA_CODEC_MUTE("Speaker Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8895	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT),
8896	HDA_CODEC_VOLUME("Line Playback Volume", 0x08, 0x0, HDA_INPUT),
8897	HDA_CODEC_MUTE("Line Playback Switch", 0x08, 0x0, HDA_INPUT),
8898	{ } /* end */
8899};
8900
8901static struct hda_verb alc883_medion_wim2160_verbs[] = {
8902	/* Unmute front mixer */
8903	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8904	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8905
8906	/* Set speaker pin to front mixer */
8907	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8908
8909	/* Init headphone pin */
8910	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8911	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8912	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8913	{0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8914
8915	{ } /* end */
8916};
8917
8918/* toggle speaker-output according to the hp-jack state */
8919static void alc883_medion_wim2160_setup(struct hda_codec *codec)
8920{
8921	struct alc_spec *spec = codec->spec;
8922
8923	spec->autocfg.hp_pins[0] = 0x1a;
8924	spec->autocfg.speaker_pins[0] = 0x15;
8925}
8926
8927static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
8928	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8929	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8930	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8931	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8932	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8933	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8934	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8935	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8936	{ } /* end */
8937};
8938
8939static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8940	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8941	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8942	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8943	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8944	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8945	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8946	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8947	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8948	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8949	{ } /* end */
8950};
8951
8952static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8953	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8954	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8955	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8956	HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8957	HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8958						0x0d, 1, 0x0, HDA_OUTPUT),
8959	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8960	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8961	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8962	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8963	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8964	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8965	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8966	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8967	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8968	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8969	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8970	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8971	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8972	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8973	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8974	{ } /* end */
8975};
8976
8977static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8978	/* Output mixers */
8979	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8980	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8981	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8982	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8983	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8984		HDA_OUTPUT),
8985	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8986	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8987	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8988	/* Output switches */
8989	HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8990	HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8991	HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8992	/* Boost mixers */
8993	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8994	HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8995	/* Input mixers */
8996	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8997	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8998	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8999	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
9000	{ } /* end */
9001};
9002
9003static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
9004	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9005	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9006	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
9007	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
9008	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
9009	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
9010	{ } /* end */
9011};
9012
9013static struct hda_bind_ctls alc883_bind_cap_vol = {
9014	.ops = &snd_hda_bind_vol,
9015	.values = {
9016		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
9017		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
9018		0
9019	},
9020};
9021
9022static struct hda_bind_ctls alc883_bind_cap_switch = {
9023	.ops = &snd_hda_bind_sw,
9024	.values = {
9025		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
9026		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
9027		0
9028	},
9029};
9030
9031static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
9032	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
9033	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
9034	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
9035	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
9036	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
9037	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
9038	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
9039	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
9040	{ } /* end */
9041};
9042
9043static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
9044	HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
9045	HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
9046	{
9047		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
9048		/* .name = "Capture Source", */
9049		.name = "Input Source",
9050		.count = 1,
9051		.info = alc_mux_enum_info,
9052		.get = alc_mux_enum_get,
9053		.put = alc_mux_enum_put,
9054	},
9055	{ } /* end */
9056};
9057
9058static struct snd_kcontrol_new alc883_chmode_mixer[] = {
9059	{
9060		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
9061		.name = "Channel Mode",
9062		.info = alc_ch_mode_info,
9063		.get = alc_ch_mode_get,
9064		.put = alc_ch_mode_put,
9065	},
9066	{ } /* end */
9067};
9068
9069/* toggle speaker-output according to the hp-jack state */
9070static void alc883_mitac_setup(struct hda_codec *codec)
9071{
9072	struct alc_spec *spec = codec->spec;
9073
9074	spec->autocfg.hp_pins[0] = 0x15;
9075	spec->autocfg.speaker_pins[0] = 0x14;
9076	spec->autocfg.speaker_pins[1] = 0x17;
9077}
9078
9079/* auto-toggle front mic */
9080/*
9081static void alc883_mitac_mic_automute(struct hda_codec *codec)
9082{
9083	unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0;
9084
9085	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
9086}
9087*/
9088
9089static struct hda_verb alc883_mitac_verbs[] = {
9090	/* HP */
9091	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9092	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9093	/* Subwoofer */
9094	{0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
9095	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9096
9097	/* enable unsolicited event */
9098	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9099	/* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
9100
9101	{ } /* end */
9102};
9103
9104static struct hda_verb alc883_clevo_m540r_verbs[] = {
9105	/* HP */
9106	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9107	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9108	/* Int speaker */
9109	/*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
9110
9111	/* enable unsolicited event */
9112	/*
9113	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9114	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9115	*/
9116
9117	{ } /* end */
9118};
9119
9120static struct hda_verb alc883_clevo_m720_verbs[] = {
9121	/* HP */
9122	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9123	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9124	/* Int speaker */
9125	{0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
9126	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9127
9128	/* enable unsolicited event */
9129	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9130	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9131
9132	{ } /* end */
9133};
9134
9135static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
9136	/* HP */
9137	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
9138	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9139	/* Subwoofer */
9140	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
9141	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9142
9143	/* enable unsolicited event */
9144	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9145
9146	{ } /* end */
9147};
9148
9149static struct hda_verb alc883_targa_verbs[] = {
9150	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9151	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9152
9153	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9154	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9155
9156/* Connect Line-Out side jack (SPDIF) to Side */
9157	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9158	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9159	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
9160/* Connect Mic jack to CLFE */
9161	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9162	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9163	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
9164/* Connect Line-in jack to Surround */
9165	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9166	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9167	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
9168/* Connect HP out jack to Front */
9169	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9170	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9171	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
9172
9173	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9174
9175	{ } /* end */
9176};
9177
9178static struct hda_verb alc883_lenovo_101e_verbs[] = {
9179	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9180	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
9181        {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
9182	{ } /* end */
9183};
9184
9185static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
9186        {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9187	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9188        {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9189        {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9190	{ } /* end */
9191};
9192
9193static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
9194	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9195	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9196	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9197	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
9198	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT    | AC_USRSP_EN},
9199	{ } /* end */
9200};
9201
9202static struct hda_verb alc883_haier_w66_verbs[] = {
9203	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9204	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9205
9206	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9207
9208	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
9209	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9210	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9211	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9212	{ } /* end */
9213};
9214
9215static struct hda_verb alc888_lenovo_sky_verbs[] = {
9216	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9217	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9218	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9219	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9220	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9221	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9222	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
9223	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9224	{ } /* end */
9225};
9226
9227static struct hda_verb alc888_6st_dell_verbs[] = {
9228	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9229	{ }
9230};
9231
9232static struct hda_verb alc883_vaiott_verbs[] = {
9233	/* HP */
9234	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9235	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9236
9237	/* enable unsolicited event */
9238	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9239
9240	{ } /* end */
9241};
9242
9243static void alc888_3st_hp_setup(struct hda_codec *codec)
9244{
9245	struct alc_spec *spec = codec->spec;
9246
9247	spec->autocfg.hp_pins[0] = 0x1b;
9248	spec->autocfg.speaker_pins[0] = 0x14;
9249	spec->autocfg.speaker_pins[1] = 0x16;
9250	spec->autocfg.speaker_pins[2] = 0x18;
9251}
9252
9253static struct hda_verb alc888_3st_hp_verbs[] = {
9254	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Front: output 0 (0x0c) */
9255	{0x16, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Rear : output 1 (0x0d) */
9256	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},	/* CLFE : output 2 (0x0e) */
9257	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9258	{ } /* end */
9259};
9260
9261/*
9262 * 2ch mode
9263 */
9264static struct hda_verb alc888_3st_hp_2ch_init[] = {
9265	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
9266	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
9267	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
9268	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
9269	{ } /* end */
9270};
9271
9272/*
9273 * 4ch mode
9274 */
9275static struct hda_verb alc888_3st_hp_4ch_init[] = {
9276	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
9277	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
9278	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
9279	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
9280	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
9281	{ } /* end */
9282};
9283
9284/*
9285 * 6ch mode
9286 */
9287static struct hda_verb alc888_3st_hp_6ch_init[] = {
9288	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
9289	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
9290	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
9291	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
9292	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
9293	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
9294	{ } /* end */
9295};
9296
9297static struct hda_channel_mode alc888_3st_hp_modes[3] = {
9298	{ 2, alc888_3st_hp_2ch_init },
9299	{ 4, alc888_3st_hp_4ch_init },
9300	{ 6, alc888_3st_hp_6ch_init },
9301};
9302
9303/* toggle front-jack and RCA according to the hp-jack state */
9304static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
9305{
9306 	unsigned int present = snd_hda_jack_detect(codec, 0x1b);
9307
9308	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9309				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9310	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9311				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9312}
9313
9314/* toggle RCA according to the front-jack state */
9315static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
9316{
9317 	unsigned int present = snd_hda_jack_detect(codec, 0x14);
9318
9319	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9320				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9321}
9322
9323static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
9324					     unsigned int res)
9325{
9326	if ((res >> 26) == ALC880_HP_EVENT)
9327		alc888_lenovo_ms7195_front_automute(codec);
9328	if ((res >> 26) == ALC880_FRONT_EVENT)
9329		alc888_lenovo_ms7195_rca_automute(codec);
9330}
9331
9332static struct hda_verb alc883_medion_md2_verbs[] = {
9333	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9334	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9335
9336	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9337
9338	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9339	{ } /* end */
9340};
9341
9342/* toggle speaker-output according to the hp-jack state */
9343static void alc883_medion_md2_setup(struct hda_codec *codec)
9344{
9345	struct alc_spec *spec = codec->spec;
9346
9347	spec->autocfg.hp_pins[0] = 0x14;
9348	spec->autocfg.speaker_pins[0] = 0x15;
9349}
9350
9351/* toggle speaker-output according to the hp-jack state */
9352#define alc883_targa_init_hook		alc882_targa_init_hook
9353#define alc883_targa_unsol_event	alc882_targa_unsol_event
9354
9355static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
9356{
9357	unsigned int present;
9358
9359	present = snd_hda_jack_detect(codec, 0x18);
9360	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
9361				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9362}
9363
9364static void alc883_clevo_m720_setup(struct hda_codec *codec)
9365{
9366	struct alc_spec *spec = codec->spec;
9367
9368	spec->autocfg.hp_pins[0] = 0x15;
9369	spec->autocfg.speaker_pins[0] = 0x14;
9370}
9371
9372static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
9373{
9374	alc_automute_amp(codec);
9375	alc883_clevo_m720_mic_automute(codec);
9376}
9377
9378static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
9379					   unsigned int res)
9380{
9381	switch (res >> 26) {
9382	case ALC880_MIC_EVENT:
9383		alc883_clevo_m720_mic_automute(codec);
9384		break;
9385	default:
9386		alc_automute_amp_unsol_event(codec, res);
9387		break;
9388	}
9389}
9390
9391/* toggle speaker-output according to the hp-jack state */
9392static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
9393{
9394	struct alc_spec *spec = codec->spec;
9395
9396	spec->autocfg.hp_pins[0] = 0x14;
9397	spec->autocfg.speaker_pins[0] = 0x15;
9398}
9399
9400static void alc883_haier_w66_setup(struct hda_codec *codec)
9401{
9402	struct alc_spec *spec = codec->spec;
9403
9404	spec->autocfg.hp_pins[0] = 0x1b;
9405	spec->autocfg.speaker_pins[0] = 0x14;
9406}
9407
9408static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
9409{
9410	int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
9411
9412	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9413				 HDA_AMP_MUTE, bits);
9414}
9415
9416static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
9417{
9418	int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
9419
9420	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9421				 HDA_AMP_MUTE, bits);
9422	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9423				 HDA_AMP_MUTE, bits);
9424}
9425
9426static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
9427					   unsigned int res)
9428{
9429	if ((res >> 26) == ALC880_HP_EVENT)
9430		alc883_lenovo_101e_all_automute(codec);
9431	if ((res >> 26) == ALC880_FRONT_EVENT)
9432		alc883_lenovo_101e_ispeaker_automute(codec);
9433}
9434
9435/* toggle speaker-output according to the hp-jack state */
9436static void alc883_acer_aspire_setup(struct hda_codec *codec)
9437{
9438	struct alc_spec *spec = codec->spec;
9439
9440	spec->autocfg.hp_pins[0] = 0x14;
9441	spec->autocfg.speaker_pins[0] = 0x15;
9442	spec->autocfg.speaker_pins[1] = 0x16;
9443}
9444
9445static struct hda_verb alc883_acer_eapd_verbs[] = {
9446	/* HP Pin: output 0 (0x0c) */
9447	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9448	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9449	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
9450	/* Front Pin: output 0 (0x0c) */
9451	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9452	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9453	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9454	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
9455        /* eanable EAPD on medion laptop */
9456	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
9457	{0x20, AC_VERB_SET_PROC_COEF, 0x3050},
9458	/* enable unsolicited event */
9459	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9460	{ }
9461};
9462
9463static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
9464	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9465	{0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
9466	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9467	{ } /* end */
9468};
9469
9470static void alc888_6st_dell_setup(struct hda_codec *codec)
9471{
9472	struct alc_spec *spec = codec->spec;
9473
9474	spec->autocfg.hp_pins[0] = 0x1b;
9475	spec->autocfg.speaker_pins[0] = 0x14;
9476	spec->autocfg.speaker_pins[1] = 0x15;
9477	spec->autocfg.speaker_pins[2] = 0x16;
9478	spec->autocfg.speaker_pins[3] = 0x17;
9479}
9480
9481static void alc888_lenovo_sky_setup(struct hda_codec *codec)
9482{
9483	struct alc_spec *spec = codec->spec;
9484
9485	spec->autocfg.hp_pins[0] = 0x1b;
9486	spec->autocfg.speaker_pins[0] = 0x14;
9487	spec->autocfg.speaker_pins[1] = 0x15;
9488	spec->autocfg.speaker_pins[2] = 0x16;
9489	spec->autocfg.speaker_pins[3] = 0x17;
9490	spec->autocfg.speaker_pins[4] = 0x1a;
9491}
9492
9493static void alc883_vaiott_setup(struct hda_codec *codec)
9494{
9495	struct alc_spec *spec = codec->spec;
9496
9497	spec->autocfg.hp_pins[0] = 0x15;
9498	spec->autocfg.speaker_pins[0] = 0x14;
9499	spec->autocfg.speaker_pins[1] = 0x17;
9500}
9501
9502static struct hda_verb alc888_asus_m90v_verbs[] = {
9503	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9504	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9505	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9506	/* enable unsolicited event */
9507	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9508	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9509	{ } /* end */
9510};
9511
9512static void alc883_mode2_setup(struct hda_codec *codec)
9513{
9514	struct alc_spec *spec = codec->spec;
9515
9516	spec->autocfg.hp_pins[0] = 0x1b;
9517	spec->autocfg.speaker_pins[0] = 0x14;
9518	spec->autocfg.speaker_pins[1] = 0x15;
9519	spec->autocfg.speaker_pins[2] = 0x16;
9520	spec->ext_mic.pin = 0x18;
9521	spec->int_mic.pin = 0x19;
9522	spec->ext_mic.mux_idx = 0;
9523	spec->int_mic.mux_idx = 1;
9524	spec->auto_mic = 1;
9525}
9526
9527static struct hda_verb alc888_asus_eee1601_verbs[] = {
9528	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9529	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9530	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9531	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9532	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
9533	{0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
9534	{0x20, AC_VERB_SET_PROC_COEF,  0x0838},
9535	/* enable unsolicited event */
9536	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9537	{ } /* end */
9538};
9539
9540static void alc883_eee1601_inithook(struct hda_codec *codec)
9541{
9542	struct alc_spec *spec = codec->spec;
9543
9544	spec->autocfg.hp_pins[0] = 0x14;
9545	spec->autocfg.speaker_pins[0] = 0x1b;
9546	alc_automute_pin(codec);
9547}
9548
9549static struct hda_verb alc889A_mb31_verbs[] = {
9550	/* Init rear pin (used as headphone output) */
9551	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},    /* Apple Headphones */
9552	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},           /* Connect to front */
9553	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9554	/* Init line pin (used as output in 4ch and 6ch mode) */
9555	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},           /* Connect to CLFE */
9556	/* Init line 2 pin (used as headphone out by default) */
9557	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},  /* Use as input */
9558	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
9559	{ } /* end */
9560};
9561
9562/* Mute speakers according to the headphone jack state */
9563static void alc889A_mb31_automute(struct hda_codec *codec)
9564{
9565	unsigned int present;
9566
9567	/* Mute only in 2ch or 4ch mode */
9568	if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
9569	    == 0x00) {
9570		present = snd_hda_jack_detect(codec, 0x15);
9571		snd_hda_codec_amp_stereo(codec, 0x14,  HDA_OUTPUT, 0,
9572			HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9573		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
9574			HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9575	}
9576}
9577
9578static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
9579{
9580	if ((res >> 26) == ALC880_HP_EVENT)
9581		alc889A_mb31_automute(codec);
9582}
9583
9584
9585#ifdef CONFIG_SND_HDA_POWER_SAVE
9586#define alc882_loopbacks	alc880_loopbacks
9587#endif
9588
9589/* pcm configuration: identical with ALC880 */
9590#define alc882_pcm_analog_playback	alc880_pcm_analog_playback
9591#define alc882_pcm_analog_capture	alc880_pcm_analog_capture
9592#define alc882_pcm_digital_playback	alc880_pcm_digital_playback
9593#define alc882_pcm_digital_capture	alc880_pcm_digital_capture
9594
9595static hda_nid_t alc883_slave_dig_outs[] = {
9596	ALC1200_DIGOUT_NID, 0,
9597};
9598
9599static hda_nid_t alc1200_slave_dig_outs[] = {
9600	ALC883_DIGOUT_NID, 0,
9601};
9602
9603/*
9604 * configuration and preset
9605 */
9606static const char *alc882_models[ALC882_MODEL_LAST] = {
9607	[ALC882_3ST_DIG]	= "3stack-dig",
9608	[ALC882_6ST_DIG]	= "6stack-dig",
9609	[ALC882_ARIMA]		= "arima",
9610	[ALC882_W2JC]		= "w2jc",
9611	[ALC882_TARGA]		= "targa",
9612	[ALC882_ASUS_A7J]	= "asus-a7j",
9613	[ALC882_ASUS_A7M]	= "asus-a7m",
9614	[ALC885_MACPRO]		= "macpro",
9615	[ALC885_MB5]		= "mb5",
9616	[ALC885_MACMINI3]	= "macmini3",
9617	[ALC885_MBA21]		= "mba21",
9618	[ALC885_MBP3]		= "mbp3",
9619	[ALC885_IMAC24]		= "imac24",
9620	[ALC885_IMAC91]		= "imac91",
9621	[ALC883_3ST_2ch_DIG]	= "3stack-2ch-dig",
9622	[ALC883_3ST_6ch_DIG]	= "3stack-6ch-dig",
9623	[ALC883_3ST_6ch]	= "3stack-6ch",
9624	[ALC883_6ST_DIG]	= "alc883-6stack-dig",
9625	[ALC883_TARGA_DIG]	= "targa-dig",
9626	[ALC883_TARGA_2ch_DIG]	= "targa-2ch-dig",
9627	[ALC883_TARGA_8ch_DIG]	= "targa-8ch-dig",
9628	[ALC883_ACER]		= "acer",
9629	[ALC883_ACER_ASPIRE]	= "acer-aspire",
9630	[ALC888_ACER_ASPIRE_4930G]	= "acer-aspire-4930g",
9631	[ALC888_ACER_ASPIRE_6530G]	= "acer-aspire-6530g",
9632	[ALC888_ACER_ASPIRE_8930G]	= "acer-aspire-8930g",
9633	[ALC888_ACER_ASPIRE_7730G]	= "acer-aspire-7730g",
9634	[ALC883_MEDION]		= "medion",
9635	[ALC883_MEDION_MD2]	= "medion-md2",
9636	[ALC883_MEDION_WIM2160]	= "medion-wim2160",
9637	[ALC883_LAPTOP_EAPD]	= "laptop-eapd",
9638	[ALC883_LENOVO_101E_2ch] = "lenovo-101e",
9639	[ALC883_LENOVO_NB0763]	= "lenovo-nb0763",
9640	[ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
9641	[ALC888_LENOVO_SKY] = "lenovo-sky",
9642	[ALC883_HAIER_W66] 	= "haier-w66",
9643	[ALC888_3ST_HP]		= "3stack-hp",
9644	[ALC888_6ST_DELL]	= "6stack-dell",
9645	[ALC883_MITAC]		= "mitac",
9646	[ALC883_CLEVO_M540R]	= "clevo-m540r",
9647	[ALC883_CLEVO_M720]	= "clevo-m720",
9648	[ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
9649	[ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
9650	[ALC883_3ST_6ch_INTEL]	= "3stack-6ch-intel",
9651	[ALC889A_INTEL]		= "intel-alc889a",
9652	[ALC889_INTEL]		= "intel-x58",
9653	[ALC1200_ASUS_P5Q]	= "asus-p5q",
9654	[ALC889A_MB31]		= "mb31",
9655	[ALC883_SONY_VAIO_TT]	= "sony-vaio-tt",
9656	[ALC882_AUTO]		= "auto",
9657};
9658
9659static struct snd_pci_quirk alc882_cfg_tbl[] = {
9660	SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
9661
9662	SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
9663	SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
9664	SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
9665	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
9666	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
9667	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
9668	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
9669		ALC888_ACER_ASPIRE_4930G),
9670	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
9671		ALC888_ACER_ASPIRE_4930G),
9672	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
9673		ALC888_ACER_ASPIRE_8930G),
9674	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
9675		ALC888_ACER_ASPIRE_8930G),
9676	SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
9677	SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
9678	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
9679		ALC888_ACER_ASPIRE_6530G),
9680	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
9681		ALC888_ACER_ASPIRE_6530G),
9682	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
9683		ALC888_ACER_ASPIRE_7730G),
9684	/* default Acer -- disabled as it causes more problems.
9685	 *    model=auto should work fine now
9686	 */
9687	/* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
9688
9689	SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
9690
9691	SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
9692	SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
9693	SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
9694	SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
9695	SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
9696	SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
9697
9698	SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
9699	SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
9700	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
9701	SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
9702	SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
9703	SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
9704	SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
9705	SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
9706	SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
9707	SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
9708	SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
9709
9710	SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
9711	SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
9712	SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
9713	SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
9714	SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
9715	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
9716	SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
9717	SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
9718	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
9719
9720	SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
9721	SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
9722	SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
9723	SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */
9724	SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
9725	SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
9726	SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
9727	SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
9728	SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
9729	SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
9730	SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
9731	SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
9732	SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
9733	SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
9734	SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
9735	SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
9736	SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
9737	SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
9738	SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG),
9739	SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
9740	SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
9741	SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
9742	SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
9743	SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
9744	SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
9745	SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
9746	SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
9747	SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
9748	SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG),
9749	SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
9750	SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
9751
9752	SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
9753	SND_PCI_QUIRK(0x1558, 0x0571, "Clevo laptop M570U", ALC883_3ST_6ch_DIG),
9754	SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
9755	SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
9756	SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
9757	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
9758	SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
9759	/* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
9760	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
9761	SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
9762		      ALC883_FUJITSU_PI2515),
9763	SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
9764		ALC888_FUJITSU_XA3530),
9765	SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
9766	SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9767	SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9768	SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9769	SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
9770	SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
9771	SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
9772	SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
9773	SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
9774
9775	SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
9776	SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
9777	SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
9778	SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
9779	SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
9780	SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
9781	SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG),
9782
9783	{}
9784};
9785
9786/* codec SSID table for Intel Mac */
9787static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9788	SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9789	SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9790	SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
9791	SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
9792	SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
9793	SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
9794	SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
9795	SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31),
9796	SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_ASUS_A7M),
9797	SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3),
9798	SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21),
9799	SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
9800	SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
9801	SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
9802	SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
9803	SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
9804	SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5),
9805	/* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
9806	 * so apparently no perfect solution yet
9807	 */
9808	SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
9809	SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
9810	SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
9811	{} /* terminator */
9812};
9813
9814static struct alc_config_preset alc882_presets[] = {
9815	[ALC882_3ST_DIG] = {
9816		.mixers = { alc882_base_mixer },
9817		.init_verbs = { alc882_base_init_verbs,
9818				alc882_adc1_init_verbs },
9819		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9820		.dac_nids = alc882_dac_nids,
9821		.dig_out_nid = ALC882_DIGOUT_NID,
9822		.dig_in_nid = ALC882_DIGIN_NID,
9823		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9824		.channel_mode = alc882_ch_modes,
9825		.need_dac_fix = 1,
9826		.input_mux = &alc882_capture_source,
9827	},
9828	[ALC882_6ST_DIG] = {
9829		.mixers = { alc882_base_mixer, alc882_chmode_mixer },
9830		.init_verbs = { alc882_base_init_verbs,
9831				alc882_adc1_init_verbs },
9832		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9833		.dac_nids = alc882_dac_nids,
9834		.dig_out_nid = ALC882_DIGOUT_NID,
9835		.dig_in_nid = ALC882_DIGIN_NID,
9836		.num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9837		.channel_mode = alc882_sixstack_modes,
9838		.input_mux = &alc882_capture_source,
9839	},
9840	[ALC882_ARIMA] = {
9841		.mixers = { alc882_base_mixer, alc882_chmode_mixer },
9842		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9843				alc882_eapd_verbs },
9844		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9845		.dac_nids = alc882_dac_nids,
9846		.num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9847		.channel_mode = alc882_sixstack_modes,
9848		.input_mux = &alc882_capture_source,
9849	},
9850	[ALC882_W2JC] = {
9851		.mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
9852		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9853				alc882_eapd_verbs, alc880_gpio1_init_verbs },
9854		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9855		.dac_nids = alc882_dac_nids,
9856		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9857		.channel_mode = alc880_threestack_modes,
9858		.need_dac_fix = 1,
9859		.input_mux = &alc882_capture_source,
9860		.dig_out_nid = ALC882_DIGOUT_NID,
9861	},
9862	   [ALC885_MBA21] = {
9863			.mixers = { alc885_mba21_mixer },
9864			.init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
9865			.num_dacs = 2,
9866			.dac_nids = alc882_dac_nids,
9867			.channel_mode = alc885_mba21_ch_modes,
9868			.num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9869			.input_mux = &alc882_capture_source,
9870			.unsol_event = alc_automute_amp_unsol_event,
9871			.setup = alc885_mba21_setup,
9872			.init_hook = alc_automute_amp,
9873       },
9874	[ALC885_MBP3] = {
9875		.mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
9876		.init_verbs = { alc885_mbp3_init_verbs,
9877				alc880_gpio1_init_verbs },
9878		.num_dacs = 2,
9879		.dac_nids = alc882_dac_nids,
9880		.hp_nid = 0x04,
9881		.channel_mode = alc885_mbp_4ch_modes,
9882		.num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9883		.input_mux = &alc882_capture_source,
9884		.dig_out_nid = ALC882_DIGOUT_NID,
9885		.dig_in_nid = ALC882_DIGIN_NID,
9886		.unsol_event = alc_automute_amp_unsol_event,
9887		.setup = alc885_mbp3_setup,
9888		.init_hook = alc_automute_amp,
9889	},
9890	[ALC885_MB5] = {
9891		.mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
9892		.init_verbs = { alc885_mb5_init_verbs,
9893				alc880_gpio1_init_verbs },
9894		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9895		.dac_nids = alc882_dac_nids,
9896		.channel_mode = alc885_mb5_6ch_modes,
9897		.num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
9898		.input_mux = &mb5_capture_source,
9899		.dig_out_nid = ALC882_DIGOUT_NID,
9900		.dig_in_nid = ALC882_DIGIN_NID,
9901		.unsol_event = alc_automute_amp_unsol_event,
9902		.setup = alc885_mb5_setup,
9903		.init_hook = alc_automute_amp,
9904	},
9905	[ALC885_MACMINI3] = {
9906		.mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
9907		.init_verbs = { alc885_macmini3_init_verbs,
9908				alc880_gpio1_init_verbs },
9909		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9910		.dac_nids = alc882_dac_nids,
9911		.channel_mode = alc885_macmini3_6ch_modes,
9912		.num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
9913		.input_mux = &macmini3_capture_source,
9914		.dig_out_nid = ALC882_DIGOUT_NID,
9915		.dig_in_nid = ALC882_DIGIN_NID,
9916		.unsol_event = alc_automute_amp_unsol_event,
9917		.setup = alc885_macmini3_setup,
9918		.init_hook = alc_automute_amp,
9919	},
9920	[ALC885_MACPRO] = {
9921		.mixers = { alc882_macpro_mixer },
9922		.init_verbs = { alc882_macpro_init_verbs },
9923		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9924		.dac_nids = alc882_dac_nids,
9925		.dig_out_nid = ALC882_DIGOUT_NID,
9926		.dig_in_nid = ALC882_DIGIN_NID,
9927		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9928		.channel_mode = alc882_ch_modes,
9929		.input_mux = &alc882_capture_source,
9930		.init_hook = alc885_macpro_init_hook,
9931	},
9932	[ALC885_IMAC24] = {
9933		.mixers = { alc885_imac24_mixer },
9934		.init_verbs = { alc885_imac24_init_verbs },
9935		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9936		.dac_nids = alc882_dac_nids,
9937		.dig_out_nid = ALC882_DIGOUT_NID,
9938		.dig_in_nid = ALC882_DIGIN_NID,
9939		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9940		.channel_mode = alc882_ch_modes,
9941		.input_mux = &alc882_capture_source,
9942		.unsol_event = alc_automute_amp_unsol_event,
9943		.setup = alc885_imac24_setup,
9944		.init_hook = alc885_imac24_init_hook,
9945	},
9946	[ALC885_IMAC91] = {
9947		.mixers = {alc885_imac91_mixer},
9948		.init_verbs = { alc885_imac91_init_verbs,
9949				alc880_gpio1_init_verbs },
9950		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9951		.dac_nids = alc882_dac_nids,
9952		.channel_mode = alc885_mba21_ch_modes,
9953		.num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9954		.input_mux = &alc889A_imac91_capture_source,
9955		.dig_out_nid = ALC882_DIGOUT_NID,
9956		.dig_in_nid = ALC882_DIGIN_NID,
9957		.unsol_event = alc_automute_amp_unsol_event,
9958		.setup = alc885_imac91_setup,
9959		.init_hook = alc_automute_amp,
9960	},
9961	[ALC882_TARGA] = {
9962		.mixers = { alc882_targa_mixer, alc882_chmode_mixer },
9963		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9964				alc880_gpio3_init_verbs, alc882_targa_verbs},
9965		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9966		.dac_nids = alc882_dac_nids,
9967		.dig_out_nid = ALC882_DIGOUT_NID,
9968		.num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9969		.adc_nids = alc882_adc_nids,
9970		.capsrc_nids = alc882_capsrc_nids,
9971		.num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9972		.channel_mode = alc882_3ST_6ch_modes,
9973		.need_dac_fix = 1,
9974		.input_mux = &alc882_capture_source,
9975		.unsol_event = alc882_targa_unsol_event,
9976		.setup = alc882_targa_setup,
9977		.init_hook = alc882_targa_automute,
9978	},
9979	[ALC882_ASUS_A7J] = {
9980		.mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
9981		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9982				alc882_asus_a7j_verbs},
9983		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9984		.dac_nids = alc882_dac_nids,
9985		.dig_out_nid = ALC882_DIGOUT_NID,
9986		.num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9987		.adc_nids = alc882_adc_nids,
9988		.capsrc_nids = alc882_capsrc_nids,
9989		.num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9990		.channel_mode = alc882_3ST_6ch_modes,
9991		.need_dac_fix = 1,
9992		.input_mux = &alc882_capture_source,
9993	},
9994	[ALC882_ASUS_A7M] = {
9995		.mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
9996		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9997				alc882_eapd_verbs, alc880_gpio1_init_verbs,
9998				alc882_asus_a7m_verbs },
9999		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
10000		.dac_nids = alc882_dac_nids,
10001		.dig_out_nid = ALC882_DIGOUT_NID,
10002		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
10003		.channel_mode = alc880_threestack_modes,
10004		.need_dac_fix = 1,
10005		.input_mux = &alc882_capture_source,
10006	},
10007	[ALC883_3ST_2ch_DIG] = {
10008		.mixers = { alc883_3ST_2ch_mixer },
10009		.init_verbs = { alc883_init_verbs },
10010		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10011		.dac_nids = alc883_dac_nids,
10012		.dig_out_nid = ALC883_DIGOUT_NID,
10013		.dig_in_nid = ALC883_DIGIN_NID,
10014		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10015		.channel_mode = alc883_3ST_2ch_modes,
10016		.input_mux = &alc883_capture_source,
10017	},
10018	[ALC883_3ST_6ch_DIG] = {
10019		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10020		.init_verbs = { alc883_init_verbs },
10021		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10022		.dac_nids = alc883_dac_nids,
10023		.dig_out_nid = ALC883_DIGOUT_NID,
10024		.dig_in_nid = ALC883_DIGIN_NID,
10025		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10026		.channel_mode = alc883_3ST_6ch_modes,
10027		.need_dac_fix = 1,
10028		.input_mux = &alc883_capture_source,
10029	},
10030	[ALC883_3ST_6ch] = {
10031		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10032		.init_verbs = { alc883_init_verbs },
10033		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10034		.dac_nids = alc883_dac_nids,
10035		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10036		.channel_mode = alc883_3ST_6ch_modes,
10037		.need_dac_fix = 1,
10038		.input_mux = &alc883_capture_source,
10039	},
10040	[ALC883_3ST_6ch_INTEL] = {
10041		.mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
10042		.init_verbs = { alc883_init_verbs },
10043		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10044		.dac_nids = alc883_dac_nids,
10045		.dig_out_nid = ALC883_DIGOUT_NID,
10046		.dig_in_nid = ALC883_DIGIN_NID,
10047		.slave_dig_outs = alc883_slave_dig_outs,
10048		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
10049		.channel_mode = alc883_3ST_6ch_intel_modes,
10050		.need_dac_fix = 1,
10051		.input_mux = &alc883_3stack_6ch_intel,
10052	},
10053	[ALC889A_INTEL] = {
10054		.mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
10055		.init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
10056				alc_hp15_unsol_verbs },
10057		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10058		.dac_nids = alc883_dac_nids,
10059		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
10060		.adc_nids = alc889_adc_nids,
10061		.dig_out_nid = ALC883_DIGOUT_NID,
10062		.dig_in_nid = ALC883_DIGIN_NID,
10063		.slave_dig_outs = alc883_slave_dig_outs,
10064		.num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
10065		.channel_mode = alc889_8ch_intel_modes,
10066		.capsrc_nids = alc889_capsrc_nids,
10067		.input_mux = &alc889_capture_source,
10068		.setup = alc889_automute_setup,
10069		.init_hook = alc_automute_amp,
10070		.unsol_event = alc_automute_amp_unsol_event,
10071		.need_dac_fix = 1,
10072	},
10073	[ALC889_INTEL] = {
10074		.mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
10075		.init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
10076				alc889_eapd_verbs, alc_hp15_unsol_verbs},
10077		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10078		.dac_nids = alc883_dac_nids,
10079		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
10080		.adc_nids = alc889_adc_nids,
10081		.dig_out_nid = ALC883_DIGOUT_NID,
10082		.dig_in_nid = ALC883_DIGIN_NID,
10083		.slave_dig_outs = alc883_slave_dig_outs,
10084		.num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
10085		.channel_mode = alc889_8ch_intel_modes,
10086		.capsrc_nids = alc889_capsrc_nids,
10087		.input_mux = &alc889_capture_source,
10088		.setup = alc889_automute_setup,
10089		.init_hook = alc889_intel_init_hook,
10090		.unsol_event = alc_automute_amp_unsol_event,
10091		.need_dac_fix = 1,
10092	},
10093	[ALC883_6ST_DIG] = {
10094		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
10095		.init_verbs = { alc883_init_verbs },
10096		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10097		.dac_nids = alc883_dac_nids,
10098		.dig_out_nid = ALC883_DIGOUT_NID,
10099		.dig_in_nid = ALC883_DIGIN_NID,
10100		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10101		.channel_mode = alc883_sixstack_modes,
10102		.input_mux = &alc883_capture_source,
10103	},
10104	[ALC883_TARGA_DIG] = {
10105		.mixers = { alc883_targa_mixer, alc883_chmode_mixer },
10106		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
10107				alc883_targa_verbs},
10108		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10109		.dac_nids = alc883_dac_nids,
10110		.dig_out_nid = ALC883_DIGOUT_NID,
10111		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10112		.channel_mode = alc883_3ST_6ch_modes,
10113		.need_dac_fix = 1,
10114		.input_mux = &alc883_capture_source,
10115		.unsol_event = alc883_targa_unsol_event,
10116		.setup = alc882_targa_setup,
10117		.init_hook = alc882_targa_automute,
10118	},
10119	[ALC883_TARGA_2ch_DIG] = {
10120		.mixers = { alc883_targa_2ch_mixer},
10121		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
10122				alc883_targa_verbs},
10123		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10124		.dac_nids = alc883_dac_nids,
10125		.adc_nids = alc883_adc_nids_alt,
10126		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
10127		.capsrc_nids = alc883_capsrc_nids,
10128		.dig_out_nid = ALC883_DIGOUT_NID,
10129		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10130		.channel_mode = alc883_3ST_2ch_modes,
10131		.input_mux = &alc883_capture_source,
10132		.unsol_event = alc883_targa_unsol_event,
10133		.setup = alc882_targa_setup,
10134		.init_hook = alc882_targa_automute,
10135	},
10136	[ALC883_TARGA_8ch_DIG] = {
10137		.mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
10138			    alc883_chmode_mixer },
10139		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
10140				alc883_targa_verbs },
10141		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10142		.dac_nids = alc883_dac_nids,
10143		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10144		.adc_nids = alc883_adc_nids_rev,
10145		.capsrc_nids = alc883_capsrc_nids_rev,
10146		.dig_out_nid = ALC883_DIGOUT_NID,
10147		.dig_in_nid = ALC883_DIGIN_NID,
10148		.num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
10149		.channel_mode = alc883_4ST_8ch_modes,
10150		.need_dac_fix = 1,
10151		.input_mux = &alc883_capture_source,
10152		.unsol_event = alc883_targa_unsol_event,
10153		.setup = alc882_targa_setup,
10154		.init_hook = alc882_targa_automute,
10155	},
10156	[ALC883_ACER] = {
10157		.mixers = { alc883_base_mixer },
10158		/* On TravelMate laptops, GPIO 0 enables the internal speaker
10159		 * and the headphone jack.  Turn this on and rely on the
10160		 * standard mute methods whenever the user wants to turn
10161		 * these outputs off.
10162		 */
10163		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
10164		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10165		.dac_nids = alc883_dac_nids,
10166		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10167		.channel_mode = alc883_3ST_2ch_modes,
10168		.input_mux = &alc883_capture_source,
10169	},
10170	[ALC883_ACER_ASPIRE] = {
10171		.mixers = { alc883_acer_aspire_mixer },
10172		.init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
10173		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10174		.dac_nids = alc883_dac_nids,
10175		.dig_out_nid = ALC883_DIGOUT_NID,
10176		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10177		.channel_mode = alc883_3ST_2ch_modes,
10178		.input_mux = &alc883_capture_source,
10179		.unsol_event = alc_automute_amp_unsol_event,
10180		.setup = alc883_acer_aspire_setup,
10181		.init_hook = alc_automute_amp,
10182	},
10183	[ALC888_ACER_ASPIRE_4930G] = {
10184		.mixers = { alc888_base_mixer,
10185				alc883_chmode_mixer },
10186		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
10187				alc888_acer_aspire_4930g_verbs },
10188		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10189		.dac_nids = alc883_dac_nids,
10190		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10191		.adc_nids = alc883_adc_nids_rev,
10192		.capsrc_nids = alc883_capsrc_nids_rev,
10193		.dig_out_nid = ALC883_DIGOUT_NID,
10194		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10195		.channel_mode = alc883_3ST_6ch_modes,
10196		.need_dac_fix = 1,
10197		.const_channel_count = 6,
10198		.num_mux_defs =
10199			ARRAY_SIZE(alc888_2_capture_sources),
10200		.input_mux = alc888_2_capture_sources,
10201		.unsol_event = alc_automute_amp_unsol_event,
10202		.setup = alc888_acer_aspire_4930g_setup,
10203		.init_hook = alc_automute_amp,
10204	},
10205	[ALC888_ACER_ASPIRE_6530G] = {
10206		.mixers = { alc888_acer_aspire_6530_mixer },
10207		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
10208				alc888_acer_aspire_6530g_verbs },
10209		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10210		.dac_nids = alc883_dac_nids,
10211		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10212		.adc_nids = alc883_adc_nids_rev,
10213		.capsrc_nids = alc883_capsrc_nids_rev,
10214		.dig_out_nid = ALC883_DIGOUT_NID,
10215		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10216		.channel_mode = alc883_3ST_2ch_modes,
10217		.num_mux_defs =
10218			ARRAY_SIZE(alc888_2_capture_sources),
10219		.input_mux = alc888_acer_aspire_6530_sources,
10220		.unsol_event = alc_automute_amp_unsol_event,
10221		.setup = alc888_acer_aspire_6530g_setup,
10222		.init_hook = alc_automute_amp,
10223	},
10224	[ALC888_ACER_ASPIRE_8930G] = {
10225		.mixers = { alc889_acer_aspire_8930g_mixer,
10226				alc883_chmode_mixer },
10227		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
10228				alc889_acer_aspire_8930g_verbs,
10229				alc889_eapd_verbs},
10230		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10231		.dac_nids = alc883_dac_nids,
10232		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
10233		.adc_nids = alc889_adc_nids,
10234		.capsrc_nids = alc889_capsrc_nids,
10235		.dig_out_nid = ALC883_DIGOUT_NID,
10236		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10237		.channel_mode = alc883_3ST_6ch_modes,
10238		.need_dac_fix = 1,
10239		.const_channel_count = 6,
10240		.num_mux_defs =
10241			ARRAY_SIZE(alc889_capture_sources),
10242		.input_mux = alc889_capture_sources,
10243		.unsol_event = alc_automute_amp_unsol_event,
10244		.setup = alc889_acer_aspire_8930g_setup,
10245		.init_hook = alc_automute_amp,
10246#ifdef CONFIG_SND_HDA_POWER_SAVE
10247		.power_hook = alc_power_eapd,
10248#endif
10249	},
10250	[ALC888_ACER_ASPIRE_7730G] = {
10251		.mixers = { alc883_3ST_6ch_mixer,
10252				alc883_chmode_mixer },
10253		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
10254				alc888_acer_aspire_7730G_verbs },
10255		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10256		.dac_nids = alc883_dac_nids,
10257		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10258		.adc_nids = alc883_adc_nids_rev,
10259		.capsrc_nids = alc883_capsrc_nids_rev,
10260		.dig_out_nid = ALC883_DIGOUT_NID,
10261		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10262		.channel_mode = alc883_3ST_6ch_modes,
10263		.need_dac_fix = 1,
10264		.const_channel_count = 6,
10265		.input_mux = &alc883_capture_source,
10266		.unsol_event = alc_automute_amp_unsol_event,
10267		.setup = alc888_acer_aspire_6530g_setup,
10268		.init_hook = alc_automute_amp,
10269	},
10270	[ALC883_MEDION] = {
10271		.mixers = { alc883_fivestack_mixer,
10272			    alc883_chmode_mixer },
10273		.init_verbs = { alc883_init_verbs,
10274				alc883_medion_eapd_verbs },
10275		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10276		.dac_nids = alc883_dac_nids,
10277		.adc_nids = alc883_adc_nids_alt,
10278		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
10279		.capsrc_nids = alc883_capsrc_nids,
10280		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10281		.channel_mode = alc883_sixstack_modes,
10282		.input_mux = &alc883_capture_source,
10283	},
10284	[ALC883_MEDION_MD2] = {
10285		.mixers = { alc883_medion_md2_mixer},
10286		.init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
10287		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10288		.dac_nids = alc883_dac_nids,
10289		.dig_out_nid = ALC883_DIGOUT_NID,
10290		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10291		.channel_mode = alc883_3ST_2ch_modes,
10292		.input_mux = &alc883_capture_source,
10293		.unsol_event = alc_automute_amp_unsol_event,
10294		.setup = alc883_medion_md2_setup,
10295		.init_hook = alc_automute_amp,
10296	},
10297	[ALC883_MEDION_WIM2160] = {
10298		.mixers = { alc883_medion_wim2160_mixer },
10299		.init_verbs = { alc883_init_verbs, alc883_medion_wim2160_verbs },
10300		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10301		.dac_nids = alc883_dac_nids,
10302		.dig_out_nid = ALC883_DIGOUT_NID,
10303		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
10304		.adc_nids = alc883_adc_nids,
10305		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10306		.channel_mode = alc883_3ST_2ch_modes,
10307		.input_mux = &alc883_capture_source,
10308		.unsol_event = alc_automute_amp_unsol_event,
10309		.setup = alc883_medion_wim2160_setup,
10310		.init_hook = alc_automute_amp,
10311	},
10312	[ALC883_LAPTOP_EAPD] = {
10313		.mixers = { alc883_base_mixer },
10314		.init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
10315		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10316		.dac_nids = alc883_dac_nids,
10317		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10318		.channel_mode = alc883_3ST_2ch_modes,
10319		.input_mux = &alc883_capture_source,
10320	},
10321	[ALC883_CLEVO_M540R] = {
10322		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10323		.init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
10324		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10325		.dac_nids = alc883_dac_nids,
10326		.dig_out_nid = ALC883_DIGOUT_NID,
10327		.dig_in_nid = ALC883_DIGIN_NID,
10328		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
10329		.channel_mode = alc883_3ST_6ch_clevo_modes,
10330		.need_dac_fix = 1,
10331		.input_mux = &alc883_capture_source,
10332		/* This machine has the hardware HP auto-muting, thus
10333		 * we need no software mute via unsol event
10334		 */
10335	},
10336	[ALC883_CLEVO_M720] = {
10337		.mixers = { alc883_clevo_m720_mixer },
10338		.init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
10339		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10340		.dac_nids = alc883_dac_nids,
10341		.dig_out_nid = ALC883_DIGOUT_NID,
10342		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10343		.channel_mode = alc883_3ST_2ch_modes,
10344		.input_mux = &alc883_capture_source,
10345		.unsol_event = alc883_clevo_m720_unsol_event,
10346		.setup = alc883_clevo_m720_setup,
10347		.init_hook = alc883_clevo_m720_init_hook,
10348	},
10349	[ALC883_LENOVO_101E_2ch] = {
10350		.mixers = { alc883_lenovo_101e_2ch_mixer},
10351		.init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
10352		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10353		.dac_nids = alc883_dac_nids,
10354		.adc_nids = alc883_adc_nids_alt,
10355		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
10356		.capsrc_nids = alc883_capsrc_nids,
10357		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10358		.channel_mode = alc883_3ST_2ch_modes,
10359		.input_mux = &alc883_lenovo_101e_capture_source,
10360		.unsol_event = alc883_lenovo_101e_unsol_event,
10361		.init_hook = alc883_lenovo_101e_all_automute,
10362	},
10363	[ALC883_LENOVO_NB0763] = {
10364		.mixers = { alc883_lenovo_nb0763_mixer },
10365		.init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
10366		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10367		.dac_nids = alc883_dac_nids,
10368		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10369		.channel_mode = alc883_3ST_2ch_modes,
10370		.need_dac_fix = 1,
10371		.input_mux = &alc883_lenovo_nb0763_capture_source,
10372		.unsol_event = alc_automute_amp_unsol_event,
10373		.setup = alc883_medion_md2_setup,
10374		.init_hook = alc_automute_amp,
10375	},
10376	[ALC888_LENOVO_MS7195_DIG] = {
10377		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10378		.init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
10379		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10380		.dac_nids = alc883_dac_nids,
10381		.dig_out_nid = ALC883_DIGOUT_NID,
10382		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10383		.channel_mode = alc883_3ST_6ch_modes,
10384		.need_dac_fix = 1,
10385		.input_mux = &alc883_capture_source,
10386		.unsol_event = alc883_lenovo_ms7195_unsol_event,
10387		.init_hook = alc888_lenovo_ms7195_front_automute,
10388	},
10389	[ALC883_HAIER_W66] = {
10390		.mixers = { alc883_targa_2ch_mixer},
10391		.init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
10392		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10393		.dac_nids = alc883_dac_nids,
10394		.dig_out_nid = ALC883_DIGOUT_NID,
10395		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10396		.channel_mode = alc883_3ST_2ch_modes,
10397		.input_mux = &alc883_capture_source,
10398		.unsol_event = alc_automute_amp_unsol_event,
10399		.setup = alc883_haier_w66_setup,
10400		.init_hook = alc_automute_amp,
10401	},
10402	[ALC888_3ST_HP] = {
10403		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10404		.init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
10405		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10406		.dac_nids = alc883_dac_nids,
10407		.num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
10408		.channel_mode = alc888_3st_hp_modes,
10409		.need_dac_fix = 1,
10410		.input_mux = &alc883_capture_source,
10411		.unsol_event = alc_automute_amp_unsol_event,
10412		.setup = alc888_3st_hp_setup,
10413		.init_hook = alc_automute_amp,
10414	},
10415	[ALC888_6ST_DELL] = {
10416		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
10417		.init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
10418		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10419		.dac_nids = alc883_dac_nids,
10420		.dig_out_nid = ALC883_DIGOUT_NID,
10421		.dig_in_nid = ALC883_DIGIN_NID,
10422		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10423		.channel_mode = alc883_sixstack_modes,
10424		.input_mux = &alc883_capture_source,
10425		.unsol_event = alc_automute_amp_unsol_event,
10426		.setup = alc888_6st_dell_setup,
10427		.init_hook = alc_automute_amp,
10428	},
10429	[ALC883_MITAC] = {
10430		.mixers = { alc883_mitac_mixer },
10431		.init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
10432		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10433		.dac_nids = alc883_dac_nids,
10434		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10435		.channel_mode = alc883_3ST_2ch_modes,
10436		.input_mux = &alc883_capture_source,
10437		.unsol_event = alc_automute_amp_unsol_event,
10438		.setup = alc883_mitac_setup,
10439		.init_hook = alc_automute_amp,
10440	},
10441	[ALC883_FUJITSU_PI2515] = {
10442		.mixers = { alc883_2ch_fujitsu_pi2515_mixer },
10443		.init_verbs = { alc883_init_verbs,
10444				alc883_2ch_fujitsu_pi2515_verbs},
10445		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10446		.dac_nids = alc883_dac_nids,
10447		.dig_out_nid = ALC883_DIGOUT_NID,
10448		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10449		.channel_mode = alc883_3ST_2ch_modes,
10450		.input_mux = &alc883_fujitsu_pi2515_capture_source,
10451		.unsol_event = alc_automute_amp_unsol_event,
10452		.setup = alc883_2ch_fujitsu_pi2515_setup,
10453		.init_hook = alc_automute_amp,
10454	},
10455	[ALC888_FUJITSU_XA3530] = {
10456		.mixers = { alc888_base_mixer, alc883_chmode_mixer },
10457		.init_verbs = { alc883_init_verbs,
10458			alc888_fujitsu_xa3530_verbs },
10459		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10460		.dac_nids = alc883_dac_nids,
10461		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10462		.adc_nids = alc883_adc_nids_rev,
10463		.capsrc_nids = alc883_capsrc_nids_rev,
10464		.dig_out_nid = ALC883_DIGOUT_NID,
10465		.num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
10466		.channel_mode = alc888_4ST_8ch_intel_modes,
10467		.num_mux_defs =
10468			ARRAY_SIZE(alc888_2_capture_sources),
10469		.input_mux = alc888_2_capture_sources,
10470		.unsol_event = alc_automute_amp_unsol_event,
10471		.setup = alc888_fujitsu_xa3530_setup,
10472		.init_hook = alc_automute_amp,
10473	},
10474	[ALC888_LENOVO_SKY] = {
10475		.mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
10476		.init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
10477		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10478		.dac_nids = alc883_dac_nids,
10479		.dig_out_nid = ALC883_DIGOUT_NID,
10480		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10481		.channel_mode = alc883_sixstack_modes,
10482		.need_dac_fix = 1,
10483		.input_mux = &alc883_lenovo_sky_capture_source,
10484		.unsol_event = alc_automute_amp_unsol_event,
10485		.setup = alc888_lenovo_sky_setup,
10486		.init_hook = alc_automute_amp,
10487	},
10488	[ALC888_ASUS_M90V] = {
10489		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10490		.init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
10491		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10492		.dac_nids = alc883_dac_nids,
10493		.dig_out_nid = ALC883_DIGOUT_NID,
10494		.dig_in_nid = ALC883_DIGIN_NID,
10495		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10496		.channel_mode = alc883_3ST_6ch_modes,
10497		.need_dac_fix = 1,
10498		.input_mux = &alc883_fujitsu_pi2515_capture_source,
10499		.unsol_event = alc_sku_unsol_event,
10500		.setup = alc883_mode2_setup,
10501		.init_hook = alc_inithook,
10502	},
10503	[ALC888_ASUS_EEE1601] = {
10504		.mixers = { alc883_asus_eee1601_mixer },
10505		.cap_mixer = alc883_asus_eee1601_cap_mixer,
10506		.init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
10507		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10508		.dac_nids = alc883_dac_nids,
10509		.dig_out_nid = ALC883_DIGOUT_NID,
10510		.dig_in_nid = ALC883_DIGIN_NID,
10511		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10512		.channel_mode = alc883_3ST_2ch_modes,
10513		.need_dac_fix = 1,
10514		.input_mux = &alc883_asus_eee1601_capture_source,
10515		.unsol_event = alc_sku_unsol_event,
10516		.init_hook = alc883_eee1601_inithook,
10517	},
10518	[ALC1200_ASUS_P5Q] = {
10519		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
10520		.init_verbs = { alc883_init_verbs },
10521		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10522		.dac_nids = alc883_dac_nids,
10523		.dig_out_nid = ALC1200_DIGOUT_NID,
10524		.dig_in_nid = ALC883_DIGIN_NID,
10525		.slave_dig_outs = alc1200_slave_dig_outs,
10526		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10527		.channel_mode = alc883_sixstack_modes,
10528		.input_mux = &alc883_capture_source,
10529	},
10530	[ALC889A_MB31] = {
10531		.mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
10532		.init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
10533			alc880_gpio1_init_verbs },
10534		.adc_nids = alc883_adc_nids,
10535		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
10536		.capsrc_nids = alc883_capsrc_nids,
10537		.dac_nids = alc883_dac_nids,
10538		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10539		.channel_mode = alc889A_mb31_6ch_modes,
10540		.num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
10541		.input_mux = &alc889A_mb31_capture_source,
10542		.dig_out_nid = ALC883_DIGOUT_NID,
10543		.unsol_event = alc889A_mb31_unsol_event,
10544		.init_hook = alc889A_mb31_automute,
10545	},
10546	[ALC883_SONY_VAIO_TT] = {
10547		.mixers = { alc883_vaiott_mixer },
10548		.init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
10549		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10550		.dac_nids = alc883_dac_nids,
10551		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10552		.channel_mode = alc883_3ST_2ch_modes,
10553		.input_mux = &alc883_capture_source,
10554		.unsol_event = alc_automute_amp_unsol_event,
10555		.setup = alc883_vaiott_setup,
10556		.init_hook = alc_automute_amp,
10557	},
10558};
10559
10560
10561/*
10562 * Pin config fixes
10563 */
10564enum {
10565	PINFIX_ABIT_AW9D_MAX,
10566	PINFIX_PB_M5210,
10567};
10568
10569static const struct alc_fixup alc882_fixups[] = {
10570	[PINFIX_ABIT_AW9D_MAX] = {
10571		.pins = (const struct alc_pincfg[]) {
10572			{ 0x15, 0x01080104 }, /* side */
10573			{ 0x16, 0x01011012 }, /* rear */
10574			{ 0x17, 0x01016011 }, /* clfe */
10575			{ }
10576		}
10577	},
10578	[PINFIX_PB_M5210] = {
10579		.verbs = (const struct hda_verb[]) {
10580			{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 },
10581			{}
10582		}
10583	},
10584};
10585
10586static struct snd_pci_quirk alc882_fixup_tbl[] = {
10587	SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", PINFIX_PB_M5210),
10588	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
10589	{}
10590};
10591
10592/*
10593 * BIOS auto configuration
10594 */
10595static int alc882_auto_create_input_ctls(struct hda_codec *codec,
10596						const struct auto_pin_cfg *cfg)
10597{
10598	return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
10599}
10600
10601static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
10602					      hda_nid_t nid, int pin_type,
10603					      hda_nid_t dac)
10604{
10605	int idx;
10606
10607	/* set as output */
10608	alc_set_pin_output(codec, nid, pin_type);
10609
10610	if (dac == 0x25)
10611		idx = 4;
10612	else if (dac >= 0x02 && dac <= 0x05)
10613		idx = dac - 2;
10614	else
10615		return;
10616	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
10617}
10618
10619static void alc882_auto_init_multi_out(struct hda_codec *codec)
10620{
10621	struct alc_spec *spec = codec->spec;
10622	int i;
10623
10624	for (i = 0; i <= HDA_SIDE; i++) {
10625		hda_nid_t nid = spec->autocfg.line_out_pins[i];
10626		int pin_type = get_pin_type(spec->autocfg.line_out_type);
10627		if (nid)
10628			alc882_auto_set_output_and_unmute(codec, nid, pin_type,
10629					spec->multiout.dac_nids[i]);
10630	}
10631}
10632
10633static void alc882_auto_init_hp_out(struct hda_codec *codec)
10634{
10635	struct alc_spec *spec = codec->spec;
10636	hda_nid_t pin, dac;
10637	int i;
10638
10639	for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
10640		pin = spec->autocfg.hp_pins[i];
10641		if (!pin)
10642			break;
10643		dac = spec->multiout.hp_nid;
10644		if (!dac)
10645			dac = spec->multiout.dac_nids[0]; /* to front */
10646		alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, dac);
10647	}
10648	for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
10649		pin = spec->autocfg.speaker_pins[i];
10650		if (!pin)
10651			break;
10652		dac = spec->multiout.extra_out_nid[0];
10653		if (!dac)
10654			dac = spec->multiout.dac_nids[0]; /* to front */
10655		alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, dac);
10656	}
10657}
10658
10659static void alc882_auto_init_analog_input(struct hda_codec *codec)
10660{
10661	struct alc_spec *spec = codec->spec;
10662	struct auto_pin_cfg *cfg = &spec->autocfg;
10663	int i;
10664
10665	for (i = 0; i < cfg->num_inputs; i++) {
10666		hda_nid_t nid = cfg->inputs[i].pin;
10667		alc_set_input_pin(codec, nid, cfg->inputs[i].type);
10668		if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
10669			snd_hda_codec_write(codec, nid, 0,
10670					    AC_VERB_SET_AMP_GAIN_MUTE,
10671					    AMP_OUT_MUTE);
10672	}
10673}
10674
10675static void alc882_auto_init_input_src(struct hda_codec *codec)
10676{
10677	struct alc_spec *spec = codec->spec;
10678	int c;
10679
10680	for (c = 0; c < spec->num_adc_nids; c++) {
10681		hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
10682		hda_nid_t nid = spec->capsrc_nids[c];
10683		unsigned int mux_idx;
10684		const struct hda_input_mux *imux;
10685		int conns, mute, idx, item;
10686
10687		conns = snd_hda_get_connections(codec, nid, conn_list,
10688						ARRAY_SIZE(conn_list));
10689		if (conns < 0)
10690			continue;
10691		mux_idx = c >= spec->num_mux_defs ? 0 : c;
10692		imux = &spec->input_mux[mux_idx];
10693		if (!imux->num_items && mux_idx > 0)
10694			imux = &spec->input_mux[0];
10695		for (idx = 0; idx < conns; idx++) {
10696			/* if the current connection is the selected one,
10697			 * unmute it as default - otherwise mute it
10698			 */
10699			mute = AMP_IN_MUTE(idx);
10700			for (item = 0; item < imux->num_items; item++) {
10701				if (imux->items[item].index == idx) {
10702					if (spec->cur_mux[c] == item)
10703						mute = AMP_IN_UNMUTE(idx);
10704					break;
10705				}
10706			}
10707			/* check if we have a selector or mixer
10708			 * we could check for the widget type instead, but
10709			 * just check for Amp-In presence (in case of mixer
10710			 * without amp-in there is something wrong, this
10711			 * function shouldn't be used or capsrc nid is wrong)
10712			 */
10713			if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
10714				snd_hda_codec_write(codec, nid, 0,
10715						    AC_VERB_SET_AMP_GAIN_MUTE,
10716						    mute);
10717			else if (mute != AMP_IN_MUTE(idx))
10718				snd_hda_codec_write(codec, nid, 0,
10719						    AC_VERB_SET_CONNECT_SEL,
10720						    idx);
10721		}
10722	}
10723}
10724
10725/* add mic boosts if needed */
10726static int alc_auto_add_mic_boost(struct hda_codec *codec)
10727{
10728	struct alc_spec *spec = codec->spec;
10729	struct auto_pin_cfg *cfg = &spec->autocfg;
10730	int i, err;
10731	hda_nid_t nid;
10732
10733	for (i = 0; i < cfg->num_inputs; i++) {
10734		if (cfg->inputs[i].type > AUTO_PIN_MIC)
10735			break;
10736		nid = cfg->inputs[i].pin;
10737		if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) {
10738			char label[32];
10739			snprintf(label, sizeof(label), "%s Boost",
10740				 hda_get_autocfg_input_label(codec, cfg, i));
10741			err = add_control(spec, ALC_CTL_WIDGET_VOL, label, 0,
10742				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10743			if (err < 0)
10744				return err;
10745		}
10746	}
10747	return 0;
10748}
10749
10750/* almost identical with ALC880 parser... */
10751static int alc882_parse_auto_config(struct hda_codec *codec)
10752{
10753	struct alc_spec *spec = codec->spec;
10754	static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
10755	int err;
10756
10757	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
10758					   alc882_ignore);
10759	if (err < 0)
10760		return err;
10761	if (!spec->autocfg.line_outs)
10762		return 0; /* can't find valid BIOS pin config */
10763
10764	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
10765	if (err < 0)
10766		return err;
10767	err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
10768	if (err < 0)
10769		return err;
10770	err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
10771					   "Headphone");
10772	if (err < 0)
10773		return err;
10774	err = alc880_auto_create_extra_out(spec,
10775					   spec->autocfg.speaker_pins[0],
10776					   "Speaker");
10777	if (err < 0)
10778		return err;
10779	err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
10780	if (err < 0)
10781		return err;
10782
10783	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
10784
10785	alc_auto_parse_digital(codec);
10786
10787	if (spec->kctls.list)
10788		add_mixer(spec, spec->kctls.list);
10789
10790	add_verb(spec, alc883_auto_init_verbs);
10791	/* if ADC 0x07 is available, initialize it, too */
10792	if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
10793		add_verb(spec, alc882_adc1_init_verbs);
10794
10795	spec->num_mux_defs = 1;
10796	spec->input_mux = &spec->private_imux[0];
10797
10798	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
10799
10800	err = alc_auto_add_mic_boost(codec);
10801	if (err < 0)
10802		return err;
10803
10804	return 1; /* config found */
10805}
10806
10807/* additional initialization for auto-configuration model */
10808static void alc882_auto_init(struct hda_codec *codec)
10809{
10810	struct alc_spec *spec = codec->spec;
10811	alc882_auto_init_multi_out(codec);
10812	alc882_auto_init_hp_out(codec);
10813	alc882_auto_init_analog_input(codec);
10814	alc882_auto_init_input_src(codec);
10815	alc_auto_init_digital(codec);
10816	if (spec->unsol_event)
10817		alc_inithook(codec);
10818}
10819
10820static int patch_alc882(struct hda_codec *codec)
10821{
10822	struct alc_spec *spec;
10823	int err, board_config;
10824
10825	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
10826	if (spec == NULL)
10827		return -ENOMEM;
10828
10829	codec->spec = spec;
10830
10831	alc_auto_parse_customize_define(codec);
10832
10833	switch (codec->vendor_id) {
10834	case 0x10ec0882:
10835	case 0x10ec0885:
10836		break;
10837	default:
10838		/* ALC883 and variants */
10839		alc_fix_pll_init(codec, 0x20, 0x0a, 10);
10840		break;
10841	}
10842
10843	board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
10844						  alc882_models,
10845						  alc882_cfg_tbl);
10846
10847	if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
10848		board_config = snd_hda_check_board_codec_sid_config(codec,
10849			ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
10850
10851	if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
10852		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
10853		       codec->chip_name);
10854		board_config = ALC882_AUTO;
10855	}
10856
10857	if (board_config == ALC882_AUTO)
10858		alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 1);
10859
10860	if (board_config == ALC882_AUTO) {
10861		/* automatic parse from the BIOS config */
10862		err = alc882_parse_auto_config(codec);
10863		if (err < 0) {
10864			alc_free(codec);
10865			return err;
10866		} else if (!err) {
10867			printk(KERN_INFO
10868			       "hda_codec: Cannot set up configuration "
10869			       "from BIOS.  Using base mode...\n");
10870			board_config = ALC882_3ST_DIG;
10871		}
10872	}
10873
10874	if (has_cdefine_beep(codec)) {
10875		err = snd_hda_attach_beep_device(codec, 0x1);
10876		if (err < 0) {
10877			alc_free(codec);
10878			return err;
10879		}
10880	}
10881
10882	if (board_config != ALC882_AUTO)
10883		setup_preset(codec, &alc882_presets[board_config]);
10884
10885	spec->stream_analog_playback = &alc882_pcm_analog_playback;
10886	spec->stream_analog_capture = &alc882_pcm_analog_capture;
10887	/* FIXME: setup DAC5 */
10888	/*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
10889	spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
10890
10891	spec->stream_digital_playback = &alc882_pcm_digital_playback;
10892	spec->stream_digital_capture = &alc882_pcm_digital_capture;
10893
10894	if (!spec->adc_nids && spec->input_mux) {
10895		int i, j;
10896		spec->num_adc_nids = 0;
10897		for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
10898			const struct hda_input_mux *imux = spec->input_mux;
10899			hda_nid_t cap;
10900			hda_nid_t items[16];
10901			hda_nid_t nid = alc882_adc_nids[i];
10902			unsigned int wcap = get_wcaps(codec, nid);
10903			/* get type */
10904			wcap = get_wcaps_type(wcap);
10905			if (wcap != AC_WID_AUD_IN)
10906				continue;
10907			spec->private_adc_nids[spec->num_adc_nids] = nid;
10908			err = snd_hda_get_connections(codec, nid, &cap, 1);
10909			if (err < 0)
10910				continue;
10911			err = snd_hda_get_connections(codec, cap, items,
10912						      ARRAY_SIZE(items));
10913			if (err < 0)
10914				continue;
10915			for (j = 0; j < imux->num_items; j++)
10916				if (imux->items[j].index >= err)
10917					break;
10918			if (j < imux->num_items)
10919				continue;
10920			spec->private_capsrc_nids[spec->num_adc_nids] = cap;
10921			spec->num_adc_nids++;
10922		}
10923		spec->adc_nids = spec->private_adc_nids;
10924		spec->capsrc_nids = spec->private_capsrc_nids;
10925	}
10926
10927	set_capture_mixer(codec);
10928
10929	if (has_cdefine_beep(codec))
10930		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10931
10932	if (board_config == ALC882_AUTO)
10933		alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 0);
10934
10935	spec->vmaster_nid = 0x0c;
10936
10937	codec->patch_ops = alc_patch_ops;
10938	if (board_config == ALC882_AUTO)
10939		spec->init_hook = alc882_auto_init;
10940#ifdef CONFIG_SND_HDA_POWER_SAVE
10941	if (!spec->loopback.amplist)
10942		spec->loopback.amplist = alc882_loopbacks;
10943#endif
10944
10945	return 0;
10946}
10947
10948
10949/*
10950 * ALC262 support
10951 */
10952
10953#define ALC262_DIGOUT_NID	ALC880_DIGOUT_NID
10954#define ALC262_DIGIN_NID	ALC880_DIGIN_NID
10955
10956#define alc262_dac_nids		alc260_dac_nids
10957#define alc262_adc_nids		alc882_adc_nids
10958#define alc262_adc_nids_alt	alc882_adc_nids_alt
10959#define alc262_capsrc_nids	alc882_capsrc_nids
10960#define alc262_capsrc_nids_alt	alc882_capsrc_nids_alt
10961
10962#define alc262_modes		alc260_modes
10963#define alc262_capture_source	alc882_capture_source
10964
10965static hda_nid_t alc262_dmic_adc_nids[1] = {
10966	/* ADC0 */
10967	0x09
10968};
10969
10970static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
10971
10972static struct snd_kcontrol_new alc262_base_mixer[] = {
10973	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10974	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10975	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10976	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10977	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10978	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10979	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10980	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10981	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10982	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10983	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10984	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10985	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
10986	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10987	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
10988	HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
10989	{ } /* end */
10990};
10991
10992/* update HP, line and mono-out pins according to the master switch */
10993static void alc262_hp_master_update(struct hda_codec *codec)
10994{
10995	struct alc_spec *spec = codec->spec;
10996	int val = spec->master_sw;
10997
10998	/* HP & line-out */
10999	snd_hda_codec_write_cache(codec, 0x1b, 0,
11000				  AC_VERB_SET_PIN_WIDGET_CONTROL,
11001				  val ? PIN_HP : 0);
11002	snd_hda_codec_write_cache(codec, 0x15, 0,
11003				  AC_VERB_SET_PIN_WIDGET_CONTROL,
11004				  val ? PIN_HP : 0);
11005	/* mono (speaker) depending on the HP jack sense */
11006	val = val && !spec->jack_present;
11007	snd_hda_codec_write_cache(codec, 0x16, 0,
11008				  AC_VERB_SET_PIN_WIDGET_CONTROL,
11009				  val ? PIN_OUT : 0);
11010}
11011
11012static void alc262_hp_bpc_automute(struct hda_codec *codec)
11013{
11014	struct alc_spec *spec = codec->spec;
11015
11016	spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
11017	alc262_hp_master_update(codec);
11018}
11019
11020static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
11021{
11022	if ((res >> 26) != ALC880_HP_EVENT)
11023		return;
11024	alc262_hp_bpc_automute(codec);
11025}
11026
11027static void alc262_hp_wildwest_automute(struct hda_codec *codec)
11028{
11029	struct alc_spec *spec = codec->spec;
11030
11031	spec->jack_present = snd_hda_jack_detect(codec, 0x15);
11032	alc262_hp_master_update(codec);
11033}
11034
11035static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
11036					   unsigned int res)
11037{
11038	if ((res >> 26) != ALC880_HP_EVENT)
11039		return;
11040	alc262_hp_wildwest_automute(codec);
11041}
11042
11043#define alc262_hp_master_sw_get		alc260_hp_master_sw_get
11044
11045static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
11046				   struct snd_ctl_elem_value *ucontrol)
11047{
11048	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11049	struct alc_spec *spec = codec->spec;
11050	int val = !!*ucontrol->value.integer.value;
11051
11052	if (val == spec->master_sw)
11053		return 0;
11054	spec->master_sw = val;
11055	alc262_hp_master_update(codec);
11056	return 1;
11057}
11058
11059#define ALC262_HP_MASTER_SWITCH					\
11060	{							\
11061		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		\
11062		.name = "Master Playback Switch",		\
11063		.info = snd_ctl_boolean_mono_info,		\
11064		.get = alc262_hp_master_sw_get,			\
11065		.put = alc262_hp_master_sw_put,			\
11066	}, \
11067	{							\
11068		.iface = NID_MAPPING,				\
11069		.name = "Master Playback Switch",		\
11070		.private_value = 0x15 | (0x16 << 8) | (0x1b << 16),	\
11071	}
11072
11073
11074static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
11075	ALC262_HP_MASTER_SWITCH,
11076	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11077	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11078	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
11079	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
11080			      HDA_OUTPUT),
11081	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
11082			    HDA_OUTPUT),
11083	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11084	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11085	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11086	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11087	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11088	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11089	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11090	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11091	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11092	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11093	HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
11094	HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
11095	{ } /* end */
11096};
11097
11098static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
11099	ALC262_HP_MASTER_SWITCH,
11100	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11101	HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
11102	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11103	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11104	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
11105			      HDA_OUTPUT),
11106	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
11107			    HDA_OUTPUT),
11108	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
11109	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
11110	HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
11111	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
11112	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
11113	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11114	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11115	{ } /* end */
11116};
11117
11118static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
11119	HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11120	HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11121	HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
11122	{ } /* end */
11123};
11124
11125/* mute/unmute internal speaker according to the hp jack and mute state */
11126static void alc262_hp_t5735_setup(struct hda_codec *codec)
11127{
11128	struct alc_spec *spec = codec->spec;
11129
11130	spec->autocfg.hp_pins[0] = 0x15;
11131	spec->autocfg.speaker_pins[0] = 0x14;
11132}
11133
11134static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
11135	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11136	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11137	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11138	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11139	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11140	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11141	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11142	{ } /* end */
11143};
11144
11145static struct hda_verb alc262_hp_t5735_verbs[] = {
11146	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11147	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11148
11149	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11150	{ }
11151};
11152
11153static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
11154	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11155	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
11156	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
11157	HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
11158	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
11159	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
11160	{ } /* end */
11161};
11162
11163static struct hda_verb alc262_hp_rp5700_verbs[] = {
11164	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11165	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11166	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11167	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11168	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11169	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11170	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11171	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11172	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
11173	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
11174	{}
11175};
11176
11177static struct hda_input_mux alc262_hp_rp5700_capture_source = {
11178	.num_items = 1,
11179	.items = {
11180		{ "Line", 0x1 },
11181	},
11182};
11183
11184/* bind hp and internal speaker mute (with plug check) as master switch */
11185static void alc262_hippo_master_update(struct hda_codec *codec)
11186{
11187	struct alc_spec *spec = codec->spec;
11188	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
11189	hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
11190	hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
11191	unsigned int mute;
11192
11193	/* HP */
11194	mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
11195	snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
11196				 HDA_AMP_MUTE, mute);
11197	/* mute internal speaker per jack sense */
11198	if (spec->jack_present)
11199		mute = HDA_AMP_MUTE;
11200	if (line_nid)
11201		snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
11202					 HDA_AMP_MUTE, mute);
11203	if (speaker_nid && speaker_nid != line_nid)
11204		snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
11205					 HDA_AMP_MUTE, mute);
11206}
11207
11208#define alc262_hippo_master_sw_get	alc262_hp_master_sw_get
11209
11210static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
11211				      struct snd_ctl_elem_value *ucontrol)
11212{
11213	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11214	struct alc_spec *spec = codec->spec;
11215	int val = !!*ucontrol->value.integer.value;
11216
11217	if (val == spec->master_sw)
11218		return 0;
11219	spec->master_sw = val;
11220	alc262_hippo_master_update(codec);
11221	return 1;
11222}
11223
11224#define ALC262_HIPPO_MASTER_SWITCH				\
11225	{							\
11226		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		\
11227		.name = "Master Playback Switch",		\
11228		.info = snd_ctl_boolean_mono_info,		\
11229		.get = alc262_hippo_master_sw_get,		\
11230		.put = alc262_hippo_master_sw_put,		\
11231	},							\
11232	{							\
11233		.iface = NID_MAPPING,				\
11234		.name = "Master Playback Switch",		\
11235		.subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
11236			     (SUBDEV_SPEAKER(0) << 16), \
11237	}
11238
11239static struct snd_kcontrol_new alc262_hippo_mixer[] = {
11240	ALC262_HIPPO_MASTER_SWITCH,
11241	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11242	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11243	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11244	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11245	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11246	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11247	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11248	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11249	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11250	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11251	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11252	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11253	{ } /* end */
11254};
11255
11256static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
11257	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11258	ALC262_HIPPO_MASTER_SWITCH,
11259	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11260	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11261	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11262	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11263	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11264	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11265	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11266	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11267	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11268	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11269	{ } /* end */
11270};
11271
11272/* mute/unmute internal speaker according to the hp jack and mute state */
11273static void alc262_hippo_automute(struct hda_codec *codec)
11274{
11275	struct alc_spec *spec = codec->spec;
11276	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
11277
11278	spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
11279	alc262_hippo_master_update(codec);
11280}
11281
11282static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
11283{
11284	if ((res >> 26) != ALC880_HP_EVENT)
11285		return;
11286	alc262_hippo_automute(codec);
11287}
11288
11289static void alc262_hippo_setup(struct hda_codec *codec)
11290{
11291	struct alc_spec *spec = codec->spec;
11292
11293	spec->autocfg.hp_pins[0] = 0x15;
11294	spec->autocfg.speaker_pins[0] = 0x14;
11295}
11296
11297static void alc262_hippo1_setup(struct hda_codec *codec)
11298{
11299	struct alc_spec *spec = codec->spec;
11300
11301	spec->autocfg.hp_pins[0] = 0x1b;
11302	spec->autocfg.speaker_pins[0] = 0x14;
11303}
11304
11305
11306static struct snd_kcontrol_new alc262_sony_mixer[] = {
11307	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11308	ALC262_HIPPO_MASTER_SWITCH,
11309	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11310	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11311	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11312	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11313	{ } /* end */
11314};
11315
11316static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
11317	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11318	ALC262_HIPPO_MASTER_SWITCH,
11319	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11320	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11321	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11322	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11323	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11324	{ } /* end */
11325};
11326
11327static struct snd_kcontrol_new alc262_tyan_mixer[] = {
11328	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11329	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11330	HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
11331	HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
11332	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11333	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11334	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11335	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11336	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11337	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11338	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11339	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11340	{ } /* end */
11341};
11342
11343static struct hda_verb alc262_tyan_verbs[] = {
11344	/* Headphone automute */
11345	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11346	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11347	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11348
11349	/* P11 AUX_IN, white 4-pin connector */
11350	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11351	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
11352	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
11353	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
11354
11355	{}
11356};
11357
11358/* unsolicited event for HP jack sensing */
11359static void alc262_tyan_setup(struct hda_codec *codec)
11360{
11361	struct alc_spec *spec = codec->spec;
11362
11363	spec->autocfg.hp_pins[0] = 0x1b;
11364	spec->autocfg.speaker_pins[0] = 0x15;
11365}
11366
11367
11368#define alc262_capture_mixer		alc882_capture_mixer
11369#define alc262_capture_alt_mixer	alc882_capture_alt_mixer
11370
11371/*
11372 * generic initialization of ADC, input mixers and output mixers
11373 */
11374static struct hda_verb alc262_init_verbs[] = {
11375	/*
11376	 * Unmute ADC0-2 and set the default input to mic-in
11377	 */
11378	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11379	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11380	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11381	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11382	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11383	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11384
11385	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11386	 * mixer widget
11387	 * Note: PASD motherboards uses the Line In 2 as the input for
11388	 * front panel mic (mic 2)
11389	 */
11390	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11391	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11392	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11393	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11394	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11395	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11396
11397	/*
11398	 * Set up output mixers (0x0c - 0x0e)
11399	 */
11400	/* set vol=0 to output mixers */
11401	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11402	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11403	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11404	/* set up input amps for analog loopback */
11405	/* Amp Indices: DAC = 0, mixer = 1 */
11406	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11407	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11408	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11409	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11410	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11411	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11412
11413	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11414	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11415	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11416	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11417	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11418	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11419
11420	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11421	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11422	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11423	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11424	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11425
11426	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11427	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11428
11429	/* FIXME: use matrix-type input source selection */
11430	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11431	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11432	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11433	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11434	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11435	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11436	/* Input mixer2 */
11437	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11438	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11439	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11440	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11441	/* Input mixer3 */
11442	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11443	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11444	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11445	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11446
11447	{ }
11448};
11449
11450static struct hda_verb alc262_eapd_verbs[] = {
11451	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
11452	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
11453	{ }
11454};
11455
11456static struct hda_verb alc262_hippo1_unsol_verbs[] = {
11457	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11458	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11459	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11460
11461	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11462	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11463	{}
11464};
11465
11466static struct hda_verb alc262_sony_unsol_verbs[] = {
11467	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11468	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11469	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},	// Front Mic
11470
11471	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11472	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11473	{}
11474};
11475
11476static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
11477	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11478	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11479	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11480	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11481	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11482	{ } /* end */
11483};
11484
11485static struct hda_verb alc262_toshiba_s06_verbs[] = {
11486	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11487	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11488	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11489	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11490	{0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
11491	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11492	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
11493	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11494	{}
11495};
11496
11497static void alc262_toshiba_s06_setup(struct hda_codec *codec)
11498{
11499	struct alc_spec *spec = codec->spec;
11500
11501	spec->autocfg.hp_pins[0] = 0x15;
11502	spec->autocfg.speaker_pins[0] = 0x14;
11503	spec->ext_mic.pin = 0x18;
11504	spec->ext_mic.mux_idx = 0;
11505	spec->int_mic.pin = 0x12;
11506	spec->int_mic.mux_idx = 9;
11507	spec->auto_mic = 1;
11508}
11509
11510/*
11511 * nec model
11512 *  0x15 = headphone
11513 *  0x16 = internal speaker
11514 *  0x18 = external mic
11515 */
11516
11517static struct snd_kcontrol_new alc262_nec_mixer[] = {
11518	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
11519	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
11520
11521	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11522	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11523	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11524
11525	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11526	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11527	{ } /* end */
11528};
11529
11530static struct hda_verb alc262_nec_verbs[] = {
11531	/* Unmute Speaker */
11532	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11533
11534	/* Headphone */
11535	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11536	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11537
11538	/* External mic to headphone */
11539	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11540	/* External mic to speaker */
11541	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11542	{}
11543};
11544
11545/*
11546 * fujitsu model
11547 *  0x14 = headphone/spdif-out, 0x15 = internal speaker,
11548 *  0x1b = port replicator headphone out
11549 */
11550
11551#define ALC_HP_EVENT	0x37
11552
11553static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
11554	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11555	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11556	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11557	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11558	{}
11559};
11560
11561static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
11562	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11563	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11564	{}
11565};
11566
11567static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
11568	/* Front Mic pin: input vref at 50% */
11569	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
11570	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11571	{}
11572};
11573
11574static struct hda_input_mux alc262_fujitsu_capture_source = {
11575	.num_items = 3,
11576	.items = {
11577		{ "Mic", 0x0 },
11578		{ "Int Mic", 0x1 },
11579		{ "CD", 0x4 },
11580	},
11581};
11582
11583static struct hda_input_mux alc262_HP_capture_source = {
11584	.num_items = 5,
11585	.items = {
11586		{ "Mic", 0x0 },
11587		{ "Front Mic", 0x1 },
11588		{ "Line", 0x2 },
11589		{ "CD", 0x4 },
11590		{ "AUX IN", 0x6 },
11591	},
11592};
11593
11594static struct hda_input_mux alc262_HP_D7000_capture_source = {
11595	.num_items = 4,
11596	.items = {
11597		{ "Mic", 0x0 },
11598		{ "Front Mic", 0x2 },
11599		{ "Line", 0x1 },
11600		{ "CD", 0x4 },
11601	},
11602};
11603
11604/* mute/unmute internal speaker according to the hp jacks and mute state */
11605static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
11606{
11607	struct alc_spec *spec = codec->spec;
11608	unsigned int mute;
11609
11610	if (force || !spec->sense_updated) {
11611		spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
11612				     snd_hda_jack_detect(codec, 0x1b);
11613		spec->sense_updated = 1;
11614	}
11615	/* unmute internal speaker only if both HPs are unplugged and
11616	 * master switch is on
11617	 */
11618	if (spec->jack_present)
11619		mute = HDA_AMP_MUTE;
11620	else
11621		mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
11622	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11623				 HDA_AMP_MUTE, mute);
11624}
11625
11626/* unsolicited event for HP jack sensing */
11627static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
11628				       unsigned int res)
11629{
11630	if ((res >> 26) != ALC_HP_EVENT)
11631		return;
11632	alc262_fujitsu_automute(codec, 1);
11633}
11634
11635static void alc262_fujitsu_init_hook(struct hda_codec *codec)
11636{
11637	alc262_fujitsu_automute(codec, 1);
11638}
11639
11640/* bind volumes of both NID 0x0c and 0x0d */
11641static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
11642	.ops = &snd_hda_bind_vol,
11643	.values = {
11644		HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
11645		HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
11646		0
11647	},
11648};
11649
11650/* mute/unmute internal speaker according to the hp jack and mute state */
11651static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
11652{
11653	struct alc_spec *spec = codec->spec;
11654	unsigned int mute;
11655
11656	if (force || !spec->sense_updated) {
11657		spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
11658		spec->sense_updated = 1;
11659	}
11660	if (spec->jack_present) {
11661		/* mute internal speaker */
11662		snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11663					 HDA_AMP_MUTE, HDA_AMP_MUTE);
11664		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11665					 HDA_AMP_MUTE, HDA_AMP_MUTE);
11666	} else {
11667		/* unmute internal speaker if necessary */
11668		mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
11669		snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11670					 HDA_AMP_MUTE, mute);
11671		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11672					 HDA_AMP_MUTE, mute);
11673	}
11674}
11675
11676/* unsolicited event for HP jack sensing */
11677static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
11678				       unsigned int res)
11679{
11680	if ((res >> 26) != ALC_HP_EVENT)
11681		return;
11682	alc262_lenovo_3000_automute(codec, 1);
11683}
11684
11685static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
11686				  int dir, int idx, long *valp)
11687{
11688	int i, change = 0;
11689
11690	for (i = 0; i < 2; i++, valp++)
11691		change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
11692						   HDA_AMP_MUTE,
11693						   *valp ? 0 : HDA_AMP_MUTE);
11694	return change;
11695}
11696
11697/* bind hp and internal speaker mute (with plug check) */
11698static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
11699					 struct snd_ctl_elem_value *ucontrol)
11700{
11701	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11702	long *valp = ucontrol->value.integer.value;
11703	int change;
11704
11705	change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11706	change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11707	if (change)
11708		alc262_fujitsu_automute(codec, 0);
11709	return change;
11710}
11711
11712static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
11713	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11714	{
11715		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11716		.name = "Master Playback Switch",
11717		.subdevice = HDA_SUBDEV_AMP_FLAG,
11718		.info = snd_hda_mixer_amp_switch_info,
11719		.get = snd_hda_mixer_amp_switch_get,
11720		.put = alc262_fujitsu_master_sw_put,
11721		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11722	},
11723	{
11724		.iface = NID_MAPPING,
11725		.name = "Master Playback Switch",
11726		.private_value = 0x1b,
11727	},
11728	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11729	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11730	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11731	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11732	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11733	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11734	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11735	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11736	{ } /* end */
11737};
11738
11739/* bind hp and internal speaker mute (with plug check) */
11740static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
11741					 struct snd_ctl_elem_value *ucontrol)
11742{
11743	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11744	long *valp = ucontrol->value.integer.value;
11745	int change;
11746
11747	change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11748	if (change)
11749		alc262_lenovo_3000_automute(codec, 0);
11750	return change;
11751}
11752
11753static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
11754	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11755	{
11756		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11757		.name = "Master Playback Switch",
11758		.subdevice = HDA_SUBDEV_AMP_FLAG,
11759		.info = snd_hda_mixer_amp_switch_info,
11760		.get = snd_hda_mixer_amp_switch_get,
11761		.put = alc262_lenovo_3000_master_sw_put,
11762		.private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
11763	},
11764	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11765	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11766	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11767	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11768	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11769	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11770	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11771	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11772	{ } /* end */
11773};
11774
11775static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11776	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11777	ALC262_HIPPO_MASTER_SWITCH,
11778	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11779	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11780	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11781	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11782	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11783	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11784	{ } /* end */
11785};
11786
11787/* additional init verbs for Benq laptops */
11788static struct hda_verb alc262_EAPD_verbs[] = {
11789	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11790	{0x20, AC_VERB_SET_PROC_COEF,  0x3070},
11791	{}
11792};
11793
11794static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11795	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11796	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11797
11798	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11799	{0x20, AC_VERB_SET_PROC_COEF,  0x3050},
11800	{}
11801};
11802
11803/* Samsung Q1 Ultra Vista model setup */
11804static struct snd_kcontrol_new alc262_ultra_mixer[] = {
11805	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11806	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11807	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11808	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11809	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
11810	HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
11811	{ } /* end */
11812};
11813
11814static struct hda_verb alc262_ultra_verbs[] = {
11815	/* output mixer */
11816	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11817	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11818	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11819	/* speaker */
11820	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11821	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11822	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11823	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11824	/* HP */
11825	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11826	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11827	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11828	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11829	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11830	/* internal mic */
11831	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11832	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11833	/* ADC, choose mic */
11834	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11835	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11836	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11837	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11838	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11839	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11840	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11841	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11842	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11843	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
11844	{}
11845};
11846
11847/* mute/unmute internal speaker according to the hp jack and mute state */
11848static void alc262_ultra_automute(struct hda_codec *codec)
11849{
11850	struct alc_spec *spec = codec->spec;
11851	unsigned int mute;
11852
11853	mute = 0;
11854	/* auto-mute only when HP is used as HP */
11855	if (!spec->cur_mux[0]) {
11856		spec->jack_present = snd_hda_jack_detect(codec, 0x15);
11857		if (spec->jack_present)
11858			mute = HDA_AMP_MUTE;
11859	}
11860	/* mute/unmute internal speaker */
11861	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11862				 HDA_AMP_MUTE, mute);
11863	/* mute/unmute HP */
11864	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11865				 HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
11866}
11867
11868/* unsolicited event for HP jack sensing */
11869static void alc262_ultra_unsol_event(struct hda_codec *codec,
11870				       unsigned int res)
11871{
11872	if ((res >> 26) != ALC880_HP_EVENT)
11873		return;
11874	alc262_ultra_automute(codec);
11875}
11876
11877static struct hda_input_mux alc262_ultra_capture_source = {
11878	.num_items = 2,
11879	.items = {
11880		{ "Mic", 0x1 },
11881		{ "Headphone", 0x7 },
11882	},
11883};
11884
11885static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
11886				     struct snd_ctl_elem_value *ucontrol)
11887{
11888	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11889	struct alc_spec *spec = codec->spec;
11890	int ret;
11891
11892	ret = alc_mux_enum_put(kcontrol, ucontrol);
11893	if (!ret)
11894		return 0;
11895	/* reprogram the HP pin as mic or HP according to the input source */
11896	snd_hda_codec_write_cache(codec, 0x15, 0,
11897				  AC_VERB_SET_PIN_WIDGET_CONTROL,
11898				  spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
11899	alc262_ultra_automute(codec); /* mute/unmute HP */
11900	return ret;
11901}
11902
11903static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
11904	HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
11905	HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
11906	{
11907		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11908		.name = "Capture Source",
11909		.info = alc_mux_enum_info,
11910		.get = alc_mux_enum_get,
11911		.put = alc262_ultra_mux_enum_put,
11912	},
11913	{
11914		.iface = NID_MAPPING,
11915		.name = "Capture Source",
11916		.private_value = 0x15,
11917	},
11918	{ } /* end */
11919};
11920
11921/* We use two mixers depending on the output pin; 0x16 is a mono output
11922 * and thus it's bound with a different mixer.
11923 * This function returns which mixer amp should be used.
11924 */
11925static int alc262_check_volbit(hda_nid_t nid)
11926{
11927	if (!nid)
11928		return 0;
11929	else if (nid == 0x16)
11930		return 2;
11931	else
11932		return 1;
11933}
11934
11935static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
11936				  const char *pfx, int *vbits, int idx)
11937{
11938	unsigned long val;
11939	int vbit;
11940
11941	vbit = alc262_check_volbit(nid);
11942	if (!vbit)
11943		return 0;
11944	if (*vbits & vbit) /* a volume control for this mixer already there */
11945		return 0;
11946	*vbits |= vbit;
11947	if (vbit == 2)
11948		val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
11949	else
11950		val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
11951	return __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, idx, val);
11952}
11953
11954static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
11955				 const char *pfx, int idx)
11956{
11957	unsigned long val;
11958
11959	if (!nid)
11960		return 0;
11961	if (nid == 0x16)
11962		val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
11963	else
11964		val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
11965	return __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, idx, val);
11966}
11967
11968/* add playback controls from the parsed DAC table */
11969static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
11970					     const struct auto_pin_cfg *cfg)
11971{
11972	const char *pfx;
11973	int vbits;
11974	int i, err;
11975
11976	spec->multiout.num_dacs = 1;	/* only use one dac */
11977	spec->multiout.dac_nids = spec->private_dac_nids;
11978	spec->multiout.dac_nids[0] = 2;
11979
11980	if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
11981		pfx = "Master";
11982	else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11983		pfx = "Speaker";
11984	else if (cfg->line_out_type == AUTO_PIN_HP_OUT)
11985		pfx = "Headphone";
11986	else
11987		pfx = "Front";
11988	for (i = 0; i < 2; i++) {
11989		err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[i], pfx, i);
11990		if (err < 0)
11991			return err;
11992		if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
11993			err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[i],
11994						    "Speaker", i);
11995			if (err < 0)
11996				return err;
11997		}
11998		if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
11999			err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[i],
12000						    "Headphone", i);
12001			if (err < 0)
12002				return err;
12003		}
12004	}
12005
12006	vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
12007		alc262_check_volbit(cfg->speaker_pins[0]) |
12008		alc262_check_volbit(cfg->hp_pins[0]);
12009	if (vbits == 1 || vbits == 2)
12010		pfx = "Master"; /* only one mixer is used */
12011	vbits = 0;
12012	for (i = 0; i < 2; i++) {
12013		err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[i], pfx,
12014					     &vbits, i);
12015		if (err < 0)
12016			return err;
12017		if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
12018			err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[i],
12019						     "Speaker", &vbits, i);
12020			if (err < 0)
12021				return err;
12022		}
12023		if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
12024			err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[i],
12025						     "Headphone", &vbits, i);
12026			if (err < 0)
12027				return err;
12028		}
12029	}
12030	return 0;
12031}
12032
12033#define alc262_auto_create_input_ctls \
12034	alc882_auto_create_input_ctls
12035
12036/*
12037 * generic initialization of ADC, input mixers and output mixers
12038 */
12039static struct hda_verb alc262_volume_init_verbs[] = {
12040	/*
12041	 * Unmute ADC0-2 and set the default input to mic-in
12042	 */
12043	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
12044	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12045	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
12046	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12047	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
12048	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12049
12050	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
12051	 * mixer widget
12052	 * Note: PASD motherboards uses the Line In 2 as the input for
12053	 * front panel mic (mic 2)
12054	 */
12055	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
12056	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
12057	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12058	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
12059	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
12060	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
12061
12062	/*
12063	 * Set up output mixers (0x0c - 0x0f)
12064	 */
12065	/* set vol=0 to output mixers */
12066	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12067	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12068	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12069
12070	/* set up input amps for analog loopback */
12071	/* Amp Indices: DAC = 0, mixer = 1 */
12072	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12073	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12074	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12075	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12076	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12077	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12078
12079	/* FIXME: use matrix-type input source selection */
12080	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
12081	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
12082	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12083	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12084	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12085	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12086	/* Input mixer2 */
12087	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12088	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12089	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12090	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12091	/* Input mixer3 */
12092	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12093	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12094	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12095	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12096
12097	{ }
12098};
12099
12100static struct hda_verb alc262_HP_BPC_init_verbs[] = {
12101	/*
12102	 * Unmute ADC0-2 and set the default input to mic-in
12103	 */
12104	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
12105	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12106	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
12107	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12108	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
12109	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12110
12111	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
12112	 * mixer widget
12113	 * Note: PASD motherboards uses the Line In 2 as the input for
12114	 * front panel mic (mic 2)
12115	 */
12116	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
12117	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
12118	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12119	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
12120	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
12121	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
12122	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
12123        {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
12124
12125	/*
12126	 * Set up output mixers (0x0c - 0x0e)
12127	 */
12128	/* set vol=0 to output mixers */
12129	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12130	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12131	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12132
12133	/* set up input amps for analog loopback */
12134	/* Amp Indices: DAC = 0, mixer = 1 */
12135	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12136	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12137	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12138	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12139	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12140	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12141
12142	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12143	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
12144	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
12145
12146	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12147	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12148
12149	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
12150	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
12151
12152	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12153	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12154        {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12155	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12156	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12157
12158	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12159	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12160        {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12161	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12162	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12163	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12164
12165
12166	/* FIXME: use matrix-type input source selection */
12167	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
12168	/* Input mixer1: only unmute Mic */
12169	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12170	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
12171	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12172	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12173	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12174	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
12175	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
12176	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
12177	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
12178	/* Input mixer2 */
12179	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12180	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
12181	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12182	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12183	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12184	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
12185	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
12186	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
12187	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
12188	/* Input mixer3 */
12189	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12190	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
12191	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12192	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12193	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12194	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
12195	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
12196	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
12197	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
12198
12199	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12200
12201	{ }
12202};
12203
12204static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
12205	/*
12206	 * Unmute ADC0-2 and set the default input to mic-in
12207	 */
12208	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
12209	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12210	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
12211	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12212	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
12213	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12214
12215	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
12216	 * mixer widget
12217	 * Note: PASD motherboards uses the Line In 2 as the input for front
12218	 * panel mic (mic 2)
12219	 */
12220	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
12221	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
12222	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12223	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
12224	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
12225	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
12226	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
12227	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
12228	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
12229	/*
12230	 * Set up output mixers (0x0c - 0x0e)
12231	 */
12232	/* set vol=0 to output mixers */
12233	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12234	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12235	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12236
12237	/* set up input amps for analog loopback */
12238	/* Amp Indices: DAC = 0, mixer = 1 */
12239	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12240	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12241	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12242	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12243	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12244	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12245
12246
12247	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* HP */
12248	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Mono */
12249	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* rear MIC */
12250	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* Line in */
12251	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* Front MIC */
12252	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Line out */
12253	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* CD in */
12254
12255	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12256	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12257
12258	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
12259	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
12260
12261	/* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
12262	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12263	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12264	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
12265	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12266	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12267
12268	/* FIXME: use matrix-type input source selection */
12269	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
12270	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
12271	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
12272	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
12273	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
12274	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
12275	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
12276        /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))},  */
12277	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
12278	/* Input mixer2 */
12279	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12280	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
12281	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
12282	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
12283	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
12284        /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
12285	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
12286	/* Input mixer3 */
12287	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12288	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
12289	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
12290	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
12291	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
12292        /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
12293	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
12294
12295	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12296
12297	{ }
12298};
12299
12300static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
12301
12302	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Front Speaker */
12303	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12304	{0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
12305
12306	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* MIC jack */
12307	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* Front MIC */
12308	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
12309	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
12310
12311	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* HP  jack */
12312	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
12313	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
12314	{}
12315};
12316
12317/*
12318 * Pin config fixes
12319 */
12320enum {
12321	PINFIX_FSC_H270,
12322};
12323
12324static const struct alc_fixup alc262_fixups[] = {
12325	[PINFIX_FSC_H270] = {
12326		.pins = (const struct alc_pincfg[]) {
12327			{ 0x14, 0x99130110 }, /* speaker */
12328			{ 0x15, 0x0221142f }, /* front HP */
12329			{ 0x1b, 0x0121141f }, /* rear HP */
12330			{ }
12331		}
12332	},
12333	[PINFIX_PB_M5210] = {
12334		.verbs = (const struct hda_verb[]) {
12335			{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 },
12336			{}
12337		}
12338	},
12339};
12340
12341static struct snd_pci_quirk alc262_fixup_tbl[] = {
12342	SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", PINFIX_FSC_H270),
12343	{}
12344};
12345
12346
12347#ifdef CONFIG_SND_HDA_POWER_SAVE
12348#define alc262_loopbacks	alc880_loopbacks
12349#endif
12350
12351/* pcm configuration: identical with ALC880 */
12352#define alc262_pcm_analog_playback	alc880_pcm_analog_playback
12353#define alc262_pcm_analog_capture	alc880_pcm_analog_capture
12354#define alc262_pcm_digital_playback	alc880_pcm_digital_playback
12355#define alc262_pcm_digital_capture	alc880_pcm_digital_capture
12356
12357/*
12358 * BIOS auto configuration
12359 */
12360static int alc262_parse_auto_config(struct hda_codec *codec)
12361{
12362	struct alc_spec *spec = codec->spec;
12363	int err;
12364	static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
12365
12366	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12367					   alc262_ignore);
12368	if (err < 0)
12369		return err;
12370	if (!spec->autocfg.line_outs) {
12371		if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
12372			spec->multiout.max_channels = 2;
12373			spec->no_analog = 1;
12374			goto dig_only;
12375		}
12376		return 0; /* can't find valid BIOS pin config */
12377	}
12378	err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
12379	if (err < 0)
12380		return err;
12381	err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
12382	if (err < 0)
12383		return err;
12384
12385	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
12386
12387 dig_only:
12388	alc_auto_parse_digital(codec);
12389
12390	if (spec->kctls.list)
12391		add_mixer(spec, spec->kctls.list);
12392
12393	add_verb(spec, alc262_volume_init_verbs);
12394	spec->num_mux_defs = 1;
12395	spec->input_mux = &spec->private_imux[0];
12396
12397	err = alc_auto_add_mic_boost(codec);
12398	if (err < 0)
12399		return err;
12400
12401	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
12402
12403	return 1;
12404}
12405
12406#define alc262_auto_init_multi_out	alc882_auto_init_multi_out
12407#define alc262_auto_init_hp_out		alc882_auto_init_hp_out
12408#define alc262_auto_init_analog_input	alc882_auto_init_analog_input
12409#define alc262_auto_init_input_src	alc882_auto_init_input_src
12410
12411
12412/* init callback for auto-configuration model -- overriding the default init */
12413static void alc262_auto_init(struct hda_codec *codec)
12414{
12415	struct alc_spec *spec = codec->spec;
12416	alc262_auto_init_multi_out(codec);
12417	alc262_auto_init_hp_out(codec);
12418	alc262_auto_init_analog_input(codec);
12419	alc262_auto_init_input_src(codec);
12420	alc_auto_init_digital(codec);
12421	if (spec->unsol_event)
12422		alc_inithook(codec);
12423}
12424
12425/*
12426 * configuration and preset
12427 */
12428static const char *alc262_models[ALC262_MODEL_LAST] = {
12429	[ALC262_BASIC]		= "basic",
12430	[ALC262_HIPPO]		= "hippo",
12431	[ALC262_HIPPO_1]	= "hippo_1",
12432	[ALC262_FUJITSU]	= "fujitsu",
12433	[ALC262_HP_BPC]		= "hp-bpc",
12434	[ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
12435	[ALC262_HP_TC_T5735]	= "hp-tc-t5735",
12436	[ALC262_HP_RP5700]	= "hp-rp5700",
12437	[ALC262_BENQ_ED8]	= "benq",
12438	[ALC262_BENQ_T31]	= "benq-t31",
12439	[ALC262_SONY_ASSAMD]	= "sony-assamd",
12440	[ALC262_TOSHIBA_S06]	= "toshiba-s06",
12441	[ALC262_TOSHIBA_RX1]	= "toshiba-rx1",
12442	[ALC262_ULTRA]		= "ultra",
12443	[ALC262_LENOVO_3000]	= "lenovo-3000",
12444	[ALC262_NEC]		= "nec",
12445	[ALC262_TYAN]		= "tyan",
12446	[ALC262_AUTO]		= "auto",
12447};
12448
12449static struct snd_pci_quirk alc262_cfg_tbl[] = {
12450	SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
12451	SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
12452	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
12453			   ALC262_HP_BPC),
12454	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
12455			   ALC262_HP_BPC),
12456	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
12457			   ALC262_HP_BPC),
12458	SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
12459	SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
12460	SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
12461	SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
12462	SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
12463	SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
12464	SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
12465	SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
12466	SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
12467	SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
12468	SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
12469	SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
12470		      ALC262_HP_TC_T5735),
12471	SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
12472	SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
12473	SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
12474	SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
12475	SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
12476	SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
12477	SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
12478	SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
12479#if 0 /* disable the quirk since model=auto works better in recent versions */
12480	SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
12481			   ALC262_SONY_ASSAMD),
12482#endif
12483	SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
12484		      ALC262_TOSHIBA_RX1),
12485	SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
12486	SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
12487	SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
12488	SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
12489	SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
12490			   ALC262_ULTRA),
12491	SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
12492	SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
12493	SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
12494	SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
12495	SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
12496	{}
12497};
12498
12499static struct alc_config_preset alc262_presets[] = {
12500	[ALC262_BASIC] = {
12501		.mixers = { alc262_base_mixer },
12502		.init_verbs = { alc262_init_verbs },
12503		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12504		.dac_nids = alc262_dac_nids,
12505		.hp_nid = 0x03,
12506		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12507		.channel_mode = alc262_modes,
12508		.input_mux = &alc262_capture_source,
12509	},
12510	[ALC262_HIPPO] = {
12511		.mixers = { alc262_hippo_mixer },
12512		.init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
12513		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12514		.dac_nids = alc262_dac_nids,
12515		.hp_nid = 0x03,
12516		.dig_out_nid = ALC262_DIGOUT_NID,
12517		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12518		.channel_mode = alc262_modes,
12519		.input_mux = &alc262_capture_source,
12520		.unsol_event = alc262_hippo_unsol_event,
12521		.setup = alc262_hippo_setup,
12522		.init_hook = alc262_hippo_automute,
12523	},
12524	[ALC262_HIPPO_1] = {
12525		.mixers = { alc262_hippo1_mixer },
12526		.init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
12527		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12528		.dac_nids = alc262_dac_nids,
12529		.hp_nid = 0x02,
12530		.dig_out_nid = ALC262_DIGOUT_NID,
12531		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12532		.channel_mode = alc262_modes,
12533		.input_mux = &alc262_capture_source,
12534		.unsol_event = alc262_hippo_unsol_event,
12535		.setup = alc262_hippo1_setup,
12536		.init_hook = alc262_hippo_automute,
12537	},
12538	[ALC262_FUJITSU] = {
12539		.mixers = { alc262_fujitsu_mixer },
12540		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12541				alc262_fujitsu_unsol_verbs },
12542		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12543		.dac_nids = alc262_dac_nids,
12544		.hp_nid = 0x03,
12545		.dig_out_nid = ALC262_DIGOUT_NID,
12546		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12547		.channel_mode = alc262_modes,
12548		.input_mux = &alc262_fujitsu_capture_source,
12549		.unsol_event = alc262_fujitsu_unsol_event,
12550		.init_hook = alc262_fujitsu_init_hook,
12551	},
12552	[ALC262_HP_BPC] = {
12553		.mixers = { alc262_HP_BPC_mixer },
12554		.init_verbs = { alc262_HP_BPC_init_verbs },
12555		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12556		.dac_nids = alc262_dac_nids,
12557		.hp_nid = 0x03,
12558		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12559		.channel_mode = alc262_modes,
12560		.input_mux = &alc262_HP_capture_source,
12561		.unsol_event = alc262_hp_bpc_unsol_event,
12562		.init_hook = alc262_hp_bpc_automute,
12563	},
12564	[ALC262_HP_BPC_D7000_WF] = {
12565		.mixers = { alc262_HP_BPC_WildWest_mixer },
12566		.init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12567		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12568		.dac_nids = alc262_dac_nids,
12569		.hp_nid = 0x03,
12570		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12571		.channel_mode = alc262_modes,
12572		.input_mux = &alc262_HP_D7000_capture_source,
12573		.unsol_event = alc262_hp_wildwest_unsol_event,
12574		.init_hook = alc262_hp_wildwest_automute,
12575	},
12576	[ALC262_HP_BPC_D7000_WL] = {
12577		.mixers = { alc262_HP_BPC_WildWest_mixer,
12578			    alc262_HP_BPC_WildWest_option_mixer },
12579		.init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12580		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12581		.dac_nids = alc262_dac_nids,
12582		.hp_nid = 0x03,
12583		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12584		.channel_mode = alc262_modes,
12585		.input_mux = &alc262_HP_D7000_capture_source,
12586		.unsol_event = alc262_hp_wildwest_unsol_event,
12587		.init_hook = alc262_hp_wildwest_automute,
12588	},
12589	[ALC262_HP_TC_T5735] = {
12590		.mixers = { alc262_hp_t5735_mixer },
12591		.init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
12592		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12593		.dac_nids = alc262_dac_nids,
12594		.hp_nid = 0x03,
12595		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12596		.channel_mode = alc262_modes,
12597		.input_mux = &alc262_capture_source,
12598		.unsol_event = alc_sku_unsol_event,
12599		.setup = alc262_hp_t5735_setup,
12600		.init_hook = alc_inithook,
12601	},
12602	[ALC262_HP_RP5700] = {
12603		.mixers = { alc262_hp_rp5700_mixer },
12604		.init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
12605		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12606		.dac_nids = alc262_dac_nids,
12607		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12608		.channel_mode = alc262_modes,
12609		.input_mux = &alc262_hp_rp5700_capture_source,
12610        },
12611	[ALC262_BENQ_ED8] = {
12612		.mixers = { alc262_base_mixer },
12613		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
12614		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12615		.dac_nids = alc262_dac_nids,
12616		.hp_nid = 0x03,
12617		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12618		.channel_mode = alc262_modes,
12619		.input_mux = &alc262_capture_source,
12620	},
12621	[ALC262_SONY_ASSAMD] = {
12622		.mixers = { alc262_sony_mixer },
12623		.init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
12624		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12625		.dac_nids = alc262_dac_nids,
12626		.hp_nid = 0x02,
12627		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12628		.channel_mode = alc262_modes,
12629		.input_mux = &alc262_capture_source,
12630		.unsol_event = alc262_hippo_unsol_event,
12631		.setup = alc262_hippo_setup,
12632		.init_hook = alc262_hippo_automute,
12633	},
12634	[ALC262_BENQ_T31] = {
12635		.mixers = { alc262_benq_t31_mixer },
12636		.init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
12637				alc_hp15_unsol_verbs },
12638		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12639		.dac_nids = alc262_dac_nids,
12640		.hp_nid = 0x03,
12641		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12642		.channel_mode = alc262_modes,
12643		.input_mux = &alc262_capture_source,
12644		.unsol_event = alc262_hippo_unsol_event,
12645		.setup = alc262_hippo_setup,
12646		.init_hook = alc262_hippo_automute,
12647	},
12648	[ALC262_ULTRA] = {
12649		.mixers = { alc262_ultra_mixer },
12650		.cap_mixer = alc262_ultra_capture_mixer,
12651		.init_verbs = { alc262_ultra_verbs },
12652		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12653		.dac_nids = alc262_dac_nids,
12654		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12655		.channel_mode = alc262_modes,
12656		.input_mux = &alc262_ultra_capture_source,
12657		.adc_nids = alc262_adc_nids, /* ADC0 */
12658		.capsrc_nids = alc262_capsrc_nids,
12659		.num_adc_nids = 1, /* single ADC */
12660		.unsol_event = alc262_ultra_unsol_event,
12661		.init_hook = alc262_ultra_automute,
12662	},
12663	[ALC262_LENOVO_3000] = {
12664		.mixers = { alc262_lenovo_3000_mixer },
12665		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12666				alc262_lenovo_3000_unsol_verbs,
12667				alc262_lenovo_3000_init_verbs },
12668		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12669		.dac_nids = alc262_dac_nids,
12670		.hp_nid = 0x03,
12671		.dig_out_nid = ALC262_DIGOUT_NID,
12672		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12673		.channel_mode = alc262_modes,
12674		.input_mux = &alc262_fujitsu_capture_source,
12675		.unsol_event = alc262_lenovo_3000_unsol_event,
12676	},
12677	[ALC262_NEC] = {
12678		.mixers = { alc262_nec_mixer },
12679		.init_verbs = { alc262_nec_verbs },
12680		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12681		.dac_nids = alc262_dac_nids,
12682		.hp_nid = 0x03,
12683		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12684		.channel_mode = alc262_modes,
12685		.input_mux = &alc262_capture_source,
12686	},
12687	[ALC262_TOSHIBA_S06] = {
12688		.mixers = { alc262_toshiba_s06_mixer },
12689		.init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
12690							alc262_eapd_verbs },
12691		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12692		.capsrc_nids = alc262_dmic_capsrc_nids,
12693		.dac_nids = alc262_dac_nids,
12694		.adc_nids = alc262_dmic_adc_nids, /* ADC0 */
12695		.num_adc_nids = 1, /* single ADC */
12696		.dig_out_nid = ALC262_DIGOUT_NID,
12697		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12698		.channel_mode = alc262_modes,
12699		.unsol_event = alc_sku_unsol_event,
12700		.setup = alc262_toshiba_s06_setup,
12701		.init_hook = alc_inithook,
12702	},
12703	[ALC262_TOSHIBA_RX1] = {
12704		.mixers = { alc262_toshiba_rx1_mixer },
12705		.init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
12706		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12707		.dac_nids = alc262_dac_nids,
12708		.hp_nid = 0x03,
12709		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12710		.channel_mode = alc262_modes,
12711		.input_mux = &alc262_capture_source,
12712		.unsol_event = alc262_hippo_unsol_event,
12713		.setup = alc262_hippo_setup,
12714		.init_hook = alc262_hippo_automute,
12715	},
12716	[ALC262_TYAN] = {
12717		.mixers = { alc262_tyan_mixer },
12718		.init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
12719		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12720		.dac_nids = alc262_dac_nids,
12721		.hp_nid = 0x02,
12722		.dig_out_nid = ALC262_DIGOUT_NID,
12723		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12724		.channel_mode = alc262_modes,
12725		.input_mux = &alc262_capture_source,
12726		.unsol_event = alc_automute_amp_unsol_event,
12727		.setup = alc262_tyan_setup,
12728		.init_hook = alc_automute_amp,
12729	},
12730};
12731
12732static int patch_alc262(struct hda_codec *codec)
12733{
12734	struct alc_spec *spec;
12735	int board_config;
12736	int err;
12737
12738	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
12739	if (spec == NULL)
12740		return -ENOMEM;
12741
12742	codec->spec = spec;
12743#if 0
12744	/* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
12745	 * under-run
12746	 */
12747	{
12748	int tmp;
12749	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12750	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
12751	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12752	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
12753	}
12754#endif
12755	alc_auto_parse_customize_define(codec);
12756
12757	alc_fix_pll_init(codec, 0x20, 0x0a, 10);
12758
12759	board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
12760						  alc262_models,
12761						  alc262_cfg_tbl);
12762
12763	if (board_config < 0) {
12764		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12765		       codec->chip_name);
12766		board_config = ALC262_AUTO;
12767	}
12768
12769	if (board_config == ALC262_AUTO)
12770		alc_pick_fixup(codec, alc262_fixup_tbl, alc262_fixups, 1);
12771
12772	if (board_config == ALC262_AUTO) {
12773		/* automatic parse from the BIOS config */
12774		err = alc262_parse_auto_config(codec);
12775		if (err < 0) {
12776			alc_free(codec);
12777			return err;
12778		} else if (!err) {
12779			printk(KERN_INFO
12780			       "hda_codec: Cannot set up configuration "
12781			       "from BIOS.  Using base mode...\n");
12782			board_config = ALC262_BASIC;
12783		}
12784	}
12785
12786	if (!spec->no_analog && has_cdefine_beep(codec)) {
12787		err = snd_hda_attach_beep_device(codec, 0x1);
12788		if (err < 0) {
12789			alc_free(codec);
12790			return err;
12791		}
12792	}
12793
12794	if (board_config != ALC262_AUTO)
12795		setup_preset(codec, &alc262_presets[board_config]);
12796
12797	spec->stream_analog_playback = &alc262_pcm_analog_playback;
12798	spec->stream_analog_capture = &alc262_pcm_analog_capture;
12799
12800	spec->stream_digital_playback = &alc262_pcm_digital_playback;
12801	spec->stream_digital_capture = &alc262_pcm_digital_capture;
12802
12803	if (!spec->adc_nids && spec->input_mux) {
12804		int i;
12805		/* check whether the digital-mic has to be supported */
12806		for (i = 0; i < spec->input_mux->num_items; i++) {
12807			if (spec->input_mux->items[i].index >= 9)
12808				break;
12809		}
12810		if (i < spec->input_mux->num_items) {
12811			/* use only ADC0 */
12812			spec->adc_nids = alc262_dmic_adc_nids;
12813			spec->num_adc_nids = 1;
12814			spec->capsrc_nids = alc262_dmic_capsrc_nids;
12815		} else {
12816			/* all analog inputs */
12817			/* check whether NID 0x07 is valid */
12818			unsigned int wcap = get_wcaps(codec, 0x07);
12819
12820			/* get type */
12821			wcap = get_wcaps_type(wcap);
12822			if (wcap != AC_WID_AUD_IN) {
12823				spec->adc_nids = alc262_adc_nids_alt;
12824				spec->num_adc_nids =
12825					ARRAY_SIZE(alc262_adc_nids_alt);
12826				spec->capsrc_nids = alc262_capsrc_nids_alt;
12827			} else {
12828				spec->adc_nids = alc262_adc_nids;
12829				spec->num_adc_nids =
12830					ARRAY_SIZE(alc262_adc_nids);
12831				spec->capsrc_nids = alc262_capsrc_nids;
12832			}
12833		}
12834	}
12835	if (!spec->cap_mixer && !spec->no_analog)
12836		set_capture_mixer(codec);
12837	if (!spec->no_analog && has_cdefine_beep(codec))
12838		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12839
12840	if (board_config == ALC262_AUTO)
12841		alc_pick_fixup(codec, alc262_fixup_tbl, alc262_fixups, 0);
12842
12843	spec->vmaster_nid = 0x0c;
12844
12845	codec->patch_ops = alc_patch_ops;
12846	if (board_config == ALC262_AUTO)
12847		spec->init_hook = alc262_auto_init;
12848#ifdef CONFIG_SND_HDA_POWER_SAVE
12849	if (!spec->loopback.amplist)
12850		spec->loopback.amplist = alc262_loopbacks;
12851#endif
12852
12853	return 0;
12854}
12855
12856/*
12857 *  ALC268 channel source setting (2 channel)
12858 */
12859#define ALC268_DIGOUT_NID	ALC880_DIGOUT_NID
12860#define alc268_modes		alc260_modes
12861
12862static hda_nid_t alc268_dac_nids[2] = {
12863	/* front, hp */
12864	0x02, 0x03
12865};
12866
12867static hda_nid_t alc268_adc_nids[2] = {
12868	/* ADC0-1 */
12869	0x08, 0x07
12870};
12871
12872static hda_nid_t alc268_adc_nids_alt[1] = {
12873	/* ADC0 */
12874	0x08
12875};
12876
12877static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
12878
12879static struct snd_kcontrol_new alc268_base_mixer[] = {
12880	/* output mixer control */
12881	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12882	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12883	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12884	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12885	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12886	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12887	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12888	{ }
12889};
12890
12891static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
12892	/* output mixer control */
12893	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12894	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12895	ALC262_HIPPO_MASTER_SWITCH,
12896	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12897	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12898	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12899	{ }
12900};
12901
12902/* bind Beep switches of both NID 0x0f and 0x10 */
12903static struct hda_bind_ctls alc268_bind_beep_sw = {
12904	.ops = &snd_hda_bind_sw,
12905	.values = {
12906		HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
12907		HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
12908		0
12909	},
12910};
12911
12912static struct snd_kcontrol_new alc268_beep_mixer[] = {
12913	HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
12914	HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
12915	{ }
12916};
12917
12918static struct hda_verb alc268_eapd_verbs[] = {
12919	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
12920	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
12921	{ }
12922};
12923
12924/* Toshiba specific */
12925static struct hda_verb alc268_toshiba_verbs[] = {
12926	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12927	{ } /* end */
12928};
12929
12930/* Acer specific */
12931/* bind volumes of both NID 0x02 and 0x03 */
12932static struct hda_bind_ctls alc268_acer_bind_master_vol = {
12933	.ops = &snd_hda_bind_vol,
12934	.values = {
12935		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
12936		HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
12937		0
12938	},
12939};
12940
12941/* mute/unmute internal speaker according to the hp jack and mute state */
12942static void alc268_acer_automute(struct hda_codec *codec, int force)
12943{
12944	struct alc_spec *spec = codec->spec;
12945	unsigned int mute;
12946
12947	if (force || !spec->sense_updated) {
12948		spec->jack_present = snd_hda_jack_detect(codec, 0x14);
12949		spec->sense_updated = 1;
12950	}
12951	if (spec->jack_present)
12952		mute = HDA_AMP_MUTE; /* mute internal speaker */
12953	else /* unmute internal speaker if necessary */
12954		mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
12955	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
12956				 HDA_AMP_MUTE, mute);
12957}
12958
12959
12960/* bind hp and internal speaker mute (with plug check) */
12961static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
12962				     struct snd_ctl_elem_value *ucontrol)
12963{
12964	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
12965	long *valp = ucontrol->value.integer.value;
12966	int change;
12967
12968	change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
12969	if (change)
12970		alc268_acer_automute(codec, 0);
12971	return change;
12972}
12973
12974static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
12975	/* output mixer control */
12976	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12977	{
12978		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12979		.name = "Master Playback Switch",
12980		.subdevice = HDA_SUBDEV_AMP_FLAG,
12981		.info = snd_hda_mixer_amp_switch_info,
12982		.get = snd_hda_mixer_amp_switch_get,
12983		.put = alc268_acer_master_sw_put,
12984		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12985	},
12986	HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
12987	{ }
12988};
12989
12990static struct snd_kcontrol_new alc268_acer_mixer[] = {
12991	/* output mixer control */
12992	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12993	{
12994		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12995		.name = "Master Playback Switch",
12996		.subdevice = HDA_SUBDEV_AMP_FLAG,
12997		.info = snd_hda_mixer_amp_switch_info,
12998		.get = snd_hda_mixer_amp_switch_get,
12999		.put = alc268_acer_master_sw_put,
13000		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13001	},
13002	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13003	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13004	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
13005	{ }
13006};
13007
13008static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
13009	/* output mixer control */
13010	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13011	{
13012		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13013		.name = "Master Playback Switch",
13014		.subdevice = HDA_SUBDEV_AMP_FLAG,
13015		.info = snd_hda_mixer_amp_switch_info,
13016		.get = snd_hda_mixer_amp_switch_get,
13017		.put = alc268_acer_master_sw_put,
13018		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13019	},
13020	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13021	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
13022	{ }
13023};
13024
13025static struct hda_verb alc268_acer_aspire_one_verbs[] = {
13026	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13027	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13028	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13029	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13030	{0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
13031	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
13032	{ }
13033};
13034
13035static struct hda_verb alc268_acer_verbs[] = {
13036	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
13037	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13038	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13039	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13040	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13041	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13042	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13043	{ }
13044};
13045
13046/* unsolicited event for HP jack sensing */
13047#define alc268_toshiba_unsol_event	alc262_hippo_unsol_event
13048#define alc268_toshiba_setup		alc262_hippo_setup
13049#define alc268_toshiba_automute		alc262_hippo_automute
13050
13051static void alc268_acer_unsol_event(struct hda_codec *codec,
13052				       unsigned int res)
13053{
13054	if ((res >> 26) != ALC880_HP_EVENT)
13055		return;
13056	alc268_acer_automute(codec, 1);
13057}
13058
13059static void alc268_acer_init_hook(struct hda_codec *codec)
13060{
13061	alc268_acer_automute(codec, 1);
13062}
13063
13064/* toggle speaker-output according to the hp-jack state */
13065static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
13066{
13067	unsigned int present;
13068	unsigned char bits;
13069
13070	present = snd_hda_jack_detect(codec, 0x15);
13071	bits = present ? HDA_AMP_MUTE : 0;
13072	snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
13073				 HDA_AMP_MUTE, bits);
13074	snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
13075				 HDA_AMP_MUTE, bits);
13076}
13077
13078static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
13079				    unsigned int res)
13080{
13081	switch (res >> 26) {
13082	case ALC880_HP_EVENT:
13083		alc268_aspire_one_speaker_automute(codec);
13084		break;
13085	case ALC880_MIC_EVENT:
13086		alc_mic_automute(codec);
13087		break;
13088	}
13089}
13090
13091static void alc268_acer_lc_setup(struct hda_codec *codec)
13092{
13093	struct alc_spec *spec = codec->spec;
13094	spec->ext_mic.pin = 0x18;
13095	spec->ext_mic.mux_idx = 0;
13096	spec->int_mic.pin = 0x12;
13097	spec->int_mic.mux_idx = 6;
13098	spec->auto_mic = 1;
13099}
13100
13101static void alc268_acer_lc_init_hook(struct hda_codec *codec)
13102{
13103	alc268_aspire_one_speaker_automute(codec);
13104	alc_mic_automute(codec);
13105}
13106
13107static struct snd_kcontrol_new alc268_dell_mixer[] = {
13108	/* output mixer control */
13109	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13110	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13111	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13112	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13113	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13114	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13115	{ }
13116};
13117
13118static struct hda_verb alc268_dell_verbs[] = {
13119	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13120	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13121	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13122	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
13123	{ }
13124};
13125
13126/* mute/unmute internal speaker according to the hp jack and mute state */
13127static void alc268_dell_setup(struct hda_codec *codec)
13128{
13129	struct alc_spec *spec = codec->spec;
13130
13131	spec->autocfg.hp_pins[0] = 0x15;
13132	spec->autocfg.speaker_pins[0] = 0x14;
13133	spec->ext_mic.pin = 0x18;
13134	spec->ext_mic.mux_idx = 0;
13135	spec->int_mic.pin = 0x19;
13136	spec->int_mic.mux_idx = 1;
13137	spec->auto_mic = 1;
13138}
13139
13140static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
13141	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
13142	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13143	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
13144	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13145	HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13146	HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
13147	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
13148	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
13149	{ }
13150};
13151
13152static struct hda_verb alc267_quanta_il1_verbs[] = {
13153	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13154	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
13155	{ }
13156};
13157
13158static void alc267_quanta_il1_setup(struct hda_codec *codec)
13159{
13160	struct alc_spec *spec = codec->spec;
13161	spec->autocfg.hp_pins[0] = 0x15;
13162	spec->autocfg.speaker_pins[0] = 0x14;
13163	spec->ext_mic.pin = 0x18;
13164	spec->ext_mic.mux_idx = 0;
13165	spec->int_mic.pin = 0x19;
13166	spec->int_mic.mux_idx = 1;
13167	spec->auto_mic = 1;
13168}
13169
13170/*
13171 * generic initialization of ADC, input mixers and output mixers
13172 */
13173static struct hda_verb alc268_base_init_verbs[] = {
13174	/* Unmute DAC0-1 and set vol = 0 */
13175	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13176	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13177
13178	/*
13179	 * Set up output mixers (0x0c - 0x0e)
13180	 */
13181	/* set vol=0 to output mixers */
13182	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13183        {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
13184
13185	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13186	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13187
13188	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
13189	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
13190	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
13191	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
13192	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
13193	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13194	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13195	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13196
13197	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13198	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13199	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13200	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13201	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13202
13203	/* set PCBEEP vol = 0, mute connections */
13204	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13205	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13206	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13207
13208	/* Unmute Selector 23h,24h and set the default input to mic-in */
13209
13210	{0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
13211	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13212	{0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
13213	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13214
13215	{ }
13216};
13217
13218/*
13219 * generic initialization of ADC, input mixers and output mixers
13220 */
13221static struct hda_verb alc268_volume_init_verbs[] = {
13222	/* set output DAC */
13223	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13224	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13225
13226	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
13227	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
13228	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13229	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13230	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13231
13232	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13233	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13234	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13235
13236	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13237	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13238
13239	/* set PCBEEP vol = 0, mute connections */
13240	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13241	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13242	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13243
13244	{ }
13245};
13246
13247static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
13248	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13249	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
13250	{ } /* end */
13251};
13252
13253static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
13254	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13255	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
13256	_DEFINE_CAPSRC(1),
13257	{ } /* end */
13258};
13259
13260static struct snd_kcontrol_new alc268_capture_mixer[] = {
13261	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13262	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
13263	HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
13264	HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
13265	_DEFINE_CAPSRC(2),
13266	{ } /* end */
13267};
13268
13269static struct hda_input_mux alc268_capture_source = {
13270	.num_items = 4,
13271	.items = {
13272		{ "Mic", 0x0 },
13273		{ "Front Mic", 0x1 },
13274		{ "Line", 0x2 },
13275		{ "CD", 0x3 },
13276	},
13277};
13278
13279static struct hda_input_mux alc268_acer_capture_source = {
13280	.num_items = 3,
13281	.items = {
13282		{ "Mic", 0x0 },
13283		{ "Internal Mic", 0x1 },
13284		{ "Line", 0x2 },
13285	},
13286};
13287
13288static struct hda_input_mux alc268_acer_dmic_capture_source = {
13289	.num_items = 3,
13290	.items = {
13291		{ "Mic", 0x0 },
13292		{ "Internal Mic", 0x6 },
13293		{ "Line", 0x2 },
13294	},
13295};
13296
13297#ifdef CONFIG_SND_DEBUG
13298static struct snd_kcontrol_new alc268_test_mixer[] = {
13299	/* Volume widgets */
13300	HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13301	HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13302	HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
13303	HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
13304	HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
13305	HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
13306	HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
13307	HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
13308	HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
13309	HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
13310	HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
13311	HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
13312	HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
13313	/* The below appears problematic on some hardwares */
13314	/*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
13315	HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13316	HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
13317	HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
13318	HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
13319
13320	/* Modes for retasking pin widgets */
13321	ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
13322	ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
13323	ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
13324	ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
13325
13326	/* Controls for GPIO pins, assuming they are configured as outputs */
13327	ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
13328	ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
13329	ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
13330	ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
13331
13332	/* Switches to allow the digital SPDIF output pin to be enabled.
13333	 * The ALC268 does not have an SPDIF input.
13334	 */
13335	ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
13336
13337	/* A switch allowing EAPD to be enabled.  Some laptops seem to use
13338	 * this output to turn on an external amplifier.
13339	 */
13340	ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
13341	ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
13342
13343	{ } /* end */
13344};
13345#endif
13346
13347/* create input playback/capture controls for the given pin */
13348static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
13349				    const char *ctlname, int idx)
13350{
13351	hda_nid_t dac;
13352	int err;
13353
13354	switch (nid) {
13355	case 0x14:
13356	case 0x16:
13357		dac = 0x02;
13358		break;
13359	case 0x15:
13360	case 0x1a: /* ALC259/269 only */
13361	case 0x1b: /* ALC259/269 only */
13362	case 0x21: /* ALC269vb has this pin, too */
13363		dac = 0x03;
13364		break;
13365	default:
13366		snd_printd(KERN_WARNING "hda_codec: "
13367			   "ignoring pin 0x%x as unknown\n", nid);
13368		return 0;
13369	}
13370	if (spec->multiout.dac_nids[0] != dac &&
13371	    spec->multiout.dac_nids[1] != dac) {
13372		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
13373				  HDA_COMPOSE_AMP_VAL(dac, 3, idx,
13374						      HDA_OUTPUT));
13375		if (err < 0)
13376			return err;
13377		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
13378	}
13379
13380	if (nid != 0x16)
13381		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
13382			  HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
13383	else /* mono */
13384		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
13385			  HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
13386	if (err < 0)
13387		return err;
13388	return 0;
13389}
13390
13391/* add playback controls from the parsed DAC table */
13392static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
13393					     const struct auto_pin_cfg *cfg)
13394{
13395	hda_nid_t nid;
13396	int err;
13397
13398	spec->multiout.dac_nids = spec->private_dac_nids;
13399
13400	nid = cfg->line_out_pins[0];
13401	if (nid) {
13402		const char *name;
13403		if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
13404			name = "Speaker";
13405		else
13406			name = "Front";
13407		err = alc268_new_analog_output(spec, nid, name, 0);
13408		if (err < 0)
13409			return err;
13410	}
13411
13412	nid = cfg->speaker_pins[0];
13413	if (nid == 0x1d) {
13414		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
13415				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
13416		if (err < 0)
13417			return err;
13418	} else if (nid) {
13419		err = alc268_new_analog_output(spec, nid, "Speaker", 0);
13420		if (err < 0)
13421			return err;
13422	}
13423	nid = cfg->hp_pins[0];
13424	if (nid) {
13425		err = alc268_new_analog_output(spec, nid, "Headphone", 0);
13426		if (err < 0)
13427			return err;
13428	}
13429
13430	nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
13431	if (nid == 0x16) {
13432		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
13433				  HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
13434		if (err < 0)
13435			return err;
13436	}
13437	return 0;
13438}
13439
13440/* create playback/capture controls for input pins */
13441static int alc268_auto_create_input_ctls(struct hda_codec *codec,
13442						const struct auto_pin_cfg *cfg)
13443{
13444	return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
13445}
13446
13447static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
13448					      hda_nid_t nid, int pin_type)
13449{
13450	int idx;
13451
13452	alc_set_pin_output(codec, nid, pin_type);
13453	if (nid == 0x14 || nid == 0x16)
13454		idx = 0;
13455	else
13456		idx = 1;
13457	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
13458}
13459
13460static void alc268_auto_init_multi_out(struct hda_codec *codec)
13461{
13462	struct alc_spec *spec = codec->spec;
13463	hda_nid_t nid = spec->autocfg.line_out_pins[0];
13464	if (nid) {
13465		int pin_type = get_pin_type(spec->autocfg.line_out_type);
13466		alc268_auto_set_output_and_unmute(codec, nid, pin_type);
13467	}
13468}
13469
13470static void alc268_auto_init_hp_out(struct hda_codec *codec)
13471{
13472	struct alc_spec *spec = codec->spec;
13473	hda_nid_t pin;
13474
13475	pin = spec->autocfg.hp_pins[0];
13476	if (pin)
13477		alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
13478	pin = spec->autocfg.speaker_pins[0];
13479	if (pin)
13480		alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
13481}
13482
13483static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
13484{
13485	struct alc_spec *spec = codec->spec;
13486	hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
13487	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
13488	hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
13489	unsigned int	dac_vol1, dac_vol2;
13490
13491	if (line_nid == 0x1d || speaker_nid == 0x1d) {
13492		snd_hda_codec_write(codec, speaker_nid, 0,
13493				    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
13494		/* mute mixer inputs from 0x1d */
13495		snd_hda_codec_write(codec, 0x0f, 0,
13496				    AC_VERB_SET_AMP_GAIN_MUTE,
13497				    AMP_IN_UNMUTE(1));
13498		snd_hda_codec_write(codec, 0x10, 0,
13499				    AC_VERB_SET_AMP_GAIN_MUTE,
13500				    AMP_IN_UNMUTE(1));
13501	} else {
13502		/* unmute mixer inputs from 0x1d */
13503		snd_hda_codec_write(codec, 0x0f, 0,
13504				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13505		snd_hda_codec_write(codec, 0x10, 0,
13506				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13507	}
13508
13509	dac_vol1 = dac_vol2 = 0xb000 | 0x40;	/* set max volume  */
13510	if (line_nid == 0x14)
13511		dac_vol2 = AMP_OUT_ZERO;
13512	else if (line_nid == 0x15)
13513		dac_vol1 = AMP_OUT_ZERO;
13514	if (hp_nid == 0x14)
13515		dac_vol2 = AMP_OUT_ZERO;
13516	else if (hp_nid == 0x15)
13517		dac_vol1 = AMP_OUT_ZERO;
13518	if (line_nid != 0x16 || hp_nid != 0x16 ||
13519	    spec->autocfg.line_out_pins[1] != 0x16 ||
13520	    spec->autocfg.line_out_pins[2] != 0x16)
13521		dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
13522
13523	snd_hda_codec_write(codec, 0x02, 0,
13524			    AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
13525	snd_hda_codec_write(codec, 0x03, 0,
13526			    AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
13527}
13528
13529/* pcm configuration: identical with ALC880 */
13530#define alc268_pcm_analog_playback	alc880_pcm_analog_playback
13531#define alc268_pcm_analog_capture	alc880_pcm_analog_capture
13532#define alc268_pcm_analog_alt_capture	alc880_pcm_analog_alt_capture
13533#define alc268_pcm_digital_playback	alc880_pcm_digital_playback
13534
13535/*
13536 * BIOS auto configuration
13537 */
13538static int alc268_parse_auto_config(struct hda_codec *codec)
13539{
13540	struct alc_spec *spec = codec->spec;
13541	int err;
13542	static hda_nid_t alc268_ignore[] = { 0 };
13543
13544	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13545					   alc268_ignore);
13546	if (err < 0)
13547		return err;
13548	if (!spec->autocfg.line_outs) {
13549		if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
13550			spec->multiout.max_channels = 2;
13551			spec->no_analog = 1;
13552			goto dig_only;
13553		}
13554		return 0; /* can't find valid BIOS pin config */
13555	}
13556	err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
13557	if (err < 0)
13558		return err;
13559	err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
13560	if (err < 0)
13561		return err;
13562
13563	spec->multiout.max_channels = 2;
13564
13565 dig_only:
13566	/* digital only support output */
13567	alc_auto_parse_digital(codec);
13568	if (spec->kctls.list)
13569		add_mixer(spec, spec->kctls.list);
13570
13571	if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
13572		add_mixer(spec, alc268_beep_mixer);
13573
13574	add_verb(spec, alc268_volume_init_verbs);
13575	spec->num_mux_defs = 2;
13576	spec->input_mux = &spec->private_imux[0];
13577
13578	err = alc_auto_add_mic_boost(codec);
13579	if (err < 0)
13580		return err;
13581
13582	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
13583
13584	return 1;
13585}
13586
13587#define alc268_auto_init_analog_input	alc882_auto_init_analog_input
13588
13589/* init callback for auto-configuration model -- overriding the default init */
13590static void alc268_auto_init(struct hda_codec *codec)
13591{
13592	struct alc_spec *spec = codec->spec;
13593	alc268_auto_init_multi_out(codec);
13594	alc268_auto_init_hp_out(codec);
13595	alc268_auto_init_mono_speaker_out(codec);
13596	alc268_auto_init_analog_input(codec);
13597	alc_auto_init_digital(codec);
13598	if (spec->unsol_event)
13599		alc_inithook(codec);
13600}
13601
13602/*
13603 * configuration and preset
13604 */
13605static const char *alc268_models[ALC268_MODEL_LAST] = {
13606	[ALC267_QUANTA_IL1]	= "quanta-il1",
13607	[ALC268_3ST]		= "3stack",
13608	[ALC268_TOSHIBA]	= "toshiba",
13609	[ALC268_ACER]		= "acer",
13610	[ALC268_ACER_DMIC]	= "acer-dmic",
13611	[ALC268_ACER_ASPIRE_ONE]	= "acer-aspire",
13612	[ALC268_DELL]		= "dell",
13613	[ALC268_ZEPTO]		= "zepto",
13614#ifdef CONFIG_SND_DEBUG
13615	[ALC268_TEST]		= "test",
13616#endif
13617	[ALC268_AUTO]		= "auto",
13618};
13619
13620static struct snd_pci_quirk alc268_cfg_tbl[] = {
13621	SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
13622	SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
13623	SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
13624	SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
13625	SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
13626	SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
13627						ALC268_ACER_ASPIRE_ONE),
13628	SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
13629	SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
13630			"Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
13631	/* almost compatible with toshiba but with optional digital outs;
13632	 * auto-probing seems working fine
13633	 */
13634	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
13635			   ALC268_AUTO),
13636	SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
13637	SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
13638	SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
13639	SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
13640	SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
13641	{}
13642};
13643
13644/* Toshiba laptops have no unique PCI SSID but only codec SSID */
13645static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
13646	SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
13647	SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
13648	SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
13649			   ALC268_TOSHIBA),
13650	{}
13651};
13652
13653static struct alc_config_preset alc268_presets[] = {
13654	[ALC267_QUANTA_IL1] = {
13655		.mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
13656			    alc268_capture_nosrc_mixer },
13657		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13658				alc267_quanta_il1_verbs },
13659		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13660		.dac_nids = alc268_dac_nids,
13661		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13662		.adc_nids = alc268_adc_nids_alt,
13663		.hp_nid = 0x03,
13664		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13665		.channel_mode = alc268_modes,
13666		.unsol_event = alc_sku_unsol_event,
13667		.setup = alc267_quanta_il1_setup,
13668		.init_hook = alc_inithook,
13669	},
13670	[ALC268_3ST] = {
13671		.mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13672			    alc268_beep_mixer },
13673		.init_verbs = { alc268_base_init_verbs },
13674		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13675		.dac_nids = alc268_dac_nids,
13676                .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13677                .adc_nids = alc268_adc_nids_alt,
13678		.capsrc_nids = alc268_capsrc_nids,
13679		.hp_nid = 0x03,
13680		.dig_out_nid = ALC268_DIGOUT_NID,
13681		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13682		.channel_mode = alc268_modes,
13683		.input_mux = &alc268_capture_source,
13684	},
13685	[ALC268_TOSHIBA] = {
13686		.mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
13687			    alc268_beep_mixer },
13688		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13689				alc268_toshiba_verbs },
13690		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13691		.dac_nids = alc268_dac_nids,
13692		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13693		.adc_nids = alc268_adc_nids_alt,
13694		.capsrc_nids = alc268_capsrc_nids,
13695		.hp_nid = 0x03,
13696		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13697		.channel_mode = alc268_modes,
13698		.input_mux = &alc268_capture_source,
13699		.unsol_event = alc268_toshiba_unsol_event,
13700		.setup = alc268_toshiba_setup,
13701		.init_hook = alc268_toshiba_automute,
13702	},
13703	[ALC268_ACER] = {
13704		.mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
13705			    alc268_beep_mixer },
13706		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13707				alc268_acer_verbs },
13708		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13709		.dac_nids = alc268_dac_nids,
13710		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13711		.adc_nids = alc268_adc_nids_alt,
13712		.capsrc_nids = alc268_capsrc_nids,
13713		.hp_nid = 0x02,
13714		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13715		.channel_mode = alc268_modes,
13716		.input_mux = &alc268_acer_capture_source,
13717		.unsol_event = alc268_acer_unsol_event,
13718		.init_hook = alc268_acer_init_hook,
13719	},
13720	[ALC268_ACER_DMIC] = {
13721		.mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
13722			    alc268_beep_mixer },
13723		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13724				alc268_acer_verbs },
13725		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13726		.dac_nids = alc268_dac_nids,
13727		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13728		.adc_nids = alc268_adc_nids_alt,
13729		.capsrc_nids = alc268_capsrc_nids,
13730		.hp_nid = 0x02,
13731		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13732		.channel_mode = alc268_modes,
13733		.input_mux = &alc268_acer_dmic_capture_source,
13734		.unsol_event = alc268_acer_unsol_event,
13735		.init_hook = alc268_acer_init_hook,
13736	},
13737	[ALC268_ACER_ASPIRE_ONE] = {
13738		.mixers = { alc268_acer_aspire_one_mixer,
13739			    alc268_beep_mixer,
13740			    alc268_capture_nosrc_mixer },
13741		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13742				alc268_acer_aspire_one_verbs },
13743		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13744		.dac_nids = alc268_dac_nids,
13745		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13746		.adc_nids = alc268_adc_nids_alt,
13747		.capsrc_nids = alc268_capsrc_nids,
13748		.hp_nid = 0x03,
13749		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13750		.channel_mode = alc268_modes,
13751		.unsol_event = alc268_acer_lc_unsol_event,
13752		.setup = alc268_acer_lc_setup,
13753		.init_hook = alc268_acer_lc_init_hook,
13754	},
13755	[ALC268_DELL] = {
13756		.mixers = { alc268_dell_mixer, alc268_beep_mixer,
13757			    alc268_capture_nosrc_mixer },
13758		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13759				alc268_dell_verbs },
13760		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13761		.dac_nids = alc268_dac_nids,
13762		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13763		.adc_nids = alc268_adc_nids_alt,
13764		.capsrc_nids = alc268_capsrc_nids,
13765		.hp_nid = 0x02,
13766		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13767		.channel_mode = alc268_modes,
13768		.unsol_event = alc_sku_unsol_event,
13769		.setup = alc268_dell_setup,
13770		.init_hook = alc_inithook,
13771	},
13772	[ALC268_ZEPTO] = {
13773		.mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13774			    alc268_beep_mixer },
13775		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13776				alc268_toshiba_verbs },
13777		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13778		.dac_nids = alc268_dac_nids,
13779		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13780		.adc_nids = alc268_adc_nids_alt,
13781		.capsrc_nids = alc268_capsrc_nids,
13782		.hp_nid = 0x03,
13783		.dig_out_nid = ALC268_DIGOUT_NID,
13784		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13785		.channel_mode = alc268_modes,
13786		.input_mux = &alc268_capture_source,
13787		.setup = alc268_toshiba_setup,
13788		.init_hook = alc268_toshiba_automute,
13789	},
13790#ifdef CONFIG_SND_DEBUG
13791	[ALC268_TEST] = {
13792		.mixers = { alc268_test_mixer, alc268_capture_mixer },
13793		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13794				alc268_volume_init_verbs },
13795		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13796		.dac_nids = alc268_dac_nids,
13797		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13798		.adc_nids = alc268_adc_nids_alt,
13799		.capsrc_nids = alc268_capsrc_nids,
13800		.hp_nid = 0x03,
13801		.dig_out_nid = ALC268_DIGOUT_NID,
13802		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13803		.channel_mode = alc268_modes,
13804		.input_mux = &alc268_capture_source,
13805	},
13806#endif
13807};
13808
13809static int patch_alc268(struct hda_codec *codec)
13810{
13811	struct alc_spec *spec;
13812	int board_config;
13813	int i, has_beep, err;
13814
13815	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13816	if (spec == NULL)
13817		return -ENOMEM;
13818
13819	codec->spec = spec;
13820
13821	board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
13822						  alc268_models,
13823						  alc268_cfg_tbl);
13824
13825	if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
13826		board_config = snd_hda_check_board_codec_sid_config(codec,
13827			ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
13828
13829	if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
13830		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13831		       codec->chip_name);
13832		board_config = ALC268_AUTO;
13833	}
13834
13835	if (board_config == ALC268_AUTO) {
13836		/* automatic parse from the BIOS config */
13837		err = alc268_parse_auto_config(codec);
13838		if (err < 0) {
13839			alc_free(codec);
13840			return err;
13841		} else if (!err) {
13842			printk(KERN_INFO
13843			       "hda_codec: Cannot set up configuration "
13844			       "from BIOS.  Using base mode...\n");
13845			board_config = ALC268_3ST;
13846		}
13847	}
13848
13849	if (board_config != ALC268_AUTO)
13850		setup_preset(codec, &alc268_presets[board_config]);
13851
13852	spec->stream_analog_playback = &alc268_pcm_analog_playback;
13853	spec->stream_analog_capture = &alc268_pcm_analog_capture;
13854	spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
13855
13856	spec->stream_digital_playback = &alc268_pcm_digital_playback;
13857
13858	has_beep = 0;
13859	for (i = 0; i < spec->num_mixers; i++) {
13860		if (spec->mixers[i] == alc268_beep_mixer) {
13861			has_beep = 1;
13862			break;
13863		}
13864	}
13865
13866	if (has_beep) {
13867		err = snd_hda_attach_beep_device(codec, 0x1);
13868		if (err < 0) {
13869			alc_free(codec);
13870			return err;
13871		}
13872		if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
13873			/* override the amp caps for beep generator */
13874			snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
13875					  (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
13876					  (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
13877					  (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
13878					  (0 << AC_AMPCAP_MUTE_SHIFT));
13879	}
13880
13881	if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
13882		/* check whether NID 0x07 is valid */
13883		unsigned int wcap = get_wcaps(codec, 0x07);
13884		int i;
13885
13886		spec->capsrc_nids = alc268_capsrc_nids;
13887		/* get type */
13888		wcap = get_wcaps_type(wcap);
13889		if (spec->auto_mic ||
13890		    wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
13891			spec->adc_nids = alc268_adc_nids_alt;
13892			spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
13893			if (spec->auto_mic)
13894				fixup_automic_adc(codec);
13895			if (spec->auto_mic || spec->input_mux->num_items == 1)
13896				add_mixer(spec, alc268_capture_nosrc_mixer);
13897			else
13898				add_mixer(spec, alc268_capture_alt_mixer);
13899		} else {
13900			spec->adc_nids = alc268_adc_nids;
13901			spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
13902			add_mixer(spec, alc268_capture_mixer);
13903		}
13904		/* set default input source */
13905		for (i = 0; i < spec->num_adc_nids; i++)
13906			snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
13907				0, AC_VERB_SET_CONNECT_SEL,
13908				i < spec->num_mux_defs ?
13909				spec->input_mux[i].items[0].index :
13910				spec->input_mux->items[0].index);
13911	}
13912
13913	spec->vmaster_nid = 0x02;
13914
13915	codec->patch_ops = alc_patch_ops;
13916	if (board_config == ALC268_AUTO)
13917		spec->init_hook = alc268_auto_init;
13918
13919	return 0;
13920}
13921
13922/*
13923 *  ALC269 channel source setting (2 channel)
13924 */
13925#define ALC269_DIGOUT_NID	ALC880_DIGOUT_NID
13926
13927#define alc269_dac_nids		alc260_dac_nids
13928
13929static hda_nid_t alc269_adc_nids[1] = {
13930	/* ADC1 */
13931	0x08,
13932};
13933
13934static hda_nid_t alc269_capsrc_nids[1] = {
13935	0x23,
13936};
13937
13938static hda_nid_t alc269vb_adc_nids[1] = {
13939	/* ADC1 */
13940	0x09,
13941};
13942
13943static hda_nid_t alc269vb_capsrc_nids[1] = {
13944	0x22,
13945};
13946
13947static hda_nid_t alc269_adc_candidates[] = {
13948	0x08, 0x09, 0x07,
13949};
13950
13951#define alc269_modes		alc260_modes
13952#define alc269_capture_source	alc880_lg_lw_capture_source
13953
13954static struct snd_kcontrol_new alc269_base_mixer[] = {
13955	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13956	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13957	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
13958	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
13959	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13960	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13961	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13962	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13963	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13964	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
13965	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13966	HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
13967	{ } /* end */
13968};
13969
13970static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
13971	/* output mixer control */
13972	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13973	{
13974		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13975		.name = "Master Playback Switch",
13976		.subdevice = HDA_SUBDEV_AMP_FLAG,
13977		.info = snd_hda_mixer_amp_switch_info,
13978		.get = snd_hda_mixer_amp_switch_get,
13979		.put = alc268_acer_master_sw_put,
13980		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13981	},
13982	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13983	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13984	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13985	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13986	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13987	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13988	{ }
13989};
13990
13991static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
13992	/* output mixer control */
13993	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13994	{
13995		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13996		.name = "Master Playback Switch",
13997		.subdevice = HDA_SUBDEV_AMP_FLAG,
13998		.info = snd_hda_mixer_amp_switch_info,
13999		.get = snd_hda_mixer_amp_switch_get,
14000		.put = alc268_acer_master_sw_put,
14001		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
14002	},
14003	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
14004	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
14005	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
14006	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
14007	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
14008	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
14009	HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
14010	HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
14011	HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
14012	{ }
14013};
14014
14015static struct snd_kcontrol_new alc269_laptop_mixer[] = {
14016	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
14017	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14018	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
14019	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
14020	{ } /* end */
14021};
14022
14023static struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
14024	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
14025	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14026	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
14027	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
14028	{ } /* end */
14029};
14030
14031static struct snd_kcontrol_new alc269_asus_mixer[] = {
14032	HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
14033	HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x0, HDA_INPUT),
14034	{ } /* end */
14035};
14036
14037/* capture mixer elements */
14038static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
14039	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
14040	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
14041	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
14042	HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
14043	{ } /* end */
14044};
14045
14046static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
14047	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
14048	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
14049	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
14050	{ } /* end */
14051};
14052
14053static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
14054	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
14055	HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
14056	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
14057	HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
14058	{ } /* end */
14059};
14060
14061static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
14062	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
14063	HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
14064	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
14065	{ } /* end */
14066};
14067
14068/* FSC amilo */
14069#define alc269_fujitsu_mixer	alc269_laptop_mixer
14070
14071static struct hda_verb alc269_quanta_fl1_verbs[] = {
14072	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14073	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14074	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14075	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
14076	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14077	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14078	{ }
14079};
14080
14081static struct hda_verb alc269_lifebook_verbs[] = {
14082	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14083	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
14084	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14085	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14086	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
14087	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14088	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14089	{0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
14090	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14091	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14092	{ }
14093};
14094
14095/* toggle speaker-output according to the hp-jack state */
14096static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
14097{
14098	unsigned int present;
14099	unsigned char bits;
14100
14101	present = snd_hda_jack_detect(codec, 0x15);
14102	bits = present ? HDA_AMP_MUTE : 0;
14103	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
14104				 HDA_AMP_MUTE, bits);
14105	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
14106				 HDA_AMP_MUTE, bits);
14107
14108	snd_hda_codec_write(codec, 0x20, 0,
14109			AC_VERB_SET_COEF_INDEX, 0x0c);
14110	snd_hda_codec_write(codec, 0x20, 0,
14111			AC_VERB_SET_PROC_COEF, 0x680);
14112
14113	snd_hda_codec_write(codec, 0x20, 0,
14114			AC_VERB_SET_COEF_INDEX, 0x0c);
14115	snd_hda_codec_write(codec, 0x20, 0,
14116			AC_VERB_SET_PROC_COEF, 0x480);
14117}
14118
14119/* toggle speaker-output according to the hp-jacks state */
14120static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
14121{
14122	unsigned int present;
14123	unsigned char bits;
14124
14125	/* Check laptop headphone socket */
14126	present = snd_hda_jack_detect(codec, 0x15);
14127
14128	/* Check port replicator headphone socket */
14129	present |= snd_hda_jack_detect(codec, 0x1a);
14130
14131	bits = present ? HDA_AMP_MUTE : 0;
14132	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
14133				 HDA_AMP_MUTE, bits);
14134	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
14135				 HDA_AMP_MUTE, bits);
14136
14137	snd_hda_codec_write(codec, 0x20, 0,
14138			AC_VERB_SET_COEF_INDEX, 0x0c);
14139	snd_hda_codec_write(codec, 0x20, 0,
14140			AC_VERB_SET_PROC_COEF, 0x680);
14141
14142	snd_hda_codec_write(codec, 0x20, 0,
14143			AC_VERB_SET_COEF_INDEX, 0x0c);
14144	snd_hda_codec_write(codec, 0x20, 0,
14145			AC_VERB_SET_PROC_COEF, 0x480);
14146}
14147
14148static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
14149{
14150	unsigned int present_laptop;
14151	unsigned int present_dock;
14152
14153	present_laptop	= snd_hda_jack_detect(codec, 0x18);
14154	present_dock	= snd_hda_jack_detect(codec, 0x1b);
14155
14156	/* Laptop mic port overrides dock mic port, design decision */
14157	if (present_dock)
14158		snd_hda_codec_write(codec, 0x23, 0,
14159				AC_VERB_SET_CONNECT_SEL, 0x3);
14160	if (present_laptop)
14161		snd_hda_codec_write(codec, 0x23, 0,
14162				AC_VERB_SET_CONNECT_SEL, 0x0);
14163	if (!present_dock && !present_laptop)
14164		snd_hda_codec_write(codec, 0x23, 0,
14165				AC_VERB_SET_CONNECT_SEL, 0x1);
14166}
14167
14168static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
14169				    unsigned int res)
14170{
14171	switch (res >> 26) {
14172	case ALC880_HP_EVENT:
14173		alc269_quanta_fl1_speaker_automute(codec);
14174		break;
14175	case ALC880_MIC_EVENT:
14176		alc_mic_automute(codec);
14177		break;
14178	}
14179}
14180
14181static void alc269_lifebook_unsol_event(struct hda_codec *codec,
14182					unsigned int res)
14183{
14184	if ((res >> 26) == ALC880_HP_EVENT)
14185		alc269_lifebook_speaker_automute(codec);
14186	if ((res >> 26) == ALC880_MIC_EVENT)
14187		alc269_lifebook_mic_autoswitch(codec);
14188}
14189
14190static void alc269_quanta_fl1_setup(struct hda_codec *codec)
14191{
14192	struct alc_spec *spec = codec->spec;
14193	spec->autocfg.hp_pins[0] = 0x15;
14194	spec->autocfg.speaker_pins[0] = 0x14;
14195	spec->ext_mic.pin = 0x18;
14196	spec->ext_mic.mux_idx = 0;
14197	spec->int_mic.pin = 0x19;
14198	spec->int_mic.mux_idx = 1;
14199	spec->auto_mic = 1;
14200}
14201
14202static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
14203{
14204	alc269_quanta_fl1_speaker_automute(codec);
14205	alc_mic_automute(codec);
14206}
14207
14208static void alc269_lifebook_init_hook(struct hda_codec *codec)
14209{
14210	alc269_lifebook_speaker_automute(codec);
14211	alc269_lifebook_mic_autoswitch(codec);
14212}
14213
14214static struct hda_verb alc269_laptop_dmic_init_verbs[] = {
14215	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14216	{0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
14217	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
14218	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
14219	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14220	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14221	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14222	{}
14223};
14224
14225static struct hda_verb alc269_laptop_amic_init_verbs[] = {
14226	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14227	{0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
14228	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
14229	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
14230	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14231	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14232	{}
14233};
14234
14235static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
14236	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
14237	{0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
14238	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
14239	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
14240	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14241	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14242	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14243	{}
14244};
14245
14246static struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
14247	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
14248	{0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
14249	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
14250	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
14251	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14252	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14253	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14254	{}
14255};
14256
14257static struct hda_verb alc271_acer_dmic_verbs[] = {
14258	{0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
14259	{0x20, AC_VERB_SET_PROC_COEF, 0x4000},
14260	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14261	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14262	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14263	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14264	{0x21, AC_VERB_SET_CONNECT_SEL, 0x00},
14265	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14266	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14267	{0x22, AC_VERB_SET_CONNECT_SEL, 6},
14268	{ }
14269};
14270
14271/* toggle speaker-output according to the hp-jack state */
14272static void alc269_speaker_automute(struct hda_codec *codec)
14273{
14274	struct alc_spec *spec = codec->spec;
14275	unsigned int nid = spec->autocfg.hp_pins[0];
14276	unsigned int present;
14277	unsigned char bits;
14278
14279	present = snd_hda_jack_detect(codec, nid);
14280	bits = present ? HDA_AMP_MUTE : 0;
14281	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
14282				 HDA_AMP_MUTE, bits);
14283	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
14284				 HDA_AMP_MUTE, bits);
14285}
14286
14287/* unsolicited event for HP jack sensing */
14288static void alc269_laptop_unsol_event(struct hda_codec *codec,
14289				     unsigned int res)
14290{
14291	switch (res >> 26) {
14292	case ALC880_HP_EVENT:
14293		alc269_speaker_automute(codec);
14294		break;
14295	case ALC880_MIC_EVENT:
14296		alc_mic_automute(codec);
14297		break;
14298	}
14299}
14300
14301static void alc269_laptop_amic_setup(struct hda_codec *codec)
14302{
14303	struct alc_spec *spec = codec->spec;
14304	spec->autocfg.hp_pins[0] = 0x15;
14305	spec->autocfg.speaker_pins[0] = 0x14;
14306	spec->ext_mic.pin = 0x18;
14307	spec->ext_mic.mux_idx = 0;
14308	spec->int_mic.pin = 0x19;
14309	spec->int_mic.mux_idx = 1;
14310	spec->auto_mic = 1;
14311}
14312
14313static void alc269_laptop_dmic_setup(struct hda_codec *codec)
14314{
14315	struct alc_spec *spec = codec->spec;
14316	spec->autocfg.hp_pins[0] = 0x15;
14317	spec->autocfg.speaker_pins[0] = 0x14;
14318	spec->ext_mic.pin = 0x18;
14319	spec->ext_mic.mux_idx = 0;
14320	spec->int_mic.pin = 0x12;
14321	spec->int_mic.mux_idx = 5;
14322	spec->auto_mic = 1;
14323}
14324
14325static void alc269vb_laptop_amic_setup(struct hda_codec *codec)
14326{
14327	struct alc_spec *spec = codec->spec;
14328	spec->autocfg.hp_pins[0] = 0x21;
14329	spec->autocfg.speaker_pins[0] = 0x14;
14330	spec->ext_mic.pin = 0x18;
14331	spec->ext_mic.mux_idx = 0;
14332	spec->int_mic.pin = 0x19;
14333	spec->int_mic.mux_idx = 1;
14334	spec->auto_mic = 1;
14335}
14336
14337static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
14338{
14339	struct alc_spec *spec = codec->spec;
14340	spec->autocfg.hp_pins[0] = 0x21;
14341	spec->autocfg.speaker_pins[0] = 0x14;
14342	spec->ext_mic.pin = 0x18;
14343	spec->ext_mic.mux_idx = 0;
14344	spec->int_mic.pin = 0x12;
14345	spec->int_mic.mux_idx = 6;
14346	spec->auto_mic = 1;
14347}
14348
14349static void alc269_laptop_inithook(struct hda_codec *codec)
14350{
14351	alc269_speaker_automute(codec);
14352	alc_mic_automute(codec);
14353}
14354
14355/*
14356 * generic initialization of ADC, input mixers and output mixers
14357 */
14358static struct hda_verb alc269_init_verbs[] = {
14359	/*
14360	 * Unmute ADC0 and set the default input to mic-in
14361	 */
14362	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14363
14364	/*
14365	 * Set up output mixers (0x02 - 0x03)
14366	 */
14367	/* set vol=0 to output mixers */
14368	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14369	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14370
14371	/* set up input amps for analog loopback */
14372	/* Amp Indices: DAC = 0, mixer = 1 */
14373	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14374	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14375	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14376	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14377	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14378	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14379
14380	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14381	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14382	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14383	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14384	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14385	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14386	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14387
14388	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14389	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14390
14391	/* FIXME: use Mux-type input source selection */
14392	/* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14393	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14394	{0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
14395
14396	/* set EAPD */
14397	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14398	{ }
14399};
14400
14401static struct hda_verb alc269vb_init_verbs[] = {
14402	/*
14403	 * Unmute ADC0 and set the default input to mic-in
14404	 */
14405	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14406
14407	/*
14408	 * Set up output mixers (0x02 - 0x03)
14409	 */
14410	/* set vol=0 to output mixers */
14411	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14412	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14413
14414	/* set up input amps for analog loopback */
14415	/* Amp Indices: DAC = 0, mixer = 1 */
14416	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14417	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14418	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14419	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14420	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14421	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14422
14423	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14424	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14425	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14426	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14427	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14428	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14429	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14430
14431	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14432	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14433
14434	/* FIXME: use Mux-type input source selection */
14435	/* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14436	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14437	{0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
14438
14439	/* set EAPD */
14440	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14441	{ }
14442};
14443
14444#define alc269_auto_create_multi_out_ctls \
14445	alc268_auto_create_multi_out_ctls
14446#define alc269_auto_create_input_ctls \
14447	alc268_auto_create_input_ctls
14448
14449#ifdef CONFIG_SND_HDA_POWER_SAVE
14450#define alc269_loopbacks	alc880_loopbacks
14451#endif
14452
14453/* pcm configuration: identical with ALC880 */
14454#define alc269_pcm_analog_playback	alc880_pcm_analog_playback
14455#define alc269_pcm_analog_capture	alc880_pcm_analog_capture
14456#define alc269_pcm_digital_playback	alc880_pcm_digital_playback
14457#define alc269_pcm_digital_capture	alc880_pcm_digital_capture
14458
14459static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
14460	.substreams = 1,
14461	.channels_min = 2,
14462	.channels_max = 8,
14463	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14464	/* NID is set in alc_build_pcms */
14465	.ops = {
14466		.open = alc880_playback_pcm_open,
14467		.prepare = alc880_playback_pcm_prepare,
14468		.cleanup = alc880_playback_pcm_cleanup
14469	},
14470};
14471
14472static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
14473	.substreams = 1,
14474	.channels_min = 2,
14475	.channels_max = 2,
14476	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14477	/* NID is set in alc_build_pcms */
14478};
14479
14480#ifdef CONFIG_SND_HDA_POWER_SAVE
14481static int alc269_mic2_for_mute_led(struct hda_codec *codec)
14482{
14483	switch (codec->subsystem_id) {
14484	case 0x103c1586:
14485		return 1;
14486	}
14487	return 0;
14488}
14489
14490static int alc269_mic2_mute_check_ps(struct hda_codec *codec, hda_nid_t nid)
14491{
14492	/* update mute-LED according to the speaker mute state */
14493	if (nid == 0x01 || nid == 0x14) {
14494		int pinval;
14495		if (snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0) &
14496		    HDA_AMP_MUTE)
14497			pinval = 0x24;
14498		else
14499			pinval = 0x20;
14500		/* mic2 vref pin is used for mute LED control */
14501		snd_hda_codec_update_cache(codec, 0x19, 0,
14502					   AC_VERB_SET_PIN_WIDGET_CONTROL,
14503					   pinval);
14504	}
14505	return alc_check_power_status(codec, nid);
14506}
14507#endif /* CONFIG_SND_HDA_POWER_SAVE */
14508
14509static int alc275_setup_dual_adc(struct hda_codec *codec)
14510{
14511	struct alc_spec *spec = codec->spec;
14512
14513	if (codec->vendor_id != 0x10ec0275 || !spec->auto_mic)
14514		return 0;
14515	if ((spec->ext_mic.pin >= 0x18 && spec->int_mic.pin <= 0x13) ||
14516	    (spec->ext_mic.pin <= 0x12 && spec->int_mic.pin >= 0x18)) {
14517		if (spec->ext_mic.pin <= 0x12) {
14518			spec->private_adc_nids[0] = 0x08;
14519			spec->private_adc_nids[1] = 0x11;
14520			spec->private_capsrc_nids[0] = 0x23;
14521			spec->private_capsrc_nids[1] = 0x22;
14522		} else {
14523			spec->private_adc_nids[0] = 0x11;
14524			spec->private_adc_nids[1] = 0x08;
14525			spec->private_capsrc_nids[0] = 0x22;
14526			spec->private_capsrc_nids[1] = 0x23;
14527		}
14528		spec->adc_nids = spec->private_adc_nids;
14529		spec->capsrc_nids = spec->private_capsrc_nids;
14530		spec->num_adc_nids = 2;
14531		spec->dual_adc_switch = 1;
14532		snd_printdd("realtek: enabling dual ADC switchg (%02x:%02x)\n",
14533			    spec->adc_nids[0], spec->adc_nids[1]);
14534		return 1;
14535	}
14536	return 0;
14537}
14538
14539/*
14540 * BIOS auto configuration
14541 */
14542static int alc269_parse_auto_config(struct hda_codec *codec)
14543{
14544	struct alc_spec *spec = codec->spec;
14545	int err;
14546	static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
14547
14548	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14549					   alc269_ignore);
14550	if (err < 0)
14551		return err;
14552
14553	err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
14554	if (err < 0)
14555		return err;
14556	err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
14557	if (err < 0)
14558		return err;
14559
14560	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
14561
14562	alc_auto_parse_digital(codec);
14563
14564	if (spec->kctls.list)
14565		add_mixer(spec, spec->kctls.list);
14566
14567	if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010) {
14568		add_verb(spec, alc269vb_init_verbs);
14569		alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21);
14570	} else {
14571		add_verb(spec, alc269_init_verbs);
14572		alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
14573	}
14574
14575	spec->num_mux_defs = 1;
14576	spec->input_mux = &spec->private_imux[0];
14577
14578	if (!alc275_setup_dual_adc(codec))
14579		fillup_priv_adc_nids(codec, alc269_adc_candidates,
14580				     sizeof(alc269_adc_candidates));
14581
14582	/* set default input source */
14583	if (!spec->dual_adc_switch)
14584		select_or_unmute_capsrc(codec, spec->capsrc_nids[0],
14585					spec->input_mux->items[0].index);
14586
14587	err = alc_auto_add_mic_boost(codec);
14588	if (err < 0)
14589		return err;
14590
14591	if (!spec->cap_mixer && !spec->no_analog)
14592		set_capture_mixer(codec);
14593
14594	return 1;
14595}
14596
14597#define alc269_auto_init_multi_out	alc268_auto_init_multi_out
14598#define alc269_auto_init_hp_out		alc268_auto_init_hp_out
14599#define alc269_auto_init_analog_input	alc882_auto_init_analog_input
14600
14601
14602/* init callback for auto-configuration model -- overriding the default init */
14603static void alc269_auto_init(struct hda_codec *codec)
14604{
14605	struct alc_spec *spec = codec->spec;
14606	alc269_auto_init_multi_out(codec);
14607	alc269_auto_init_hp_out(codec);
14608	alc269_auto_init_analog_input(codec);
14609	alc_auto_init_digital(codec);
14610	alc_init_jacks(codec);
14611	if (spec->unsol_event)
14612		alc_inithook(codec);
14613}
14614
14615#ifdef CONFIG_SND_HDA_POWER_SAVE
14616static int alc269_suspend(struct hda_codec *codec, pm_message_t state)
14617{
14618	struct alc_spec *spec = codec->spec;
14619	int val;
14620
14621	if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017) {
14622		val = alc_read_coef_idx(codec, 0x04);
14623		/* Power down output pin */
14624		alc_write_coef_idx(codec, 0x04, val & ~(1<<11));
14625	}
14626
14627	if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
14628		val = alc_read_coef_idx(codec, 0x04);
14629		/* Power down output pin */
14630		alc_write_coef_idx(codec, 0x04, val & ~(1<<11));
14631		msleep(150);
14632	}
14633
14634	alc_shutup(codec);
14635	if (spec && spec->power_hook)
14636		spec->power_hook(codec);
14637	return 0;
14638}
14639#endif
14640#ifdef SND_HDA_NEEDS_RESUME
14641static int alc269_resume(struct hda_codec *codec)
14642{
14643	int val;
14644
14645	if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
14646		val = alc_read_coef_idx(codec, 0x04);
14647		/* Power down output pin */
14648		alc_write_coef_idx(codec, 0x04, val & ~(1<<11));
14649		msleep(150);
14650	}
14651
14652	codec->patch_ops.init(codec);
14653
14654	if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017) {
14655		val = alc_read_coef_idx(codec, 0x04);
14656		/* Power up output pin */
14657		alc_write_coef_idx(codec, 0x04, val | (1<<11));
14658		msleep(200);
14659	}
14660
14661	if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
14662		val = alc_read_coef_idx(codec, 0x04);
14663		/* Power up output pin */
14664		alc_write_coef_idx(codec, 0x04, val | (1<<11));
14665	}
14666
14667	snd_hda_codec_resume_amp(codec);
14668	snd_hda_codec_resume_cache(codec);
14669#ifdef CONFIG_SND_HDA_POWER_SAVE
14670	if (codec->patch_ops.check_power_status)
14671		codec->patch_ops.check_power_status(codec, 0x01);
14672#endif
14673	return 0;
14674}
14675#endif
14676
14677enum {
14678	ALC269_FIXUP_SONY_VAIO,
14679};
14680
14681static const struct alc_fixup alc269_fixups[] = {
14682	[ALC269_FIXUP_SONY_VAIO] = {
14683		.verbs = (const struct hda_verb[]) {
14684			{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
14685			{}
14686		}
14687	},
14688};
14689
14690static struct snd_pci_quirk alc269_fixup_tbl[] = {
14691	SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
14692	SND_PCI_QUIRK(0x104d, 0x9077, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
14693	{}
14694};
14695
14696
14697/*
14698 * configuration and preset
14699 */
14700static const char *alc269_models[ALC269_MODEL_LAST] = {
14701	[ALC269_BASIC]			= "basic",
14702	[ALC269_QUANTA_FL1]		= "quanta",
14703	[ALC269_AMIC]			= "laptop-amic",
14704	[ALC269_DMIC]			= "laptop-dmic",
14705	[ALC269_FUJITSU]		= "fujitsu",
14706	[ALC269_LIFEBOOK]		= "lifebook",
14707	[ALC269_AUTO]			= "auto",
14708};
14709
14710static struct snd_pci_quirk alc269_cfg_tbl[] = {
14711	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
14712	SND_PCI_QUIRK(0x1025, 0x047c, "ACER ZGA", ALC271_ACER),
14713	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
14714		      ALC269_AMIC),
14715	SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
14716	SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
14717	SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
14718	SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
14719	SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
14720	SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
14721	SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
14722	SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
14723	SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
14724	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC),
14725	SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
14726	SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
14727	SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
14728	SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
14729	SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
14730	SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
14731	SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
14732	SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
14733	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
14734	SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
14735	SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
14736	SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
14737	SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
14738	SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
14739	SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
14740	SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
14741	SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
14742	SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
14743	SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
14744	SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
14745	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
14746	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
14747	SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
14748	SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
14749	SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
14750	SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
14751	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
14752		      ALC269_DMIC),
14753	SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
14754		      ALC269_DMIC),
14755	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
14756	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
14757	SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),
14758	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
14759	SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
14760	SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
14761	SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC),
14762	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC),
14763	SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC),
14764	SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC),
14765	{}
14766};
14767
14768static struct alc_config_preset alc269_presets[] = {
14769	[ALC269_BASIC] = {
14770		.mixers = { alc269_base_mixer },
14771		.init_verbs = { alc269_init_verbs },
14772		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14773		.dac_nids = alc269_dac_nids,
14774		.hp_nid = 0x03,
14775		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14776		.channel_mode = alc269_modes,
14777		.input_mux = &alc269_capture_source,
14778	},
14779	[ALC269_QUANTA_FL1] = {
14780		.mixers = { alc269_quanta_fl1_mixer },
14781		.init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
14782		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14783		.dac_nids = alc269_dac_nids,
14784		.hp_nid = 0x03,
14785		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14786		.channel_mode = alc269_modes,
14787		.input_mux = &alc269_capture_source,
14788		.unsol_event = alc269_quanta_fl1_unsol_event,
14789		.setup = alc269_quanta_fl1_setup,
14790		.init_hook = alc269_quanta_fl1_init_hook,
14791	},
14792	[ALC269_AMIC] = {
14793		.mixers = { alc269_laptop_mixer },
14794		.cap_mixer = alc269_laptop_analog_capture_mixer,
14795		.init_verbs = { alc269_init_verbs,
14796				alc269_laptop_amic_init_verbs },
14797		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14798		.dac_nids = alc269_dac_nids,
14799		.hp_nid = 0x03,
14800		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14801		.channel_mode = alc269_modes,
14802		.unsol_event = alc269_laptop_unsol_event,
14803		.setup = alc269_laptop_amic_setup,
14804		.init_hook = alc269_laptop_inithook,
14805	},
14806	[ALC269_DMIC] = {
14807		.mixers = { alc269_laptop_mixer },
14808		.cap_mixer = alc269_laptop_digital_capture_mixer,
14809		.init_verbs = { alc269_init_verbs,
14810				alc269_laptop_dmic_init_verbs },
14811		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14812		.dac_nids = alc269_dac_nids,
14813		.hp_nid = 0x03,
14814		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14815		.channel_mode = alc269_modes,
14816		.unsol_event = alc269_laptop_unsol_event,
14817		.setup = alc269_laptop_dmic_setup,
14818		.init_hook = alc269_laptop_inithook,
14819	},
14820	[ALC269VB_AMIC] = {
14821		.mixers = { alc269vb_laptop_mixer },
14822		.cap_mixer = alc269vb_laptop_analog_capture_mixer,
14823		.init_verbs = { alc269vb_init_verbs,
14824				alc269vb_laptop_amic_init_verbs },
14825		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14826		.dac_nids = alc269_dac_nids,
14827		.hp_nid = 0x03,
14828		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14829		.channel_mode = alc269_modes,
14830		.unsol_event = alc269_laptop_unsol_event,
14831		.setup = alc269vb_laptop_amic_setup,
14832		.init_hook = alc269_laptop_inithook,
14833	},
14834	[ALC269VB_DMIC] = {
14835		.mixers = { alc269vb_laptop_mixer },
14836		.cap_mixer = alc269vb_laptop_digital_capture_mixer,
14837		.init_verbs = { alc269vb_init_verbs,
14838				alc269vb_laptop_dmic_init_verbs },
14839		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14840		.dac_nids = alc269_dac_nids,
14841		.hp_nid = 0x03,
14842		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14843		.channel_mode = alc269_modes,
14844		.unsol_event = alc269_laptop_unsol_event,
14845		.setup = alc269vb_laptop_dmic_setup,
14846		.init_hook = alc269_laptop_inithook,
14847	},
14848	[ALC269_FUJITSU] = {
14849		.mixers = { alc269_fujitsu_mixer },
14850		.cap_mixer = alc269_laptop_digital_capture_mixer,
14851		.init_verbs = { alc269_init_verbs,
14852				alc269_laptop_dmic_init_verbs },
14853		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14854		.dac_nids = alc269_dac_nids,
14855		.hp_nid = 0x03,
14856		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14857		.channel_mode = alc269_modes,
14858		.unsol_event = alc269_laptop_unsol_event,
14859		.setup = alc269_laptop_dmic_setup,
14860		.init_hook = alc269_laptop_inithook,
14861	},
14862	[ALC269_LIFEBOOK] = {
14863		.mixers = { alc269_lifebook_mixer },
14864		.init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
14865		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14866		.dac_nids = alc269_dac_nids,
14867		.hp_nid = 0x03,
14868		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14869		.channel_mode = alc269_modes,
14870		.input_mux = &alc269_capture_source,
14871		.unsol_event = alc269_lifebook_unsol_event,
14872		.init_hook = alc269_lifebook_init_hook,
14873	},
14874	[ALC271_ACER] = {
14875		.mixers = { alc269_asus_mixer },
14876		.cap_mixer = alc269vb_laptop_digital_capture_mixer,
14877		.init_verbs = { alc269_init_verbs, alc271_acer_dmic_verbs },
14878		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14879		.dac_nids = alc269_dac_nids,
14880		.adc_nids = alc262_dmic_adc_nids,
14881		.num_adc_nids = ARRAY_SIZE(alc262_dmic_adc_nids),
14882		.capsrc_nids = alc262_dmic_capsrc_nids,
14883		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14884		.channel_mode = alc269_modes,
14885		.input_mux = &alc269_capture_source,
14886		.dig_out_nid = ALC880_DIGOUT_NID,
14887		.unsol_event = alc_sku_unsol_event,
14888		.setup = alc269vb_laptop_dmic_setup,
14889		.init_hook = alc_inithook,
14890	},
14891};
14892
14893static int alc269_fill_coef(struct hda_codec *codec)
14894{
14895	int val;
14896
14897	if ((alc_read_coef_idx(codec, 0) & 0x00ff) < 0x015) {
14898		alc_write_coef_idx(codec, 0xf, 0x960b);
14899		alc_write_coef_idx(codec, 0xe, 0x8817);
14900	}
14901
14902	if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x016) {
14903		alc_write_coef_idx(codec, 0xf, 0x960b);
14904		alc_write_coef_idx(codec, 0xe, 0x8814);
14905	}
14906
14907	if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017) {
14908		val = alc_read_coef_idx(codec, 0x04);
14909		/* Power up output pin */
14910		alc_write_coef_idx(codec, 0x04, val | (1<<11));
14911	}
14912
14913	if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
14914		val = alc_read_coef_idx(codec, 0xd);
14915		if ((val & 0x0c00) >> 10 != 0x1) {
14916			/* Capless ramp up clock control */
14917			alc_write_coef_idx(codec, 0xd, val | 1<<10);
14918		}
14919		val = alc_read_coef_idx(codec, 0x17);
14920		if ((val & 0x01c0) >> 6 != 0x4) {
14921			/* Class D power on reset */
14922			alc_write_coef_idx(codec, 0x17, val | 1<<7);
14923		}
14924	}
14925	return 0;
14926}
14927
14928static int patch_alc269(struct hda_codec *codec)
14929{
14930	struct alc_spec *spec;
14931	int board_config;
14932	int err;
14933	int is_alc269vb = 0;
14934
14935	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14936	if (spec == NULL)
14937		return -ENOMEM;
14938
14939	codec->spec = spec;
14940
14941	alc_auto_parse_customize_define(codec);
14942
14943	if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){
14944		if (codec->bus->pci->subsystem_vendor == 0x1025 &&
14945		    spec->cdefine.platform_type == 1)
14946			alc_codec_rename(codec, "ALC271X");
14947		else
14948			alc_codec_rename(codec, "ALC259");
14949		is_alc269vb = 1;
14950	} else
14951		alc_fix_pll_init(codec, 0x20, 0x04, 15);
14952
14953	alc269_fill_coef(codec);
14954
14955	board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
14956						  alc269_models,
14957						  alc269_cfg_tbl);
14958
14959	if (board_config < 0) {
14960		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14961		       codec->chip_name);
14962		board_config = ALC269_AUTO;
14963	}
14964
14965	if (board_config == ALC269_AUTO)
14966		alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 1);
14967
14968	if (board_config == ALC269_AUTO) {
14969		/* automatic parse from the BIOS config */
14970		err = alc269_parse_auto_config(codec);
14971		if (err < 0) {
14972			alc_free(codec);
14973			return err;
14974		} else if (!err) {
14975			printk(KERN_INFO
14976			       "hda_codec: Cannot set up configuration "
14977			       "from BIOS.  Using base mode...\n");
14978			board_config = ALC269_BASIC;
14979		}
14980	}
14981
14982	if (has_cdefine_beep(codec)) {
14983		err = snd_hda_attach_beep_device(codec, 0x1);
14984		if (err < 0) {
14985			alc_free(codec);
14986			return err;
14987		}
14988	}
14989
14990	if (board_config != ALC269_AUTO)
14991		setup_preset(codec, &alc269_presets[board_config]);
14992
14993	if (board_config == ALC269_QUANTA_FL1) {
14994		/* Due to a hardware problem on Lenovo Ideadpad, we need to
14995		 * fix the sample rate of analog I/O to 44.1kHz
14996		 */
14997		spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
14998		spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
14999	} else if (spec->dual_adc_switch) {
15000		spec->stream_analog_playback = &alc269_pcm_analog_playback;
15001		/* switch ADC dynamically */
15002		spec->stream_analog_capture = &dualmic_pcm_analog_capture;
15003	} else {
15004		spec->stream_analog_playback = &alc269_pcm_analog_playback;
15005		spec->stream_analog_capture = &alc269_pcm_analog_capture;
15006	}
15007	spec->stream_digital_playback = &alc269_pcm_digital_playback;
15008	spec->stream_digital_capture = &alc269_pcm_digital_capture;
15009
15010	if (!spec->adc_nids) { /* wasn't filled automatically? use default */
15011		if (!is_alc269vb) {
15012			spec->adc_nids = alc269_adc_nids;
15013			spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
15014			spec->capsrc_nids = alc269_capsrc_nids;
15015		} else {
15016			spec->adc_nids = alc269vb_adc_nids;
15017			spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids);
15018			spec->capsrc_nids = alc269vb_capsrc_nids;
15019		}
15020	}
15021
15022	if (!spec->cap_mixer)
15023		set_capture_mixer(codec);
15024	if (has_cdefine_beep(codec))
15025		set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
15026
15027	if (board_config == ALC269_AUTO)
15028		alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 0);
15029
15030	spec->vmaster_nid = 0x02;
15031
15032	codec->patch_ops = alc_patch_ops;
15033#ifdef CONFIG_SND_HDA_POWER_SAVE
15034	codec->patch_ops.suspend = alc269_suspend;
15035#endif
15036#ifdef SND_HDA_NEEDS_RESUME
15037	codec->patch_ops.resume = alc269_resume;
15038#endif
15039	if (board_config == ALC269_AUTO)
15040		spec->init_hook = alc269_auto_init;
15041#ifdef CONFIG_SND_HDA_POWER_SAVE
15042	if (!spec->loopback.amplist)
15043		spec->loopback.amplist = alc269_loopbacks;
15044	if (alc269_mic2_for_mute_led(codec))
15045		codec->patch_ops.check_power_status = alc269_mic2_mute_check_ps;
15046#endif
15047
15048	return 0;
15049}
15050
15051/*
15052 *  ALC861 channel source setting (2/6 channel selection for 3-stack)
15053 */
15054
15055/*
15056 * set the path ways for 2 channel output
15057 * need to set the codec line out and mic 1 pin widgets to inputs
15058 */
15059static struct hda_verb alc861_threestack_ch2_init[] = {
15060	/* set pin widget 1Ah (line in) for input */
15061	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15062	/* set pin widget 18h (mic1/2) for input, for mic also enable
15063	 * the vref
15064	 */
15065	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15066
15067	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
15068#if 0
15069	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
15070	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
15071#endif
15072	{ } /* end */
15073};
15074/*
15075 * 6ch mode
15076 * need to set the codec line out and mic 1 pin widgets to outputs
15077 */
15078static struct hda_verb alc861_threestack_ch6_init[] = {
15079	/* set pin widget 1Ah (line in) for output (Back Surround)*/
15080	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15081	/* set pin widget 18h (mic1) for output (CLFE)*/
15082	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15083
15084	{ 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
15085	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
15086
15087	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
15088#if 0
15089	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
15090	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
15091#endif
15092	{ } /* end */
15093};
15094
15095static struct hda_channel_mode alc861_threestack_modes[2] = {
15096	{ 2, alc861_threestack_ch2_init },
15097	{ 6, alc861_threestack_ch6_init },
15098};
15099/* Set mic1 as input and unmute the mixer */
15100static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
15101	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15102	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
15103	{ } /* end */
15104};
15105/* Set mic1 as output and mute mixer */
15106static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
15107	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15108	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
15109	{ } /* end */
15110};
15111
15112static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
15113	{ 2, alc861_uniwill_m31_ch2_init },
15114	{ 4, alc861_uniwill_m31_ch4_init },
15115};
15116
15117/* Set mic1 and line-in as input and unmute the mixer */
15118static struct hda_verb alc861_asus_ch2_init[] = {
15119	/* set pin widget 1Ah (line in) for input */
15120	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15121	/* set pin widget 18h (mic1/2) for input, for mic also enable
15122	 * the vref
15123	 */
15124	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15125
15126	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
15127#if 0
15128	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
15129	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
15130#endif
15131	{ } /* end */
15132};
15133/* Set mic1 nad line-in as output and mute mixer */
15134static struct hda_verb alc861_asus_ch6_init[] = {
15135	/* set pin widget 1Ah (line in) for output (Back Surround)*/
15136	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15137	/* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
15138	/* set pin widget 18h (mic1) for output (CLFE)*/
15139	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15140	/* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
15141	{ 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
15142	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
15143
15144	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
15145#if 0
15146	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
15147	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
15148#endif
15149	{ } /* end */
15150};
15151
15152static struct hda_channel_mode alc861_asus_modes[2] = {
15153	{ 2, alc861_asus_ch2_init },
15154	{ 6, alc861_asus_ch6_init },
15155};
15156
15157/* patch-ALC861 */
15158
15159static struct snd_kcontrol_new alc861_base_mixer[] = {
15160        /* output mixer control */
15161	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15162	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
15163	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
15164	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
15165	HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
15166
15167        /*Input mixer control */
15168	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
15169	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
15170	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
15171	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
15172	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
15173	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
15174	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
15175	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
15176	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
15177	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
15178
15179	{ } /* end */
15180};
15181
15182static struct snd_kcontrol_new alc861_3ST_mixer[] = {
15183        /* output mixer control */
15184	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15185	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
15186	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
15187	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
15188	/*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
15189
15190	/* Input mixer control */
15191	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
15192	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
15193	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
15194	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
15195	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
15196	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
15197	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
15198	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
15199	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
15200	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
15201
15202	{
15203		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15204		.name = "Channel Mode",
15205		.info = alc_ch_mode_info,
15206		.get = alc_ch_mode_get,
15207		.put = alc_ch_mode_put,
15208                .private_value = ARRAY_SIZE(alc861_threestack_modes),
15209	},
15210	{ } /* end */
15211};
15212
15213static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
15214        /* output mixer control */
15215	HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15216	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
15217	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
15218
15219	{ } /* end */
15220};
15221
15222static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
15223        /* output mixer control */
15224	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15225	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
15226	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
15227	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
15228	/*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
15229
15230	/* Input mixer control */
15231	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
15232	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
15233	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
15234	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
15235	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
15236	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
15237	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
15238	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
15239	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
15240	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
15241
15242	{
15243		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15244		.name = "Channel Mode",
15245		.info = alc_ch_mode_info,
15246		.get = alc_ch_mode_get,
15247		.put = alc_ch_mode_put,
15248                .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
15249	},
15250	{ } /* end */
15251};
15252
15253static struct snd_kcontrol_new alc861_asus_mixer[] = {
15254        /* output mixer control */
15255	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
15256	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
15257	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
15258	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
15259	HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
15260
15261	/* Input mixer control */
15262	HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
15263	HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
15264	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
15265	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
15266	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
15267	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
15268	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
15269	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
15270	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
15271	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
15272
15273	{
15274		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15275		.name = "Channel Mode",
15276		.info = alc_ch_mode_info,
15277		.get = alc_ch_mode_get,
15278		.put = alc_ch_mode_put,
15279                .private_value = ARRAY_SIZE(alc861_asus_modes),
15280	},
15281	{ }
15282};
15283
15284/* additional mixer */
15285static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
15286	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
15287	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
15288	{ }
15289};
15290
15291/*
15292 * generic initialization of ADC, input mixers and output mixers
15293 */
15294static struct hda_verb alc861_base_init_verbs[] = {
15295	/*
15296	 * Unmute ADC0 and set the default input to mic-in
15297	 */
15298	/* port-A for surround (rear panel) */
15299	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15300	{ 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
15301	/* port-B for mic-in (rear panel) with vref */
15302	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15303	/* port-C for line-in (rear panel) */
15304	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15305	/* port-D for Front */
15306	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15307	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
15308	/* port-E for HP out (front panel) */
15309	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
15310	/* route front PCM to HP */
15311	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15312	/* port-F for mic-in (front panel) with vref */
15313	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15314	/* port-G for CLFE (rear panel) */
15315	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15316	{ 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15317	/* port-H for side (rear panel) */
15318	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15319	{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
15320	/* CD-in */
15321	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15322	/* route front mic to ADC1*/
15323	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
15324	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15325
15326	/* Unmute DAC0~3 & spdif out*/
15327	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15328	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15329	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15330	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15331	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15332
15333	/* Unmute Mixer 14 (mic) 1c (Line in)*/
15334	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15335        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15336	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15337        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15338
15339	/* Unmute Stereo Mixer 15 */
15340	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15341	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15342	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15343	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
15344
15345	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15346	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15347	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15348	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15349	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15350	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15351	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15352	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15353	/* hp used DAC 3 (Front) */
15354	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15355        {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15356
15357	{ }
15358};
15359
15360static struct hda_verb alc861_threestack_init_verbs[] = {
15361	/*
15362	 * Unmute ADC0 and set the default input to mic-in
15363	 */
15364	/* port-A for surround (rear panel) */
15365	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15366	/* port-B for mic-in (rear panel) with vref */
15367	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15368	/* port-C for line-in (rear panel) */
15369	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15370	/* port-D for Front */
15371	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15372	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
15373	/* port-E for HP out (front panel) */
15374	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
15375	/* route front PCM to HP */
15376	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15377	/* port-F for mic-in (front panel) with vref */
15378	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15379	/* port-G for CLFE (rear panel) */
15380	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15381	/* port-H for side (rear panel) */
15382	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15383	/* CD-in */
15384	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15385	/* route front mic to ADC1*/
15386	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
15387	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15388	/* Unmute DAC0~3 & spdif out*/
15389	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15390	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15391	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15392	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15393	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15394
15395	/* Unmute Mixer 14 (mic) 1c (Line in)*/
15396	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15397        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15398	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15399        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15400
15401	/* Unmute Stereo Mixer 15 */
15402	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15403	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15404	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15405	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
15406
15407	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15408	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15409	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15410	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15411	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15412	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15413	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15414	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15415	/* hp used DAC 3 (Front) */
15416	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15417        {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15418	{ }
15419};
15420
15421static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
15422	/*
15423	 * Unmute ADC0 and set the default input to mic-in
15424	 */
15425	/* port-A for surround (rear panel) */
15426	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15427	/* port-B for mic-in (rear panel) with vref */
15428	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15429	/* port-C for line-in (rear panel) */
15430	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15431	/* port-D for Front */
15432	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15433	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
15434	/* port-E for HP out (front panel) */
15435	/* this has to be set to VREF80 */
15436	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15437	/* route front PCM to HP */
15438	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15439	/* port-F for mic-in (front panel) with vref */
15440	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15441	/* port-G for CLFE (rear panel) */
15442	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15443	/* port-H for side (rear panel) */
15444	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15445	/* CD-in */
15446	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15447	/* route front mic to ADC1*/
15448	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
15449	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15450	/* Unmute DAC0~3 & spdif out*/
15451	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15452	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15453	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15454	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15455	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15456
15457	/* Unmute Mixer 14 (mic) 1c (Line in)*/
15458	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15459        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15460	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15461        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15462
15463	/* Unmute Stereo Mixer 15 */
15464	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15465	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15466	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15467	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
15468
15469	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15470	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15471	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15472	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15473	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15474	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15475	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15476	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15477	/* hp used DAC 3 (Front) */
15478	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15479        {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15480	{ }
15481};
15482
15483static struct hda_verb alc861_asus_init_verbs[] = {
15484	/*
15485	 * Unmute ADC0 and set the default input to mic-in
15486	 */
15487	/* port-A for surround (rear panel)
15488	 * according to codec#0 this is the HP jack
15489	 */
15490	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
15491	/* route front PCM to HP */
15492	{ 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
15493	/* port-B for mic-in (rear panel) with vref */
15494	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15495	/* port-C for line-in (rear panel) */
15496	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15497	/* port-D for Front */
15498	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15499	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
15500	/* port-E for HP out (front panel) */
15501	/* this has to be set to VREF80 */
15502	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15503	/* route front PCM to HP */
15504	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15505	/* port-F for mic-in (front panel) with vref */
15506	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15507	/* port-G for CLFE (rear panel) */
15508	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15509	/* port-H for side (rear panel) */
15510	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15511	/* CD-in */
15512	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15513	/* route front mic to ADC1*/
15514	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
15515	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15516	/* Unmute DAC0~3 & spdif out*/
15517	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15518	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15519	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15520	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15521	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15522	/* Unmute Mixer 14 (mic) 1c (Line in)*/
15523	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15524        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15525	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15526        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15527
15528	/* Unmute Stereo Mixer 15 */
15529	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15530	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15531	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15532	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
15533
15534	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15535	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15536	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15537	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15538	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15539	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15540	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15541	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15542	/* hp used DAC 3 (Front) */
15543	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15544	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15545	{ }
15546};
15547
15548/* additional init verbs for ASUS laptops */
15549static struct hda_verb alc861_asus_laptop_init_verbs[] = {
15550	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
15551	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
15552	{ }
15553};
15554
15555/*
15556 * generic initialization of ADC, input mixers and output mixers
15557 */
15558static struct hda_verb alc861_auto_init_verbs[] = {
15559	/*
15560	 * Unmute ADC0 and set the default input to mic-in
15561	 */
15562	/* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
15563	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15564
15565	/* Unmute DAC0~3 & spdif out*/
15566	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15567	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15568	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15569	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15570	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15571
15572	/* Unmute Mixer 14 (mic) 1c (Line in)*/
15573	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15574	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15575	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15576	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15577
15578	/* Unmute Stereo Mixer 15 */
15579	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15580	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15581	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15582	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
15583
15584	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15585	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15586	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15587	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15588	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15589	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15590	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15591	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15592
15593	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15594	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15595	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15596	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15597	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15598	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15599	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15600	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15601
15602	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},	/* set Mic 1 */
15603
15604	{ }
15605};
15606
15607static struct hda_verb alc861_toshiba_init_verbs[] = {
15608	{0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15609
15610	{ }
15611};
15612
15613/* toggle speaker-output according to the hp-jack state */
15614static void alc861_toshiba_automute(struct hda_codec *codec)
15615{
15616	unsigned int present = snd_hda_jack_detect(codec, 0x0f);
15617
15618	snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
15619				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
15620	snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
15621				 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
15622}
15623
15624static void alc861_toshiba_unsol_event(struct hda_codec *codec,
15625				       unsigned int res)
15626{
15627	if ((res >> 26) == ALC880_HP_EVENT)
15628		alc861_toshiba_automute(codec);
15629}
15630
15631/* pcm configuration: identical with ALC880 */
15632#define alc861_pcm_analog_playback	alc880_pcm_analog_playback
15633#define alc861_pcm_analog_capture	alc880_pcm_analog_capture
15634#define alc861_pcm_digital_playback	alc880_pcm_digital_playback
15635#define alc861_pcm_digital_capture	alc880_pcm_digital_capture
15636
15637
15638#define ALC861_DIGOUT_NID	0x07
15639
15640static struct hda_channel_mode alc861_8ch_modes[1] = {
15641	{ 8, NULL }
15642};
15643
15644static hda_nid_t alc861_dac_nids[4] = {
15645	/* front, surround, clfe, side */
15646	0x03, 0x06, 0x05, 0x04
15647};
15648
15649static hda_nid_t alc660_dac_nids[3] = {
15650	/* front, clfe, surround */
15651	0x03, 0x05, 0x06
15652};
15653
15654static hda_nid_t alc861_adc_nids[1] = {
15655	/* ADC0-2 */
15656	0x08,
15657};
15658
15659static struct hda_input_mux alc861_capture_source = {
15660	.num_items = 5,
15661	.items = {
15662		{ "Mic", 0x0 },
15663		{ "Front Mic", 0x3 },
15664		{ "Line", 0x1 },
15665		{ "CD", 0x4 },
15666		{ "Mixer", 0x5 },
15667	},
15668};
15669
15670static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
15671{
15672	struct alc_spec *spec = codec->spec;
15673	hda_nid_t mix, srcs[5];
15674	int i, j, num;
15675
15676	if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
15677		return 0;
15678	num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15679	if (num < 0)
15680		return 0;
15681	for (i = 0; i < num; i++) {
15682		unsigned int type;
15683		type = get_wcaps_type(get_wcaps(codec, srcs[i]));
15684		if (type != AC_WID_AUD_OUT)
15685			continue;
15686		for (j = 0; j < spec->multiout.num_dacs; j++)
15687			if (spec->multiout.dac_nids[j] == srcs[i])
15688				break;
15689		if (j >= spec->multiout.num_dacs)
15690			return srcs[i];
15691	}
15692	return 0;
15693}
15694
15695/* fill in the dac_nids table from the parsed pin configuration */
15696static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
15697				     const struct auto_pin_cfg *cfg)
15698{
15699	struct alc_spec *spec = codec->spec;
15700	int i;
15701	hda_nid_t nid, dac;
15702
15703	spec->multiout.dac_nids = spec->private_dac_nids;
15704	for (i = 0; i < cfg->line_outs; i++) {
15705		nid = cfg->line_out_pins[i];
15706		dac = alc861_look_for_dac(codec, nid);
15707		if (!dac)
15708			continue;
15709		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
15710	}
15711	return 0;
15712}
15713
15714static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
15715				hda_nid_t nid, unsigned int chs)
15716{
15717	return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx,
15718			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
15719}
15720
15721/* add playback controls from the parsed DAC table */
15722static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
15723					     const struct auto_pin_cfg *cfg)
15724{
15725	struct alc_spec *spec = codec->spec;
15726	static const char *chname[4] = {
15727		"Front", "Surround", NULL /*CLFE*/, "Side"
15728	};
15729	hda_nid_t nid;
15730	int i, err;
15731
15732	if (cfg->line_outs == 1) {
15733		const char *pfx = NULL;
15734		if (!cfg->hp_outs)
15735			pfx = "Master";
15736		else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
15737			pfx = "Speaker";
15738		if (pfx) {
15739			nid = spec->multiout.dac_nids[0];
15740			return alc861_create_out_sw(codec, pfx, nid, 3);
15741		}
15742	}
15743
15744	for (i = 0; i < cfg->line_outs; i++) {
15745		nid = spec->multiout.dac_nids[i];
15746		if (!nid)
15747			continue;
15748		if (i == 2) {
15749			/* Center/LFE */
15750			err = alc861_create_out_sw(codec, "Center", nid, 1);
15751			if (err < 0)
15752				return err;
15753			err = alc861_create_out_sw(codec, "LFE", nid, 2);
15754			if (err < 0)
15755				return err;
15756		} else {
15757			err = alc861_create_out_sw(codec, chname[i], nid, 3);
15758			if (err < 0)
15759				return err;
15760		}
15761	}
15762	return 0;
15763}
15764
15765static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
15766{
15767	struct alc_spec *spec = codec->spec;
15768	int err;
15769	hda_nid_t nid;
15770
15771	if (!pin)
15772		return 0;
15773
15774	if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
15775		nid = alc861_look_for_dac(codec, pin);
15776		if (nid) {
15777			err = alc861_create_out_sw(codec, "Headphone", nid, 3);
15778			if (err < 0)
15779				return err;
15780			spec->multiout.hp_nid = nid;
15781		}
15782	}
15783	return 0;
15784}
15785
15786/* create playback/capture controls for input pins */
15787static int alc861_auto_create_input_ctls(struct hda_codec *codec,
15788						const struct auto_pin_cfg *cfg)
15789{
15790	return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
15791}
15792
15793static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
15794					      hda_nid_t nid,
15795					      int pin_type, hda_nid_t dac)
15796{
15797	hda_nid_t mix, srcs[5];
15798	int i, num;
15799
15800	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
15801			    pin_type);
15802	snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15803			    AMP_OUT_UNMUTE);
15804	if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
15805		return;
15806	num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15807	if (num < 0)
15808		return;
15809	for (i = 0; i < num; i++) {
15810		unsigned int mute;
15811		if (srcs[i] == dac || srcs[i] == 0x15)
15812			mute = AMP_IN_UNMUTE(i);
15813		else
15814			mute = AMP_IN_MUTE(i);
15815		snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15816				    mute);
15817	}
15818}
15819
15820static void alc861_auto_init_multi_out(struct hda_codec *codec)
15821{
15822	struct alc_spec *spec = codec->spec;
15823	int i;
15824
15825	for (i = 0; i < spec->autocfg.line_outs; i++) {
15826		hda_nid_t nid = spec->autocfg.line_out_pins[i];
15827		int pin_type = get_pin_type(spec->autocfg.line_out_type);
15828		if (nid)
15829			alc861_auto_set_output_and_unmute(codec, nid, pin_type,
15830							  spec->multiout.dac_nids[i]);
15831	}
15832}
15833
15834static void alc861_auto_init_hp_out(struct hda_codec *codec)
15835{
15836	struct alc_spec *spec = codec->spec;
15837
15838	if (spec->autocfg.hp_outs)
15839		alc861_auto_set_output_and_unmute(codec,
15840						  spec->autocfg.hp_pins[0],
15841						  PIN_HP,
15842						  spec->multiout.hp_nid);
15843	if (spec->autocfg.speaker_outs)
15844		alc861_auto_set_output_and_unmute(codec,
15845						  spec->autocfg.speaker_pins[0],
15846						  PIN_OUT,
15847						  spec->multiout.dac_nids[0]);
15848}
15849
15850static void alc861_auto_init_analog_input(struct hda_codec *codec)
15851{
15852	struct alc_spec *spec = codec->spec;
15853	struct auto_pin_cfg *cfg = &spec->autocfg;
15854	int i;
15855
15856	for (i = 0; i < cfg->num_inputs; i++) {
15857		hda_nid_t nid = cfg->inputs[i].pin;
15858		if (nid >= 0x0c && nid <= 0x11)
15859			alc_set_input_pin(codec, nid, cfg->inputs[i].type);
15860	}
15861}
15862
15863/* parse the BIOS configuration and set up the alc_spec */
15864/* return 1 if successful, 0 if the proper config is not found,
15865 * or a negative error code
15866 */
15867static int alc861_parse_auto_config(struct hda_codec *codec)
15868{
15869	struct alc_spec *spec = codec->spec;
15870	int err;
15871	static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
15872
15873	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15874					   alc861_ignore);
15875	if (err < 0)
15876		return err;
15877	if (!spec->autocfg.line_outs)
15878		return 0; /* can't find valid BIOS pin config */
15879
15880	err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
15881	if (err < 0)
15882		return err;
15883	err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
15884	if (err < 0)
15885		return err;
15886	err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
15887	if (err < 0)
15888		return err;
15889	err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
15890	if (err < 0)
15891		return err;
15892
15893	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15894
15895	alc_auto_parse_digital(codec);
15896
15897	if (spec->kctls.list)
15898		add_mixer(spec, spec->kctls.list);
15899
15900	add_verb(spec, alc861_auto_init_verbs);
15901
15902	spec->num_mux_defs = 1;
15903	spec->input_mux = &spec->private_imux[0];
15904
15905	spec->adc_nids = alc861_adc_nids;
15906	spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
15907	set_capture_mixer(codec);
15908
15909	alc_ssid_check(codec, 0x0e, 0x0f, 0x0b, 0);
15910
15911	return 1;
15912}
15913
15914/* additional initialization for auto-configuration model */
15915static void alc861_auto_init(struct hda_codec *codec)
15916{
15917	struct alc_spec *spec = codec->spec;
15918	alc861_auto_init_multi_out(codec);
15919	alc861_auto_init_hp_out(codec);
15920	alc861_auto_init_analog_input(codec);
15921	alc_auto_init_digital(codec);
15922	if (spec->unsol_event)
15923		alc_inithook(codec);
15924}
15925
15926#ifdef CONFIG_SND_HDA_POWER_SAVE
15927static struct hda_amp_list alc861_loopbacks[] = {
15928	{ 0x15, HDA_INPUT, 0 },
15929	{ 0x15, HDA_INPUT, 1 },
15930	{ 0x15, HDA_INPUT, 2 },
15931	{ 0x15, HDA_INPUT, 3 },
15932	{ } /* end */
15933};
15934#endif
15935
15936
15937/*
15938 * configuration and preset
15939 */
15940static const char *alc861_models[ALC861_MODEL_LAST] = {
15941	[ALC861_3ST]		= "3stack",
15942	[ALC660_3ST]		= "3stack-660",
15943	[ALC861_3ST_DIG]	= "3stack-dig",
15944	[ALC861_6ST_DIG]	= "6stack-dig",
15945	[ALC861_UNIWILL_M31]	= "uniwill-m31",
15946	[ALC861_TOSHIBA]	= "toshiba",
15947	[ALC861_ASUS]		= "asus",
15948	[ALC861_ASUS_LAPTOP]	= "asus-laptop",
15949	[ALC861_AUTO]		= "auto",
15950};
15951
15952static struct snd_pci_quirk alc861_cfg_tbl[] = {
15953	SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
15954	SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15955	SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15956	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
15957	SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
15958	SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
15959	SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
15960	/* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
15961	 *        Any other models that need this preset?
15962	 */
15963	/* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
15964	SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
15965	SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
15966	SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
15967	SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
15968	SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
15969	/* FIXME: the below seems conflict */
15970	/* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
15971	SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
15972	SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
15973	{}
15974};
15975
15976static struct alc_config_preset alc861_presets[] = {
15977	[ALC861_3ST] = {
15978		.mixers = { alc861_3ST_mixer },
15979		.init_verbs = { alc861_threestack_init_verbs },
15980		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15981		.dac_nids = alc861_dac_nids,
15982		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15983		.channel_mode = alc861_threestack_modes,
15984		.need_dac_fix = 1,
15985		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15986		.adc_nids = alc861_adc_nids,
15987		.input_mux = &alc861_capture_source,
15988	},
15989	[ALC861_3ST_DIG] = {
15990		.mixers = { alc861_base_mixer },
15991		.init_verbs = { alc861_threestack_init_verbs },
15992		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15993		.dac_nids = alc861_dac_nids,
15994		.dig_out_nid = ALC861_DIGOUT_NID,
15995		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15996		.channel_mode = alc861_threestack_modes,
15997		.need_dac_fix = 1,
15998		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15999		.adc_nids = alc861_adc_nids,
16000		.input_mux = &alc861_capture_source,
16001	},
16002	[ALC861_6ST_DIG] = {
16003		.mixers = { alc861_base_mixer },
16004		.init_verbs = { alc861_base_init_verbs },
16005		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
16006		.dac_nids = alc861_dac_nids,
16007		.dig_out_nid = ALC861_DIGOUT_NID,
16008		.num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
16009		.channel_mode = alc861_8ch_modes,
16010		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
16011		.adc_nids = alc861_adc_nids,
16012		.input_mux = &alc861_capture_source,
16013	},
16014	[ALC660_3ST] = {
16015		.mixers = { alc861_3ST_mixer },
16016		.init_verbs = { alc861_threestack_init_verbs },
16017		.num_dacs = ARRAY_SIZE(alc660_dac_nids),
16018		.dac_nids = alc660_dac_nids,
16019		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
16020		.channel_mode = alc861_threestack_modes,
16021		.need_dac_fix = 1,
16022		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
16023		.adc_nids = alc861_adc_nids,
16024		.input_mux = &alc861_capture_source,
16025	},
16026	[ALC861_UNIWILL_M31] = {
16027		.mixers = { alc861_uniwill_m31_mixer },
16028		.init_verbs = { alc861_uniwill_m31_init_verbs },
16029		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
16030		.dac_nids = alc861_dac_nids,
16031		.dig_out_nid = ALC861_DIGOUT_NID,
16032		.num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
16033		.channel_mode = alc861_uniwill_m31_modes,
16034		.need_dac_fix = 1,
16035		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
16036		.adc_nids = alc861_adc_nids,
16037		.input_mux = &alc861_capture_source,
16038	},
16039	[ALC861_TOSHIBA] = {
16040		.mixers = { alc861_toshiba_mixer },
16041		.init_verbs = { alc861_base_init_verbs,
16042				alc861_toshiba_init_verbs },
16043		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
16044		.dac_nids = alc861_dac_nids,
16045		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
16046		.channel_mode = alc883_3ST_2ch_modes,
16047		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
16048		.adc_nids = alc861_adc_nids,
16049		.input_mux = &alc861_capture_source,
16050		.unsol_event = alc861_toshiba_unsol_event,
16051		.init_hook = alc861_toshiba_automute,
16052	},
16053	[ALC861_ASUS] = {
16054		.mixers = { alc861_asus_mixer },
16055		.init_verbs = { alc861_asus_init_verbs },
16056		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
16057		.dac_nids = alc861_dac_nids,
16058		.dig_out_nid = ALC861_DIGOUT_NID,
16059		.num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
16060		.channel_mode = alc861_asus_modes,
16061		.need_dac_fix = 1,
16062		.hp_nid = 0x06,
16063		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
16064		.adc_nids = alc861_adc_nids,
16065		.input_mux = &alc861_capture_source,
16066	},
16067	[ALC861_ASUS_LAPTOP] = {
16068		.mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
16069		.init_verbs = { alc861_asus_init_verbs,
16070				alc861_asus_laptop_init_verbs },
16071		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
16072		.dac_nids = alc861_dac_nids,
16073		.dig_out_nid = ALC861_DIGOUT_NID,
16074		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
16075		.channel_mode = alc883_3ST_2ch_modes,
16076		.need_dac_fix = 1,
16077		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
16078		.adc_nids = alc861_adc_nids,
16079		.input_mux = &alc861_capture_source,
16080	},
16081};
16082
16083/* Pin config fixes */
16084enum {
16085	PINFIX_FSC_AMILO_PI1505,
16086};
16087
16088static const struct alc_fixup alc861_fixups[] = {
16089	[PINFIX_FSC_AMILO_PI1505] = {
16090		.pins = (const struct alc_pincfg[]) {
16091			{ 0x0b, 0x0221101f }, /* HP */
16092			{ 0x0f, 0x90170310 }, /* speaker */
16093			{ }
16094		}
16095	},
16096};
16097
16098static struct snd_pci_quirk alc861_fixup_tbl[] = {
16099	SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
16100	{}
16101};
16102
16103static int patch_alc861(struct hda_codec *codec)
16104{
16105	struct alc_spec *spec;
16106	int board_config;
16107	int err;
16108
16109	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
16110	if (spec == NULL)
16111		return -ENOMEM;
16112
16113	codec->spec = spec;
16114
16115        board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
16116						  alc861_models,
16117						  alc861_cfg_tbl);
16118
16119	if (board_config < 0) {
16120		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
16121		       codec->chip_name);
16122		board_config = ALC861_AUTO;
16123	}
16124
16125	if (board_config == ALC861_AUTO)
16126		alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 1);
16127
16128	if (board_config == ALC861_AUTO) {
16129		/* automatic parse from the BIOS config */
16130		err = alc861_parse_auto_config(codec);
16131		if (err < 0) {
16132			alc_free(codec);
16133			return err;
16134		} else if (!err) {
16135			printk(KERN_INFO
16136			       "hda_codec: Cannot set up configuration "
16137			       "from BIOS.  Using base mode...\n");
16138		   board_config = ALC861_3ST_DIG;
16139		}
16140	}
16141
16142	err = snd_hda_attach_beep_device(codec, 0x23);
16143	if (err < 0) {
16144		alc_free(codec);
16145		return err;
16146	}
16147
16148	if (board_config != ALC861_AUTO)
16149		setup_preset(codec, &alc861_presets[board_config]);
16150
16151	spec->stream_analog_playback = &alc861_pcm_analog_playback;
16152	spec->stream_analog_capture = &alc861_pcm_analog_capture;
16153
16154	spec->stream_digital_playback = &alc861_pcm_digital_playback;
16155	spec->stream_digital_capture = &alc861_pcm_digital_capture;
16156
16157	if (!spec->cap_mixer)
16158		set_capture_mixer(codec);
16159	set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
16160
16161	spec->vmaster_nid = 0x03;
16162
16163	if (board_config == ALC861_AUTO)
16164		alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 0);
16165
16166	codec->patch_ops = alc_patch_ops;
16167	if (board_config == ALC861_AUTO) {
16168		spec->init_hook = alc861_auto_init;
16169#ifdef CONFIG_SND_HDA_POWER_SAVE
16170		spec->power_hook = alc_power_eapd;
16171#endif
16172	}
16173#ifdef CONFIG_SND_HDA_POWER_SAVE
16174	if (!spec->loopback.amplist)
16175		spec->loopback.amplist = alc861_loopbacks;
16176#endif
16177
16178	return 0;
16179}
16180
16181/*
16182 * ALC861-VD support
16183 *
16184 * Based on ALC882
16185 *
16186 * In addition, an independent DAC
16187 */
16188#define ALC861VD_DIGOUT_NID	0x06
16189
16190static hda_nid_t alc861vd_dac_nids[4] = {
16191	/* front, surr, clfe, side surr */
16192	0x02, 0x03, 0x04, 0x05
16193};
16194
16195/* dac_nids for ALC660vd are in a different order - according to
16196 * Realtek's driver.
16197 * This should probably result in a different mixer for 6stack models
16198 * of ALC660vd codecs, but for now there is only 3stack mixer
16199 * - and it is the same as in 861vd.
16200 * adc_nids in ALC660vd are (is) the same as in 861vd
16201 */
16202static hda_nid_t alc660vd_dac_nids[3] = {
16203	/* front, rear, clfe, rear_surr */
16204	0x02, 0x04, 0x03
16205};
16206
16207static hda_nid_t alc861vd_adc_nids[1] = {
16208	/* ADC0 */
16209	0x09,
16210};
16211
16212static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
16213
16214/* input MUX */
16215/* FIXME: should be a matrix-type input source selection */
16216static struct hda_input_mux alc861vd_capture_source = {
16217	.num_items = 4,
16218	.items = {
16219		{ "Mic", 0x0 },
16220		{ "Front Mic", 0x1 },
16221		{ "Line", 0x2 },
16222		{ "CD", 0x4 },
16223	},
16224};
16225
16226static struct hda_input_mux alc861vd_dallas_capture_source = {
16227	.num_items = 2,
16228	.items = {
16229		{ "Ext Mic", 0x0 },
16230		{ "Int Mic", 0x1 },
16231	},
16232};
16233
16234static struct hda_input_mux alc861vd_hp_capture_source = {
16235	.num_items = 2,
16236	.items = {
16237		{ "Front Mic", 0x0 },
16238		{ "ATAPI Mic", 0x1 },
16239	},
16240};
16241
16242/*
16243 * 2ch mode
16244 */
16245static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
16246	{ 2, NULL }
16247};
16248
16249/*
16250 * 6ch mode
16251 */
16252static struct hda_verb alc861vd_6stack_ch6_init[] = {
16253	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16254	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16255	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16256	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16257	{ } /* end */
16258};
16259
16260/*
16261 * 8ch mode
16262 */
16263static struct hda_verb alc861vd_6stack_ch8_init[] = {
16264	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16265	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16266	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16267	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16268	{ } /* end */
16269};
16270
16271static struct hda_channel_mode alc861vd_6stack_modes[2] = {
16272	{ 6, alc861vd_6stack_ch6_init },
16273	{ 8, alc861vd_6stack_ch8_init },
16274};
16275
16276static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
16277	{
16278		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
16279		.name = "Channel Mode",
16280		.info = alc_ch_mode_info,
16281		.get = alc_ch_mode_get,
16282		.put = alc_ch_mode_put,
16283	},
16284	{ } /* end */
16285};
16286
16287/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
16288 *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
16289 */
16290static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
16291	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16292	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16293
16294	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16295	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
16296
16297	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
16298				HDA_OUTPUT),
16299	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
16300				HDA_OUTPUT),
16301	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
16302	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
16303
16304	HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
16305	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
16306
16307	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16308
16309	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
16310	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16311	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16312
16313	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
16314	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16315	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16316
16317	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16318	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16319
16320	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16321	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16322
16323	{ } /* end */
16324};
16325
16326static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
16327	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16328	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16329
16330	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16331
16332	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
16333	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16334	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16335
16336	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
16337	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16338	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16339
16340	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16341	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16342
16343	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16344	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16345
16346	{ } /* end */
16347};
16348
16349static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
16350	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16351	/*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
16352	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16353
16354	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16355
16356	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
16357	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16358	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16359
16360	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
16361	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16362	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16363
16364	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16365	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16366
16367	{ } /* end */
16368};
16369
16370/* Pin assignment: Speaker=0x14, HP = 0x15,
16371 *                 Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
16372 */
16373static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
16374	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16375	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
16376	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16377	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
16378	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
16379	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16380	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16381	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
16382	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16383	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16384	{ } /* end */
16385};
16386
16387/* Pin assignment: Speaker=0x14, Line-out = 0x15,
16388 *                 Front Mic=0x18, ATAPI Mic = 0x19,
16389 */
16390static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
16391	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16392	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16393	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16394	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
16395	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16396	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16397	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16398	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16399
16400	{ } /* end */
16401};
16402
16403/*
16404 * generic initialization of ADC, input mixers and output mixers
16405 */
16406static struct hda_verb alc861vd_volume_init_verbs[] = {
16407	/*
16408	 * Unmute ADC0 and set the default input to mic-in
16409	 */
16410	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16411	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16412
16413	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
16414	 * the analog-loopback mixer widget
16415	 */
16416	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
16417	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16418	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16419	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16420	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16421	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16422
16423	/* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
16424	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16425	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16426	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
16427	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
16428
16429	/*
16430	 * Set up output mixers (0x02 - 0x05)
16431	 */
16432	/* set vol=0 to output mixers */
16433	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16434	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16435	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16436	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16437
16438	/* set up input amps for analog loopback */
16439	/* Amp Indices: DAC = 0, mixer = 1 */
16440	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16441	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16442	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16443	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16444	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16445	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16446	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16447	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16448
16449	{ }
16450};
16451
16452/*
16453 * 3-stack pin configuration:
16454 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
16455 */
16456static struct hda_verb alc861vd_3stack_init_verbs[] = {
16457	/*
16458	 * Set pin mode and muting
16459	 */
16460	/* set front pin widgets 0x14 for output */
16461	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16462	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16463	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
16464
16465	/* Mic (rear) pin: input vref at 80% */
16466	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16467	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16468	/* Front Mic pin: input vref at 80% */
16469	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16470	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16471	/* Line In pin: input */
16472	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16473	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16474	/* Line-2 In: Headphone output (output 0 - 0x0c) */
16475	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16476	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16477	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16478	/* CD pin widget for input */
16479	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16480
16481	{ }
16482};
16483
16484/*
16485 * 6-stack pin configuration:
16486 */
16487static struct hda_verb alc861vd_6stack_init_verbs[] = {
16488	/*
16489	 * Set pin mode and muting
16490	 */
16491	/* set front pin widgets 0x14 for output */
16492	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16493	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16494	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
16495
16496	/* Rear Pin: output 1 (0x0d) */
16497	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16498	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16499	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
16500	/* CLFE Pin: output 2 (0x0e) */
16501	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16502	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16503	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
16504	/* Side Pin: output 3 (0x0f) */
16505	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16506	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16507	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
16508
16509	/* Mic (rear) pin: input vref at 80% */
16510	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16511	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16512	/* Front Mic pin: input vref at 80% */
16513	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16514	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16515	/* Line In pin: input */
16516	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16517	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16518	/* Line-2 In: Headphone output (output 0 - 0x0c) */
16519	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16520	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16521	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16522	/* CD pin widget for input */
16523	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16524
16525	{ }
16526};
16527
16528static struct hda_verb alc861vd_eapd_verbs[] = {
16529	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16530	{ }
16531};
16532
16533static struct hda_verb alc660vd_eapd_verbs[] = {
16534	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16535	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16536	{ }
16537};
16538
16539static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
16540	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16541	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16542	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
16543	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16544	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16545	{}
16546};
16547
16548static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
16549{
16550	unsigned int present;
16551	unsigned char bits;
16552
16553	present = snd_hda_jack_detect(codec, 0x18);
16554	bits = present ? HDA_AMP_MUTE : 0;
16555
16556	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
16557				 HDA_AMP_MUTE, bits);
16558}
16559
16560static void alc861vd_lenovo_setup(struct hda_codec *codec)
16561{
16562	struct alc_spec *spec = codec->spec;
16563	spec->autocfg.hp_pins[0] = 0x1b;
16564	spec->autocfg.speaker_pins[0] = 0x14;
16565}
16566
16567static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
16568{
16569	alc_automute_amp(codec);
16570	alc861vd_lenovo_mic_automute(codec);
16571}
16572
16573static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
16574					unsigned int res)
16575{
16576	switch (res >> 26) {
16577	case ALC880_MIC_EVENT:
16578		alc861vd_lenovo_mic_automute(codec);
16579		break;
16580	default:
16581		alc_automute_amp_unsol_event(codec, res);
16582		break;
16583	}
16584}
16585
16586static struct hda_verb alc861vd_dallas_verbs[] = {
16587	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16588	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16589	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16590	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16591
16592	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16593	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16594	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16595	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16596	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16597	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16598	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16599	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16600
16601	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16602	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16603	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16604	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16605	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16606	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16607	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16608	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16609
16610	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16611	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16612	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16613	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16614	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16615	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16616	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16617	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16618
16619	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16620	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16621	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16622	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16623
16624	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16625	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16626	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16627
16628	{ } /* end */
16629};
16630
16631/* toggle speaker-output according to the hp-jack state */
16632static void alc861vd_dallas_setup(struct hda_codec *codec)
16633{
16634	struct alc_spec *spec = codec->spec;
16635
16636	spec->autocfg.hp_pins[0] = 0x15;
16637	spec->autocfg.speaker_pins[0] = 0x14;
16638}
16639
16640#ifdef CONFIG_SND_HDA_POWER_SAVE
16641#define alc861vd_loopbacks	alc880_loopbacks
16642#endif
16643
16644/* pcm configuration: identical with ALC880 */
16645#define alc861vd_pcm_analog_playback	alc880_pcm_analog_playback
16646#define alc861vd_pcm_analog_capture	alc880_pcm_analog_capture
16647#define alc861vd_pcm_digital_playback	alc880_pcm_digital_playback
16648#define alc861vd_pcm_digital_capture	alc880_pcm_digital_capture
16649
16650/*
16651 * configuration and preset
16652 */
16653static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
16654	[ALC660VD_3ST]		= "3stack-660",
16655	[ALC660VD_3ST_DIG]	= "3stack-660-digout",
16656	[ALC660VD_ASUS_V1S]	= "asus-v1s",
16657	[ALC861VD_3ST]		= "3stack",
16658	[ALC861VD_3ST_DIG]	= "3stack-digout",
16659	[ALC861VD_6ST_DIG]	= "6stack-digout",
16660	[ALC861VD_LENOVO]	= "lenovo",
16661	[ALC861VD_DALLAS]	= "dallas",
16662	[ALC861VD_HP]		= "hp",
16663	[ALC861VD_AUTO]		= "auto",
16664};
16665
16666static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
16667	SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
16668	SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
16669	SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
16670	/*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
16671	SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
16672	SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
16673	SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
16674	SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
16675	/*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
16676	SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
16677	SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
16678	SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
16679	SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
16680	SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
16681	SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
16682	{}
16683};
16684
16685static struct alc_config_preset alc861vd_presets[] = {
16686	[ALC660VD_3ST] = {
16687		.mixers = { alc861vd_3st_mixer },
16688		.init_verbs = { alc861vd_volume_init_verbs,
16689				 alc861vd_3stack_init_verbs },
16690		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16691		.dac_nids = alc660vd_dac_nids,
16692		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16693		.channel_mode = alc861vd_3stack_2ch_modes,
16694		.input_mux = &alc861vd_capture_source,
16695	},
16696	[ALC660VD_3ST_DIG] = {
16697		.mixers = { alc861vd_3st_mixer },
16698		.init_verbs = { alc861vd_volume_init_verbs,
16699				 alc861vd_3stack_init_verbs },
16700		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16701		.dac_nids = alc660vd_dac_nids,
16702		.dig_out_nid = ALC861VD_DIGOUT_NID,
16703		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16704		.channel_mode = alc861vd_3stack_2ch_modes,
16705		.input_mux = &alc861vd_capture_source,
16706	},
16707	[ALC861VD_3ST] = {
16708		.mixers = { alc861vd_3st_mixer },
16709		.init_verbs = { alc861vd_volume_init_verbs,
16710				 alc861vd_3stack_init_verbs },
16711		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16712		.dac_nids = alc861vd_dac_nids,
16713		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16714		.channel_mode = alc861vd_3stack_2ch_modes,
16715		.input_mux = &alc861vd_capture_source,
16716	},
16717	[ALC861VD_3ST_DIG] = {
16718		.mixers = { alc861vd_3st_mixer },
16719		.init_verbs = { alc861vd_volume_init_verbs,
16720		 		 alc861vd_3stack_init_verbs },
16721		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16722		.dac_nids = alc861vd_dac_nids,
16723		.dig_out_nid = ALC861VD_DIGOUT_NID,
16724		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16725		.channel_mode = alc861vd_3stack_2ch_modes,
16726		.input_mux = &alc861vd_capture_source,
16727	},
16728	[ALC861VD_6ST_DIG] = {
16729		.mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
16730		.init_verbs = { alc861vd_volume_init_verbs,
16731				alc861vd_6stack_init_verbs },
16732		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16733		.dac_nids = alc861vd_dac_nids,
16734		.dig_out_nid = ALC861VD_DIGOUT_NID,
16735		.num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
16736		.channel_mode = alc861vd_6stack_modes,
16737		.input_mux = &alc861vd_capture_source,
16738	},
16739	[ALC861VD_LENOVO] = {
16740		.mixers = { alc861vd_lenovo_mixer },
16741		.init_verbs = { alc861vd_volume_init_verbs,
16742				alc861vd_3stack_init_verbs,
16743				alc861vd_eapd_verbs,
16744				alc861vd_lenovo_unsol_verbs },
16745		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16746		.dac_nids = alc660vd_dac_nids,
16747		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16748		.channel_mode = alc861vd_3stack_2ch_modes,
16749		.input_mux = &alc861vd_capture_source,
16750		.unsol_event = alc861vd_lenovo_unsol_event,
16751		.setup = alc861vd_lenovo_setup,
16752		.init_hook = alc861vd_lenovo_init_hook,
16753	},
16754	[ALC861VD_DALLAS] = {
16755		.mixers = { alc861vd_dallas_mixer },
16756		.init_verbs = { alc861vd_dallas_verbs },
16757		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16758		.dac_nids = alc861vd_dac_nids,
16759		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16760		.channel_mode = alc861vd_3stack_2ch_modes,
16761		.input_mux = &alc861vd_dallas_capture_source,
16762		.unsol_event = alc_automute_amp_unsol_event,
16763		.setup = alc861vd_dallas_setup,
16764		.init_hook = alc_automute_amp,
16765	},
16766	[ALC861VD_HP] = {
16767		.mixers = { alc861vd_hp_mixer },
16768		.init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
16769		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16770		.dac_nids = alc861vd_dac_nids,
16771		.dig_out_nid = ALC861VD_DIGOUT_NID,
16772		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16773		.channel_mode = alc861vd_3stack_2ch_modes,
16774		.input_mux = &alc861vd_hp_capture_source,
16775		.unsol_event = alc_automute_amp_unsol_event,
16776		.setup = alc861vd_dallas_setup,
16777		.init_hook = alc_automute_amp,
16778	},
16779	[ALC660VD_ASUS_V1S] = {
16780		.mixers = { alc861vd_lenovo_mixer },
16781		.init_verbs = { alc861vd_volume_init_verbs,
16782				alc861vd_3stack_init_verbs,
16783				alc861vd_eapd_verbs,
16784				alc861vd_lenovo_unsol_verbs },
16785		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16786		.dac_nids = alc660vd_dac_nids,
16787		.dig_out_nid = ALC861VD_DIGOUT_NID,
16788		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16789		.channel_mode = alc861vd_3stack_2ch_modes,
16790		.input_mux = &alc861vd_capture_source,
16791		.unsol_event = alc861vd_lenovo_unsol_event,
16792		.setup = alc861vd_lenovo_setup,
16793		.init_hook = alc861vd_lenovo_init_hook,
16794	},
16795};
16796
16797/*
16798 * BIOS auto configuration
16799 */
16800static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
16801						const struct auto_pin_cfg *cfg)
16802{
16803	return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
16804}
16805
16806
16807static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
16808				hda_nid_t nid, int pin_type, int dac_idx)
16809{
16810	alc_set_pin_output(codec, nid, pin_type);
16811}
16812
16813static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
16814{
16815	struct alc_spec *spec = codec->spec;
16816	int i;
16817
16818	for (i = 0; i <= HDA_SIDE; i++) {
16819		hda_nid_t nid = spec->autocfg.line_out_pins[i];
16820		int pin_type = get_pin_type(spec->autocfg.line_out_type);
16821		if (nid)
16822			alc861vd_auto_set_output_and_unmute(codec, nid,
16823							    pin_type, i);
16824	}
16825}
16826
16827
16828static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
16829{
16830	struct alc_spec *spec = codec->spec;
16831	hda_nid_t pin;
16832
16833	pin = spec->autocfg.hp_pins[0];
16834	if (pin) /* connect to front and use dac 0 */
16835		alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
16836	pin = spec->autocfg.speaker_pins[0];
16837	if (pin)
16838		alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
16839}
16840
16841#define ALC861VD_PIN_CD_NID		ALC880_PIN_CD_NID
16842
16843static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
16844{
16845	struct alc_spec *spec = codec->spec;
16846	struct auto_pin_cfg *cfg = &spec->autocfg;
16847	int i;
16848
16849	for (i = 0; i < cfg->num_inputs; i++) {
16850		hda_nid_t nid = cfg->inputs[i].pin;
16851		if (alc_is_input_pin(codec, nid)) {
16852			alc_set_input_pin(codec, nid, cfg->inputs[i].type);
16853			if (nid != ALC861VD_PIN_CD_NID &&
16854			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
16855				snd_hda_codec_write(codec, nid, 0,
16856						AC_VERB_SET_AMP_GAIN_MUTE,
16857						AMP_OUT_MUTE);
16858		}
16859	}
16860}
16861
16862#define alc861vd_auto_init_input_src	alc882_auto_init_input_src
16863
16864#define alc861vd_idx_to_mixer_vol(nid)		((nid) + 0x02)
16865#define alc861vd_idx_to_mixer_switch(nid)	((nid) + 0x0c)
16866
16867/* add playback controls from the parsed DAC table */
16868/* Based on ALC880 version. But ALC861VD has separate,
16869 * different NIDs for mute/unmute switch and volume control */
16870static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
16871					     const struct auto_pin_cfg *cfg)
16872{
16873	static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
16874	hda_nid_t nid_v, nid_s;
16875	int i, err;
16876
16877	for (i = 0; i < cfg->line_outs; i++) {
16878		if (!spec->multiout.dac_nids[i])
16879			continue;
16880		nid_v = alc861vd_idx_to_mixer_vol(
16881				alc880_dac_to_idx(
16882					spec->multiout.dac_nids[i]));
16883		nid_s = alc861vd_idx_to_mixer_switch(
16884				alc880_dac_to_idx(
16885					spec->multiout.dac_nids[i]));
16886
16887		if (i == 2) {
16888			/* Center/LFE */
16889			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16890					      "Center",
16891					  HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
16892							      HDA_OUTPUT));
16893			if (err < 0)
16894				return err;
16895			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16896					      "LFE",
16897					  HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
16898							      HDA_OUTPUT));
16899			if (err < 0)
16900				return err;
16901			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16902					     "Center",
16903					  HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
16904							      HDA_INPUT));
16905			if (err < 0)
16906				return err;
16907			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16908					     "LFE",
16909					  HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
16910							      HDA_INPUT));
16911			if (err < 0)
16912				return err;
16913		} else {
16914			const char *pfx;
16915			if (cfg->line_outs == 1 &&
16916			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
16917				if (!cfg->hp_pins)
16918					pfx = "Speaker";
16919				else
16920					pfx = "PCM";
16921			} else
16922				pfx = chname[i];
16923			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16924					  HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
16925							      HDA_OUTPUT));
16926			if (err < 0)
16927				return err;
16928			if (cfg->line_outs == 1 &&
16929			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
16930				pfx = "Speaker";
16931			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16932					  HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
16933							      HDA_INPUT));
16934			if (err < 0)
16935				return err;
16936		}
16937	}
16938	return 0;
16939}
16940
16941/* add playback controls for speaker and HP outputs */
16942/* Based on ALC880 version. But ALC861VD has separate,
16943 * different NIDs for mute/unmute switch and volume control */
16944static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
16945					hda_nid_t pin, const char *pfx)
16946{
16947	hda_nid_t nid_v, nid_s;
16948	int err;
16949
16950	if (!pin)
16951		return 0;
16952
16953	if (alc880_is_fixed_pin(pin)) {
16954		nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
16955		/* specify the DAC as the extra output */
16956		if (!spec->multiout.hp_nid)
16957			spec->multiout.hp_nid = nid_v;
16958		else
16959			spec->multiout.extra_out_nid[0] = nid_v;
16960		/* control HP volume/switch on the output mixer amp */
16961		nid_v = alc861vd_idx_to_mixer_vol(
16962				alc880_fixed_pin_idx(pin));
16963		nid_s = alc861vd_idx_to_mixer_switch(
16964				alc880_fixed_pin_idx(pin));
16965
16966		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16967				  HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
16968		if (err < 0)
16969			return err;
16970		err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16971				  HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
16972		if (err < 0)
16973			return err;
16974	} else if (alc880_is_multi_pin(pin)) {
16975		/* set manual connection */
16976		/* we have only a switch on HP-out PIN */
16977		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
16978				  HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
16979		if (err < 0)
16980			return err;
16981	}
16982	return 0;
16983}
16984
16985/* parse the BIOS configuration and set up the alc_spec
16986 * return 1 if successful, 0 if the proper config is not found,
16987 * or a negative error code
16988 * Based on ALC880 version - had to change it to override
16989 * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
16990static int alc861vd_parse_auto_config(struct hda_codec *codec)
16991{
16992	struct alc_spec *spec = codec->spec;
16993	int err;
16994	static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
16995
16996	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
16997					   alc861vd_ignore);
16998	if (err < 0)
16999		return err;
17000	if (!spec->autocfg.line_outs)
17001		return 0; /* can't find valid BIOS pin config */
17002
17003	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
17004	if (err < 0)
17005		return err;
17006	err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
17007	if (err < 0)
17008		return err;
17009	err = alc861vd_auto_create_extra_out(spec,
17010					     spec->autocfg.speaker_pins[0],
17011					     "Speaker");
17012	if (err < 0)
17013		return err;
17014	err = alc861vd_auto_create_extra_out(spec,
17015					     spec->autocfg.hp_pins[0],
17016					     "Headphone");
17017	if (err < 0)
17018		return err;
17019	err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
17020	if (err < 0)
17021		return err;
17022
17023	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
17024
17025	alc_auto_parse_digital(codec);
17026
17027	if (spec->kctls.list)
17028		add_mixer(spec, spec->kctls.list);
17029
17030	add_verb(spec, alc861vd_volume_init_verbs);
17031
17032	spec->num_mux_defs = 1;
17033	spec->input_mux = &spec->private_imux[0];
17034
17035	err = alc_auto_add_mic_boost(codec);
17036	if (err < 0)
17037		return err;
17038
17039	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
17040
17041	return 1;
17042}
17043
17044/* additional initialization for auto-configuration model */
17045static void alc861vd_auto_init(struct hda_codec *codec)
17046{
17047	struct alc_spec *spec = codec->spec;
17048	alc861vd_auto_init_multi_out(codec);
17049	alc861vd_auto_init_hp_out(codec);
17050	alc861vd_auto_init_analog_input(codec);
17051	alc861vd_auto_init_input_src(codec);
17052	alc_auto_init_digital(codec);
17053	if (spec->unsol_event)
17054		alc_inithook(codec);
17055}
17056
17057enum {
17058	ALC660VD_FIX_ASUS_GPIO1
17059};
17060
17061/* reset GPIO1 */
17062static const struct alc_fixup alc861vd_fixups[] = {
17063	[ALC660VD_FIX_ASUS_GPIO1] = {
17064		.verbs = (const struct hda_verb[]) {
17065			{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
17066			{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
17067			{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
17068			{ }
17069		}
17070	},
17071};
17072
17073static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
17074	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
17075	{}
17076};
17077
17078static int patch_alc861vd(struct hda_codec *codec)
17079{
17080	struct alc_spec *spec;
17081	int err, board_config;
17082
17083	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
17084	if (spec == NULL)
17085		return -ENOMEM;
17086
17087	codec->spec = spec;
17088
17089	board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
17090						  alc861vd_models,
17091						  alc861vd_cfg_tbl);
17092
17093	if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
17094		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
17095		       codec->chip_name);
17096		board_config = ALC861VD_AUTO;
17097	}
17098
17099	if (board_config == ALC861VD_AUTO)
17100		alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 1);
17101
17102	if (board_config == ALC861VD_AUTO) {
17103		/* automatic parse from the BIOS config */
17104		err = alc861vd_parse_auto_config(codec);
17105		if (err < 0) {
17106			alc_free(codec);
17107			return err;
17108		} else if (!err) {
17109			printk(KERN_INFO
17110			       "hda_codec: Cannot set up configuration "
17111			       "from BIOS.  Using base mode...\n");
17112			board_config = ALC861VD_3ST;
17113		}
17114	}
17115
17116	err = snd_hda_attach_beep_device(codec, 0x23);
17117	if (err < 0) {
17118		alc_free(codec);
17119		return err;
17120	}
17121
17122	if (board_config != ALC861VD_AUTO)
17123		setup_preset(codec, &alc861vd_presets[board_config]);
17124
17125	if (codec->vendor_id == 0x10ec0660) {
17126		/* always turn on EAPD */
17127		add_verb(spec, alc660vd_eapd_verbs);
17128	}
17129
17130	spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
17131	spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
17132
17133	spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
17134	spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
17135
17136	if (!spec->adc_nids) {
17137		spec->adc_nids = alc861vd_adc_nids;
17138		spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
17139	}
17140	if (!spec->capsrc_nids)
17141		spec->capsrc_nids = alc861vd_capsrc_nids;
17142
17143	set_capture_mixer(codec);
17144	set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
17145
17146	spec->vmaster_nid = 0x02;
17147
17148	if (board_config == ALC861VD_AUTO)
17149		alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 0);
17150
17151	codec->patch_ops = alc_patch_ops;
17152
17153	if (board_config == ALC861VD_AUTO)
17154		spec->init_hook = alc861vd_auto_init;
17155#ifdef CONFIG_SND_HDA_POWER_SAVE
17156	if (!spec->loopback.amplist)
17157		spec->loopback.amplist = alc861vd_loopbacks;
17158#endif
17159
17160	return 0;
17161}
17162
17163/*
17164 * ALC662 support
17165 *
17166 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
17167 * configuration.  Each pin widget can choose any input DACs and a mixer.
17168 * Each ADC is connected from a mixer of all inputs.  This makes possible
17169 * 6-channel independent captures.
17170 *
17171 * In addition, an independent DAC for the multi-playback (not used in this
17172 * driver yet).
17173 */
17174#define ALC662_DIGOUT_NID	0x06
17175#define ALC662_DIGIN_NID	0x0a
17176
17177static hda_nid_t alc662_dac_nids[4] = {
17178	/* front, rear, clfe, rear_surr */
17179	0x02, 0x03, 0x04
17180};
17181
17182static hda_nid_t alc272_dac_nids[2] = {
17183	0x02, 0x03
17184};
17185
17186static hda_nid_t alc662_adc_nids[2] = {
17187	/* ADC1-2 */
17188	0x09, 0x08
17189};
17190
17191static hda_nid_t alc272_adc_nids[1] = {
17192	/* ADC1-2 */
17193	0x08,
17194};
17195
17196static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
17197static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
17198
17199
17200/* input MUX */
17201/* FIXME: should be a matrix-type input source selection */
17202static struct hda_input_mux alc662_capture_source = {
17203	.num_items = 4,
17204	.items = {
17205		{ "Mic", 0x0 },
17206		{ "Front Mic", 0x1 },
17207		{ "Line", 0x2 },
17208		{ "CD", 0x4 },
17209	},
17210};
17211
17212static struct hda_input_mux alc662_lenovo_101e_capture_source = {
17213	.num_items = 2,
17214	.items = {
17215		{ "Mic", 0x1 },
17216		{ "Line", 0x2 },
17217	},
17218};
17219
17220static struct hda_input_mux alc663_capture_source = {
17221	.num_items = 3,
17222	.items = {
17223		{ "Mic", 0x0 },
17224		{ "Front Mic", 0x1 },
17225		{ "Line", 0x2 },
17226	},
17227};
17228
17229#if 0 /* set to 1 for testing other input sources below */
17230static struct hda_input_mux alc272_nc10_capture_source = {
17231	.num_items = 16,
17232	.items = {
17233		{ "Autoselect Mic", 0x0 },
17234		{ "Internal Mic", 0x1 },
17235		{ "In-0x02", 0x2 },
17236		{ "In-0x03", 0x3 },
17237		{ "In-0x04", 0x4 },
17238		{ "In-0x05", 0x5 },
17239		{ "In-0x06", 0x6 },
17240		{ "In-0x07", 0x7 },
17241		{ "In-0x08", 0x8 },
17242		{ "In-0x09", 0x9 },
17243		{ "In-0x0a", 0x0a },
17244		{ "In-0x0b", 0x0b },
17245		{ "In-0x0c", 0x0c },
17246		{ "In-0x0d", 0x0d },
17247		{ "In-0x0e", 0x0e },
17248		{ "In-0x0f", 0x0f },
17249	},
17250};
17251#endif
17252
17253/*
17254 * 2ch mode
17255 */
17256static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
17257	{ 2, NULL }
17258};
17259
17260/*
17261 * 2ch mode
17262 */
17263static struct hda_verb alc662_3ST_ch2_init[] = {
17264	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
17265	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
17266	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
17267	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
17268	{ } /* end */
17269};
17270
17271/*
17272 * 6ch mode
17273 */
17274static struct hda_verb alc662_3ST_ch6_init[] = {
17275	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17276	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
17277	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
17278	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17279	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
17280	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
17281	{ } /* end */
17282};
17283
17284static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
17285	{ 2, alc662_3ST_ch2_init },
17286	{ 6, alc662_3ST_ch6_init },
17287};
17288
17289/*
17290 * 2ch mode
17291 */
17292static struct hda_verb alc662_sixstack_ch6_init[] = {
17293	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
17294	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
17295	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17296	{ } /* end */
17297};
17298
17299/*
17300 * 6ch mode
17301 */
17302static struct hda_verb alc662_sixstack_ch8_init[] = {
17303	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17304	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17305	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17306	{ } /* end */
17307};
17308
17309static struct hda_channel_mode alc662_5stack_modes[2] = {
17310	{ 2, alc662_sixstack_ch6_init },
17311	{ 6, alc662_sixstack_ch8_init },
17312};
17313
17314/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
17315 *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
17316 */
17317
17318static struct snd_kcontrol_new alc662_base_mixer[] = {
17319	/* output mixer control */
17320	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
17321	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
17322	HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
17323	HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
17324	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
17325	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
17326	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
17327	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
17328	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17329
17330	/*Input mixer control */
17331	HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
17332	HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
17333	HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
17334	HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
17335	HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
17336	HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
17337	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
17338	HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
17339	{ } /* end */
17340};
17341
17342static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
17343	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17344	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
17345	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17346	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
17347	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
17348	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17349	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17350	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17351	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17352	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17353	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17354	{ } /* end */
17355};
17356
17357static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
17358	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17359	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
17360	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17361	HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
17362	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
17363	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
17364	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
17365	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
17366	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17367	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
17368	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
17369	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17370	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17371	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17372	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17373	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17374	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17375	{ } /* end */
17376};
17377
17378static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
17379	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17380	HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
17381	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17382	HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
17383	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17384	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17385	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17386	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17387	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17388	{ } /* end */
17389};
17390
17391static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
17392	HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17393	ALC262_HIPPO_MASTER_SWITCH,
17394
17395	HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
17396	HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17397	HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17398
17399	HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
17400	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17401	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17402	{ } /* end */
17403};
17404
17405static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
17406	ALC262_HIPPO_MASTER_SWITCH,
17407	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17408	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17409	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
17410	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
17411	HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
17412	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17413	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17414	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17415	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17416	{ } /* end */
17417};
17418
17419static struct hda_bind_ctls alc663_asus_bind_master_vol = {
17420	.ops = &snd_hda_bind_vol,
17421	.values = {
17422		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
17423		HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
17424		0
17425	},
17426};
17427
17428static struct hda_bind_ctls alc663_asus_one_bind_switch = {
17429	.ops = &snd_hda_bind_sw,
17430	.values = {
17431		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17432		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
17433		0
17434	},
17435};
17436
17437static struct snd_kcontrol_new alc663_m51va_mixer[] = {
17438	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17439	HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
17440	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17441	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17442	{ } /* end */
17443};
17444
17445static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
17446	.ops = &snd_hda_bind_sw,
17447	.values = {
17448		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17449		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
17450		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
17451		0
17452	},
17453};
17454
17455static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
17456	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17457	HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
17458	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17459	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17460	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17461	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17462
17463	{ } /* end */
17464};
17465
17466static struct hda_bind_ctls alc663_asus_four_bind_switch = {
17467	.ops = &snd_hda_bind_sw,
17468	.values = {
17469		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17470		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
17471		HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
17472		0
17473	},
17474};
17475
17476static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
17477	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17478	HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
17479	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17480	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17481	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17482	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17483	{ } /* end */
17484};
17485
17486static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
17487	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17488	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17489	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17490	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17491	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17492	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17493	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17494	{ } /* end */
17495};
17496
17497static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
17498	.ops = &snd_hda_bind_vol,
17499	.values = {
17500		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
17501		HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
17502		0
17503	},
17504};
17505
17506static struct hda_bind_ctls alc663_asus_two_bind_switch = {
17507	.ops = &snd_hda_bind_sw,
17508	.values = {
17509		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17510		HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
17511		0
17512	},
17513};
17514
17515static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
17516	HDA_BIND_VOL("Master Playback Volume",
17517				&alc663_asus_two_bind_master_vol),
17518	HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
17519	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17520	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17521	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17522	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17523	{ } /* end */
17524};
17525
17526static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
17527	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17528	HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
17529	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17530	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17531	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17532	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17533	{ } /* end */
17534};
17535
17536static struct snd_kcontrol_new alc663_g71v_mixer[] = {
17537	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17538	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17539	HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17540	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17541	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17542
17543	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17544	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17545	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17546	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17547	{ } /* end */
17548};
17549
17550static struct snd_kcontrol_new alc663_g50v_mixer[] = {
17551	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17552	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17553	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17554
17555	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17556	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17557	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17558	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17559	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17560	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17561	{ } /* end */
17562};
17563
17564static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
17565	.ops = &snd_hda_bind_sw,
17566	.values = {
17567		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17568		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
17569		HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17570		HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
17571		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
17572		0
17573	},
17574};
17575
17576static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
17577	.ops = &snd_hda_bind_sw,
17578	.values = {
17579		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17580		HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17581		0
17582	},
17583};
17584
17585static struct snd_kcontrol_new alc663_mode7_mixer[] = {
17586	HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17587	HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17588	HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17589	HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17590	HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17591	HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17592	HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17593	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17594	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17595	{ } /* end */
17596};
17597
17598static struct snd_kcontrol_new alc663_mode8_mixer[] = {
17599	HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17600	HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17601	HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17602	HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17603	HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17604	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17605	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17606	{ } /* end */
17607};
17608
17609
17610static struct snd_kcontrol_new alc662_chmode_mixer[] = {
17611	{
17612		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
17613		.name = "Channel Mode",
17614		.info = alc_ch_mode_info,
17615		.get = alc_ch_mode_get,
17616		.put = alc_ch_mode_put,
17617	},
17618	{ } /* end */
17619};
17620
17621static struct hda_verb alc662_init_verbs[] = {
17622	/* ADC: mute amp left and right */
17623	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17624	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
17625
17626	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17627	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17628	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17629	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17630	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17631	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17632
17633	/* Front Pin: output 0 (0x0c) */
17634	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17635	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17636
17637	/* Rear Pin: output 1 (0x0d) */
17638	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17639	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17640
17641	/* CLFE Pin: output 2 (0x0e) */
17642	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17643	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17644
17645	/* Mic (rear) pin: input vref at 80% */
17646	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17647	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17648	/* Front Mic pin: input vref at 80% */
17649	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17650	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17651	/* Line In pin: input */
17652	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17653	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17654	/* Line-2 In: Headphone output (output 0 - 0x0c) */
17655	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17656	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17657	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
17658	/* CD pin widget for input */
17659	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17660
17661	/* FIXME: use matrix-type input source selection */
17662	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
17663	/* Input mixer */
17664	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17665	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17666
17667	/* always trun on EAPD */
17668	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
17669	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
17670
17671	{ }
17672};
17673
17674static struct hda_verb alc663_init_verbs[] = {
17675	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17676	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17677	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17678	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17679	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17680	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17681	{ }
17682};
17683
17684static struct hda_verb alc272_init_verbs[] = {
17685	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17686	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17687	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17688	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17689	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17690	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17691	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17692	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17693	{ }
17694};
17695
17696static struct hda_verb alc662_sue_init_verbs[] = {
17697	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17698	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17699	{}
17700};
17701
17702static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
17703	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17704	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17705	{}
17706};
17707
17708/* Set Unsolicited Event*/
17709static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
17710	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17711	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17712	{}
17713};
17714
17715static struct hda_verb alc663_m51va_init_verbs[] = {
17716	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17717	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17718	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17719	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17720	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17721	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17722	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17723	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17724	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17725	{}
17726};
17727
17728static struct hda_verb alc663_21jd_amic_init_verbs[] = {
17729	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17730	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17731	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17732	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17733	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17734	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17735	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17736	{}
17737};
17738
17739static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
17740	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17741	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17742	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17743	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
17744	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17745	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17746	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17747	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17748	{}
17749};
17750
17751static struct hda_verb alc663_15jd_amic_init_verbs[] = {
17752	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17753	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17754	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17755	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17756	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17757	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17758	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17759	{}
17760};
17761
17762static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
17763	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17764	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17765	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17766	{0x21, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Headphone */
17767	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17768	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17769	{0x15, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Headphone */
17770	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17771	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17772	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17773	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17774	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17775	{}
17776};
17777
17778static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
17779	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17780	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17781	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17782	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17783	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17784	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17785	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17786	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17787	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17788	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17789	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17790	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17791	{}
17792};
17793
17794static struct hda_verb alc663_g71v_init_verbs[] = {
17795	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17796	/* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
17797	/* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
17798
17799	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17800	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17801	{0x21, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
17802
17803	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17804	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
17805	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17806	{}
17807};
17808
17809static struct hda_verb alc663_g50v_init_verbs[] = {
17810	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17811	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17812	{0x21, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
17813
17814	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17815	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17816	{}
17817};
17818
17819static struct hda_verb alc662_ecs_init_verbs[] = {
17820	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
17821	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17822	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17823	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17824	{}
17825};
17826
17827static struct hda_verb alc272_dell_zm1_init_verbs[] = {
17828	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17829	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17830	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17831	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17832	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17833	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17834	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17835	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17836	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17837	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17838	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17839	{}
17840};
17841
17842static struct hda_verb alc272_dell_init_verbs[] = {
17843	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17844	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17845	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17846	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17847	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17848	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17849	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17850	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17851	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17852	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17853	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17854	{}
17855};
17856
17857static struct hda_verb alc663_mode7_init_verbs[] = {
17858	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17859	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17860	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17861	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17862	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17863	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17864	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
17865	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17866	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17867	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17868	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17869	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17870	{0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17871	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17872	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17873	{}
17874};
17875
17876static struct hda_verb alc663_mode8_init_verbs[] = {
17877	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17878	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17879	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17880	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
17881	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17882	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17883	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17884	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17885	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17886	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17887	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17888	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17889	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17890	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17891	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17892	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17893	{}
17894};
17895
17896static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
17897	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
17898	HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
17899	{ } /* end */
17900};
17901
17902static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
17903	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
17904	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
17905	{ } /* end */
17906};
17907
17908static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
17909{
17910	unsigned int present;
17911	unsigned char bits;
17912
17913	present = snd_hda_jack_detect(codec, 0x14);
17914	bits = present ? HDA_AMP_MUTE : 0;
17915
17916	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17917				 HDA_AMP_MUTE, bits);
17918}
17919
17920static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
17921{
17922	unsigned int present;
17923	unsigned char bits;
17924
17925 	present = snd_hda_jack_detect(codec, 0x1b);
17926	bits = present ? HDA_AMP_MUTE : 0;
17927
17928	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17929				 HDA_AMP_MUTE, bits);
17930	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17931				 HDA_AMP_MUTE, bits);
17932}
17933
17934static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
17935					   unsigned int res)
17936{
17937	if ((res >> 26) == ALC880_HP_EVENT)
17938		alc662_lenovo_101e_all_automute(codec);
17939	if ((res >> 26) == ALC880_FRONT_EVENT)
17940		alc662_lenovo_101e_ispeaker_automute(codec);
17941}
17942
17943/* unsolicited event for HP jack sensing */
17944static void alc662_eeepc_unsol_event(struct hda_codec *codec,
17945				     unsigned int res)
17946{
17947	if ((res >> 26) == ALC880_MIC_EVENT)
17948		alc_mic_automute(codec);
17949	else
17950		alc262_hippo_unsol_event(codec, res);
17951}
17952
17953static void alc662_eeepc_setup(struct hda_codec *codec)
17954{
17955	struct alc_spec *spec = codec->spec;
17956
17957	alc262_hippo1_setup(codec);
17958	spec->ext_mic.pin = 0x18;
17959	spec->ext_mic.mux_idx = 0;
17960	spec->int_mic.pin = 0x19;
17961	spec->int_mic.mux_idx = 1;
17962	spec->auto_mic = 1;
17963}
17964
17965static void alc662_eeepc_inithook(struct hda_codec *codec)
17966{
17967	alc262_hippo_automute(codec);
17968	alc_mic_automute(codec);
17969}
17970
17971static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
17972{
17973	struct alc_spec *spec = codec->spec;
17974
17975	spec->autocfg.hp_pins[0] = 0x14;
17976	spec->autocfg.speaker_pins[0] = 0x1b;
17977}
17978
17979#define alc662_eeepc_ep20_inithook	alc262_hippo_master_update
17980
17981static void alc663_m51va_speaker_automute(struct hda_codec *codec)
17982{
17983	unsigned int present;
17984	unsigned char bits;
17985
17986	present = snd_hda_jack_detect(codec, 0x21);
17987	bits = present ? HDA_AMP_MUTE : 0;
17988	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17989				 HDA_AMP_MUTE, bits);
17990	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17991				 HDA_AMP_MUTE, bits);
17992}
17993
17994static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
17995{
17996	unsigned int present;
17997	unsigned char bits;
17998
17999	present = snd_hda_jack_detect(codec, 0x21);
18000	bits = present ? HDA_AMP_MUTE : 0;
18001	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
18002				 HDA_AMP_MUTE, bits);
18003	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
18004				 HDA_AMP_MUTE, bits);
18005	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
18006				 HDA_AMP_MUTE, bits);
18007	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
18008				 HDA_AMP_MUTE, bits);
18009}
18010
18011static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
18012{
18013	unsigned int present;
18014	unsigned char bits;
18015
18016	present = snd_hda_jack_detect(codec, 0x15);
18017	bits = present ? HDA_AMP_MUTE : 0;
18018	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
18019				 HDA_AMP_MUTE, bits);
18020	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
18021				 HDA_AMP_MUTE, bits);
18022	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
18023				 HDA_AMP_MUTE, bits);
18024	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
18025				 HDA_AMP_MUTE, bits);
18026}
18027
18028static void alc662_f5z_speaker_automute(struct hda_codec *codec)
18029{
18030	unsigned int present;
18031	unsigned char bits;
18032
18033	present = snd_hda_jack_detect(codec, 0x1b);
18034	bits = present ? 0 : PIN_OUT;
18035	snd_hda_codec_write(codec, 0x14, 0,
18036			 AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
18037}
18038
18039static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
18040{
18041	unsigned int present1, present2;
18042
18043	present1 = snd_hda_jack_detect(codec, 0x21);
18044	present2 = snd_hda_jack_detect(codec, 0x15);
18045
18046	if (present1 || present2) {
18047		snd_hda_codec_write_cache(codec, 0x14, 0,
18048			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18049	} else {
18050		snd_hda_codec_write_cache(codec, 0x14, 0,
18051			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18052	}
18053}
18054
18055static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
18056{
18057	unsigned int present1, present2;
18058
18059	present1 = snd_hda_jack_detect(codec, 0x1b);
18060	present2 = snd_hda_jack_detect(codec, 0x15);
18061
18062	if (present1 || present2) {
18063		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
18064					 HDA_AMP_MUTE, HDA_AMP_MUTE);
18065		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
18066					 HDA_AMP_MUTE, HDA_AMP_MUTE);
18067	} else {
18068		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
18069					 HDA_AMP_MUTE, 0);
18070		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
18071					 HDA_AMP_MUTE, 0);
18072	}
18073}
18074
18075static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
18076{
18077	unsigned int present1, present2;
18078
18079	present1 = snd_hda_codec_read(codec, 0x1b, 0,
18080			AC_VERB_GET_PIN_SENSE, 0)
18081			& AC_PINSENSE_PRESENCE;
18082	present2 = snd_hda_codec_read(codec, 0x21, 0,
18083			AC_VERB_GET_PIN_SENSE, 0)
18084			& AC_PINSENSE_PRESENCE;
18085
18086	if (present1 || present2) {
18087		snd_hda_codec_write_cache(codec, 0x14, 0,
18088			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18089		snd_hda_codec_write_cache(codec, 0x17, 0,
18090			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18091	} else {
18092		snd_hda_codec_write_cache(codec, 0x14, 0,
18093			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18094		snd_hda_codec_write_cache(codec, 0x17, 0,
18095			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18096	}
18097}
18098
18099static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
18100{
18101	unsigned int present1, present2;
18102
18103	present1 = snd_hda_codec_read(codec, 0x21, 0,
18104			AC_VERB_GET_PIN_SENSE, 0)
18105			& AC_PINSENSE_PRESENCE;
18106	present2 = snd_hda_codec_read(codec, 0x15, 0,
18107			AC_VERB_GET_PIN_SENSE, 0)
18108			& AC_PINSENSE_PRESENCE;
18109
18110	if (present1 || present2) {
18111		snd_hda_codec_write_cache(codec, 0x14, 0,
18112			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18113		snd_hda_codec_write_cache(codec, 0x17, 0,
18114			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
18115	} else {
18116		snd_hda_codec_write_cache(codec, 0x14, 0,
18117			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18118		snd_hda_codec_write_cache(codec, 0x17, 0,
18119			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
18120	}
18121}
18122
18123static void alc663_m51va_unsol_event(struct hda_codec *codec,
18124					   unsigned int res)
18125{
18126	switch (res >> 26) {
18127	case ALC880_HP_EVENT:
18128		alc663_m51va_speaker_automute(codec);
18129		break;
18130	case ALC880_MIC_EVENT:
18131		alc_mic_automute(codec);
18132		break;
18133	}
18134}
18135
18136static void alc663_m51va_setup(struct hda_codec *codec)
18137{
18138	struct alc_spec *spec = codec->spec;
18139	spec->ext_mic.pin = 0x18;
18140	spec->ext_mic.mux_idx = 0;
18141	spec->int_mic.pin = 0x12;
18142	spec->int_mic.mux_idx = 9;
18143	spec->auto_mic = 1;
18144}
18145
18146static void alc663_m51va_inithook(struct hda_codec *codec)
18147{
18148	alc663_m51va_speaker_automute(codec);
18149	alc_mic_automute(codec);
18150}
18151
18152/* ***************** Mode1 ******************************/
18153#define alc663_mode1_unsol_event	alc663_m51va_unsol_event
18154
18155static void alc663_mode1_setup(struct hda_codec *codec)
18156{
18157	struct alc_spec *spec = codec->spec;
18158	spec->ext_mic.pin = 0x18;
18159	spec->ext_mic.mux_idx = 0;
18160	spec->int_mic.pin = 0x19;
18161	spec->int_mic.mux_idx = 1;
18162	spec->auto_mic = 1;
18163}
18164
18165#define alc663_mode1_inithook		alc663_m51va_inithook
18166
18167/* ***************** Mode2 ******************************/
18168static void alc662_mode2_unsol_event(struct hda_codec *codec,
18169					   unsigned int res)
18170{
18171	switch (res >> 26) {
18172	case ALC880_HP_EVENT:
18173		alc662_f5z_speaker_automute(codec);
18174		break;
18175	case ALC880_MIC_EVENT:
18176		alc_mic_automute(codec);
18177		break;
18178	}
18179}
18180
18181#define alc662_mode2_setup	alc663_mode1_setup
18182
18183static void alc662_mode2_inithook(struct hda_codec *codec)
18184{
18185	alc662_f5z_speaker_automute(codec);
18186	alc_mic_automute(codec);
18187}
18188/* ***************** Mode3 ******************************/
18189static void alc663_mode3_unsol_event(struct hda_codec *codec,
18190					   unsigned int res)
18191{
18192	switch (res >> 26) {
18193	case ALC880_HP_EVENT:
18194		alc663_two_hp_m1_speaker_automute(codec);
18195		break;
18196	case ALC880_MIC_EVENT:
18197		alc_mic_automute(codec);
18198		break;
18199	}
18200}
18201
18202#define alc663_mode3_setup	alc663_mode1_setup
18203
18204static void alc663_mode3_inithook(struct hda_codec *codec)
18205{
18206	alc663_two_hp_m1_speaker_automute(codec);
18207	alc_mic_automute(codec);
18208}
18209/* ***************** Mode4 ******************************/
18210static void alc663_mode4_unsol_event(struct hda_codec *codec,
18211					   unsigned int res)
18212{
18213	switch (res >> 26) {
18214	case ALC880_HP_EVENT:
18215		alc663_21jd_two_speaker_automute(codec);
18216		break;
18217	case ALC880_MIC_EVENT:
18218		alc_mic_automute(codec);
18219		break;
18220	}
18221}
18222
18223#define alc663_mode4_setup	alc663_mode1_setup
18224
18225static void alc663_mode4_inithook(struct hda_codec *codec)
18226{
18227	alc663_21jd_two_speaker_automute(codec);
18228	alc_mic_automute(codec);
18229}
18230/* ***************** Mode5 ******************************/
18231static void alc663_mode5_unsol_event(struct hda_codec *codec,
18232					   unsigned int res)
18233{
18234	switch (res >> 26) {
18235	case ALC880_HP_EVENT:
18236		alc663_15jd_two_speaker_automute(codec);
18237		break;
18238	case ALC880_MIC_EVENT:
18239		alc_mic_automute(codec);
18240		break;
18241	}
18242}
18243
18244#define alc663_mode5_setup	alc663_mode1_setup
18245
18246static void alc663_mode5_inithook(struct hda_codec *codec)
18247{
18248	alc663_15jd_two_speaker_automute(codec);
18249	alc_mic_automute(codec);
18250}
18251/* ***************** Mode6 ******************************/
18252static void alc663_mode6_unsol_event(struct hda_codec *codec,
18253					   unsigned int res)
18254{
18255	switch (res >> 26) {
18256	case ALC880_HP_EVENT:
18257		alc663_two_hp_m2_speaker_automute(codec);
18258		break;
18259	case ALC880_MIC_EVENT:
18260		alc_mic_automute(codec);
18261		break;
18262	}
18263}
18264
18265#define alc663_mode6_setup	alc663_mode1_setup
18266
18267static void alc663_mode6_inithook(struct hda_codec *codec)
18268{
18269	alc663_two_hp_m2_speaker_automute(codec);
18270	alc_mic_automute(codec);
18271}
18272
18273/* ***************** Mode7 ******************************/
18274static void alc663_mode7_unsol_event(struct hda_codec *codec,
18275					   unsigned int res)
18276{
18277	switch (res >> 26) {
18278	case ALC880_HP_EVENT:
18279		alc663_two_hp_m7_speaker_automute(codec);
18280		break;
18281	case ALC880_MIC_EVENT:
18282		alc_mic_automute(codec);
18283		break;
18284	}
18285}
18286
18287#define alc663_mode7_setup	alc663_mode1_setup
18288
18289static void alc663_mode7_inithook(struct hda_codec *codec)
18290{
18291	alc663_two_hp_m7_speaker_automute(codec);
18292	alc_mic_automute(codec);
18293}
18294
18295/* ***************** Mode8 ******************************/
18296static void alc663_mode8_unsol_event(struct hda_codec *codec,
18297					   unsigned int res)
18298{
18299	switch (res >> 26) {
18300	case ALC880_HP_EVENT:
18301		alc663_two_hp_m8_speaker_automute(codec);
18302		break;
18303	case ALC880_MIC_EVENT:
18304		alc_mic_automute(codec);
18305		break;
18306	}
18307}
18308
18309#define alc663_mode8_setup	alc663_m51va_setup
18310
18311static void alc663_mode8_inithook(struct hda_codec *codec)
18312{
18313	alc663_two_hp_m8_speaker_automute(codec);
18314	alc_mic_automute(codec);
18315}
18316
18317static void alc663_g71v_hp_automute(struct hda_codec *codec)
18318{
18319	unsigned int present;
18320	unsigned char bits;
18321
18322	present = snd_hda_jack_detect(codec, 0x21);
18323	bits = present ? HDA_AMP_MUTE : 0;
18324	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
18325				 HDA_AMP_MUTE, bits);
18326	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
18327				 HDA_AMP_MUTE, bits);
18328}
18329
18330static void alc663_g71v_front_automute(struct hda_codec *codec)
18331{
18332	unsigned int present;
18333	unsigned char bits;
18334
18335	present = snd_hda_jack_detect(codec, 0x15);
18336	bits = present ? HDA_AMP_MUTE : 0;
18337	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
18338				 HDA_AMP_MUTE, bits);
18339}
18340
18341static void alc663_g71v_unsol_event(struct hda_codec *codec,
18342					   unsigned int res)
18343{
18344	switch (res >> 26) {
18345	case ALC880_HP_EVENT:
18346		alc663_g71v_hp_automute(codec);
18347		break;
18348	case ALC880_FRONT_EVENT:
18349		alc663_g71v_front_automute(codec);
18350		break;
18351	case ALC880_MIC_EVENT:
18352		alc_mic_automute(codec);
18353		break;
18354	}
18355}
18356
18357#define alc663_g71v_setup	alc663_m51va_setup
18358
18359static void alc663_g71v_inithook(struct hda_codec *codec)
18360{
18361	alc663_g71v_front_automute(codec);
18362	alc663_g71v_hp_automute(codec);
18363	alc_mic_automute(codec);
18364}
18365
18366static void alc663_g50v_unsol_event(struct hda_codec *codec,
18367					   unsigned int res)
18368{
18369	switch (res >> 26) {
18370	case ALC880_HP_EVENT:
18371		alc663_m51va_speaker_automute(codec);
18372		break;
18373	case ALC880_MIC_EVENT:
18374		alc_mic_automute(codec);
18375		break;
18376	}
18377}
18378
18379#define alc663_g50v_setup	alc663_m51va_setup
18380
18381static void alc663_g50v_inithook(struct hda_codec *codec)
18382{
18383	alc663_m51va_speaker_automute(codec);
18384	alc_mic_automute(codec);
18385}
18386
18387static struct snd_kcontrol_new alc662_ecs_mixer[] = {
18388	HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
18389	ALC262_HIPPO_MASTER_SWITCH,
18390
18391	HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
18392	HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
18393	HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
18394
18395	HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
18396	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
18397	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
18398	{ } /* end */
18399};
18400
18401static struct snd_kcontrol_new alc272_nc10_mixer[] = {
18402	/* Master Playback automatically created from Speaker and Headphone */
18403	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
18404	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
18405	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
18406	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
18407
18408	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
18409	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
18410	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
18411
18412	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
18413	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
18414	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
18415	{ } /* end */
18416};
18417
18418#ifdef CONFIG_SND_HDA_POWER_SAVE
18419#define alc662_loopbacks	alc880_loopbacks
18420#endif
18421
18422
18423/* pcm configuration: identical with ALC880 */
18424#define alc662_pcm_analog_playback	alc880_pcm_analog_playback
18425#define alc662_pcm_analog_capture	alc880_pcm_analog_capture
18426#define alc662_pcm_digital_playback	alc880_pcm_digital_playback
18427#define alc662_pcm_digital_capture	alc880_pcm_digital_capture
18428
18429/*
18430 * configuration and preset
18431 */
18432static const char *alc662_models[ALC662_MODEL_LAST] = {
18433	[ALC662_3ST_2ch_DIG]	= "3stack-dig",
18434	[ALC662_3ST_6ch_DIG]	= "3stack-6ch-dig",
18435	[ALC662_3ST_6ch]	= "3stack-6ch",
18436	[ALC662_5ST_DIG]	= "6stack-dig",
18437	[ALC662_LENOVO_101E]	= "lenovo-101e",
18438	[ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
18439	[ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
18440	[ALC662_ECS] = "ecs",
18441	[ALC663_ASUS_M51VA] = "m51va",
18442	[ALC663_ASUS_G71V] = "g71v",
18443	[ALC663_ASUS_H13] = "h13",
18444	[ALC663_ASUS_G50V] = "g50v",
18445	[ALC663_ASUS_MODE1] = "asus-mode1",
18446	[ALC662_ASUS_MODE2] = "asus-mode2",
18447	[ALC663_ASUS_MODE3] = "asus-mode3",
18448	[ALC663_ASUS_MODE4] = "asus-mode4",
18449	[ALC663_ASUS_MODE5] = "asus-mode5",
18450	[ALC663_ASUS_MODE6] = "asus-mode6",
18451	[ALC663_ASUS_MODE7] = "asus-mode7",
18452	[ALC663_ASUS_MODE8] = "asus-mode8",
18453	[ALC272_DELL]		= "dell",
18454	[ALC272_DELL_ZM1]	= "dell-zm1",
18455	[ALC272_SAMSUNG_NC10]	= "samsung-nc10",
18456	[ALC662_AUTO]		= "auto",
18457};
18458
18459static struct snd_pci_quirk alc662_cfg_tbl[] = {
18460	SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
18461	SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
18462	SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
18463	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
18464	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
18465	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1),
18466	SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
18467	SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
18468	SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
18469	SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
18470	SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
18471	SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
18472	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
18473	SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
18474	SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
18475	SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
18476	SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
18477	SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
18478	SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
18479	SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
18480	SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
18481	SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
18482	SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
18483	SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
18484	SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
18485	SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
18486	SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
18487	SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
18488	SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
18489	SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
18490	SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
18491	SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
18492	SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
18493	SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
18494	SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
18495	SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
18496	SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
18497	/*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
18498	SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
18499	SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
18500	SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
18501	SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1),
18502	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
18503	SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
18504	SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
18505	SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
18506	SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
18507	SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
18508	SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
18509	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
18510	SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
18511	SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
18512	SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
18513	/*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
18514	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
18515	SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
18516	SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
18517	SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
18518	SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
18519	SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
18520	SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
18521	SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
18522	SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
18523	SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
18524		      ALC662_3ST_6ch_DIG),
18525	SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
18526	SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
18527	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
18528		      ALC662_3ST_6ch_DIG),
18529	SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13),
18530	SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
18531	SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
18532	SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
18533	SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
18534					ALC662_3ST_6ch_DIG),
18535	SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
18536			   ALC663_ASUS_H13),
18537	{}
18538};
18539
18540static struct alc_config_preset alc662_presets[] = {
18541	[ALC662_3ST_2ch_DIG] = {
18542		.mixers = { alc662_3ST_2ch_mixer },
18543		.init_verbs = { alc662_init_verbs },
18544		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18545		.dac_nids = alc662_dac_nids,
18546		.dig_out_nid = ALC662_DIGOUT_NID,
18547		.dig_in_nid = ALC662_DIGIN_NID,
18548		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18549		.channel_mode = alc662_3ST_2ch_modes,
18550		.input_mux = &alc662_capture_source,
18551	},
18552	[ALC662_3ST_6ch_DIG] = {
18553		.mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18554		.init_verbs = { alc662_init_verbs },
18555		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18556		.dac_nids = alc662_dac_nids,
18557		.dig_out_nid = ALC662_DIGOUT_NID,
18558		.dig_in_nid = ALC662_DIGIN_NID,
18559		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18560		.channel_mode = alc662_3ST_6ch_modes,
18561		.need_dac_fix = 1,
18562		.input_mux = &alc662_capture_source,
18563	},
18564	[ALC662_3ST_6ch] = {
18565		.mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18566		.init_verbs = { alc662_init_verbs },
18567		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18568		.dac_nids = alc662_dac_nids,
18569		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18570		.channel_mode = alc662_3ST_6ch_modes,
18571		.need_dac_fix = 1,
18572		.input_mux = &alc662_capture_source,
18573	},
18574	[ALC662_5ST_DIG] = {
18575		.mixers = { alc662_base_mixer, alc662_chmode_mixer },
18576		.init_verbs = { alc662_init_verbs },
18577		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18578		.dac_nids = alc662_dac_nids,
18579		.dig_out_nid = ALC662_DIGOUT_NID,
18580		.dig_in_nid = ALC662_DIGIN_NID,
18581		.num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
18582		.channel_mode = alc662_5stack_modes,
18583		.input_mux = &alc662_capture_source,
18584	},
18585	[ALC662_LENOVO_101E] = {
18586		.mixers = { alc662_lenovo_101e_mixer },
18587		.init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
18588		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18589		.dac_nids = alc662_dac_nids,
18590		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18591		.channel_mode = alc662_3ST_2ch_modes,
18592		.input_mux = &alc662_lenovo_101e_capture_source,
18593		.unsol_event = alc662_lenovo_101e_unsol_event,
18594		.init_hook = alc662_lenovo_101e_all_automute,
18595	},
18596	[ALC662_ASUS_EEEPC_P701] = {
18597		.mixers = { alc662_eeepc_p701_mixer },
18598		.init_verbs = { alc662_init_verbs,
18599				alc662_eeepc_sue_init_verbs },
18600		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18601		.dac_nids = alc662_dac_nids,
18602		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18603		.channel_mode = alc662_3ST_2ch_modes,
18604		.unsol_event = alc662_eeepc_unsol_event,
18605		.setup = alc662_eeepc_setup,
18606		.init_hook = alc662_eeepc_inithook,
18607	},
18608	[ALC662_ASUS_EEEPC_EP20] = {
18609		.mixers = { alc662_eeepc_ep20_mixer,
18610			    alc662_chmode_mixer },
18611		.init_verbs = { alc662_init_verbs,
18612				alc662_eeepc_ep20_sue_init_verbs },
18613		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18614		.dac_nids = alc662_dac_nids,
18615		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18616		.channel_mode = alc662_3ST_6ch_modes,
18617		.input_mux = &alc662_lenovo_101e_capture_source,
18618		.unsol_event = alc662_eeepc_unsol_event,
18619		.setup = alc662_eeepc_ep20_setup,
18620		.init_hook = alc662_eeepc_ep20_inithook,
18621	},
18622	[ALC662_ECS] = {
18623		.mixers = { alc662_ecs_mixer },
18624		.init_verbs = { alc662_init_verbs,
18625				alc662_ecs_init_verbs },
18626		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18627		.dac_nids = alc662_dac_nids,
18628		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18629		.channel_mode = alc662_3ST_2ch_modes,
18630		.unsol_event = alc662_eeepc_unsol_event,
18631		.setup = alc662_eeepc_setup,
18632		.init_hook = alc662_eeepc_inithook,
18633	},
18634	[ALC663_ASUS_M51VA] = {
18635		.mixers = { alc663_m51va_mixer },
18636		.init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18637		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18638		.dac_nids = alc662_dac_nids,
18639		.dig_out_nid = ALC662_DIGOUT_NID,
18640		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18641		.channel_mode = alc662_3ST_2ch_modes,
18642		.unsol_event = alc663_m51va_unsol_event,
18643		.setup = alc663_m51va_setup,
18644		.init_hook = alc663_m51va_inithook,
18645	},
18646	[ALC663_ASUS_G71V] = {
18647		.mixers = { alc663_g71v_mixer },
18648		.init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
18649		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18650		.dac_nids = alc662_dac_nids,
18651		.dig_out_nid = ALC662_DIGOUT_NID,
18652		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18653		.channel_mode = alc662_3ST_2ch_modes,
18654		.unsol_event = alc663_g71v_unsol_event,
18655		.setup = alc663_g71v_setup,
18656		.init_hook = alc663_g71v_inithook,
18657	},
18658	[ALC663_ASUS_H13] = {
18659		.mixers = { alc663_m51va_mixer },
18660		.init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18661		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18662		.dac_nids = alc662_dac_nids,
18663		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18664		.channel_mode = alc662_3ST_2ch_modes,
18665		.unsol_event = alc663_m51va_unsol_event,
18666		.init_hook = alc663_m51va_inithook,
18667	},
18668	[ALC663_ASUS_G50V] = {
18669		.mixers = { alc663_g50v_mixer },
18670		.init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
18671		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18672		.dac_nids = alc662_dac_nids,
18673		.dig_out_nid = ALC662_DIGOUT_NID,
18674		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18675		.channel_mode = alc662_3ST_6ch_modes,
18676		.input_mux = &alc663_capture_source,
18677		.unsol_event = alc663_g50v_unsol_event,
18678		.setup = alc663_g50v_setup,
18679		.init_hook = alc663_g50v_inithook,
18680	},
18681	[ALC663_ASUS_MODE1] = {
18682		.mixers = { alc663_m51va_mixer },
18683		.cap_mixer = alc662_auto_capture_mixer,
18684		.init_verbs = { alc662_init_verbs,
18685				alc663_21jd_amic_init_verbs },
18686		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18687		.hp_nid = 0x03,
18688		.dac_nids = alc662_dac_nids,
18689		.dig_out_nid = ALC662_DIGOUT_NID,
18690		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18691		.channel_mode = alc662_3ST_2ch_modes,
18692		.unsol_event = alc663_mode1_unsol_event,
18693		.setup = alc663_mode1_setup,
18694		.init_hook = alc663_mode1_inithook,
18695	},
18696	[ALC662_ASUS_MODE2] = {
18697		.mixers = { alc662_1bjd_mixer },
18698		.cap_mixer = alc662_auto_capture_mixer,
18699		.init_verbs = { alc662_init_verbs,
18700				alc662_1bjd_amic_init_verbs },
18701		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18702		.dac_nids = alc662_dac_nids,
18703		.dig_out_nid = ALC662_DIGOUT_NID,
18704		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18705		.channel_mode = alc662_3ST_2ch_modes,
18706		.unsol_event = alc662_mode2_unsol_event,
18707		.setup = alc662_mode2_setup,
18708		.init_hook = alc662_mode2_inithook,
18709	},
18710	[ALC663_ASUS_MODE3] = {
18711		.mixers = { alc663_two_hp_m1_mixer },
18712		.cap_mixer = alc662_auto_capture_mixer,
18713		.init_verbs = { alc662_init_verbs,
18714				alc663_two_hp_amic_m1_init_verbs },
18715		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18716		.hp_nid = 0x03,
18717		.dac_nids = alc662_dac_nids,
18718		.dig_out_nid = ALC662_DIGOUT_NID,
18719		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18720		.channel_mode = alc662_3ST_2ch_modes,
18721		.unsol_event = alc663_mode3_unsol_event,
18722		.setup = alc663_mode3_setup,
18723		.init_hook = alc663_mode3_inithook,
18724	},
18725	[ALC663_ASUS_MODE4] = {
18726		.mixers = { alc663_asus_21jd_clfe_mixer },
18727		.cap_mixer = alc662_auto_capture_mixer,
18728		.init_verbs = { alc662_init_verbs,
18729				alc663_21jd_amic_init_verbs},
18730		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18731		.hp_nid = 0x03,
18732		.dac_nids = alc662_dac_nids,
18733		.dig_out_nid = ALC662_DIGOUT_NID,
18734		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18735		.channel_mode = alc662_3ST_2ch_modes,
18736		.unsol_event = alc663_mode4_unsol_event,
18737		.setup = alc663_mode4_setup,
18738		.init_hook = alc663_mode4_inithook,
18739	},
18740	[ALC663_ASUS_MODE5] = {
18741		.mixers = { alc663_asus_15jd_clfe_mixer },
18742		.cap_mixer = alc662_auto_capture_mixer,
18743		.init_verbs = { alc662_init_verbs,
18744				alc663_15jd_amic_init_verbs },
18745		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18746		.hp_nid = 0x03,
18747		.dac_nids = alc662_dac_nids,
18748		.dig_out_nid = ALC662_DIGOUT_NID,
18749		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18750		.channel_mode = alc662_3ST_2ch_modes,
18751		.unsol_event = alc663_mode5_unsol_event,
18752		.setup = alc663_mode5_setup,
18753		.init_hook = alc663_mode5_inithook,
18754	},
18755	[ALC663_ASUS_MODE6] = {
18756		.mixers = { alc663_two_hp_m2_mixer },
18757		.cap_mixer = alc662_auto_capture_mixer,
18758		.init_verbs = { alc662_init_verbs,
18759				alc663_two_hp_amic_m2_init_verbs },
18760		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18761		.hp_nid = 0x03,
18762		.dac_nids = alc662_dac_nids,
18763		.dig_out_nid = ALC662_DIGOUT_NID,
18764		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18765		.channel_mode = alc662_3ST_2ch_modes,
18766		.unsol_event = alc663_mode6_unsol_event,
18767		.setup = alc663_mode6_setup,
18768		.init_hook = alc663_mode6_inithook,
18769	},
18770	[ALC663_ASUS_MODE7] = {
18771		.mixers = { alc663_mode7_mixer },
18772		.cap_mixer = alc662_auto_capture_mixer,
18773		.init_verbs = { alc662_init_verbs,
18774				alc663_mode7_init_verbs },
18775		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18776		.hp_nid = 0x03,
18777		.dac_nids = alc662_dac_nids,
18778		.dig_out_nid = ALC662_DIGOUT_NID,
18779		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18780		.channel_mode = alc662_3ST_2ch_modes,
18781		.unsol_event = alc663_mode7_unsol_event,
18782		.setup = alc663_mode7_setup,
18783		.init_hook = alc663_mode7_inithook,
18784	},
18785	[ALC663_ASUS_MODE8] = {
18786		.mixers = { alc663_mode8_mixer },
18787		.cap_mixer = alc662_auto_capture_mixer,
18788		.init_verbs = { alc662_init_verbs,
18789				alc663_mode8_init_verbs },
18790		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18791		.hp_nid = 0x03,
18792		.dac_nids = alc662_dac_nids,
18793		.dig_out_nid = ALC662_DIGOUT_NID,
18794		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18795		.channel_mode = alc662_3ST_2ch_modes,
18796		.unsol_event = alc663_mode8_unsol_event,
18797		.setup = alc663_mode8_setup,
18798		.init_hook = alc663_mode8_inithook,
18799	},
18800	[ALC272_DELL] = {
18801		.mixers = { alc663_m51va_mixer },
18802		.cap_mixer = alc272_auto_capture_mixer,
18803		.init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
18804		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
18805		.dac_nids = alc662_dac_nids,
18806		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18807		.adc_nids = alc272_adc_nids,
18808		.num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
18809		.capsrc_nids = alc272_capsrc_nids,
18810		.channel_mode = alc662_3ST_2ch_modes,
18811		.unsol_event = alc663_m51va_unsol_event,
18812		.setup = alc663_m51va_setup,
18813		.init_hook = alc663_m51va_inithook,
18814	},
18815	[ALC272_DELL_ZM1] = {
18816		.mixers = { alc663_m51va_mixer },
18817		.cap_mixer = alc662_auto_capture_mixer,
18818		.init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
18819		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
18820		.dac_nids = alc662_dac_nids,
18821		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18822		.adc_nids = alc662_adc_nids,
18823		.num_adc_nids = 1,
18824		.capsrc_nids = alc662_capsrc_nids,
18825		.channel_mode = alc662_3ST_2ch_modes,
18826		.unsol_event = alc663_m51va_unsol_event,
18827		.setup = alc663_m51va_setup,
18828		.init_hook = alc663_m51va_inithook,
18829	},
18830	[ALC272_SAMSUNG_NC10] = {
18831		.mixers = { alc272_nc10_mixer },
18832		.init_verbs = { alc662_init_verbs,
18833				alc663_21jd_amic_init_verbs },
18834		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
18835		.dac_nids = alc272_dac_nids,
18836		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18837		.channel_mode = alc662_3ST_2ch_modes,
18838		/*.input_mux = &alc272_nc10_capture_source,*/
18839		.unsol_event = alc663_mode4_unsol_event,
18840		.setup = alc663_mode4_setup,
18841		.init_hook = alc663_mode4_inithook,
18842	},
18843};
18844
18845
18846/*
18847 * BIOS auto configuration
18848 */
18849
18850/* convert from MIX nid to DAC */
18851static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
18852{
18853	if (nid == 0x0f)
18854		return 0x02;
18855	else if (nid >= 0x0c && nid <= 0x0e)
18856		return nid - 0x0c + 0x02;
18857	else
18858		return 0;
18859}
18860
18861/* get MIX nid connected to the given pin targeted to DAC */
18862static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
18863				   hda_nid_t dac)
18864{
18865	hda_nid_t mix[4];
18866	int i, num;
18867
18868	num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
18869	for (i = 0; i < num; i++) {
18870		if (alc662_mix_to_dac(mix[i]) == dac)
18871			return mix[i];
18872	}
18873	return 0;
18874}
18875
18876/* look for an empty DAC slot */
18877static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
18878{
18879	struct alc_spec *spec = codec->spec;
18880	hda_nid_t srcs[5];
18881	int i, j, num;
18882
18883	num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
18884	if (num < 0)
18885		return 0;
18886	for (i = 0; i < num; i++) {
18887		hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
18888		if (!nid)
18889			continue;
18890		for (j = 0; j < spec->multiout.num_dacs; j++)
18891			if (spec->multiout.dac_nids[j] == nid)
18892				break;
18893		if (j >= spec->multiout.num_dacs)
18894			return nid;
18895	}
18896	return 0;
18897}
18898
18899/* fill in the dac_nids table from the parsed pin configuration */
18900static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
18901				     const struct auto_pin_cfg *cfg)
18902{
18903	struct alc_spec *spec = codec->spec;
18904	int i;
18905	hda_nid_t dac;
18906
18907	spec->multiout.dac_nids = spec->private_dac_nids;
18908	for (i = 0; i < cfg->line_outs; i++) {
18909		dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
18910		if (!dac)
18911			continue;
18912		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
18913	}
18914	return 0;
18915}
18916
18917static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
18918			      hda_nid_t nid, unsigned int chs)
18919{
18920	return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
18921			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
18922}
18923
18924static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
18925			     hda_nid_t nid, unsigned int chs)
18926{
18927	return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18928			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
18929}
18930
18931#define alc662_add_stereo_vol(spec, pfx, nid) \
18932	alc662_add_vol_ctl(spec, pfx, nid, 3)
18933#define alc662_add_stereo_sw(spec, pfx, nid) \
18934	alc662_add_sw_ctl(spec, pfx, nid, 3)
18935
18936/* add playback controls from the parsed DAC table */
18937static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
18938					     const struct auto_pin_cfg *cfg)
18939{
18940	struct alc_spec *spec = codec->spec;
18941	static const char *chname[4] = {
18942		"Front", "Surround", NULL /*CLFE*/, "Side"
18943	};
18944	hda_nid_t nid, mix;
18945	int i, err;
18946
18947	for (i = 0; i < cfg->line_outs; i++) {
18948		nid = spec->multiout.dac_nids[i];
18949		if (!nid)
18950			continue;
18951		mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
18952		if (!mix)
18953			continue;
18954		if (i == 2) {
18955			/* Center/LFE */
18956			err = alc662_add_vol_ctl(spec, "Center", nid, 1);
18957			if (err < 0)
18958				return err;
18959			err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
18960			if (err < 0)
18961				return err;
18962			err = alc662_add_sw_ctl(spec, "Center", mix, 1);
18963			if (err < 0)
18964				return err;
18965			err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
18966			if (err < 0)
18967				return err;
18968		} else {
18969			const char *pfx;
18970			if (cfg->line_outs == 1 &&
18971			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
18972				if (cfg->hp_outs)
18973					pfx = "Speaker";
18974				else
18975					pfx = "PCM";
18976			} else
18977				pfx = chname[i];
18978			err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18979			if (err < 0)
18980				return err;
18981			if (cfg->line_outs == 1 &&
18982			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
18983				pfx = "Speaker";
18984			err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18985			if (err < 0)
18986				return err;
18987		}
18988	}
18989	return 0;
18990}
18991
18992/* add playback controls for speaker and HP outputs */
18993/* return DAC nid if any new DAC is assigned */
18994static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
18995					const char *pfx)
18996{
18997	struct alc_spec *spec = codec->spec;
18998	hda_nid_t nid, mix;
18999	int err;
19000
19001	if (!pin)
19002		return 0;
19003	nid = alc662_look_for_dac(codec, pin);
19004	if (!nid) {
19005		/* the corresponding DAC is already occupied */
19006		if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
19007			return 0; /* no way */
19008		/* create a switch only */
19009		return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
19010				   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
19011	}
19012
19013	mix = alc662_dac_to_mix(codec, pin, nid);
19014	if (!mix)
19015		return 0;
19016	err = alc662_add_vol_ctl(spec, pfx, nid, 3);
19017	if (err < 0)
19018		return err;
19019	err = alc662_add_sw_ctl(spec, pfx, mix, 3);
19020	if (err < 0)
19021		return err;
19022	return nid;
19023}
19024
19025/* create playback/capture controls for input pins */
19026#define alc662_auto_create_input_ctls \
19027	alc882_auto_create_input_ctls
19028
19029static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
19030					      hda_nid_t nid, int pin_type,
19031					      hda_nid_t dac)
19032{
19033	int i, num;
19034	hda_nid_t srcs[HDA_MAX_CONNECTIONS];
19035
19036	alc_set_pin_output(codec, nid, pin_type);
19037	/* need the manual connection? */
19038	num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
19039	if (num <= 1)
19040		return;
19041	for (i = 0; i < num; i++) {
19042		if (alc662_mix_to_dac(srcs[i]) != dac)
19043			continue;
19044		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
19045		return;
19046	}
19047}
19048
19049static void alc662_auto_init_multi_out(struct hda_codec *codec)
19050{
19051	struct alc_spec *spec = codec->spec;
19052	int pin_type = get_pin_type(spec->autocfg.line_out_type);
19053	int i;
19054
19055	for (i = 0; i <= HDA_SIDE; i++) {
19056		hda_nid_t nid = spec->autocfg.line_out_pins[i];
19057		if (nid)
19058			alc662_auto_set_output_and_unmute(codec, nid, pin_type,
19059					spec->multiout.dac_nids[i]);
19060	}
19061}
19062
19063static void alc662_auto_init_hp_out(struct hda_codec *codec)
19064{
19065	struct alc_spec *spec = codec->spec;
19066	hda_nid_t pin;
19067
19068	pin = spec->autocfg.hp_pins[0];
19069	if (pin)
19070		alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
19071						  spec->multiout.hp_nid);
19072	pin = spec->autocfg.speaker_pins[0];
19073	if (pin)
19074		alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
19075					spec->multiout.extra_out_nid[0]);
19076}
19077
19078#define ALC662_PIN_CD_NID		ALC880_PIN_CD_NID
19079
19080static void alc662_auto_init_analog_input(struct hda_codec *codec)
19081{
19082	struct alc_spec *spec = codec->spec;
19083	struct auto_pin_cfg *cfg = &spec->autocfg;
19084	int i;
19085
19086	for (i = 0; i < cfg->num_inputs; i++) {
19087		hda_nid_t nid = cfg->inputs[i].pin;
19088		if (alc_is_input_pin(codec, nid)) {
19089			alc_set_input_pin(codec, nid, cfg->inputs[i].type);
19090			if (nid != ALC662_PIN_CD_NID &&
19091			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
19092				snd_hda_codec_write(codec, nid, 0,
19093						    AC_VERB_SET_AMP_GAIN_MUTE,
19094						    AMP_OUT_MUTE);
19095		}
19096	}
19097}
19098
19099#define alc662_auto_init_input_src	alc882_auto_init_input_src
19100
19101static int alc662_parse_auto_config(struct hda_codec *codec)
19102{
19103	struct alc_spec *spec = codec->spec;
19104	int err;
19105	static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
19106
19107	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
19108					   alc662_ignore);
19109	if (err < 0)
19110		return err;
19111	if (!spec->autocfg.line_outs)
19112		return 0; /* can't find valid BIOS pin config */
19113
19114	err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
19115	if (err < 0)
19116		return err;
19117	err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
19118	if (err < 0)
19119		return err;
19120	err = alc662_auto_create_extra_out(codec,
19121					   spec->autocfg.speaker_pins[0],
19122					   "Speaker");
19123	if (err < 0)
19124		return err;
19125	if (err)
19126		spec->multiout.extra_out_nid[0] = err;
19127	err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
19128					   "Headphone");
19129	if (err < 0)
19130		return err;
19131	if (err)
19132		spec->multiout.hp_nid = err;
19133	err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
19134	if (err < 0)
19135		return err;
19136
19137	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
19138
19139	alc_auto_parse_digital(codec);
19140
19141	if (spec->kctls.list)
19142		add_mixer(spec, spec->kctls.list);
19143
19144	spec->num_mux_defs = 1;
19145	spec->input_mux = &spec->private_imux[0];
19146
19147	add_verb(spec, alc662_init_verbs);
19148	if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
19149	    codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
19150		add_verb(spec, alc663_init_verbs);
19151
19152	if (codec->vendor_id == 0x10ec0272)
19153		add_verb(spec, alc272_init_verbs);
19154
19155	err = alc_auto_add_mic_boost(codec);
19156	if (err < 0)
19157		return err;
19158
19159	if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
19160	    codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
19161	    alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0x21);
19162	else
19163	    alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
19164
19165	return 1;
19166}
19167
19168/* additional initialization for auto-configuration model */
19169static void alc662_auto_init(struct hda_codec *codec)
19170{
19171	struct alc_spec *spec = codec->spec;
19172	alc662_auto_init_multi_out(codec);
19173	alc662_auto_init_hp_out(codec);
19174	alc662_auto_init_analog_input(codec);
19175	alc662_auto_init_input_src(codec);
19176	alc_auto_init_digital(codec);
19177	if (spec->unsol_event)
19178		alc_inithook(codec);
19179}
19180
19181enum {
19182	ALC662_FIXUP_IDEAPAD,
19183};
19184
19185static const struct alc_fixup alc662_fixups[] = {
19186	[ALC662_FIXUP_IDEAPAD] = {
19187		.pins = (const struct alc_pincfg[]) {
19188			{ 0x17, 0x99130112 }, /* subwoofer */
19189			{ }
19190		}
19191	},
19192};
19193
19194static struct snd_pci_quirk alc662_fixup_tbl[] = {
19195	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
19196	{}
19197};
19198
19199
19200
19201static int patch_alc662(struct hda_codec *codec)
19202{
19203	struct alc_spec *spec;
19204	int err, board_config;
19205
19206	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
19207	if (!spec)
19208		return -ENOMEM;
19209
19210	codec->spec = spec;
19211
19212	alc_auto_parse_customize_define(codec);
19213
19214	alc_fix_pll_init(codec, 0x20, 0x04, 15);
19215
19216	if (alc_read_coef_idx(codec, 0) == 0x8020)
19217		alc_codec_rename(codec, "ALC661");
19218	else if ((alc_read_coef_idx(codec, 0) & (1 << 14)) &&
19219		 codec->bus->pci->subsystem_vendor == 0x1025 &&
19220		 spec->cdefine.platform_type == 1)
19221		alc_codec_rename(codec, "ALC272X");
19222
19223	board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
19224						  alc662_models,
19225			  	                  alc662_cfg_tbl);
19226	if (board_config < 0) {
19227		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
19228		       codec->chip_name);
19229		board_config = ALC662_AUTO;
19230	}
19231
19232	if (board_config == ALC662_AUTO) {
19233		alc_pick_fixup(codec, alc662_fixup_tbl, alc662_fixups, 1);
19234		/* automatic parse from the BIOS config */
19235		err = alc662_parse_auto_config(codec);
19236		if (err < 0) {
19237			alc_free(codec);
19238			return err;
19239		} else if (!err) {
19240			printk(KERN_INFO
19241			       "hda_codec: Cannot set up configuration "
19242			       "from BIOS.  Using base mode...\n");
19243			board_config = ALC662_3ST_2ch_DIG;
19244		}
19245	}
19246
19247	if (has_cdefine_beep(codec)) {
19248		err = snd_hda_attach_beep_device(codec, 0x1);
19249		if (err < 0) {
19250			alc_free(codec);
19251			return err;
19252		}
19253	}
19254
19255	if (board_config != ALC662_AUTO)
19256		setup_preset(codec, &alc662_presets[board_config]);
19257
19258	spec->stream_analog_playback = &alc662_pcm_analog_playback;
19259	spec->stream_analog_capture = &alc662_pcm_analog_capture;
19260
19261	spec->stream_digital_playback = &alc662_pcm_digital_playback;
19262	spec->stream_digital_capture = &alc662_pcm_digital_capture;
19263
19264	if (!spec->adc_nids) {
19265		spec->adc_nids = alc662_adc_nids;
19266		spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
19267	}
19268	if (!spec->capsrc_nids)
19269		spec->capsrc_nids = alc662_capsrc_nids;
19270
19271	if (!spec->cap_mixer)
19272		set_capture_mixer(codec);
19273
19274	if (has_cdefine_beep(codec)) {
19275		switch (codec->vendor_id) {
19276		case 0x10ec0662:
19277			set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
19278			break;
19279		case 0x10ec0272:
19280		case 0x10ec0663:
19281		case 0x10ec0665:
19282			set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
19283			break;
19284		case 0x10ec0273:
19285			set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
19286			break;
19287		}
19288	}
19289	spec->vmaster_nid = 0x02;
19290
19291	codec->patch_ops = alc_patch_ops;
19292	if (board_config == ALC662_AUTO) {
19293		spec->init_hook = alc662_auto_init;
19294		alc_pick_fixup(codec, alc662_fixup_tbl, alc662_fixups, 0);
19295	}
19296
19297#ifdef CONFIG_SND_HDA_POWER_SAVE
19298	if (!spec->loopback.amplist)
19299		spec->loopback.amplist = alc662_loopbacks;
19300#endif
19301
19302	return 0;
19303}
19304
19305static int patch_alc888(struct hda_codec *codec)
19306{
19307	if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
19308		kfree(codec->chip_name);
19309		codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
19310		if (!codec->chip_name) {
19311			alc_free(codec);
19312			return -ENOMEM;
19313		}
19314		return patch_alc662(codec);
19315	}
19316	return patch_alc882(codec);
19317}
19318
19319/*
19320 * ALC680 support
19321 */
19322#define ALC680_DIGIN_NID	ALC880_DIGIN_NID
19323#define ALC680_DIGOUT_NID	ALC880_DIGOUT_NID
19324#define alc680_modes		alc260_modes
19325
19326static hda_nid_t alc680_dac_nids[3] = {
19327	/* Lout1, Lout2, hp */
19328	0x02, 0x03, 0x04
19329};
19330
19331static hda_nid_t alc680_adc_nids[3] = {
19332	/* ADC0-2 */
19333	/* DMIC, MIC, Line-in*/
19334	0x07, 0x08, 0x09
19335};
19336
19337/*
19338 * Analog capture ADC cgange
19339 */
19340static void alc680_rec_autoswitch(struct hda_codec *codec)
19341{
19342	struct alc_spec *spec = codec->spec;
19343	struct auto_pin_cfg *cfg = &spec->autocfg;
19344	int pin_found = 0;
19345	int type_found = AUTO_PIN_LAST;
19346	hda_nid_t nid;
19347	int i;
19348
19349	for (i = 0; i < cfg->num_inputs; i++) {
19350		nid = cfg->inputs[i].pin;
19351		if (!(snd_hda_query_pin_caps(codec, nid) &
19352		      AC_PINCAP_PRES_DETECT))
19353			continue;
19354		if (snd_hda_jack_detect(codec, nid)) {
19355			if (cfg->inputs[i].type < type_found) {
19356				type_found = cfg->inputs[i].type;
19357				pin_found = nid;
19358			}
19359		}
19360	}
19361
19362	nid = 0x07;
19363	if (pin_found)
19364		snd_hda_get_connections(codec, pin_found, &nid, 1);
19365
19366	if (nid != spec->cur_adc)
19367		__snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
19368	spec->cur_adc = nid;
19369	snd_hda_codec_setup_stream(codec, nid, spec->cur_adc_stream_tag, 0,
19370				   spec->cur_adc_format);
19371}
19372
19373static int alc680_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
19374				      struct hda_codec *codec,
19375				      unsigned int stream_tag,
19376				      unsigned int format,
19377				      struct snd_pcm_substream *substream)
19378{
19379	struct alc_spec *spec = codec->spec;
19380
19381	spec->cur_adc = 0x07;
19382	spec->cur_adc_stream_tag = stream_tag;
19383	spec->cur_adc_format = format;
19384
19385	alc680_rec_autoswitch(codec);
19386	return 0;
19387}
19388
19389static int alc680_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
19390				      struct hda_codec *codec,
19391				      struct snd_pcm_substream *substream)
19392{
19393	snd_hda_codec_cleanup_stream(codec, 0x07);
19394	snd_hda_codec_cleanup_stream(codec, 0x08);
19395	snd_hda_codec_cleanup_stream(codec, 0x09);
19396	return 0;
19397}
19398
19399static struct hda_pcm_stream alc680_pcm_analog_auto_capture = {
19400	.substreams = 1, /* can be overridden */
19401	.channels_min = 2,
19402	.channels_max = 2,
19403	/* NID is set in alc_build_pcms */
19404	.ops = {
19405		.prepare = alc680_capture_pcm_prepare,
19406		.cleanup = alc680_capture_pcm_cleanup
19407	},
19408};
19409
19410static struct snd_kcontrol_new alc680_base_mixer[] = {
19411	/* output mixer control */
19412	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
19413	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
19414	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT),
19415	HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT),
19416	HDA_CODEC_VOLUME("Int Mic Boost", 0x12, 0, HDA_INPUT),
19417	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
19418	HDA_CODEC_VOLUME("Line In Boost", 0x19, 0, HDA_INPUT),
19419	{ }
19420};
19421
19422static struct hda_bind_ctls alc680_bind_cap_vol = {
19423	.ops = &snd_hda_bind_vol,
19424	.values = {
19425		HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT),
19426		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
19427		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
19428		0
19429	},
19430};
19431
19432static struct hda_bind_ctls alc680_bind_cap_switch = {
19433	.ops = &snd_hda_bind_sw,
19434	.values = {
19435		HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT),
19436		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
19437		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
19438		0
19439	},
19440};
19441
19442static struct snd_kcontrol_new alc680_master_capture_mixer[] = {
19443	HDA_BIND_VOL("Capture Volume", &alc680_bind_cap_vol),
19444	HDA_BIND_SW("Capture Switch", &alc680_bind_cap_switch),
19445	{ } /* end */
19446};
19447
19448/*
19449 * generic initialization of ADC, input mixers and output mixers
19450 */
19451static struct hda_verb alc680_init_verbs[] = {
19452	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
19453	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
19454	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
19455
19456	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
19457	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
19458	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
19459	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
19460	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
19461	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
19462
19463	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19464	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19465	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19466	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19467	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19468
19469	{0x16, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT   | AC_USRSP_EN},
19470	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT  | AC_USRSP_EN},
19471	{0x19, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT  | AC_USRSP_EN},
19472
19473	{ }
19474};
19475
19476/* toggle speaker-output according to the hp-jack state */
19477static void alc680_base_setup(struct hda_codec *codec)
19478{
19479	struct alc_spec *spec = codec->spec;
19480
19481	spec->autocfg.hp_pins[0] = 0x16;
19482	spec->autocfg.speaker_pins[0] = 0x14;
19483	spec->autocfg.speaker_pins[1] = 0x15;
19484	spec->autocfg.num_inputs = 2;
19485	spec->autocfg.inputs[0].pin = 0x18;
19486	spec->autocfg.inputs[0].type = AUTO_PIN_MIC;
19487	spec->autocfg.inputs[1].pin = 0x19;
19488	spec->autocfg.inputs[1].type = AUTO_PIN_LINE_IN;
19489}
19490
19491static void alc680_unsol_event(struct hda_codec *codec,
19492					   unsigned int res)
19493{
19494	if ((res >> 26) == ALC880_HP_EVENT)
19495		alc_automute_amp(codec);
19496	if ((res >> 26) == ALC880_MIC_EVENT)
19497		alc680_rec_autoswitch(codec);
19498}
19499
19500static void alc680_inithook(struct hda_codec *codec)
19501{
19502	alc_automute_amp(codec);
19503	alc680_rec_autoswitch(codec);
19504}
19505
19506/* create input playback/capture controls for the given pin */
19507static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
19508				    const char *ctlname, int idx)
19509{
19510	hda_nid_t dac;
19511	int err;
19512
19513	switch (nid) {
19514	case 0x14:
19515		dac = 0x02;
19516		break;
19517	case 0x15:
19518		dac = 0x03;
19519		break;
19520	case 0x16:
19521		dac = 0x04;
19522		break;
19523	default:
19524		return 0;
19525	}
19526	if (spec->multiout.dac_nids[0] != dac &&
19527	    spec->multiout.dac_nids[1] != dac) {
19528		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
19529				  HDA_COMPOSE_AMP_VAL(dac, 3, idx,
19530						      HDA_OUTPUT));
19531		if (err < 0)
19532			return err;
19533
19534		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
19535			  HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
19536
19537		if (err < 0)
19538			return err;
19539		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
19540	}
19541
19542	return 0;
19543}
19544
19545/* add playback controls from the parsed DAC table */
19546static int alc680_auto_create_multi_out_ctls(struct alc_spec *spec,
19547					     const struct auto_pin_cfg *cfg)
19548{
19549	hda_nid_t nid;
19550	int err;
19551
19552	spec->multiout.dac_nids = spec->private_dac_nids;
19553
19554	nid = cfg->line_out_pins[0];
19555	if (nid) {
19556		const char *name;
19557		if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
19558			name = "Speaker";
19559		else
19560			name = "Front";
19561		err = alc680_new_analog_output(spec, nid, name, 0);
19562		if (err < 0)
19563			return err;
19564	}
19565
19566	nid = cfg->speaker_pins[0];
19567	if (nid) {
19568		err = alc680_new_analog_output(spec, nid, "Speaker", 0);
19569		if (err < 0)
19570			return err;
19571	}
19572	nid = cfg->hp_pins[0];
19573	if (nid) {
19574		err = alc680_new_analog_output(spec, nid, "Headphone", 0);
19575		if (err < 0)
19576			return err;
19577	}
19578
19579	return 0;
19580}
19581
19582static void alc680_auto_set_output_and_unmute(struct hda_codec *codec,
19583					      hda_nid_t nid, int pin_type)
19584{
19585	alc_set_pin_output(codec, nid, pin_type);
19586}
19587
19588static void alc680_auto_init_multi_out(struct hda_codec *codec)
19589{
19590	struct alc_spec *spec = codec->spec;
19591	hda_nid_t nid = spec->autocfg.line_out_pins[0];
19592	if (nid) {
19593		int pin_type = get_pin_type(spec->autocfg.line_out_type);
19594		alc680_auto_set_output_and_unmute(codec, nid, pin_type);
19595	}
19596}
19597
19598static void alc680_auto_init_hp_out(struct hda_codec *codec)
19599{
19600	struct alc_spec *spec = codec->spec;
19601	hda_nid_t pin;
19602
19603	pin = spec->autocfg.hp_pins[0];
19604	if (pin)
19605		alc680_auto_set_output_and_unmute(codec, pin, PIN_HP);
19606	pin = spec->autocfg.speaker_pins[0];
19607	if (pin)
19608		alc680_auto_set_output_and_unmute(codec, pin, PIN_OUT);
19609}
19610
19611/* pcm configuration: identical with ALC880 */
19612#define alc680_pcm_analog_playback	alc880_pcm_analog_playback
19613#define alc680_pcm_analog_capture	alc880_pcm_analog_capture
19614#define alc680_pcm_analog_alt_capture	alc880_pcm_analog_alt_capture
19615#define alc680_pcm_digital_playback	alc880_pcm_digital_playback
19616#define alc680_pcm_digital_capture	alc880_pcm_digital_capture
19617
19618/*
19619 * BIOS auto configuration
19620 */
19621static int alc680_parse_auto_config(struct hda_codec *codec)
19622{
19623	struct alc_spec *spec = codec->spec;
19624	int err;
19625	static hda_nid_t alc680_ignore[] = { 0 };
19626
19627	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
19628					   alc680_ignore);
19629	if (err < 0)
19630		return err;
19631
19632	if (!spec->autocfg.line_outs) {
19633		if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
19634			spec->multiout.max_channels = 2;
19635			spec->no_analog = 1;
19636			goto dig_only;
19637		}
19638		return 0; /* can't find valid BIOS pin config */
19639	}
19640	err = alc680_auto_create_multi_out_ctls(spec, &spec->autocfg);
19641	if (err < 0)
19642		return err;
19643
19644	spec->multiout.max_channels = 2;
19645
19646 dig_only:
19647	/* digital only support output */
19648	alc_auto_parse_digital(codec);
19649	if (spec->kctls.list)
19650		add_mixer(spec, spec->kctls.list);
19651
19652	add_verb(spec, alc680_init_verbs);
19653
19654	err = alc_auto_add_mic_boost(codec);
19655	if (err < 0)
19656		return err;
19657
19658	return 1;
19659}
19660
19661#define alc680_auto_init_analog_input	alc882_auto_init_analog_input
19662
19663/* init callback for auto-configuration model -- overriding the default init */
19664static void alc680_auto_init(struct hda_codec *codec)
19665{
19666	struct alc_spec *spec = codec->spec;
19667	alc680_auto_init_multi_out(codec);
19668	alc680_auto_init_hp_out(codec);
19669	alc680_auto_init_analog_input(codec);
19670	alc_auto_init_digital(codec);
19671	if (spec->unsol_event)
19672		alc_inithook(codec);
19673}
19674
19675/*
19676 * configuration and preset
19677 */
19678static const char *alc680_models[ALC680_MODEL_LAST] = {
19679	[ALC680_BASE]		= "base",
19680	[ALC680_AUTO]		= "auto",
19681};
19682
19683static struct snd_pci_quirk alc680_cfg_tbl[] = {
19684	SND_PCI_QUIRK(0x1043, 0x12f3, "ASUS NX90", ALC680_BASE),
19685	{}
19686};
19687
19688static struct alc_config_preset alc680_presets[] = {
19689	[ALC680_BASE] = {
19690		.mixers = { alc680_base_mixer },
19691		.cap_mixer =  alc680_master_capture_mixer,
19692		.init_verbs = { alc680_init_verbs },
19693		.num_dacs = ARRAY_SIZE(alc680_dac_nids),
19694		.dac_nids = alc680_dac_nids,
19695		.dig_out_nid = ALC680_DIGOUT_NID,
19696		.num_channel_mode = ARRAY_SIZE(alc680_modes),
19697		.channel_mode = alc680_modes,
19698		.unsol_event = alc680_unsol_event,
19699		.setup = alc680_base_setup,
19700		.init_hook = alc680_inithook,
19701
19702	},
19703};
19704
19705static int patch_alc680(struct hda_codec *codec)
19706{
19707	struct alc_spec *spec;
19708	int board_config;
19709	int err;
19710
19711	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
19712	if (spec == NULL)
19713		return -ENOMEM;
19714
19715	codec->spec = spec;
19716
19717	board_config = snd_hda_check_board_config(codec, ALC680_MODEL_LAST,
19718						  alc680_models,
19719						  alc680_cfg_tbl);
19720
19721	if (board_config < 0 || board_config >= ALC680_MODEL_LAST) {
19722		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
19723		       codec->chip_name);
19724		board_config = ALC680_AUTO;
19725	}
19726
19727	if (board_config == ALC680_AUTO) {
19728		/* automatic parse from the BIOS config */
19729		err = alc680_parse_auto_config(codec);
19730		if (err < 0) {
19731			alc_free(codec);
19732			return err;
19733		} else if (!err) {
19734			printk(KERN_INFO
19735			       "hda_codec: Cannot set up configuration "
19736			       "from BIOS.  Using base mode...\n");
19737			board_config = ALC680_BASE;
19738		}
19739	}
19740
19741	if (board_config != ALC680_AUTO)
19742		setup_preset(codec, &alc680_presets[board_config]);
19743
19744	spec->stream_analog_playback = &alc680_pcm_analog_playback;
19745	spec->stream_analog_capture = &alc680_pcm_analog_auto_capture;
19746	spec->stream_digital_playback = &alc680_pcm_digital_playback;
19747	spec->stream_digital_capture = &alc680_pcm_digital_capture;
19748
19749	if (!spec->adc_nids) {
19750		spec->adc_nids = alc680_adc_nids;
19751		spec->num_adc_nids = ARRAY_SIZE(alc680_adc_nids);
19752	}
19753
19754	if (!spec->cap_mixer)
19755		set_capture_mixer(codec);
19756
19757	spec->vmaster_nid = 0x02;
19758
19759	codec->patch_ops = alc_patch_ops;
19760	if (board_config == ALC680_AUTO)
19761		spec->init_hook = alc680_auto_init;
19762
19763	return 0;
19764}
19765
19766/*
19767 * patch entries
19768 */
19769static struct hda_codec_preset snd_hda_preset_realtek[] = {
19770	{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
19771	{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
19772	{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
19773	{ .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
19774	{ .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
19775	{ .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
19776	{ .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
19777	{ .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
19778	{ .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
19779	  .patch = patch_alc861 },
19780	{ .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
19781	{ .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
19782	{ .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
19783	{ .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
19784	  .patch = patch_alc882 },
19785	{ .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
19786	  .patch = patch_alc662 },
19787	{ .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
19788	{ .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
19789	{ .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
19790	{ .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 },
19791	{ .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
19792	{ .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
19793	{ .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
19794	{ .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
19795	  .patch = patch_alc882 },
19796	{ .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
19797	  .patch = patch_alc882 },
19798	{ .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
19799	{ .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
19800	{ .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
19801	  .patch = patch_alc882 },
19802	{ .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
19803	{ .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
19804	{ .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
19805	{} /* terminator */
19806};
19807
19808MODULE_ALIAS("snd-hda-codec-id:10ec*");
19809
19810MODULE_LICENSE("GPL");
19811MODULE_DESCRIPTION("Realtek HD-audio codec");
19812
19813static struct hda_codec_preset_list realtek_list = {
19814	.preset = snd_hda_preset_realtek,
19815	.owner = THIS_MODULE,
19816};
19817
19818static int __init patch_realtek_init(void)
19819{
19820	return snd_hda_add_codec_preset(&realtek_list);
19821}
19822
19823static void __exit patch_realtek_exit(void)
19824{
19825	snd_hda_delete_codec_preset(&realtek_list);
19826}
19827
19828module_init(patch_realtek_init)
19829module_exit(patch_realtek_exit)
19830