patch_realtek.c revision 8af2591d6342a9e4bb79b4f1236246a79d20ebee
1/*
2 * Universal Interface for Intel High Definition Audio Codec
3 *
4 * HD audio interface patch for ALC 260/880/882 codecs
5 *
6 * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
7 *                    PeiSen Hou <pshou@realtek.com.tw>
8 *                    Takashi Iwai <tiwai@suse.de>
9 *                    Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
10 *
11 *  This driver is free software; you can redistribute it and/or modify
12 *  it under the terms of the GNU General Public License as published by
13 *  the Free Software Foundation; either version 2 of the License, or
14 *  (at your option) any later version.
15 *
16 *  This driver is distributed in the hope that it will be useful,
17 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 *  GNU General Public License for more details.
20 *
21 *  You should have received a copy of the GNU General Public License
22 *  along with this program; if not, write to the Free Software
23 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
24 */
25
26#include <linux/init.h>
27#include <linux/delay.h>
28#include <linux/slab.h>
29#include <linux/pci.h>
30#include <sound/core.h>
31#include "hda_codec.h"
32#include "hda_local.h"
33#include "hda_beep.h"
34
35#define ALC880_FRONT_EVENT		0x01
36#define ALC880_DCVOL_EVENT		0x02
37#define ALC880_HP_EVENT			0x04
38#define ALC880_MIC_EVENT		0x08
39
40/* ALC880 board config type */
41enum {
42	ALC880_3ST,
43	ALC880_3ST_DIG,
44	ALC880_5ST,
45	ALC880_5ST_DIG,
46	ALC880_W810,
47	ALC880_Z71V,
48	ALC880_6ST,
49	ALC880_6ST_DIG,
50	ALC880_F1734,
51	ALC880_ASUS,
52	ALC880_ASUS_DIG,
53	ALC880_ASUS_W1V,
54	ALC880_ASUS_DIG2,
55	ALC880_FUJITSU,
56	ALC880_UNIWILL_DIG,
57	ALC880_UNIWILL,
58	ALC880_UNIWILL_P53,
59	ALC880_CLEVO,
60	ALC880_TCL_S700,
61	ALC880_LG,
62	ALC880_LG_LW,
63	ALC880_MEDION_RIM,
64#ifdef CONFIG_SND_DEBUG
65	ALC880_TEST,
66#endif
67	ALC880_AUTO,
68	ALC880_MODEL_LAST /* last tag */
69};
70
71/* ALC260 models */
72enum {
73	ALC260_BASIC,
74	ALC260_HP,
75	ALC260_HP_DC7600,
76	ALC260_HP_3013,
77	ALC260_FUJITSU_S702X,
78	ALC260_ACER,
79	ALC260_WILL,
80	ALC260_REPLACER_672V,
81	ALC260_FAVORIT100,
82#ifdef CONFIG_SND_DEBUG
83	ALC260_TEST,
84#endif
85	ALC260_AUTO,
86	ALC260_MODEL_LAST /* last tag */
87};
88
89/* ALC262 models */
90enum {
91	ALC262_BASIC,
92	ALC262_HIPPO,
93	ALC262_HIPPO_1,
94	ALC262_FUJITSU,
95	ALC262_HP_BPC,
96	ALC262_HP_BPC_D7000_WL,
97	ALC262_HP_BPC_D7000_WF,
98	ALC262_HP_TC_T5735,
99	ALC262_HP_RP5700,
100	ALC262_BENQ_ED8,
101	ALC262_SONY_ASSAMD,
102	ALC262_BENQ_T31,
103	ALC262_ULTRA,
104	ALC262_LENOVO_3000,
105	ALC262_NEC,
106	ALC262_TOSHIBA_S06,
107	ALC262_TOSHIBA_RX1,
108	ALC262_TYAN,
109	ALC262_AUTO,
110	ALC262_MODEL_LAST /* last tag */
111};
112
113/* ALC268 models */
114enum {
115	ALC267_QUANTA_IL1,
116	ALC268_3ST,
117	ALC268_TOSHIBA,
118	ALC268_ACER,
119	ALC268_ACER_DMIC,
120	ALC268_ACER_ASPIRE_ONE,
121	ALC268_DELL,
122	ALC268_ZEPTO,
123#ifdef CONFIG_SND_DEBUG
124	ALC268_TEST,
125#endif
126	ALC268_AUTO,
127	ALC268_MODEL_LAST /* last tag */
128};
129
130/* ALC269 models */
131enum {
132	ALC269_BASIC,
133	ALC269_QUANTA_FL1,
134	ALC269_AMIC,
135	ALC269_DMIC,
136	ALC269VB_AMIC,
137	ALC269VB_DMIC,
138	ALC269_FUJITSU,
139	ALC269_LIFEBOOK,
140	ALC269_AUTO,
141	ALC269_MODEL_LAST /* last tag */
142};
143
144/* ALC861 models */
145enum {
146	ALC861_3ST,
147	ALC660_3ST,
148	ALC861_3ST_DIG,
149	ALC861_6ST_DIG,
150	ALC861_UNIWILL_M31,
151	ALC861_TOSHIBA,
152	ALC861_ASUS,
153	ALC861_ASUS_LAPTOP,
154	ALC861_AUTO,
155	ALC861_MODEL_LAST,
156};
157
158/* ALC861-VD models */
159enum {
160	ALC660VD_3ST,
161	ALC660VD_3ST_DIG,
162	ALC660VD_ASUS_V1S,
163	ALC861VD_3ST,
164	ALC861VD_3ST_DIG,
165	ALC861VD_6ST_DIG,
166	ALC861VD_LENOVO,
167	ALC861VD_DALLAS,
168	ALC861VD_HP,
169	ALC861VD_AUTO,
170	ALC861VD_MODEL_LAST,
171};
172
173/* ALC662 models */
174enum {
175	ALC662_3ST_2ch_DIG,
176	ALC662_3ST_6ch_DIG,
177	ALC662_3ST_6ch,
178	ALC662_5ST_DIG,
179	ALC662_LENOVO_101E,
180	ALC662_ASUS_EEEPC_P701,
181	ALC662_ASUS_EEEPC_EP20,
182	ALC663_ASUS_M51VA,
183	ALC663_ASUS_G71V,
184	ALC663_ASUS_H13,
185	ALC663_ASUS_G50V,
186	ALC662_ECS,
187	ALC663_ASUS_MODE1,
188	ALC662_ASUS_MODE2,
189	ALC663_ASUS_MODE3,
190	ALC663_ASUS_MODE4,
191	ALC663_ASUS_MODE5,
192	ALC663_ASUS_MODE6,
193	ALC663_ASUS_MODE7,
194	ALC663_ASUS_MODE8,
195	ALC272_DELL,
196	ALC272_DELL_ZM1,
197	ALC272_SAMSUNG_NC10,
198	ALC662_AUTO,
199	ALC662_MODEL_LAST,
200};
201
202/* ALC882 models */
203enum {
204	ALC882_3ST_DIG,
205	ALC882_6ST_DIG,
206	ALC882_ARIMA,
207	ALC882_W2JC,
208	ALC882_TARGA,
209	ALC882_ASUS_A7J,
210	ALC882_ASUS_A7M,
211	ALC885_MACPRO,
212	ALC885_MBA21,
213	ALC885_MBP3,
214	ALC885_MB5,
215	ALC885_MACMINI3,
216	ALC885_IMAC24,
217	ALC885_IMAC91,
218	ALC883_3ST_2ch_DIG,
219	ALC883_3ST_6ch_DIG,
220	ALC883_3ST_6ch,
221	ALC883_6ST_DIG,
222	ALC883_TARGA_DIG,
223	ALC883_TARGA_2ch_DIG,
224	ALC883_TARGA_8ch_DIG,
225	ALC883_ACER,
226	ALC883_ACER_ASPIRE,
227	ALC888_ACER_ASPIRE_4930G,
228	ALC888_ACER_ASPIRE_6530G,
229	ALC888_ACER_ASPIRE_8930G,
230	ALC888_ACER_ASPIRE_7730G,
231	ALC883_MEDION,
232	ALC883_MEDION_MD2,
233	ALC883_MEDION_WIM2160,
234	ALC883_LAPTOP_EAPD,
235	ALC883_LENOVO_101E_2ch,
236	ALC883_LENOVO_NB0763,
237	ALC888_LENOVO_MS7195_DIG,
238	ALC888_LENOVO_SKY,
239	ALC883_HAIER_W66,
240	ALC888_3ST_HP,
241	ALC888_6ST_DELL,
242	ALC883_MITAC,
243	ALC883_CLEVO_M540R,
244	ALC883_CLEVO_M720,
245	ALC883_FUJITSU_PI2515,
246	ALC888_FUJITSU_XA3530,
247	ALC883_3ST_6ch_INTEL,
248	ALC889A_INTEL,
249	ALC889_INTEL,
250	ALC888_ASUS_M90V,
251	ALC888_ASUS_EEE1601,
252	ALC889A_MB31,
253	ALC1200_ASUS_P5Q,
254	ALC883_SONY_VAIO_TT,
255	ALC882_AUTO,
256	ALC882_MODEL_LAST,
257};
258
259/* for GPIO Poll */
260#define GPIO_MASK	0x03
261
262/* extra amp-initialization sequence types */
263enum {
264	ALC_INIT_NONE,
265	ALC_INIT_DEFAULT,
266	ALC_INIT_GPIO1,
267	ALC_INIT_GPIO2,
268	ALC_INIT_GPIO3,
269};
270
271struct alc_mic_route {
272	hda_nid_t pin;
273	unsigned char mux_idx;
274	unsigned char amix_idx;
275};
276
277#define MUX_IDX_UNDEF	((unsigned char)-1)
278
279struct alc_customize_define {
280	unsigned int  sku_cfg;
281	unsigned char port_connectivity;
282	unsigned char check_sum;
283	unsigned char customization;
284	unsigned char external_amp;
285	unsigned int  enable_pcbeep:1;
286	unsigned int  platform_type:1;
287	unsigned int  swap:1;
288	unsigned int  override:1;
289};
290
291struct alc_spec {
292	/* codec parameterization */
293	struct snd_kcontrol_new *mixers[5];	/* mixer arrays */
294	unsigned int num_mixers;
295	struct snd_kcontrol_new *cap_mixer;	/* capture mixer */
296	unsigned int beep_amp;	/* beep amp value, set via set_beep_amp() */
297
298	const struct hda_verb *init_verbs[10];	/* initialization verbs
299						 * don't forget NULL
300						 * termination!
301						 */
302	unsigned int num_init_verbs;
303
304	char stream_name_analog[32];	/* analog PCM stream */
305	struct hda_pcm_stream *stream_analog_playback;
306	struct hda_pcm_stream *stream_analog_capture;
307	struct hda_pcm_stream *stream_analog_alt_playback;
308	struct hda_pcm_stream *stream_analog_alt_capture;
309
310	char stream_name_digital[32];	/* digital PCM stream */
311	struct hda_pcm_stream *stream_digital_playback;
312	struct hda_pcm_stream *stream_digital_capture;
313
314	/* playback */
315	struct hda_multi_out multiout;	/* playback set-up
316					 * max_channels, dacs must be set
317					 * dig_out_nid and hp_nid are optional
318					 */
319	hda_nid_t alt_dac_nid;
320	hda_nid_t slave_dig_outs[3];	/* optional - for auto-parsing */
321	int dig_out_type;
322
323	/* capture */
324	unsigned int num_adc_nids;
325	hda_nid_t *adc_nids;
326	hda_nid_t *capsrc_nids;
327	hda_nid_t dig_in_nid;		/* digital-in NID; optional */
328
329	/* capture source */
330	unsigned int num_mux_defs;
331	const struct hda_input_mux *input_mux;
332	unsigned int cur_mux[3];
333	struct alc_mic_route ext_mic;
334	struct alc_mic_route int_mic;
335
336	/* channel model */
337	const struct hda_channel_mode *channel_mode;
338	int num_channel_mode;
339	int need_dac_fix;
340	int const_channel_count;
341	int ext_channel_count;
342
343	/* PCM information */
344	struct hda_pcm pcm_rec[3];	/* used in alc_build_pcms() */
345
346	/* dynamic controls, init_verbs and input_mux */
347	struct auto_pin_cfg autocfg;
348	struct alc_customize_define cdefine;
349	struct snd_array kctls;
350	struct hda_input_mux private_imux[3];
351	hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
352	hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
353	hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
354
355	/* hooks */
356	void (*init_hook)(struct hda_codec *codec);
357	void (*unsol_event)(struct hda_codec *codec, unsigned int res);
358#ifdef CONFIG_SND_HDA_POWER_SAVE
359	void (*power_hook)(struct hda_codec *codec);
360#endif
361
362	/* for pin sensing */
363	unsigned int sense_updated: 1;
364	unsigned int jack_present: 1;
365	unsigned int master_sw: 1;
366	unsigned int auto_mic:1;
367
368	/* other flags */
369	unsigned int no_analog :1; /* digital I/O only */
370	int init_amp;
371
372	/* for virtual master */
373	hda_nid_t vmaster_nid;
374#ifdef CONFIG_SND_HDA_POWER_SAVE
375	struct hda_loopback_check loopback;
376#endif
377
378	/* for PLL fix */
379	hda_nid_t pll_nid;
380	unsigned int pll_coef_idx, pll_coef_bit;
381};
382
383/*
384 * configuration template - to be copied to the spec instance
385 */
386struct alc_config_preset {
387	struct snd_kcontrol_new *mixers[5]; /* should be identical size
388					     * with spec
389					     */
390	struct snd_kcontrol_new *cap_mixer; /* capture mixer */
391	const struct hda_verb *init_verbs[5];
392	unsigned int num_dacs;
393	hda_nid_t *dac_nids;
394	hda_nid_t dig_out_nid;		/* optional */
395	hda_nid_t hp_nid;		/* optional */
396	hda_nid_t *slave_dig_outs;
397	unsigned int num_adc_nids;
398	hda_nid_t *adc_nids;
399	hda_nid_t *capsrc_nids;
400	hda_nid_t dig_in_nid;
401	unsigned int num_channel_mode;
402	const struct hda_channel_mode *channel_mode;
403	int need_dac_fix;
404	int const_channel_count;
405	unsigned int num_mux_defs;
406	const struct hda_input_mux *input_mux;
407	void (*unsol_event)(struct hda_codec *, unsigned int);
408	void (*setup)(struct hda_codec *);
409	void (*init_hook)(struct hda_codec *);
410#ifdef CONFIG_SND_HDA_POWER_SAVE
411	struct hda_amp_list *loopbacks;
412	void (*power_hook)(struct hda_codec *codec);
413#endif
414};
415
416
417/*
418 * input MUX handling
419 */
420static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
421			     struct snd_ctl_elem_info *uinfo)
422{
423	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
424	struct alc_spec *spec = codec->spec;
425	unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
426	if (mux_idx >= spec->num_mux_defs)
427		mux_idx = 0;
428	if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
429		mux_idx = 0;
430	return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
431}
432
433static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
434			    struct snd_ctl_elem_value *ucontrol)
435{
436	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
437	struct alc_spec *spec = codec->spec;
438	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
439
440	ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
441	return 0;
442}
443
444static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
445			    struct snd_ctl_elem_value *ucontrol)
446{
447	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
448	struct alc_spec *spec = codec->spec;
449	const struct hda_input_mux *imux;
450	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
451	unsigned int mux_idx;
452	hda_nid_t nid = spec->capsrc_nids ?
453		spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
454	unsigned int type;
455
456	mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
457	imux = &spec->input_mux[mux_idx];
458	if (!imux->num_items && mux_idx > 0)
459		imux = &spec->input_mux[0];
460
461	type = get_wcaps_type(get_wcaps(codec, nid));
462	if (type == AC_WID_AUD_MIX) {
463		/* Matrix-mixer style (e.g. ALC882) */
464		unsigned int *cur_val = &spec->cur_mux[adc_idx];
465		unsigned int i, idx;
466
467		idx = ucontrol->value.enumerated.item[0];
468		if (idx >= imux->num_items)
469			idx = imux->num_items - 1;
470		if (*cur_val == idx)
471			return 0;
472		for (i = 0; i < imux->num_items; i++) {
473			unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
474			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
475						 imux->items[i].index,
476						 HDA_AMP_MUTE, v);
477		}
478		*cur_val = idx;
479		return 1;
480	} else {
481		/* MUX style (e.g. ALC880) */
482		return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
483					     &spec->cur_mux[adc_idx]);
484	}
485}
486
487/*
488 * channel mode setting
489 */
490static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
491			    struct snd_ctl_elem_info *uinfo)
492{
493	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
494	struct alc_spec *spec = codec->spec;
495	return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
496				    spec->num_channel_mode);
497}
498
499static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
500			   struct snd_ctl_elem_value *ucontrol)
501{
502	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
503	struct alc_spec *spec = codec->spec;
504	return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
505				   spec->num_channel_mode,
506				   spec->ext_channel_count);
507}
508
509static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
510			   struct snd_ctl_elem_value *ucontrol)
511{
512	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
513	struct alc_spec *spec = codec->spec;
514	int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
515				      spec->num_channel_mode,
516				      &spec->ext_channel_count);
517	if (err >= 0 && !spec->const_channel_count) {
518		spec->multiout.max_channels = spec->ext_channel_count;
519		if (spec->need_dac_fix)
520			spec->multiout.num_dacs = spec->multiout.max_channels / 2;
521	}
522	return err;
523}
524
525/*
526 * Control the mode of pin widget settings via the mixer.  "pc" is used
527 * instead of "%" to avoid consequences of accidently treating the % as
528 * being part of a format specifier.  Maximum allowed length of a value is
529 * 63 characters plus NULL terminator.
530 *
531 * Note: some retasking pin complexes seem to ignore requests for input
532 * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
533 * are requested.  Therefore order this list so that this behaviour will not
534 * cause problems when mixer clients move through the enum sequentially.
535 * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
536 * March 2006.
537 */
538static char *alc_pin_mode_names[] = {
539	"Mic 50pc bias", "Mic 80pc bias",
540	"Line in", "Line out", "Headphone out",
541};
542static unsigned char alc_pin_mode_values[] = {
543	PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
544};
545/* The control can present all 5 options, or it can limit the options based
546 * in the pin being assumed to be exclusively an input or an output pin.  In
547 * addition, "input" pins may or may not process the mic bias option
548 * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
549 * accept requests for bias as of chip versions up to March 2006) and/or
550 * wiring in the computer.
551 */
552#define ALC_PIN_DIR_IN              0x00
553#define ALC_PIN_DIR_OUT             0x01
554#define ALC_PIN_DIR_INOUT           0x02
555#define ALC_PIN_DIR_IN_NOMICBIAS    0x03
556#define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
557
558/* Info about the pin modes supported by the different pin direction modes.
559 * For each direction the minimum and maximum values are given.
560 */
561static signed char alc_pin_mode_dir_info[5][2] = {
562	{ 0, 2 },    /* ALC_PIN_DIR_IN */
563	{ 3, 4 },    /* ALC_PIN_DIR_OUT */
564	{ 0, 4 },    /* ALC_PIN_DIR_INOUT */
565	{ 2, 2 },    /* ALC_PIN_DIR_IN_NOMICBIAS */
566	{ 2, 4 },    /* ALC_PIN_DIR_INOUT_NOMICBIAS */
567};
568#define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
569#define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
570#define alc_pin_mode_n_items(_dir) \
571	(alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
572
573static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
574			     struct snd_ctl_elem_info *uinfo)
575{
576	unsigned int item_num = uinfo->value.enumerated.item;
577	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
578
579	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
580	uinfo->count = 1;
581	uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
582
583	if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
584		item_num = alc_pin_mode_min(dir);
585	strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
586	return 0;
587}
588
589static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
590			    struct snd_ctl_elem_value *ucontrol)
591{
592	unsigned int i;
593	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
594	hda_nid_t nid = kcontrol->private_value & 0xffff;
595	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
596	long *valp = ucontrol->value.integer.value;
597	unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
598						 AC_VERB_GET_PIN_WIDGET_CONTROL,
599						 0x00);
600
601	/* Find enumerated value for current pinctl setting */
602	i = alc_pin_mode_min(dir);
603	while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
604		i++;
605	*valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
606	return 0;
607}
608
609static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
610			    struct snd_ctl_elem_value *ucontrol)
611{
612	signed int change;
613	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
614	hda_nid_t nid = kcontrol->private_value & 0xffff;
615	unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
616	long val = *ucontrol->value.integer.value;
617	unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
618						 AC_VERB_GET_PIN_WIDGET_CONTROL,
619						 0x00);
620
621	if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
622		val = alc_pin_mode_min(dir);
623
624	change = pinctl != alc_pin_mode_values[val];
625	if (change) {
626		/* Set pin mode to that requested */
627		snd_hda_codec_write_cache(codec, nid, 0,
628					  AC_VERB_SET_PIN_WIDGET_CONTROL,
629					  alc_pin_mode_values[val]);
630
631		/* Also enable the retasking pin's input/output as required
632		 * for the requested pin mode.  Enum values of 2 or less are
633		 * input modes.
634		 *
635		 * Dynamically switching the input/output buffers probably
636		 * reduces noise slightly (particularly on input) so we'll
637		 * do it.  However, having both input and output buffers
638		 * enabled simultaneously doesn't seem to be problematic if
639		 * this turns out to be necessary in the future.
640		 */
641		if (val <= 2) {
642			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
643						 HDA_AMP_MUTE, HDA_AMP_MUTE);
644			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
645						 HDA_AMP_MUTE, 0);
646		} else {
647			snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
648						 HDA_AMP_MUTE, HDA_AMP_MUTE);
649			snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
650						 HDA_AMP_MUTE, 0);
651		}
652	}
653	return change;
654}
655
656#define ALC_PIN_MODE(xname, nid, dir) \
657	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
658	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
659	  .info = alc_pin_mode_info, \
660	  .get = alc_pin_mode_get, \
661	  .put = alc_pin_mode_put, \
662	  .private_value = nid | (dir<<16) }
663
664/* A switch control for ALC260 GPIO pins.  Multiple GPIOs can be ganged
665 * together using a mask with more than one bit set.  This control is
666 * currently used only by the ALC260 test model.  At this stage they are not
667 * needed for any "production" models.
668 */
669#ifdef CONFIG_SND_DEBUG
670#define alc_gpio_data_info	snd_ctl_boolean_mono_info
671
672static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
673			     struct snd_ctl_elem_value *ucontrol)
674{
675	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
676	hda_nid_t nid = kcontrol->private_value & 0xffff;
677	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
678	long *valp = ucontrol->value.integer.value;
679	unsigned int val = snd_hda_codec_read(codec, nid, 0,
680					      AC_VERB_GET_GPIO_DATA, 0x00);
681
682	*valp = (val & mask) != 0;
683	return 0;
684}
685static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
686			     struct snd_ctl_elem_value *ucontrol)
687{
688	signed int change;
689	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
690	hda_nid_t nid = kcontrol->private_value & 0xffff;
691	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
692	long val = *ucontrol->value.integer.value;
693	unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
694						    AC_VERB_GET_GPIO_DATA,
695						    0x00);
696
697	/* Set/unset the masked GPIO bit(s) as needed */
698	change = (val == 0 ? 0 : mask) != (gpio_data & mask);
699	if (val == 0)
700		gpio_data &= ~mask;
701	else
702		gpio_data |= mask;
703	snd_hda_codec_write_cache(codec, nid, 0,
704				  AC_VERB_SET_GPIO_DATA, gpio_data);
705
706	return change;
707}
708#define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
709	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
710	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
711	  .info = alc_gpio_data_info, \
712	  .get = alc_gpio_data_get, \
713	  .put = alc_gpio_data_put, \
714	  .private_value = nid | (mask<<16) }
715#endif   /* CONFIG_SND_DEBUG */
716
717/* A switch control to allow the enabling of the digital IO pins on the
718 * ALC260.  This is incredibly simplistic; the intention of this control is
719 * to provide something in the test model allowing digital outputs to be
720 * identified if present.  If models are found which can utilise these
721 * outputs a more complete mixer control can be devised for those models if
722 * necessary.
723 */
724#ifdef CONFIG_SND_DEBUG
725#define alc_spdif_ctrl_info	snd_ctl_boolean_mono_info
726
727static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
728			      struct snd_ctl_elem_value *ucontrol)
729{
730	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
731	hda_nid_t nid = kcontrol->private_value & 0xffff;
732	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
733	long *valp = ucontrol->value.integer.value;
734	unsigned int val = snd_hda_codec_read(codec, nid, 0,
735					      AC_VERB_GET_DIGI_CONVERT_1, 0x00);
736
737	*valp = (val & mask) != 0;
738	return 0;
739}
740static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
741			      struct snd_ctl_elem_value *ucontrol)
742{
743	signed int change;
744	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
745	hda_nid_t nid = kcontrol->private_value & 0xffff;
746	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
747	long val = *ucontrol->value.integer.value;
748	unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
749						    AC_VERB_GET_DIGI_CONVERT_1,
750						    0x00);
751
752	/* Set/unset the masked control bit(s) as needed */
753	change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
754	if (val==0)
755		ctrl_data &= ~mask;
756	else
757		ctrl_data |= mask;
758	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
759				  ctrl_data);
760
761	return change;
762}
763#define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
764	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
765	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
766	  .info = alc_spdif_ctrl_info, \
767	  .get = alc_spdif_ctrl_get, \
768	  .put = alc_spdif_ctrl_put, \
769	  .private_value = nid | (mask<<16) }
770#endif   /* CONFIG_SND_DEBUG */
771
772/* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
773 * Again, this is only used in the ALC26x test models to help identify when
774 * the EAPD line must be asserted for features to work.
775 */
776#ifdef CONFIG_SND_DEBUG
777#define alc_eapd_ctrl_info	snd_ctl_boolean_mono_info
778
779static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
780			      struct snd_ctl_elem_value *ucontrol)
781{
782	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
783	hda_nid_t nid = kcontrol->private_value & 0xffff;
784	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
785	long *valp = ucontrol->value.integer.value;
786	unsigned int val = snd_hda_codec_read(codec, nid, 0,
787					      AC_VERB_GET_EAPD_BTLENABLE, 0x00);
788
789	*valp = (val & mask) != 0;
790	return 0;
791}
792
793static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
794			      struct snd_ctl_elem_value *ucontrol)
795{
796	int change;
797	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
798	hda_nid_t nid = kcontrol->private_value & 0xffff;
799	unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
800	long val = *ucontrol->value.integer.value;
801	unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
802						    AC_VERB_GET_EAPD_BTLENABLE,
803						    0x00);
804
805	/* Set/unset the masked control bit(s) as needed */
806	change = (!val ? 0 : mask) != (ctrl_data & mask);
807	if (!val)
808		ctrl_data &= ~mask;
809	else
810		ctrl_data |= mask;
811	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
812				  ctrl_data);
813
814	return change;
815}
816
817#define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
818	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
819	  .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
820	  .info = alc_eapd_ctrl_info, \
821	  .get = alc_eapd_ctrl_get, \
822	  .put = alc_eapd_ctrl_put, \
823	  .private_value = nid | (mask<<16) }
824#endif   /* CONFIG_SND_DEBUG */
825
826/*
827 * set up the input pin config (depending on the given auto-pin type)
828 */
829static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
830			      int auto_pin_type)
831{
832	unsigned int val = PIN_IN;
833
834	if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
835		unsigned int pincap;
836		pincap = snd_hda_query_pin_caps(codec, nid);
837		pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
838		if (pincap & AC_PINCAP_VREF_80)
839			val = PIN_VREF80;
840		else if (pincap & AC_PINCAP_VREF_50)
841			val = PIN_VREF50;
842		else if (pincap & AC_PINCAP_VREF_100)
843			val = PIN_VREF100;
844		else if (pincap & AC_PINCAP_VREF_GRD)
845			val = PIN_VREFGRD;
846	}
847	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
848}
849
850/*
851 */
852static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
853{
854	if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
855		return;
856	spec->mixers[spec->num_mixers++] = mix;
857}
858
859static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
860{
861	if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
862		return;
863	spec->init_verbs[spec->num_init_verbs++] = verb;
864}
865
866/*
867 * set up from the preset table
868 */
869static void setup_preset(struct hda_codec *codec,
870			 const struct alc_config_preset *preset)
871{
872	struct alc_spec *spec = codec->spec;
873	int i;
874
875	for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
876		add_mixer(spec, preset->mixers[i]);
877	spec->cap_mixer = preset->cap_mixer;
878	for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
879	     i++)
880		add_verb(spec, preset->init_verbs[i]);
881
882	spec->channel_mode = preset->channel_mode;
883	spec->num_channel_mode = preset->num_channel_mode;
884	spec->need_dac_fix = preset->need_dac_fix;
885	spec->const_channel_count = preset->const_channel_count;
886
887	if (preset->const_channel_count)
888		spec->multiout.max_channels = preset->const_channel_count;
889	else
890		spec->multiout.max_channels = spec->channel_mode[0].channels;
891	spec->ext_channel_count = spec->channel_mode[0].channels;
892
893	spec->multiout.num_dacs = preset->num_dacs;
894	spec->multiout.dac_nids = preset->dac_nids;
895	spec->multiout.dig_out_nid = preset->dig_out_nid;
896	spec->multiout.slave_dig_outs = preset->slave_dig_outs;
897	spec->multiout.hp_nid = preset->hp_nid;
898
899	spec->num_mux_defs = preset->num_mux_defs;
900	if (!spec->num_mux_defs)
901		spec->num_mux_defs = 1;
902	spec->input_mux = preset->input_mux;
903
904	spec->num_adc_nids = preset->num_adc_nids;
905	spec->adc_nids = preset->adc_nids;
906	spec->capsrc_nids = preset->capsrc_nids;
907	spec->dig_in_nid = preset->dig_in_nid;
908
909	spec->unsol_event = preset->unsol_event;
910	spec->init_hook = preset->init_hook;
911#ifdef CONFIG_SND_HDA_POWER_SAVE
912	spec->power_hook = preset->power_hook;
913	spec->loopback.amplist = preset->loopbacks;
914#endif
915
916	if (preset->setup)
917		preset->setup(codec);
918}
919
920/* Enable GPIO mask and set output */
921static struct hda_verb alc_gpio1_init_verbs[] = {
922	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
923	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
924	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
925	{ }
926};
927
928static struct hda_verb alc_gpio2_init_verbs[] = {
929	{0x01, AC_VERB_SET_GPIO_MASK, 0x02},
930	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
931	{0x01, AC_VERB_SET_GPIO_DATA, 0x02},
932	{ }
933};
934
935static struct hda_verb alc_gpio3_init_verbs[] = {
936	{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
937	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
938	{0x01, AC_VERB_SET_GPIO_DATA, 0x03},
939	{ }
940};
941
942/*
943 * Fix hardware PLL issue
944 * On some codecs, the analog PLL gating control must be off while
945 * the default value is 1.
946 */
947static void alc_fix_pll(struct hda_codec *codec)
948{
949	struct alc_spec *spec = codec->spec;
950	unsigned int val;
951
952	if (!spec->pll_nid)
953		return;
954	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
955			    spec->pll_coef_idx);
956	val = snd_hda_codec_read(codec, spec->pll_nid, 0,
957				 AC_VERB_GET_PROC_COEF, 0);
958	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
959			    spec->pll_coef_idx);
960	snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
961			    val & ~(1 << spec->pll_coef_bit));
962}
963
964static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
965			     unsigned int coef_idx, unsigned int coef_bit)
966{
967	struct alc_spec *spec = codec->spec;
968	spec->pll_nid = nid;
969	spec->pll_coef_idx = coef_idx;
970	spec->pll_coef_bit = coef_bit;
971	alc_fix_pll(codec);
972}
973
974static void alc_automute_pin(struct hda_codec *codec)
975{
976	struct alc_spec *spec = codec->spec;
977	unsigned int nid = spec->autocfg.hp_pins[0];
978	int i;
979
980	if (!nid)
981		return;
982	spec->jack_present = snd_hda_jack_detect(codec, nid);
983	for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
984		nid = spec->autocfg.speaker_pins[i];
985		if (!nid)
986			break;
987		snd_hda_codec_write(codec, nid, 0,
988				    AC_VERB_SET_PIN_WIDGET_CONTROL,
989				    spec->jack_present ? 0 : PIN_OUT);
990	}
991}
992
993static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
994				hda_nid_t nid)
995{
996	hda_nid_t conn[HDA_MAX_NUM_INPUTS];
997	int i, nums;
998
999	nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
1000	for (i = 0; i < nums; i++)
1001		if (conn[i] == nid)
1002			return i;
1003	return -1;
1004}
1005
1006static void alc_mic_automute(struct hda_codec *codec)
1007{
1008	struct alc_spec *spec = codec->spec;
1009	struct alc_mic_route *dead, *alive;
1010	unsigned int present, type;
1011	hda_nid_t cap_nid;
1012
1013	if (!spec->auto_mic)
1014		return;
1015	if (!spec->int_mic.pin || !spec->ext_mic.pin)
1016		return;
1017	if (snd_BUG_ON(!spec->adc_nids))
1018		return;
1019
1020	cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1021
1022	present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1023	if (present) {
1024		alive = &spec->ext_mic;
1025		dead = &spec->int_mic;
1026	} else {
1027		alive = &spec->int_mic;
1028		dead = &spec->ext_mic;
1029	}
1030
1031	type = get_wcaps_type(get_wcaps(codec, cap_nid));
1032	if (type == AC_WID_AUD_MIX) {
1033		/* Matrix-mixer style (e.g. ALC882) */
1034		snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1035					 alive->mux_idx,
1036					 HDA_AMP_MUTE, 0);
1037		snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1038					 dead->mux_idx,
1039					 HDA_AMP_MUTE, HDA_AMP_MUTE);
1040	} else {
1041		/* MUX style (e.g. ALC880) */
1042		snd_hda_codec_write_cache(codec, cap_nid, 0,
1043					  AC_VERB_SET_CONNECT_SEL,
1044					  alive->mux_idx);
1045	}
1046
1047	/* FIXME: analog mixer */
1048}
1049
1050/* unsolicited event for HP jack sensing */
1051static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1052{
1053	if (codec->vendor_id == 0x10ec0880)
1054		res >>= 28;
1055	else
1056		res >>= 26;
1057	switch (res) {
1058	case ALC880_HP_EVENT:
1059		alc_automute_pin(codec);
1060		break;
1061	case ALC880_MIC_EVENT:
1062		alc_mic_automute(codec);
1063		break;
1064	}
1065}
1066
1067static void alc_inithook(struct hda_codec *codec)
1068{
1069	alc_automute_pin(codec);
1070	alc_mic_automute(codec);
1071}
1072
1073/* additional initialization for ALC888 variants */
1074static void alc888_coef_init(struct hda_codec *codec)
1075{
1076	unsigned int tmp;
1077
1078	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1079	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1080	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1081	if ((tmp & 0xf0) == 0x20)
1082		/* alc888S-VC */
1083		snd_hda_codec_read(codec, 0x20, 0,
1084				   AC_VERB_SET_PROC_COEF, 0x830);
1085	 else
1086		 /* alc888-VB */
1087		 snd_hda_codec_read(codec, 0x20, 0,
1088				    AC_VERB_SET_PROC_COEF, 0x3030);
1089}
1090
1091static void alc889_coef_init(struct hda_codec *codec)
1092{
1093	unsigned int tmp;
1094
1095	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1096	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1097	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1098	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1099}
1100
1101/* turn on/off EAPD control (only if available) */
1102static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
1103{
1104	if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
1105		return;
1106	if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
1107		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
1108				    on ? 2 : 0);
1109}
1110
1111static void alc_auto_init_amp(struct hda_codec *codec, int type)
1112{
1113	unsigned int tmp;
1114
1115	switch (type) {
1116	case ALC_INIT_GPIO1:
1117		snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1118		break;
1119	case ALC_INIT_GPIO2:
1120		snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1121		break;
1122	case ALC_INIT_GPIO3:
1123		snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1124		break;
1125	case ALC_INIT_DEFAULT:
1126		switch (codec->vendor_id) {
1127		case 0x10ec0260:
1128			set_eapd(codec, 0x0f, 1);
1129			set_eapd(codec, 0x10, 1);
1130			break;
1131		case 0x10ec0262:
1132		case 0x10ec0267:
1133		case 0x10ec0268:
1134		case 0x10ec0269:
1135		case 0x10ec0270:
1136		case 0x10ec0272:
1137		case 0x10ec0660:
1138		case 0x10ec0662:
1139		case 0x10ec0663:
1140		case 0x10ec0862:
1141		case 0x10ec0889:
1142			set_eapd(codec, 0x14, 1);
1143			set_eapd(codec, 0x15, 1);
1144			break;
1145		}
1146		switch (codec->vendor_id) {
1147		case 0x10ec0260:
1148			snd_hda_codec_write(codec, 0x1a, 0,
1149					    AC_VERB_SET_COEF_INDEX, 7);
1150			tmp = snd_hda_codec_read(codec, 0x1a, 0,
1151						 AC_VERB_GET_PROC_COEF, 0);
1152			snd_hda_codec_write(codec, 0x1a, 0,
1153					    AC_VERB_SET_COEF_INDEX, 7);
1154			snd_hda_codec_write(codec, 0x1a, 0,
1155					    AC_VERB_SET_PROC_COEF,
1156					    tmp | 0x2010);
1157			break;
1158		case 0x10ec0262:
1159		case 0x10ec0880:
1160		case 0x10ec0882:
1161		case 0x10ec0883:
1162		case 0x10ec0885:
1163		case 0x10ec0887:
1164		case 0x10ec0889:
1165			alc889_coef_init(codec);
1166			break;
1167		case 0x10ec0888:
1168			alc888_coef_init(codec);
1169			break;
1170#if 0 /* XXX: This may cause the silent output on speaker on some machines */
1171		case 0x10ec0267:
1172		case 0x10ec0268:
1173			snd_hda_codec_write(codec, 0x20, 0,
1174					    AC_VERB_SET_COEF_INDEX, 7);
1175			tmp = snd_hda_codec_read(codec, 0x20, 0,
1176						 AC_VERB_GET_PROC_COEF, 0);
1177			snd_hda_codec_write(codec, 0x20, 0,
1178					    AC_VERB_SET_COEF_INDEX, 7);
1179			snd_hda_codec_write(codec, 0x20, 0,
1180					    AC_VERB_SET_PROC_COEF,
1181					    tmp | 0x3000);
1182			break;
1183#endif /* XXX */
1184		}
1185		break;
1186	}
1187}
1188
1189static void alc_init_auto_hp(struct hda_codec *codec)
1190{
1191	struct alc_spec *spec = codec->spec;
1192
1193	if (!spec->autocfg.hp_pins[0])
1194		return;
1195
1196	if (!spec->autocfg.speaker_pins[0]) {
1197		if (spec->autocfg.line_out_pins[0] &&
1198		    spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
1199			spec->autocfg.speaker_pins[0] =
1200				spec->autocfg.line_out_pins[0];
1201		else
1202			return;
1203	}
1204
1205	snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1206		    spec->autocfg.hp_pins[0]);
1207	snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1208				  AC_VERB_SET_UNSOLICITED_ENABLE,
1209				  AC_USRSP_EN | ALC880_HP_EVENT);
1210	spec->unsol_event = alc_sku_unsol_event;
1211}
1212
1213static void alc_init_auto_mic(struct hda_codec *codec)
1214{
1215	struct alc_spec *spec = codec->spec;
1216	struct auto_pin_cfg *cfg = &spec->autocfg;
1217	hda_nid_t fixed, ext;
1218	int i;
1219
1220	/* there must be only two mic inputs exclusively */
1221	for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1222		if (cfg->input_pins[i])
1223			return;
1224
1225	fixed = ext = 0;
1226	for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1227		hda_nid_t nid = cfg->input_pins[i];
1228		unsigned int defcfg;
1229		if (!nid)
1230			return;
1231		defcfg = snd_hda_codec_get_pincfg(codec, nid);
1232		switch (get_defcfg_connect(defcfg)) {
1233		case AC_JACK_PORT_FIXED:
1234			if (fixed)
1235				return; /* already occupied */
1236			fixed = nid;
1237			break;
1238		case AC_JACK_PORT_COMPLEX:
1239			if (ext)
1240				return; /* already occupied */
1241			ext = nid;
1242			break;
1243		default:
1244			return; /* invalid entry */
1245		}
1246	}
1247	if (!ext || !fixed)
1248		return;
1249	if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1250		return; /* no unsol support */
1251	snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1252		    ext, fixed);
1253	spec->ext_mic.pin = ext;
1254	spec->int_mic.pin = fixed;
1255	spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1256	spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1257	spec->auto_mic = 1;
1258	snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1259				  AC_VERB_SET_UNSOLICITED_ENABLE,
1260				  AC_USRSP_EN | ALC880_MIC_EVENT);
1261	spec->unsol_event = alc_sku_unsol_event;
1262}
1263
1264static int alc_auto_parse_customize_define(struct hda_codec *codec)
1265{
1266	unsigned int ass, tmp, i;
1267	unsigned nid = 0;
1268	struct alc_spec *spec = codec->spec;
1269
1270	ass = codec->subsystem_id & 0xffff;
1271	if (ass != codec->bus->pci->subsystem_device && (ass & 1)) {
1272		spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
1273		goto do_sku;
1274	}
1275
1276	nid = 0x1d;
1277	if (codec->vendor_id == 0x10ec0260)
1278		nid = 0x17;
1279	ass = snd_hda_codec_get_pincfg(codec, nid);
1280
1281	if (!(ass & 1)) {
1282		printk(KERN_INFO "hda_codec: %s: SKU not ready 0x%08x\n",
1283		       codec->chip_name, ass);
1284		return -1;
1285	}
1286
1287	/* check sum */
1288	tmp = 0;
1289	for (i = 1; i < 16; i++) {
1290		if ((ass >> i) & 1)
1291			tmp++;
1292	}
1293	if (((ass >> 16) & 0xf) != tmp)
1294		return -1;
1295
1296	spec->cdefine.port_connectivity = ass >> 30;
1297	spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
1298	spec->cdefine.check_sum = (ass >> 16) & 0xf;
1299	spec->cdefine.customization = ass >> 8;
1300do_sku:
1301	spec->cdefine.sku_cfg = ass;
1302	spec->cdefine.external_amp = (ass & 0x38) >> 3;
1303	spec->cdefine.platform_type = (ass & 0x4) >> 2;
1304	spec->cdefine.swap = (ass & 0x2) >> 1;
1305	spec->cdefine.override = ass & 0x1;
1306
1307	snd_printd("SKU: Nid=0x%x sku_cfg=0x%08x\n",
1308		   nid, spec->cdefine.sku_cfg);
1309	snd_printd("SKU: port_connectivity=0x%x\n",
1310		   spec->cdefine.port_connectivity);
1311	snd_printd("SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
1312	snd_printd("SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
1313	snd_printd("SKU: customization=0x%08x\n", spec->cdefine.customization);
1314	snd_printd("SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
1315	snd_printd("SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
1316	snd_printd("SKU: swap=0x%x\n", spec->cdefine.swap);
1317	snd_printd("SKU: override=0x%x\n", spec->cdefine.override);
1318
1319	return 0;
1320}
1321
1322/* check subsystem ID and set up device-specific initialization;
1323 * return 1 if initialized, 0 if invalid SSID
1324 */
1325/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1326 *	31 ~ 16 :	Manufacture ID
1327 *	15 ~ 8	:	SKU ID
1328 *	7  ~ 0	:	Assembly ID
1329 *	port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1330 */
1331static int alc_subsystem_id(struct hda_codec *codec,
1332			    hda_nid_t porta, hda_nid_t porte,
1333			    hda_nid_t portd, hda_nid_t porti)
1334{
1335	unsigned int ass, tmp, i;
1336	unsigned nid;
1337	struct alc_spec *spec = codec->spec;
1338
1339	ass = codec->subsystem_id & 0xffff;
1340	if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1341		goto do_sku;
1342
1343	/* invalid SSID, check the special NID pin defcfg instead */
1344	/*
1345	 * 31~30	: port connectivity
1346	 * 29~21	: reserve
1347	 * 20		: PCBEEP input
1348	 * 19~16	: Check sum (15:1)
1349	 * 15~1		: Custom
1350	 * 0		: override
1351	*/
1352	nid = 0x1d;
1353	if (codec->vendor_id == 0x10ec0260)
1354		nid = 0x17;
1355	ass = snd_hda_codec_get_pincfg(codec, nid);
1356	snd_printd("realtek: No valid SSID, "
1357		   "checking pincfg 0x%08x for NID 0x%x\n",
1358		   ass, nid);
1359	if (!(ass & 1))
1360		return 0;
1361	if ((ass >> 30) != 1)	/* no physical connection */
1362		return 0;
1363
1364	/* check sum */
1365	tmp = 0;
1366	for (i = 1; i < 16; i++) {
1367		if ((ass >> i) & 1)
1368			tmp++;
1369	}
1370	if (((ass >> 16) & 0xf) != tmp)
1371		return 0;
1372do_sku:
1373	snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1374		   ass & 0xffff, codec->vendor_id);
1375	/*
1376	 * 0 : override
1377	 * 1 :	Swap Jack
1378	 * 2 : 0 --> Desktop, 1 --> Laptop
1379	 * 3~5 : External Amplifier control
1380	 * 7~6 : Reserved
1381	*/
1382	tmp = (ass & 0x38) >> 3;	/* external Amp control */
1383	switch (tmp) {
1384	case 1:
1385		spec->init_amp = ALC_INIT_GPIO1;
1386		break;
1387	case 3:
1388		spec->init_amp = ALC_INIT_GPIO2;
1389		break;
1390	case 7:
1391		spec->init_amp = ALC_INIT_GPIO3;
1392		break;
1393	case 5:
1394		spec->init_amp = ALC_INIT_DEFAULT;
1395		break;
1396	}
1397
1398	/* is laptop or Desktop and enable the function "Mute internal speaker
1399	 * when the external headphone out jack is plugged"
1400	 */
1401	if (!(ass & 0x8000))
1402		return 1;
1403	/*
1404	 * 10~8 : Jack location
1405	 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1406	 * 14~13: Resvered
1407	 * 15   : 1 --> enable the function "Mute internal speaker
1408	 *	        when the external headphone out jack is plugged"
1409	 */
1410	if (!spec->autocfg.hp_pins[0]) {
1411		hda_nid_t nid;
1412		tmp = (ass >> 11) & 0x3;	/* HP to chassis */
1413		if (tmp == 0)
1414			nid = porta;
1415		else if (tmp == 1)
1416			nid = porte;
1417		else if (tmp == 2)
1418			nid = portd;
1419		else if (tmp == 3)
1420			nid = porti;
1421		else
1422			return 1;
1423		for (i = 0; i < spec->autocfg.line_outs; i++)
1424			if (spec->autocfg.line_out_pins[i] == nid)
1425				return 1;
1426		spec->autocfg.hp_pins[0] = nid;
1427	}
1428
1429	alc_init_auto_hp(codec);
1430	alc_init_auto_mic(codec);
1431	return 1;
1432}
1433
1434static void alc_ssid_check(struct hda_codec *codec,
1435			   hda_nid_t porta, hda_nid_t porte,
1436			   hda_nid_t portd, hda_nid_t porti)
1437{
1438	if (!alc_subsystem_id(codec, porta, porte, portd, porti)) {
1439		struct alc_spec *spec = codec->spec;
1440		snd_printd("realtek: "
1441			   "Enable default setup for auto mode as fallback\n");
1442		spec->init_amp = ALC_INIT_DEFAULT;
1443		alc_init_auto_hp(codec);
1444		alc_init_auto_mic(codec);
1445	}
1446}
1447
1448/*
1449 * Fix-up pin default configurations and add default verbs
1450 */
1451
1452struct alc_pincfg {
1453	hda_nid_t nid;
1454	u32 val;
1455};
1456
1457struct alc_fixup {
1458	const struct alc_pincfg *pins;
1459	const struct hda_verb *verbs;
1460};
1461
1462static void alc_pick_fixup(struct hda_codec *codec,
1463			   const struct snd_pci_quirk *quirk,
1464			   const struct alc_fixup *fix,
1465			   int pre_init)
1466{
1467	const struct alc_pincfg *cfg;
1468
1469	quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1470	if (!quirk)
1471		return;
1472	fix += quirk->value;
1473	cfg = fix->pins;
1474	if (pre_init && cfg) {
1475#ifdef CONFIG_SND_DEBUG_VERBOSE
1476		snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n",
1477			    codec->chip_name, quirk->name);
1478#endif
1479		for (; cfg->nid; cfg++)
1480			snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1481	}
1482	if (!pre_init && fix->verbs) {
1483#ifdef CONFIG_SND_DEBUG_VERBOSE
1484		snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-verbs for %s\n",
1485			    codec->chip_name, quirk->name);
1486#endif
1487		add_verb(codec->spec, fix->verbs);
1488	}
1489}
1490
1491static int alc_read_coef_idx(struct hda_codec *codec,
1492			unsigned int coef_idx)
1493{
1494	unsigned int val;
1495	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1496		    		coef_idx);
1497	val = snd_hda_codec_read(codec, 0x20, 0,
1498			 	AC_VERB_GET_PROC_COEF, 0);
1499	return val;
1500}
1501
1502/*
1503 * ALC888
1504 */
1505
1506/*
1507 * 2ch mode
1508 */
1509static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1510/* Mic-in jack as mic in */
1511	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1512	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1513/* Line-in jack as Line in */
1514	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1515	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1516/* Line-Out as Front */
1517	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1518	{ } /* end */
1519};
1520
1521/*
1522 * 4ch mode
1523 */
1524static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1525/* Mic-in jack as mic in */
1526	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1527	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1528/* Line-in jack as Surround */
1529	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1530	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1531/* Line-Out as Front */
1532	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1533	{ } /* end */
1534};
1535
1536/*
1537 * 6ch mode
1538 */
1539static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1540/* Mic-in jack as CLFE */
1541	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1542	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1543/* Line-in jack as Surround */
1544	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1545	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1546/* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1547	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1548	{ } /* end */
1549};
1550
1551/*
1552 * 8ch mode
1553 */
1554static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1555/* Mic-in jack as CLFE */
1556	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1557	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1558/* Line-in jack as Surround */
1559	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1560	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1561/* Line-Out as Side */
1562	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1563	{ } /* end */
1564};
1565
1566static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1567	{ 2, alc888_4ST_ch2_intel_init },
1568	{ 4, alc888_4ST_ch4_intel_init },
1569	{ 6, alc888_4ST_ch6_intel_init },
1570	{ 8, alc888_4ST_ch8_intel_init },
1571};
1572
1573/*
1574 * ALC888 Fujitsu Siemens Amillo xa3530
1575 */
1576
1577static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1578/* Front Mic: set to PIN_IN (empty by default) */
1579	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1580/* Connect Internal HP to Front */
1581	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1582	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1583	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1584/* Connect Bass HP to Front */
1585	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1586	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1587	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1588/* Connect Line-Out side jack (SPDIF) to Side */
1589	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1590	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1591	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1592/* Connect Mic jack to CLFE */
1593	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1594	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1595	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1596/* Connect Line-in jack to Surround */
1597	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1598	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1599	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1600/* Connect HP out jack to Front */
1601	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1602	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1603	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1604/* Enable unsolicited event for HP jack and Line-out jack */
1605	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1606	{0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1607	{}
1608};
1609
1610static void alc_automute_amp(struct hda_codec *codec)
1611{
1612	struct alc_spec *spec = codec->spec;
1613	unsigned int mute;
1614	hda_nid_t nid;
1615	int i;
1616
1617	spec->jack_present = 0;
1618	for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1619		nid = spec->autocfg.hp_pins[i];
1620		if (!nid)
1621			break;
1622		if (snd_hda_jack_detect(codec, nid)) {
1623			spec->jack_present = 1;
1624			break;
1625		}
1626	}
1627
1628	mute = spec->jack_present ? HDA_AMP_MUTE : 0;
1629	/* Toggle internal speakers muting */
1630	for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1631		nid = spec->autocfg.speaker_pins[i];
1632		if (!nid)
1633			break;
1634		snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1635					 HDA_AMP_MUTE, mute);
1636	}
1637}
1638
1639static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1640					 unsigned int res)
1641{
1642	if (codec->vendor_id == 0x10ec0880)
1643		res >>= 28;
1644	else
1645		res >>= 26;
1646	if (res == ALC880_HP_EVENT)
1647		alc_automute_amp(codec);
1648}
1649
1650static void alc889_automute_setup(struct hda_codec *codec)
1651{
1652	struct alc_spec *spec = codec->spec;
1653
1654	spec->autocfg.hp_pins[0] = 0x15;
1655	spec->autocfg.speaker_pins[0] = 0x14;
1656	spec->autocfg.speaker_pins[1] = 0x16;
1657	spec->autocfg.speaker_pins[2] = 0x17;
1658	spec->autocfg.speaker_pins[3] = 0x19;
1659	spec->autocfg.speaker_pins[4] = 0x1a;
1660}
1661
1662static void alc889_intel_init_hook(struct hda_codec *codec)
1663{
1664	alc889_coef_init(codec);
1665	alc_automute_amp(codec);
1666}
1667
1668static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
1669{
1670	struct alc_spec *spec = codec->spec;
1671
1672	spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1673	spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1674	spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1675	spec->autocfg.speaker_pins[1] = 0x15; /* bass */
1676}
1677
1678/*
1679 * ALC888 Acer Aspire 4930G model
1680 */
1681
1682static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1683/* Front Mic: set to PIN_IN (empty by default) */
1684	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1685/* Unselect Front Mic by default in input mixer 3 */
1686	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1687/* Enable unsolicited event for HP jack */
1688	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1689/* Connect Internal HP to front */
1690	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1691	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1692	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1693/* Connect HP out to front */
1694	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1695	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1696	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1697	{ }
1698};
1699
1700/*
1701 * ALC888 Acer Aspire 6530G model
1702 */
1703
1704static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1705/* Route to built-in subwoofer as well as speakers */
1706	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1707	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1708	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1709	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1710/* Bias voltage on for external mic port */
1711	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
1712/* Front Mic: set to PIN_IN (empty by default) */
1713	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1714/* Unselect Front Mic by default in input mixer 3 */
1715	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1716/* Enable unsolicited event for HP jack */
1717	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1718/* Enable speaker output */
1719	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1720	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1721	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
1722/* Enable headphone output */
1723	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1724	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1725	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1726	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
1727	{ }
1728};
1729
1730/*
1731 * ALC889 Acer Aspire 8930G model
1732 */
1733
1734static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
1735/* Front Mic: set to PIN_IN (empty by default) */
1736	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1737/* Unselect Front Mic by default in input mixer 3 */
1738	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1739/* Enable unsolicited event for HP jack */
1740	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1741/* Connect Internal Front to Front */
1742	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1743	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1744	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1745/* Connect Internal Rear to Rear */
1746	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1747	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1748	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1749/* Connect Internal CLFE to CLFE */
1750	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1751	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1752	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1753/* Connect HP out to Front */
1754	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1755	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1756	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1757/* Enable all DACs */
1758/*  DAC DISABLE/MUTE 1? */
1759/*  setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1760	{0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1761	{0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1762/*  DAC DISABLE/MUTE 2? */
1763/*  some bit here disables the other DACs. Init=0x4900 */
1764	{0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1765	{0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1766/* DMIC fix
1767 * This laptop has a stereo digital microphone. The mics are only 1cm apart
1768 * which makes the stereo useless. However, either the mic or the ALC889
1769 * makes the signal become a difference/sum signal instead of standard
1770 * stereo, which is annoying. So instead we flip this bit which makes the
1771 * codec replicate the sum signal to both channels, turning it into a
1772 * normal mono mic.
1773 */
1774/*  DMIC_CONTROL? Init value = 0x0001 */
1775	{0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1776	{0x20, AC_VERB_SET_PROC_COEF, 0x0003},
1777	{ }
1778};
1779
1780static struct hda_input_mux alc888_2_capture_sources[2] = {
1781	/* Front mic only available on one ADC */
1782	{
1783		.num_items = 4,
1784		.items = {
1785			{ "Mic", 0x0 },
1786			{ "Line", 0x2 },
1787			{ "CD", 0x4 },
1788			{ "Front Mic", 0xb },
1789		},
1790	},
1791	{
1792		.num_items = 3,
1793		.items = {
1794			{ "Mic", 0x0 },
1795			{ "Line", 0x2 },
1796			{ "CD", 0x4 },
1797		},
1798	}
1799};
1800
1801static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
1802	/* Interal mic only available on one ADC */
1803	{
1804		.num_items = 5,
1805		.items = {
1806			{ "Ext Mic", 0x0 },
1807			{ "Line In", 0x2 },
1808			{ "CD", 0x4 },
1809			{ "Input Mix", 0xa },
1810			{ "Int Mic", 0xb },
1811		},
1812	},
1813	{
1814		.num_items = 4,
1815		.items = {
1816			{ "Ext Mic", 0x0 },
1817			{ "Line In", 0x2 },
1818			{ "CD", 0x4 },
1819			{ "Input Mix", 0xa },
1820		},
1821	}
1822};
1823
1824static struct hda_input_mux alc889_capture_sources[3] = {
1825	/* Digital mic only available on first "ADC" */
1826	{
1827		.num_items = 5,
1828		.items = {
1829			{ "Mic", 0x0 },
1830			{ "Line", 0x2 },
1831			{ "CD", 0x4 },
1832			{ "Front Mic", 0xb },
1833			{ "Input Mix", 0xa },
1834		},
1835	},
1836	{
1837		.num_items = 4,
1838		.items = {
1839			{ "Mic", 0x0 },
1840			{ "Line", 0x2 },
1841			{ "CD", 0x4 },
1842			{ "Input Mix", 0xa },
1843		},
1844	},
1845	{
1846		.num_items = 4,
1847		.items = {
1848			{ "Mic", 0x0 },
1849			{ "Line", 0x2 },
1850			{ "CD", 0x4 },
1851			{ "Input Mix", 0xa },
1852		},
1853	}
1854};
1855
1856static struct snd_kcontrol_new alc888_base_mixer[] = {
1857	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1858	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1859	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1860	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1861	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1862		HDA_OUTPUT),
1863	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1864	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1865	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1866	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1867	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1868	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1869	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1870	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1871	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1872	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1873	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1874	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1875	{ } /* end */
1876};
1877
1878static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
1879	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1880	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1881	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1882	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1883	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1884		HDA_OUTPUT),
1885	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1886	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1887	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1888	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1889	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1890	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1891	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1892	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1893	{ } /* end */
1894};
1895
1896
1897static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
1898{
1899	struct alc_spec *spec = codec->spec;
1900
1901	spec->autocfg.hp_pins[0] = 0x15;
1902	spec->autocfg.speaker_pins[0] = 0x14;
1903	spec->autocfg.speaker_pins[1] = 0x16;
1904	spec->autocfg.speaker_pins[2] = 0x17;
1905}
1906
1907static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
1908{
1909	struct alc_spec *spec = codec->spec;
1910
1911	spec->autocfg.hp_pins[0] = 0x15;
1912	spec->autocfg.speaker_pins[0] = 0x14;
1913	spec->autocfg.speaker_pins[1] = 0x16;
1914	spec->autocfg.speaker_pins[2] = 0x17;
1915}
1916
1917static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
1918{
1919	struct alc_spec *spec = codec->spec;
1920
1921	spec->autocfg.hp_pins[0] = 0x15;
1922	spec->autocfg.speaker_pins[0] = 0x14;
1923	spec->autocfg.speaker_pins[1] = 0x16;
1924	spec->autocfg.speaker_pins[2] = 0x1b;
1925}
1926
1927/*
1928 * ALC880 3-stack model
1929 *
1930 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
1931 * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
1932 *                 F-Mic = 0x1b, HP = 0x19
1933 */
1934
1935static hda_nid_t alc880_dac_nids[4] = {
1936	/* front, rear, clfe, rear_surr */
1937	0x02, 0x05, 0x04, 0x03
1938};
1939
1940static hda_nid_t alc880_adc_nids[3] = {
1941	/* ADC0-2 */
1942	0x07, 0x08, 0x09,
1943};
1944
1945/* The datasheet says the node 0x07 is connected from inputs,
1946 * but it shows zero connection in the real implementation on some devices.
1947 * Note: this is a 915GAV bug, fixed on 915GLV
1948 */
1949static hda_nid_t alc880_adc_nids_alt[2] = {
1950	/* ADC1-2 */
1951	0x08, 0x09,
1952};
1953
1954#define ALC880_DIGOUT_NID	0x06
1955#define ALC880_DIGIN_NID	0x0a
1956
1957static struct hda_input_mux alc880_capture_source = {
1958	.num_items = 4,
1959	.items = {
1960		{ "Mic", 0x0 },
1961		{ "Front Mic", 0x3 },
1962		{ "Line", 0x2 },
1963		{ "CD", 0x4 },
1964	},
1965};
1966
1967/* channel source setting (2/6 channel selection for 3-stack) */
1968/* 2ch mode */
1969static struct hda_verb alc880_threestack_ch2_init[] = {
1970	/* set line-in to input, mute it */
1971	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1972	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1973	/* set mic-in to input vref 80%, mute it */
1974	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1975	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1976	{ } /* end */
1977};
1978
1979/* 6ch mode */
1980static struct hda_verb alc880_threestack_ch6_init[] = {
1981	/* set line-in to output, unmute it */
1982	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1983	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1984	/* set mic-in to output, unmute it */
1985	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1986	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1987	{ } /* end */
1988};
1989
1990static struct hda_channel_mode alc880_threestack_modes[2] = {
1991	{ 2, alc880_threestack_ch2_init },
1992	{ 6, alc880_threestack_ch6_init },
1993};
1994
1995static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
1996	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1997	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1998	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1999	HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
2000	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2001	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2002	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2003	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2004	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2005	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2006	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2007	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2008	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2009	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2010	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
2011	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
2012	HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
2013	{
2014		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2015		.name = "Channel Mode",
2016		.info = alc_ch_mode_info,
2017		.get = alc_ch_mode_get,
2018		.put = alc_ch_mode_put,
2019	},
2020	{ } /* end */
2021};
2022
2023/* capture mixer elements */
2024static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
2025			    struct snd_ctl_elem_info *uinfo)
2026{
2027	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2028	struct alc_spec *spec = codec->spec;
2029	int err;
2030
2031	mutex_lock(&codec->control_mutex);
2032	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2033						      HDA_INPUT);
2034	err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
2035	mutex_unlock(&codec->control_mutex);
2036	return err;
2037}
2038
2039static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
2040			   unsigned int size, unsigned int __user *tlv)
2041{
2042	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2043	struct alc_spec *spec = codec->spec;
2044	int err;
2045
2046	mutex_lock(&codec->control_mutex);
2047	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2048						      HDA_INPUT);
2049	err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
2050	mutex_unlock(&codec->control_mutex);
2051	return err;
2052}
2053
2054typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
2055			     struct snd_ctl_elem_value *ucontrol);
2056
2057static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
2058				 struct snd_ctl_elem_value *ucontrol,
2059				 getput_call_t func)
2060{
2061	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2062	struct alc_spec *spec = codec->spec;
2063	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2064	int err;
2065
2066	mutex_lock(&codec->control_mutex);
2067	kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
2068						      3, 0, HDA_INPUT);
2069	err = func(kcontrol, ucontrol);
2070	mutex_unlock(&codec->control_mutex);
2071	return err;
2072}
2073
2074static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
2075			   struct snd_ctl_elem_value *ucontrol)
2076{
2077	return alc_cap_getput_caller(kcontrol, ucontrol,
2078				     snd_hda_mixer_amp_volume_get);
2079}
2080
2081static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
2082			   struct snd_ctl_elem_value *ucontrol)
2083{
2084	return alc_cap_getput_caller(kcontrol, ucontrol,
2085				     snd_hda_mixer_amp_volume_put);
2086}
2087
2088/* capture mixer elements */
2089#define alc_cap_sw_info		snd_ctl_boolean_stereo_info
2090
2091static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
2092			  struct snd_ctl_elem_value *ucontrol)
2093{
2094	return alc_cap_getput_caller(kcontrol, ucontrol,
2095				     snd_hda_mixer_amp_switch_get);
2096}
2097
2098static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2099			  struct snd_ctl_elem_value *ucontrol)
2100{
2101	return alc_cap_getput_caller(kcontrol, ucontrol,
2102				     snd_hda_mixer_amp_switch_put);
2103}
2104
2105#define _DEFINE_CAPMIX(num) \
2106	{ \
2107		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2108		.name = "Capture Switch", \
2109		.access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2110		.count = num, \
2111		.info = alc_cap_sw_info, \
2112		.get = alc_cap_sw_get, \
2113		.put = alc_cap_sw_put, \
2114	}, \
2115	{ \
2116		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2117		.name = "Capture Volume", \
2118		.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2119			   SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2120			   SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2121		.count = num, \
2122		.info = alc_cap_vol_info, \
2123		.get = alc_cap_vol_get, \
2124		.put = alc_cap_vol_put, \
2125		.tlv = { .c = alc_cap_vol_tlv }, \
2126	}
2127
2128#define _DEFINE_CAPSRC(num) \
2129	{ \
2130		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2131		/* .name = "Capture Source", */ \
2132		.name = "Input Source", \
2133		.count = num, \
2134		.info = alc_mux_enum_info, \
2135		.get = alc_mux_enum_get, \
2136		.put = alc_mux_enum_put, \
2137	}
2138
2139#define DEFINE_CAPMIX(num) \
2140static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2141	_DEFINE_CAPMIX(num),				      \
2142	_DEFINE_CAPSRC(num),				      \
2143	{ } /* end */					      \
2144}
2145
2146#define DEFINE_CAPMIX_NOSRC(num) \
2147static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2148	_DEFINE_CAPMIX(num),					    \
2149	{ } /* end */						    \
2150}
2151
2152/* up to three ADCs */
2153DEFINE_CAPMIX(1);
2154DEFINE_CAPMIX(2);
2155DEFINE_CAPMIX(3);
2156DEFINE_CAPMIX_NOSRC(1);
2157DEFINE_CAPMIX_NOSRC(2);
2158DEFINE_CAPMIX_NOSRC(3);
2159
2160/*
2161 * ALC880 5-stack model
2162 *
2163 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2164 *      Side = 0x02 (0xd)
2165 * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2166 *                 Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2167 */
2168
2169/* additional mixers to alc880_three_stack_mixer */
2170static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2171	HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2172	HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2173	{ } /* end */
2174};
2175
2176/* channel source setting (6/8 channel selection for 5-stack) */
2177/* 6ch mode */
2178static struct hda_verb alc880_fivestack_ch6_init[] = {
2179	/* set line-in to input, mute it */
2180	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2181	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2182	{ } /* end */
2183};
2184
2185/* 8ch mode */
2186static struct hda_verb alc880_fivestack_ch8_init[] = {
2187	/* set line-in to output, unmute it */
2188	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2189	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2190	{ } /* end */
2191};
2192
2193static struct hda_channel_mode alc880_fivestack_modes[2] = {
2194	{ 6, alc880_fivestack_ch6_init },
2195	{ 8, alc880_fivestack_ch8_init },
2196};
2197
2198
2199/*
2200 * ALC880 6-stack model
2201 *
2202 * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2203 *      Side = 0x05 (0x0f)
2204 * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2205 *   Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2206 */
2207
2208static hda_nid_t alc880_6st_dac_nids[4] = {
2209	/* front, rear, clfe, rear_surr */
2210	0x02, 0x03, 0x04, 0x05
2211};
2212
2213static struct hda_input_mux alc880_6stack_capture_source = {
2214	.num_items = 4,
2215	.items = {
2216		{ "Mic", 0x0 },
2217		{ "Front Mic", 0x1 },
2218		{ "Line", 0x2 },
2219		{ "CD", 0x4 },
2220	},
2221};
2222
2223/* fixed 8-channels */
2224static struct hda_channel_mode alc880_sixstack_modes[1] = {
2225	{ 8, NULL },
2226};
2227
2228static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2229	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2230	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2231	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2232	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2233	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2234	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2235	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2236	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2237	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2238	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2239	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2240	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2241	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2242	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2243	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2244	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2245	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2246	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2247	{
2248		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2249		.name = "Channel Mode",
2250		.info = alc_ch_mode_info,
2251		.get = alc_ch_mode_get,
2252		.put = alc_ch_mode_put,
2253	},
2254	{ } /* end */
2255};
2256
2257
2258/*
2259 * ALC880 W810 model
2260 *
2261 * W810 has rear IO for:
2262 * Front (DAC 02)
2263 * Surround (DAC 03)
2264 * Center/LFE (DAC 04)
2265 * Digital out (06)
2266 *
2267 * The system also has a pair of internal speakers, and a headphone jack.
2268 * These are both connected to Line2 on the codec, hence to DAC 02.
2269 *
2270 * There is a variable resistor to control the speaker or headphone
2271 * volume. This is a hardware-only device without a software API.
2272 *
2273 * Plugging headphones in will disable the internal speakers. This is
2274 * implemented in hardware, not via the driver using jack sense. In
2275 * a similar fashion, plugging into the rear socket marked "front" will
2276 * disable both the speakers and headphones.
2277 *
2278 * For input, there's a microphone jack, and an "audio in" jack.
2279 * These may not do anything useful with this driver yet, because I
2280 * haven't setup any initialization verbs for these yet...
2281 */
2282
2283static hda_nid_t alc880_w810_dac_nids[3] = {
2284	/* front, rear/surround, clfe */
2285	0x02, 0x03, 0x04
2286};
2287
2288/* fixed 6 channels */
2289static struct hda_channel_mode alc880_w810_modes[1] = {
2290	{ 6, NULL }
2291};
2292
2293/* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2294static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2295	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2296	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2297	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2298	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2299	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2300	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2301	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2302	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2303	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2304	{ } /* end */
2305};
2306
2307
2308/*
2309 * Z710V model
2310 *
2311 * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
2312 * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2313 *                 Line = 0x1a
2314 */
2315
2316static hda_nid_t alc880_z71v_dac_nids[1] = {
2317	0x02
2318};
2319#define ALC880_Z71V_HP_DAC	0x03
2320
2321/* fixed 2 channels */
2322static struct hda_channel_mode alc880_2_jack_modes[1] = {
2323	{ 2, NULL }
2324};
2325
2326static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2327	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2328	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2329	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2330	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
2331	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2332	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2333	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2334	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2335	{ } /* end */
2336};
2337
2338
2339/*
2340 * ALC880 F1734 model
2341 *
2342 * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2343 * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2344 */
2345
2346static hda_nid_t alc880_f1734_dac_nids[1] = {
2347	0x03
2348};
2349#define ALC880_F1734_HP_DAC	0x02
2350
2351static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2352	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2353	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2354	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2355	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2356	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2357	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2358	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2359	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2360	{ } /* end */
2361};
2362
2363static struct hda_input_mux alc880_f1734_capture_source = {
2364	.num_items = 2,
2365	.items = {
2366		{ "Mic", 0x1 },
2367		{ "CD", 0x4 },
2368	},
2369};
2370
2371
2372/*
2373 * ALC880 ASUS model
2374 *
2375 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2376 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2377 *  Mic = 0x18, Line = 0x1a
2378 */
2379
2380#define alc880_asus_dac_nids	alc880_w810_dac_nids	/* identical with w810 */
2381#define alc880_asus_modes	alc880_threestack_modes	/* 2/6 channel mode */
2382
2383static struct snd_kcontrol_new alc880_asus_mixer[] = {
2384	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2385	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2386	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2387	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2388	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2389	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2390	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2391	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2392	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2393	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2394	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2395	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2396	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2397	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2398	{
2399		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2400		.name = "Channel Mode",
2401		.info = alc_ch_mode_info,
2402		.get = alc_ch_mode_get,
2403		.put = alc_ch_mode_put,
2404	},
2405	{ } /* end */
2406};
2407
2408/*
2409 * ALC880 ASUS W1V model
2410 *
2411 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2412 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2413 *  Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2414 */
2415
2416/* additional mixers to alc880_asus_mixer */
2417static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2418	HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2419	HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2420	{ } /* end */
2421};
2422
2423/* TCL S700 */
2424static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2425	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2426	HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2427	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2428	HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2429	HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2430	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2431	HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2432	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2433	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
2434	{ } /* end */
2435};
2436
2437/* Uniwill */
2438static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2439	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2440	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2441	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2442	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2443	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2444	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2445	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2446	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2447	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2448	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2449	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2450	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2451	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2452	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2453	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2454	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2455	{
2456		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2457		.name = "Channel Mode",
2458		.info = alc_ch_mode_info,
2459		.get = alc_ch_mode_get,
2460		.put = alc_ch_mode_put,
2461	},
2462	{ } /* end */
2463};
2464
2465static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2466	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2467	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2468	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2469	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2470	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2471	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2472	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2473	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2474	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2475	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2476	{ } /* end */
2477};
2478
2479static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2480	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2481	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2482	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2483	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2484	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2485	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2486	{ } /* end */
2487};
2488
2489/*
2490 * virtual master controls
2491 */
2492
2493/*
2494 * slave controls for virtual master
2495 */
2496static const char *alc_slave_vols[] = {
2497	"Front Playback Volume",
2498	"Surround Playback Volume",
2499	"Center Playback Volume",
2500	"LFE Playback Volume",
2501	"Side Playback Volume",
2502	"Headphone Playback Volume",
2503	"Speaker Playback Volume",
2504	"Mono Playback Volume",
2505	"Line-Out Playback Volume",
2506	"PCM Playback Volume",
2507	NULL,
2508};
2509
2510static const char *alc_slave_sws[] = {
2511	"Front Playback Switch",
2512	"Surround Playback Switch",
2513	"Center Playback Switch",
2514	"LFE Playback Switch",
2515	"Side Playback Switch",
2516	"Headphone Playback Switch",
2517	"Speaker Playback Switch",
2518	"Mono Playback Switch",
2519	"IEC958 Playback Switch",
2520	"Line-Out Playback Switch",
2521	"PCM Playback Switch",
2522	NULL,
2523};
2524
2525/*
2526 * build control elements
2527 */
2528
2529#define NID_MAPPING		(-1)
2530
2531#define SUBDEV_SPEAKER_		(0 << 6)
2532#define SUBDEV_HP_		(1 << 6)
2533#define SUBDEV_LINE_		(2 << 6)
2534#define SUBDEV_SPEAKER(x)	(SUBDEV_SPEAKER_ | ((x) & 0x3f))
2535#define SUBDEV_HP(x)		(SUBDEV_HP_ | ((x) & 0x3f))
2536#define SUBDEV_LINE(x)		(SUBDEV_LINE_ | ((x) & 0x3f))
2537
2538static void alc_free_kctls(struct hda_codec *codec);
2539
2540#ifdef CONFIG_SND_HDA_INPUT_BEEP
2541/* additional beep mixers; the actual parameters are overwritten at build */
2542static struct snd_kcontrol_new alc_beep_mixer[] = {
2543	HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2544	HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
2545	{ } /* end */
2546};
2547#endif
2548
2549static int alc_build_controls(struct hda_codec *codec)
2550{
2551	struct alc_spec *spec = codec->spec;
2552	struct snd_kcontrol *kctl = NULL;
2553	struct snd_kcontrol_new *knew;
2554	int i, j, err;
2555	unsigned int u;
2556	hda_nid_t nid;
2557
2558	for (i = 0; i < spec->num_mixers; i++) {
2559		err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2560		if (err < 0)
2561			return err;
2562	}
2563	if (spec->cap_mixer) {
2564		err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2565		if (err < 0)
2566			return err;
2567	}
2568	if (spec->multiout.dig_out_nid) {
2569		err = snd_hda_create_spdif_out_ctls(codec,
2570						    spec->multiout.dig_out_nid);
2571		if (err < 0)
2572			return err;
2573		if (!spec->no_analog) {
2574			err = snd_hda_create_spdif_share_sw(codec,
2575							    &spec->multiout);
2576			if (err < 0)
2577				return err;
2578			spec->multiout.share_spdif = 1;
2579		}
2580	}
2581	if (spec->dig_in_nid) {
2582		err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2583		if (err < 0)
2584			return err;
2585	}
2586
2587#ifdef CONFIG_SND_HDA_INPUT_BEEP
2588	/* create beep controls if needed */
2589	if (spec->beep_amp) {
2590		struct snd_kcontrol_new *knew;
2591		for (knew = alc_beep_mixer; knew->name; knew++) {
2592			struct snd_kcontrol *kctl;
2593			kctl = snd_ctl_new1(knew, codec);
2594			if (!kctl)
2595				return -ENOMEM;
2596			kctl->private_value = spec->beep_amp;
2597			err = snd_hda_ctl_add(codec, 0, kctl);
2598			if (err < 0)
2599				return err;
2600		}
2601	}
2602#endif
2603
2604	/* if we have no master control, let's create it */
2605	if (!spec->no_analog &&
2606	    !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
2607		unsigned int vmaster_tlv[4];
2608		snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
2609					HDA_OUTPUT, vmaster_tlv);
2610		err = snd_hda_add_vmaster(codec, "Master Playback Volume",
2611					  vmaster_tlv, alc_slave_vols);
2612		if (err < 0)
2613			return err;
2614	}
2615	if (!spec->no_analog &&
2616	    !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2617		err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2618					  NULL, alc_slave_sws);
2619		if (err < 0)
2620			return err;
2621	}
2622
2623	/* assign Capture Source enums to NID */
2624	if (spec->capsrc_nids || spec->adc_nids) {
2625		kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
2626		if (!kctl)
2627			kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
2628		for (i = 0; kctl && i < kctl->count; i++) {
2629			hda_nid_t *nids = spec->capsrc_nids;
2630			if (!nids)
2631				nids = spec->adc_nids;
2632			err = snd_hda_add_nid(codec, kctl, i, nids[i]);
2633			if (err < 0)
2634				return err;
2635		}
2636	}
2637	if (spec->cap_mixer) {
2638		const char *kname = kctl ? kctl->id.name : NULL;
2639		for (knew = spec->cap_mixer; knew->name; knew++) {
2640			if (kname && strcmp(knew->name, kname) == 0)
2641				continue;
2642			kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2643			for (i = 0; kctl && i < kctl->count; i++) {
2644				err = snd_hda_add_nid(codec, kctl, i,
2645						      spec->adc_nids[i]);
2646				if (err < 0)
2647					return err;
2648			}
2649		}
2650	}
2651
2652	/* other nid->control mapping */
2653	for (i = 0; i < spec->num_mixers; i++) {
2654		for (knew = spec->mixers[i]; knew->name; knew++) {
2655			if (knew->iface != NID_MAPPING)
2656				continue;
2657			kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2658			if (kctl == NULL)
2659				continue;
2660			u = knew->subdevice;
2661			for (j = 0; j < 4; j++, u >>= 8) {
2662				nid = u & 0x3f;
2663				if (nid == 0)
2664					continue;
2665				switch (u & 0xc0) {
2666				case SUBDEV_SPEAKER_:
2667					nid = spec->autocfg.speaker_pins[nid];
2668					break;
2669				case SUBDEV_LINE_:
2670					nid = spec->autocfg.line_out_pins[nid];
2671					break;
2672				case SUBDEV_HP_:
2673					nid = spec->autocfg.hp_pins[nid];
2674					break;
2675				default:
2676					continue;
2677				}
2678				err = snd_hda_add_nid(codec, kctl, 0, nid);
2679				if (err < 0)
2680					return err;
2681			}
2682			u = knew->private_value;
2683			for (j = 0; j < 4; j++, u >>= 8) {
2684				nid = u & 0xff;
2685				if (nid == 0)
2686					continue;
2687				err = snd_hda_add_nid(codec, kctl, 0, nid);
2688				if (err < 0)
2689					return err;
2690			}
2691		}
2692	}
2693
2694	alc_free_kctls(codec); /* no longer needed */
2695
2696	return 0;
2697}
2698
2699
2700/*
2701 * initialize the codec volumes, etc
2702 */
2703
2704/*
2705 * generic initialization of ADC, input mixers and output mixers
2706 */
2707static struct hda_verb alc880_volume_init_verbs[] = {
2708	/*
2709	 * Unmute ADC0-2 and set the default input to mic-in
2710	 */
2711	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2712	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2713	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
2714	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2715	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
2716	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2717
2718	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2719	 * mixer widget
2720	 * Note: PASD motherboards uses the Line In 2 as the input for front
2721	 * panel mic (mic 2)
2722	 */
2723	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
2724	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2725	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2726	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2727	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2728	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2729	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2730	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2731
2732	/*
2733	 * Set up output mixers (0x0c - 0x0f)
2734	 */
2735	/* set vol=0 to output mixers */
2736	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2737	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2738	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2739	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2740	/* set up input amps for analog loopback */
2741	/* Amp Indices: DAC = 0, mixer = 1 */
2742	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2743	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2744	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2745	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2746	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2747	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2748	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2749	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2750
2751	{ }
2752};
2753
2754/*
2755 * 3-stack pin configuration:
2756 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2757 */
2758static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2759	/*
2760	 * preset connection lists of input pins
2761	 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2762	 */
2763	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2764	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2765	{0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2766
2767	/*
2768	 * Set pin mode and muting
2769	 */
2770	/* set front pin widgets 0x14 for output */
2771	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2772	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2773	/* Mic1 (rear panel) pin widget for input and vref at 80% */
2774	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2775	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2776	/* Mic2 (as headphone out) for HP output */
2777	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2778	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2779	/* Line In pin widget for input */
2780	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2781	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2782	/* Line2 (as front mic) pin widget for input and vref at 80% */
2783	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2784	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2785	/* CD pin widget for input */
2786	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2787
2788	{ }
2789};
2790
2791/*
2792 * 5-stack pin configuration:
2793 * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2794 * line-in/side = 0x1a, f-mic = 0x1b
2795 */
2796static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2797	/*
2798	 * preset connection lists of input pins
2799	 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2800	 */
2801	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2802	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
2803
2804	/*
2805	 * Set pin mode and muting
2806	 */
2807	/* set pin widgets 0x14-0x17 for output */
2808	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2809	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2810	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2811	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2812	/* unmute pins for output (no gain on this amp) */
2813	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2814	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2815	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2816	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2817
2818	/* Mic1 (rear panel) pin widget for input and vref at 80% */
2819	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2820	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2821	/* Mic2 (as headphone out) for HP output */
2822	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2823	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2824	/* Line In pin widget for input */
2825	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2826	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2827	/* Line2 (as front mic) pin widget for input and vref at 80% */
2828	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2829	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2830	/* CD pin widget for input */
2831	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2832
2833	{ }
2834};
2835
2836/*
2837 * W810 pin configuration:
2838 * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2839 */
2840static struct hda_verb alc880_pin_w810_init_verbs[] = {
2841	/* hphone/speaker input selector: front DAC */
2842	{0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
2843
2844	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2845	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2846	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2847	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2848	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2849	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2850
2851	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2852	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2853
2854	{ }
2855};
2856
2857/*
2858 * Z71V pin configuration:
2859 * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2860 */
2861static struct hda_verb alc880_pin_z71v_init_verbs[] = {
2862	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2863	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2864	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2865	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2866
2867	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2868	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2869	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2870	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2871
2872	{ }
2873};
2874
2875/*
2876 * 6-stack pin configuration:
2877 * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2878 * f-mic = 0x19, line = 0x1a, HP = 0x1b
2879 */
2880static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2881	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2882
2883	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2884	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2885	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2886	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2887	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2888	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2889	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2890	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2891
2892	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2893	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2894	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2895	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2896	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2897	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2898	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2899	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2900	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2901
2902	{ }
2903};
2904
2905/*
2906 * Uniwill pin configuration:
2907 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
2908 * line = 0x1a
2909 */
2910static struct hda_verb alc880_uniwill_init_verbs[] = {
2911	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2912
2913	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2914	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2915	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2916	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2917	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2918	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2919	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2920	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2921	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2922	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2923	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2924	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2925	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2926	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2927
2928	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2929	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2930	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2931	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2932	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2933	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2934	/* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
2935	/* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
2936	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2937
2938	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2939	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
2940
2941	{ }
2942};
2943
2944/*
2945* Uniwill P53
2946* HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
2947 */
2948static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
2949	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2950
2951	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2952	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2953	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2954	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2955	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2956	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2957	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2958	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2959	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2960	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2961	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2962	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2963
2964	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2965	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2966	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2967	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2968	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2969	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2970
2971	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2972	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
2973
2974	{ }
2975};
2976
2977static struct hda_verb alc880_beep_init_verbs[] = {
2978	{ 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
2979	{ }
2980};
2981
2982/* auto-toggle front mic */
2983static void alc880_uniwill_mic_automute(struct hda_codec *codec)
2984{
2985 	unsigned int present;
2986	unsigned char bits;
2987
2988	present = snd_hda_jack_detect(codec, 0x18);
2989	bits = present ? HDA_AMP_MUTE : 0;
2990	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
2991}
2992
2993static void alc880_uniwill_setup(struct hda_codec *codec)
2994{
2995	struct alc_spec *spec = codec->spec;
2996
2997	spec->autocfg.hp_pins[0] = 0x14;
2998	spec->autocfg.speaker_pins[0] = 0x15;
2999	spec->autocfg.speaker_pins[0] = 0x16;
3000}
3001
3002static void alc880_uniwill_init_hook(struct hda_codec *codec)
3003{
3004	alc_automute_amp(codec);
3005	alc880_uniwill_mic_automute(codec);
3006}
3007
3008static void alc880_uniwill_unsol_event(struct hda_codec *codec,
3009				       unsigned int res)
3010{
3011	/* Looks like the unsol event is incompatible with the standard
3012	 * definition.  4bit tag is placed at 28 bit!
3013	 */
3014	switch (res >> 28) {
3015	case ALC880_MIC_EVENT:
3016		alc880_uniwill_mic_automute(codec);
3017		break;
3018	default:
3019		alc_automute_amp_unsol_event(codec, res);
3020		break;
3021	}
3022}
3023
3024static void alc880_uniwill_p53_setup(struct hda_codec *codec)
3025{
3026	struct alc_spec *spec = codec->spec;
3027
3028	spec->autocfg.hp_pins[0] = 0x14;
3029	spec->autocfg.speaker_pins[0] = 0x15;
3030}
3031
3032static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
3033{
3034	unsigned int present;
3035
3036	present = snd_hda_codec_read(codec, 0x21, 0,
3037				     AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
3038	present &= HDA_AMP_VOLMASK;
3039	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
3040				 HDA_AMP_VOLMASK, present);
3041	snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
3042				 HDA_AMP_VOLMASK, present);
3043}
3044
3045static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
3046					   unsigned int res)
3047{
3048	/* Looks like the unsol event is incompatible with the standard
3049	 * definition.  4bit tag is placed at 28 bit!
3050	 */
3051	if ((res >> 28) == ALC880_DCVOL_EVENT)
3052		alc880_uniwill_p53_dcvol_automute(codec);
3053	else
3054		alc_automute_amp_unsol_event(codec, res);
3055}
3056
3057/*
3058 * F1734 pin configuration:
3059 * HP = 0x14, speaker-out = 0x15, mic = 0x18
3060 */
3061static struct hda_verb alc880_pin_f1734_init_verbs[] = {
3062	{0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
3063	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3064	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3065	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3066	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3067
3068	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3069	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3070	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3071	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3072
3073	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3074	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3075	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
3076	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3077	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3078	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3079	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3080	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3081	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3082
3083	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
3084	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
3085
3086	{ }
3087};
3088
3089/*
3090 * ASUS pin configuration:
3091 * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
3092 */
3093static struct hda_verb alc880_pin_asus_init_verbs[] = {
3094	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3095	{0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3096	{0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3097	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3098
3099	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3100	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3101	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3102	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3103	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3104	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3105	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3106	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3107
3108	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3109	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3110	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3111	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3112	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3113	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3114	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3115	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3116	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3117
3118	{ }
3119};
3120
3121/* Enable GPIO mask and set output */
3122#define alc880_gpio1_init_verbs	alc_gpio1_init_verbs
3123#define alc880_gpio2_init_verbs	alc_gpio2_init_verbs
3124#define alc880_gpio3_init_verbs	alc_gpio3_init_verbs
3125
3126/* Clevo m520g init */
3127static struct hda_verb alc880_pin_clevo_init_verbs[] = {
3128	/* headphone output */
3129	{0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3130	/* line-out */
3131	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3132	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3133	/* Line-in */
3134	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3135	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3136	/* CD */
3137	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3138	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3139	/* Mic1 (rear panel) */
3140	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3141	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3142	/* Mic2 (front panel) */
3143	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3144	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3145	/* headphone */
3146	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3147	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3148        /* change to EAPD mode */
3149	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3150	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3151
3152	{ }
3153};
3154
3155static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
3156	/* change to EAPD mode */
3157	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3158	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3159
3160	/* Headphone output */
3161	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3162	/* Front output*/
3163	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3164	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
3165
3166	/* Line In pin widget for input */
3167	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3168	/* CD pin widget for input */
3169	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3170	/* Mic1 (rear panel) pin widget for input and vref at 80% */
3171	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3172
3173	/* change to EAPD mode */
3174	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3175	{0x20, AC_VERB_SET_PROC_COEF,  0x3070},
3176
3177	{ }
3178};
3179
3180/*
3181 * LG m1 express dual
3182 *
3183 * Pin assignment:
3184 *   Rear Line-In/Out (blue): 0x14
3185 *   Build-in Mic-In: 0x15
3186 *   Speaker-out: 0x17
3187 *   HP-Out (green): 0x1b
3188 *   Mic-In/Out (red): 0x19
3189 *   SPDIF-Out: 0x1e
3190 */
3191
3192/* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3193static hda_nid_t alc880_lg_dac_nids[3] = {
3194	0x05, 0x02, 0x03
3195};
3196
3197/* seems analog CD is not working */
3198static struct hda_input_mux alc880_lg_capture_source = {
3199	.num_items = 3,
3200	.items = {
3201		{ "Mic", 0x1 },
3202		{ "Line", 0x5 },
3203		{ "Internal Mic", 0x6 },
3204	},
3205};
3206
3207/* 2,4,6 channel modes */
3208static struct hda_verb alc880_lg_ch2_init[] = {
3209	/* set line-in and mic-in to input */
3210	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3211	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3212	{ }
3213};
3214
3215static struct hda_verb alc880_lg_ch4_init[] = {
3216	/* set line-in to out and mic-in to input */
3217	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3218	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3219	{ }
3220};
3221
3222static struct hda_verb alc880_lg_ch6_init[] = {
3223	/* set line-in and mic-in to output */
3224	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3225	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3226	{ }
3227};
3228
3229static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3230	{ 2, alc880_lg_ch2_init },
3231	{ 4, alc880_lg_ch4_init },
3232	{ 6, alc880_lg_ch6_init },
3233};
3234
3235static struct snd_kcontrol_new alc880_lg_mixer[] = {
3236	HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3237	HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3238	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3239	HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3240	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3241	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3242	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3243	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3244	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3245	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3246	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3247	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3248	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3249	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3250	{
3251		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3252		.name = "Channel Mode",
3253		.info = alc_ch_mode_info,
3254		.get = alc_ch_mode_get,
3255		.put = alc_ch_mode_put,
3256	},
3257	{ } /* end */
3258};
3259
3260static struct hda_verb alc880_lg_init_verbs[] = {
3261	/* set capture source to mic-in */
3262	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3263	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3264	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3265	/* mute all amp mixer inputs */
3266	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
3267	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3268	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3269	/* line-in to input */
3270	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3271	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3272	/* built-in mic */
3273	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3274	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3275	/* speaker-out */
3276	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3277	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3278	/* mic-in to input */
3279	{0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3280	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3281	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3282	/* HP-out */
3283	{0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3284	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3285	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3286	/* jack sense */
3287	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3288	{ }
3289};
3290
3291/* toggle speaker-output according to the hp-jack state */
3292static void alc880_lg_setup(struct hda_codec *codec)
3293{
3294	struct alc_spec *spec = codec->spec;
3295
3296	spec->autocfg.hp_pins[0] = 0x1b;
3297	spec->autocfg.speaker_pins[0] = 0x17;
3298}
3299
3300/*
3301 * LG LW20
3302 *
3303 * Pin assignment:
3304 *   Speaker-out: 0x14
3305 *   Mic-In: 0x18
3306 *   Built-in Mic-In: 0x19
3307 *   Line-In: 0x1b
3308 *   HP-Out: 0x1a
3309 *   SPDIF-Out: 0x1e
3310 */
3311
3312static struct hda_input_mux alc880_lg_lw_capture_source = {
3313	.num_items = 3,
3314	.items = {
3315		{ "Mic", 0x0 },
3316		{ "Internal Mic", 0x1 },
3317		{ "Line In", 0x2 },
3318	},
3319};
3320
3321#define alc880_lg_lw_modes alc880_threestack_modes
3322
3323static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3324	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3325	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3326	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3327	HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3328	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3329	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3330	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3331	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3332	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3333	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
3334	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3335	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3336	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3337	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
3338	{
3339		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3340		.name = "Channel Mode",
3341		.info = alc_ch_mode_info,
3342		.get = alc_ch_mode_get,
3343		.put = alc_ch_mode_put,
3344	},
3345	{ } /* end */
3346};
3347
3348static struct hda_verb alc880_lg_lw_init_verbs[] = {
3349	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3350	{0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3351	{0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3352
3353	/* set capture source to mic-in */
3354	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3355	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3356	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3357	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3358	/* speaker-out */
3359	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3360	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3361	/* HP-out */
3362	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3363	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3364	/* mic-in to input */
3365	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3366	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3367	/* built-in mic */
3368	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3369	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3370	/* jack sense */
3371	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3372	{ }
3373};
3374
3375/* toggle speaker-output according to the hp-jack state */
3376static void alc880_lg_lw_setup(struct hda_codec *codec)
3377{
3378	struct alc_spec *spec = codec->spec;
3379
3380	spec->autocfg.hp_pins[0] = 0x1b;
3381	spec->autocfg.speaker_pins[0] = 0x14;
3382}
3383
3384static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3385	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3386	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3387	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3388	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3389	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3390	HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3391	{ } /* end */
3392};
3393
3394static struct hda_input_mux alc880_medion_rim_capture_source = {
3395	.num_items = 2,
3396	.items = {
3397		{ "Mic", 0x0 },
3398		{ "Internal Mic", 0x1 },
3399	},
3400};
3401
3402static struct hda_verb alc880_medion_rim_init_verbs[] = {
3403	{0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3404
3405	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3406	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3407
3408	/* Mic1 (rear panel) pin widget for input and vref at 80% */
3409	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3410	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3411	/* Mic2 (as headphone out) for HP output */
3412	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3413	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3414	/* Internal Speaker */
3415	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3416	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3417
3418	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3419	{0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3420
3421	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3422	{ }
3423};
3424
3425/* toggle speaker-output according to the hp-jack state */
3426static void alc880_medion_rim_automute(struct hda_codec *codec)
3427{
3428	struct alc_spec *spec = codec->spec;
3429	alc_automute_amp(codec);
3430	/* toggle EAPD */
3431	if (spec->jack_present)
3432		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3433	else
3434		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3435}
3436
3437static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3438					  unsigned int res)
3439{
3440	/* Looks like the unsol event is incompatible with the standard
3441	 * definition.  4bit tag is placed at 28 bit!
3442	 */
3443	if ((res >> 28) == ALC880_HP_EVENT)
3444		alc880_medion_rim_automute(codec);
3445}
3446
3447static void alc880_medion_rim_setup(struct hda_codec *codec)
3448{
3449	struct alc_spec *spec = codec->spec;
3450
3451	spec->autocfg.hp_pins[0] = 0x14;
3452	spec->autocfg.speaker_pins[0] = 0x1b;
3453}
3454
3455#ifdef CONFIG_SND_HDA_POWER_SAVE
3456static struct hda_amp_list alc880_loopbacks[] = {
3457	{ 0x0b, HDA_INPUT, 0 },
3458	{ 0x0b, HDA_INPUT, 1 },
3459	{ 0x0b, HDA_INPUT, 2 },
3460	{ 0x0b, HDA_INPUT, 3 },
3461	{ 0x0b, HDA_INPUT, 4 },
3462	{ } /* end */
3463};
3464
3465static struct hda_amp_list alc880_lg_loopbacks[] = {
3466	{ 0x0b, HDA_INPUT, 1 },
3467	{ 0x0b, HDA_INPUT, 6 },
3468	{ 0x0b, HDA_INPUT, 7 },
3469	{ } /* end */
3470};
3471#endif
3472
3473/*
3474 * Common callbacks
3475 */
3476
3477static int alc_init(struct hda_codec *codec)
3478{
3479	struct alc_spec *spec = codec->spec;
3480	unsigned int i;
3481
3482	alc_fix_pll(codec);
3483	alc_auto_init_amp(codec, spec->init_amp);
3484
3485	for (i = 0; i < spec->num_init_verbs; i++)
3486		snd_hda_sequence_write(codec, spec->init_verbs[i]);
3487
3488	if (spec->init_hook)
3489		spec->init_hook(codec);
3490
3491#ifdef CONFIG_SND_HDA_POWER_SAVE
3492	if (codec->patch_ops.check_power_status)
3493		codec->patch_ops.check_power_status(codec, 0x01);
3494#endif
3495	return 0;
3496}
3497
3498static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3499{
3500	struct alc_spec *spec = codec->spec;
3501
3502	if (spec->unsol_event)
3503		spec->unsol_event(codec, res);
3504}
3505
3506#ifdef CONFIG_SND_HDA_POWER_SAVE
3507static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3508{
3509	struct alc_spec *spec = codec->spec;
3510	return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3511}
3512#endif
3513
3514/*
3515 * Analog playback callbacks
3516 */
3517static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3518				    struct hda_codec *codec,
3519				    struct snd_pcm_substream *substream)
3520{
3521	struct alc_spec *spec = codec->spec;
3522	return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3523					     hinfo);
3524}
3525
3526static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3527				       struct hda_codec *codec,
3528				       unsigned int stream_tag,
3529				       unsigned int format,
3530				       struct snd_pcm_substream *substream)
3531{
3532	struct alc_spec *spec = codec->spec;
3533	return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3534						stream_tag, format, substream);
3535}
3536
3537static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3538				       struct hda_codec *codec,
3539				       struct snd_pcm_substream *substream)
3540{
3541	struct alc_spec *spec = codec->spec;
3542	return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3543}
3544
3545/*
3546 * Digital out
3547 */
3548static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3549					struct hda_codec *codec,
3550					struct snd_pcm_substream *substream)
3551{
3552	struct alc_spec *spec = codec->spec;
3553	return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3554}
3555
3556static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3557					   struct hda_codec *codec,
3558					   unsigned int stream_tag,
3559					   unsigned int format,
3560					   struct snd_pcm_substream *substream)
3561{
3562	struct alc_spec *spec = codec->spec;
3563	return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3564					     stream_tag, format, substream);
3565}
3566
3567static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3568					   struct hda_codec *codec,
3569					   struct snd_pcm_substream *substream)
3570{
3571	struct alc_spec *spec = codec->spec;
3572	return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3573}
3574
3575static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3576					 struct hda_codec *codec,
3577					 struct snd_pcm_substream *substream)
3578{
3579	struct alc_spec *spec = codec->spec;
3580	return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3581}
3582
3583/*
3584 * Analog capture
3585 */
3586static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3587				      struct hda_codec *codec,
3588				      unsigned int stream_tag,
3589				      unsigned int format,
3590				      struct snd_pcm_substream *substream)
3591{
3592	struct alc_spec *spec = codec->spec;
3593
3594	snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3595				   stream_tag, 0, format);
3596	return 0;
3597}
3598
3599static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3600				      struct hda_codec *codec,
3601				      struct snd_pcm_substream *substream)
3602{
3603	struct alc_spec *spec = codec->spec;
3604
3605	snd_hda_codec_cleanup_stream(codec,
3606				     spec->adc_nids[substream->number + 1]);
3607	return 0;
3608}
3609
3610
3611/*
3612 */
3613static struct hda_pcm_stream alc880_pcm_analog_playback = {
3614	.substreams = 1,
3615	.channels_min = 2,
3616	.channels_max = 8,
3617	/* NID is set in alc_build_pcms */
3618	.ops = {
3619		.open = alc880_playback_pcm_open,
3620		.prepare = alc880_playback_pcm_prepare,
3621		.cleanup = alc880_playback_pcm_cleanup
3622	},
3623};
3624
3625static struct hda_pcm_stream alc880_pcm_analog_capture = {
3626	.substreams = 1,
3627	.channels_min = 2,
3628	.channels_max = 2,
3629	/* NID is set in alc_build_pcms */
3630};
3631
3632static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3633	.substreams = 1,
3634	.channels_min = 2,
3635	.channels_max = 2,
3636	/* NID is set in alc_build_pcms */
3637};
3638
3639static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3640	.substreams = 2, /* can be overridden */
3641	.channels_min = 2,
3642	.channels_max = 2,
3643	/* NID is set in alc_build_pcms */
3644	.ops = {
3645		.prepare = alc880_alt_capture_pcm_prepare,
3646		.cleanup = alc880_alt_capture_pcm_cleanup
3647	},
3648};
3649
3650static struct hda_pcm_stream alc880_pcm_digital_playback = {
3651	.substreams = 1,
3652	.channels_min = 2,
3653	.channels_max = 2,
3654	/* NID is set in alc_build_pcms */
3655	.ops = {
3656		.open = alc880_dig_playback_pcm_open,
3657		.close = alc880_dig_playback_pcm_close,
3658		.prepare = alc880_dig_playback_pcm_prepare,
3659		.cleanup = alc880_dig_playback_pcm_cleanup
3660	},
3661};
3662
3663static struct hda_pcm_stream alc880_pcm_digital_capture = {
3664	.substreams = 1,
3665	.channels_min = 2,
3666	.channels_max = 2,
3667	/* NID is set in alc_build_pcms */
3668};
3669
3670/* Used by alc_build_pcms to flag that a PCM has no playback stream */
3671static struct hda_pcm_stream alc_pcm_null_stream = {
3672	.substreams = 0,
3673	.channels_min = 0,
3674	.channels_max = 0,
3675};
3676
3677static int alc_build_pcms(struct hda_codec *codec)
3678{
3679	struct alc_spec *spec = codec->spec;
3680	struct hda_pcm *info = spec->pcm_rec;
3681	int i;
3682
3683	codec->num_pcms = 1;
3684	codec->pcm_info = info;
3685
3686	if (spec->no_analog)
3687		goto skip_analog;
3688
3689	snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3690		 "%s Analog", codec->chip_name);
3691	info->name = spec->stream_name_analog;
3692
3693	if (spec->stream_analog_playback) {
3694		if (snd_BUG_ON(!spec->multiout.dac_nids))
3695			return -EINVAL;
3696		info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3697		info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3698	}
3699	if (spec->stream_analog_capture) {
3700		if (snd_BUG_ON(!spec->adc_nids))
3701			return -EINVAL;
3702		info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3703		info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3704	}
3705
3706	if (spec->channel_mode) {
3707		info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3708		for (i = 0; i < spec->num_channel_mode; i++) {
3709			if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3710				info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3711			}
3712		}
3713	}
3714
3715 skip_analog:
3716	/* SPDIF for stream index #1 */
3717	if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3718		snprintf(spec->stream_name_digital,
3719			 sizeof(spec->stream_name_digital),
3720			 "%s Digital", codec->chip_name);
3721		codec->num_pcms = 2;
3722	        codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3723		info = spec->pcm_rec + 1;
3724		info->name = spec->stream_name_digital;
3725		if (spec->dig_out_type)
3726			info->pcm_type = spec->dig_out_type;
3727		else
3728			info->pcm_type = HDA_PCM_TYPE_SPDIF;
3729		if (spec->multiout.dig_out_nid &&
3730		    spec->stream_digital_playback) {
3731			info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3732			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3733		}
3734		if (spec->dig_in_nid &&
3735		    spec->stream_digital_capture) {
3736			info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3737			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3738		}
3739		/* FIXME: do we need this for all Realtek codec models? */
3740		codec->spdif_status_reset = 1;
3741	}
3742
3743	if (spec->no_analog)
3744		return 0;
3745
3746	/* If the use of more than one ADC is requested for the current
3747	 * model, configure a second analog capture-only PCM.
3748	 */
3749	/* Additional Analaog capture for index #2 */
3750	if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3751	    (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
3752		codec->num_pcms = 3;
3753		info = spec->pcm_rec + 2;
3754		info->name = spec->stream_name_analog;
3755		if (spec->alt_dac_nid) {
3756			info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3757				*spec->stream_analog_alt_playback;
3758			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3759				spec->alt_dac_nid;
3760		} else {
3761			info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3762				alc_pcm_null_stream;
3763			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3764		}
3765		if (spec->num_adc_nids > 1) {
3766			info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3767				*spec->stream_analog_alt_capture;
3768			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3769				spec->adc_nids[1];
3770			info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3771				spec->num_adc_nids - 1;
3772		} else {
3773			info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3774				alc_pcm_null_stream;
3775			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3776		}
3777	}
3778
3779	return 0;
3780}
3781
3782static inline void alc_shutup(struct hda_codec *codec)
3783{
3784	snd_hda_shutup_pins(codec);
3785}
3786
3787static void alc_free_kctls(struct hda_codec *codec)
3788{
3789	struct alc_spec *spec = codec->spec;
3790
3791	if (spec->kctls.list) {
3792		struct snd_kcontrol_new *kctl = spec->kctls.list;
3793		int i;
3794		for (i = 0; i < spec->kctls.used; i++)
3795			kfree(kctl[i].name);
3796	}
3797	snd_array_free(&spec->kctls);
3798}
3799
3800static void alc_free(struct hda_codec *codec)
3801{
3802	struct alc_spec *spec = codec->spec;
3803
3804	if (!spec)
3805		return;
3806
3807	alc_shutup(codec);
3808	alc_free_kctls(codec);
3809	kfree(spec);
3810	snd_hda_detach_beep_device(codec);
3811}
3812
3813#ifdef CONFIG_SND_HDA_POWER_SAVE
3814static void alc_power_eapd(struct hda_codec *codec)
3815{
3816	/* We currently only handle front, HP */
3817	switch (codec->vendor_id) {
3818	case 0x10ec0260:
3819		set_eapd(codec, 0x0f, 0);
3820		set_eapd(codec, 0x10, 0);
3821		break;
3822	case 0x10ec0262:
3823	case 0x10ec0267:
3824	case 0x10ec0268:
3825	case 0x10ec0269:
3826	case 0x10ec0270:
3827	case 0x10ec0272:
3828	case 0x10ec0660:
3829	case 0x10ec0662:
3830	case 0x10ec0663:
3831	case 0x10ec0862:
3832	case 0x10ec0889:
3833		set_eapd(codec, 0x14, 0);
3834		set_eapd(codec, 0x15, 0);
3835		break;
3836	}
3837}
3838
3839static int alc_suspend(struct hda_codec *codec, pm_message_t state)
3840{
3841	struct alc_spec *spec = codec->spec;
3842	alc_shutup(codec);
3843	if (spec && spec->power_hook)
3844		spec->power_hook(codec);
3845	return 0;
3846}
3847#endif
3848
3849#ifdef SND_HDA_NEEDS_RESUME
3850static int alc_resume(struct hda_codec *codec)
3851{
3852	codec->patch_ops.init(codec);
3853	snd_hda_codec_resume_amp(codec);
3854	snd_hda_codec_resume_cache(codec);
3855#ifdef CONFIG_SND_HDA_POWER_SAVE
3856	if (codec->patch_ops.check_power_status)
3857		codec->patch_ops.check_power_status(codec, 0x01);
3858#endif
3859	return 0;
3860}
3861#endif
3862
3863/*
3864 */
3865static struct hda_codec_ops alc_patch_ops = {
3866	.build_controls = alc_build_controls,
3867	.build_pcms = alc_build_pcms,
3868	.init = alc_init,
3869	.free = alc_free,
3870	.unsol_event = alc_unsol_event,
3871#ifdef SND_HDA_NEEDS_RESUME
3872	.resume = alc_resume,
3873#endif
3874#ifdef CONFIG_SND_HDA_POWER_SAVE
3875	.suspend = alc_suspend,
3876	.check_power_status = alc_check_power_status,
3877#endif
3878	.reboot_notify = alc_shutup,
3879};
3880
3881/* replace the codec chip_name with the given string */
3882static int alc_codec_rename(struct hda_codec *codec, const char *name)
3883{
3884	kfree(codec->chip_name);
3885	codec->chip_name = kstrdup(name, GFP_KERNEL);
3886	if (!codec->chip_name) {
3887		alc_free(codec);
3888		return -ENOMEM;
3889	}
3890	return 0;
3891}
3892
3893/*
3894 * Test configuration for debugging
3895 *
3896 * Almost all inputs/outputs are enabled.  I/O pins can be configured via
3897 * enum controls.
3898 */
3899#ifdef CONFIG_SND_DEBUG
3900static hda_nid_t alc880_test_dac_nids[4] = {
3901	0x02, 0x03, 0x04, 0x05
3902};
3903
3904static struct hda_input_mux alc880_test_capture_source = {
3905	.num_items = 7,
3906	.items = {
3907		{ "In-1", 0x0 },
3908		{ "In-2", 0x1 },
3909		{ "In-3", 0x2 },
3910		{ "In-4", 0x3 },
3911		{ "CD", 0x4 },
3912		{ "Front", 0x5 },
3913		{ "Surround", 0x6 },
3914	},
3915};
3916
3917static struct hda_channel_mode alc880_test_modes[4] = {
3918	{ 2, NULL },
3919	{ 4, NULL },
3920	{ 6, NULL },
3921	{ 8, NULL },
3922};
3923
3924static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
3925				 struct snd_ctl_elem_info *uinfo)
3926{
3927	static char *texts[] = {
3928		"N/A", "Line Out", "HP Out",
3929		"In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
3930	};
3931	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3932	uinfo->count = 1;
3933	uinfo->value.enumerated.items = 8;
3934	if (uinfo->value.enumerated.item >= 8)
3935		uinfo->value.enumerated.item = 7;
3936	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3937	return 0;
3938}
3939
3940static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
3941				struct snd_ctl_elem_value *ucontrol)
3942{
3943	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3944	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3945	unsigned int pin_ctl, item = 0;
3946
3947	pin_ctl = snd_hda_codec_read(codec, nid, 0,
3948				     AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3949	if (pin_ctl & AC_PINCTL_OUT_EN) {
3950		if (pin_ctl & AC_PINCTL_HP_EN)
3951			item = 2;
3952		else
3953			item = 1;
3954	} else if (pin_ctl & AC_PINCTL_IN_EN) {
3955		switch (pin_ctl & AC_PINCTL_VREFEN) {
3956		case AC_PINCTL_VREF_HIZ: item = 3; break;
3957		case AC_PINCTL_VREF_50:  item = 4; break;
3958		case AC_PINCTL_VREF_GRD: item = 5; break;
3959		case AC_PINCTL_VREF_80:  item = 6; break;
3960		case AC_PINCTL_VREF_100: item = 7; break;
3961		}
3962	}
3963	ucontrol->value.enumerated.item[0] = item;
3964	return 0;
3965}
3966
3967static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
3968				struct snd_ctl_elem_value *ucontrol)
3969{
3970	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3971	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3972	static unsigned int ctls[] = {
3973		0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
3974		AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
3975		AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
3976		AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
3977		AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
3978		AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
3979	};
3980	unsigned int old_ctl, new_ctl;
3981
3982	old_ctl = snd_hda_codec_read(codec, nid, 0,
3983				     AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3984	new_ctl = ctls[ucontrol->value.enumerated.item[0]];
3985	if (old_ctl != new_ctl) {
3986		int val;
3987		snd_hda_codec_write_cache(codec, nid, 0,
3988					  AC_VERB_SET_PIN_WIDGET_CONTROL,
3989					  new_ctl);
3990		val = ucontrol->value.enumerated.item[0] >= 3 ?
3991			HDA_AMP_MUTE : 0;
3992		snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3993					 HDA_AMP_MUTE, val);
3994		return 1;
3995	}
3996	return 0;
3997}
3998
3999static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
4000				 struct snd_ctl_elem_info *uinfo)
4001{
4002	static char *texts[] = {
4003		"Front", "Surround", "CLFE", "Side"
4004	};
4005	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4006	uinfo->count = 1;
4007	uinfo->value.enumerated.items = 4;
4008	if (uinfo->value.enumerated.item >= 4)
4009		uinfo->value.enumerated.item = 3;
4010	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
4011	return 0;
4012}
4013
4014static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
4015				struct snd_ctl_elem_value *ucontrol)
4016{
4017	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4018	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4019	unsigned int sel;
4020
4021	sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
4022	ucontrol->value.enumerated.item[0] = sel & 3;
4023	return 0;
4024}
4025
4026static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
4027				struct snd_ctl_elem_value *ucontrol)
4028{
4029	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4030	hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4031	unsigned int sel;
4032
4033	sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
4034	if (ucontrol->value.enumerated.item[0] != sel) {
4035		sel = ucontrol->value.enumerated.item[0] & 3;
4036		snd_hda_codec_write_cache(codec, nid, 0,
4037					  AC_VERB_SET_CONNECT_SEL, sel);
4038		return 1;
4039	}
4040	return 0;
4041}
4042
4043#define PIN_CTL_TEST(xname,nid) {			\
4044		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	\
4045			.name = xname,		       \
4046			.subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4047			.info = alc_test_pin_ctl_info, \
4048			.get = alc_test_pin_ctl_get,   \
4049			.put = alc_test_pin_ctl_put,   \
4050			.private_value = nid	       \
4051			}
4052
4053#define PIN_SRC_TEST(xname,nid) {			\
4054		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	\
4055			.name = xname,		       \
4056			.subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4057			.info = alc_test_pin_src_info, \
4058			.get = alc_test_pin_src_get,   \
4059			.put = alc_test_pin_src_put,   \
4060			.private_value = nid	       \
4061			}
4062
4063static struct snd_kcontrol_new alc880_test_mixer[] = {
4064	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
4065	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
4066	HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
4067	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
4068	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
4069	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
4070	HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
4071	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
4072	PIN_CTL_TEST("Front Pin Mode", 0x14),
4073	PIN_CTL_TEST("Surround Pin Mode", 0x15),
4074	PIN_CTL_TEST("CLFE Pin Mode", 0x16),
4075	PIN_CTL_TEST("Side Pin Mode", 0x17),
4076	PIN_CTL_TEST("In-1 Pin Mode", 0x18),
4077	PIN_CTL_TEST("In-2 Pin Mode", 0x19),
4078	PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
4079	PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
4080	PIN_SRC_TEST("In-1 Pin Source", 0x18),
4081	PIN_SRC_TEST("In-2 Pin Source", 0x19),
4082	PIN_SRC_TEST("In-3 Pin Source", 0x1a),
4083	PIN_SRC_TEST("In-4 Pin Source", 0x1b),
4084	HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
4085	HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
4086	HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
4087	HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
4088	HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
4089	HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
4090	HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
4091	HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
4092	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
4093	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
4094	{
4095		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4096		.name = "Channel Mode",
4097		.info = alc_ch_mode_info,
4098		.get = alc_ch_mode_get,
4099		.put = alc_ch_mode_put,
4100	},
4101	{ } /* end */
4102};
4103
4104static struct hda_verb alc880_test_init_verbs[] = {
4105	/* Unmute inputs of 0x0c - 0x0f */
4106	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4107	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4108	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4109	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4110	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4111	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4112	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4113	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4114	/* Vol output for 0x0c-0x0f */
4115	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4116	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4117	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4118	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4119	/* Set output pins 0x14-0x17 */
4120	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4121	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4122	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4123	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4124	/* Unmute output pins 0x14-0x17 */
4125	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4126	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4127	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4128	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4129	/* Set input pins 0x18-0x1c */
4130	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4131	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4132	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4133	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4134	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4135	/* Mute input pins 0x18-0x1b */
4136	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4137	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4138	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4139	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4140	/* ADC set up */
4141	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4142	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
4143	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4144	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
4145	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4146	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
4147	/* Analog input/passthru */
4148	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4149	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4150	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4151	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4152	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4153	{ }
4154};
4155#endif
4156
4157/*
4158 */
4159
4160static const char *alc880_models[ALC880_MODEL_LAST] = {
4161	[ALC880_3ST]		= "3stack",
4162	[ALC880_TCL_S700]	= "tcl",
4163	[ALC880_3ST_DIG]	= "3stack-digout",
4164	[ALC880_CLEVO]		= "clevo",
4165	[ALC880_5ST]		= "5stack",
4166	[ALC880_5ST_DIG]	= "5stack-digout",
4167	[ALC880_W810]		= "w810",
4168	[ALC880_Z71V]		= "z71v",
4169	[ALC880_6ST]		= "6stack",
4170	[ALC880_6ST_DIG]	= "6stack-digout",
4171	[ALC880_ASUS]		= "asus",
4172	[ALC880_ASUS_W1V]	= "asus-w1v",
4173	[ALC880_ASUS_DIG]	= "asus-dig",
4174	[ALC880_ASUS_DIG2]	= "asus-dig2",
4175	[ALC880_UNIWILL_DIG]	= "uniwill",
4176	[ALC880_UNIWILL_P53]	= "uniwill-p53",
4177	[ALC880_FUJITSU]	= "fujitsu",
4178	[ALC880_F1734]		= "F1734",
4179	[ALC880_LG]		= "lg",
4180	[ALC880_LG_LW]		= "lg-lw",
4181	[ALC880_MEDION_RIM]	= "medion",
4182#ifdef CONFIG_SND_DEBUG
4183	[ALC880_TEST]		= "test",
4184#endif
4185	[ALC880_AUTO]		= "auto",
4186};
4187
4188static struct snd_pci_quirk alc880_cfg_tbl[] = {
4189	SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
4190	SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
4191	SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
4192	SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
4193	SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
4194	SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
4195	SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
4196	SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
4197	SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
4198	SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
4199	SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
4200	SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
4201	SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
4202	SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
4203	SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
4204	SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
4205	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
4206	SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
4207	/* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
4208	SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
4209	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
4210	SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
4211	SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
4212	SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
4213	SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
4214	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
4215	SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
4216	SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
4217	SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
4218	SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
4219	SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
4220	SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
4221	SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
4222	SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
4223	SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
4224	SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
4225	SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
4226	SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
4227	SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
4228	SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
4229	SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
4230	SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
4231	SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
4232	SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
4233	SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
4234	SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
4235	SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
4236	SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
4237	SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
4238	SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_F1734),
4239	SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
4240	SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
4241	SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
4242	SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
4243	SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
4244	SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
4245	SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
4246	SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
4247	SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
4248	SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
4249	SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
4250	SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
4251	SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
4252	SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
4253	SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
4254	SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
4255	SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
4256	SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
4257	/* default Intel */
4258	SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
4259	SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
4260	SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
4261	{}
4262};
4263
4264/*
4265 * ALC880 codec presets
4266 */
4267static struct alc_config_preset alc880_presets[] = {
4268	[ALC880_3ST] = {
4269		.mixers = { alc880_three_stack_mixer },
4270		.init_verbs = { alc880_volume_init_verbs,
4271				alc880_pin_3stack_init_verbs },
4272		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4273		.dac_nids = alc880_dac_nids,
4274		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4275		.channel_mode = alc880_threestack_modes,
4276		.need_dac_fix = 1,
4277		.input_mux = &alc880_capture_source,
4278	},
4279	[ALC880_3ST_DIG] = {
4280		.mixers = { alc880_three_stack_mixer },
4281		.init_verbs = { alc880_volume_init_verbs,
4282				alc880_pin_3stack_init_verbs },
4283		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4284		.dac_nids = alc880_dac_nids,
4285		.dig_out_nid = ALC880_DIGOUT_NID,
4286		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4287		.channel_mode = alc880_threestack_modes,
4288		.need_dac_fix = 1,
4289		.input_mux = &alc880_capture_source,
4290	},
4291	[ALC880_TCL_S700] = {
4292		.mixers = { alc880_tcl_s700_mixer },
4293		.init_verbs = { alc880_volume_init_verbs,
4294				alc880_pin_tcl_S700_init_verbs,
4295				alc880_gpio2_init_verbs },
4296		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4297		.dac_nids = alc880_dac_nids,
4298		.adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4299		.num_adc_nids = 1, /* single ADC */
4300		.hp_nid = 0x03,
4301		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4302		.channel_mode = alc880_2_jack_modes,
4303		.input_mux = &alc880_capture_source,
4304	},
4305	[ALC880_5ST] = {
4306		.mixers = { alc880_three_stack_mixer,
4307			    alc880_five_stack_mixer},
4308		.init_verbs = { alc880_volume_init_verbs,
4309				alc880_pin_5stack_init_verbs },
4310		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4311		.dac_nids = alc880_dac_nids,
4312		.num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4313		.channel_mode = alc880_fivestack_modes,
4314		.input_mux = &alc880_capture_source,
4315	},
4316	[ALC880_5ST_DIG] = {
4317		.mixers = { alc880_three_stack_mixer,
4318			    alc880_five_stack_mixer },
4319		.init_verbs = { alc880_volume_init_verbs,
4320				alc880_pin_5stack_init_verbs },
4321		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4322		.dac_nids = alc880_dac_nids,
4323		.dig_out_nid = ALC880_DIGOUT_NID,
4324		.num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4325		.channel_mode = alc880_fivestack_modes,
4326		.input_mux = &alc880_capture_source,
4327	},
4328	[ALC880_6ST] = {
4329		.mixers = { alc880_six_stack_mixer },
4330		.init_verbs = { alc880_volume_init_verbs,
4331				alc880_pin_6stack_init_verbs },
4332		.num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4333		.dac_nids = alc880_6st_dac_nids,
4334		.num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4335		.channel_mode = alc880_sixstack_modes,
4336		.input_mux = &alc880_6stack_capture_source,
4337	},
4338	[ALC880_6ST_DIG] = {
4339		.mixers = { alc880_six_stack_mixer },
4340		.init_verbs = { alc880_volume_init_verbs,
4341				alc880_pin_6stack_init_verbs },
4342		.num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4343		.dac_nids = alc880_6st_dac_nids,
4344		.dig_out_nid = ALC880_DIGOUT_NID,
4345		.num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4346		.channel_mode = alc880_sixstack_modes,
4347		.input_mux = &alc880_6stack_capture_source,
4348	},
4349	[ALC880_W810] = {
4350		.mixers = { alc880_w810_base_mixer },
4351		.init_verbs = { alc880_volume_init_verbs,
4352				alc880_pin_w810_init_verbs,
4353				alc880_gpio2_init_verbs },
4354		.num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4355		.dac_nids = alc880_w810_dac_nids,
4356		.dig_out_nid = ALC880_DIGOUT_NID,
4357		.num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4358		.channel_mode = alc880_w810_modes,
4359		.input_mux = &alc880_capture_source,
4360	},
4361	[ALC880_Z71V] = {
4362		.mixers = { alc880_z71v_mixer },
4363		.init_verbs = { alc880_volume_init_verbs,
4364				alc880_pin_z71v_init_verbs },
4365		.num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4366		.dac_nids = alc880_z71v_dac_nids,
4367		.dig_out_nid = ALC880_DIGOUT_NID,
4368		.hp_nid = 0x03,
4369		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4370		.channel_mode = alc880_2_jack_modes,
4371		.input_mux = &alc880_capture_source,
4372	},
4373	[ALC880_F1734] = {
4374		.mixers = { alc880_f1734_mixer },
4375		.init_verbs = { alc880_volume_init_verbs,
4376				alc880_pin_f1734_init_verbs },
4377		.num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4378		.dac_nids = alc880_f1734_dac_nids,
4379		.hp_nid = 0x02,
4380		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4381		.channel_mode = alc880_2_jack_modes,
4382		.input_mux = &alc880_f1734_capture_source,
4383		.unsol_event = alc880_uniwill_p53_unsol_event,
4384		.setup = alc880_uniwill_p53_setup,
4385		.init_hook = alc_automute_amp,
4386	},
4387	[ALC880_ASUS] = {
4388		.mixers = { alc880_asus_mixer },
4389		.init_verbs = { alc880_volume_init_verbs,
4390				alc880_pin_asus_init_verbs,
4391				alc880_gpio1_init_verbs },
4392		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4393		.dac_nids = alc880_asus_dac_nids,
4394		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4395		.channel_mode = alc880_asus_modes,
4396		.need_dac_fix = 1,
4397		.input_mux = &alc880_capture_source,
4398	},
4399	[ALC880_ASUS_DIG] = {
4400		.mixers = { alc880_asus_mixer },
4401		.init_verbs = { alc880_volume_init_verbs,
4402				alc880_pin_asus_init_verbs,
4403				alc880_gpio1_init_verbs },
4404		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4405		.dac_nids = alc880_asus_dac_nids,
4406		.dig_out_nid = ALC880_DIGOUT_NID,
4407		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4408		.channel_mode = alc880_asus_modes,
4409		.need_dac_fix = 1,
4410		.input_mux = &alc880_capture_source,
4411	},
4412	[ALC880_ASUS_DIG2] = {
4413		.mixers = { alc880_asus_mixer },
4414		.init_verbs = { alc880_volume_init_verbs,
4415				alc880_pin_asus_init_verbs,
4416				alc880_gpio2_init_verbs }, /* use GPIO2 */
4417		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4418		.dac_nids = alc880_asus_dac_nids,
4419		.dig_out_nid = ALC880_DIGOUT_NID,
4420		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4421		.channel_mode = alc880_asus_modes,
4422		.need_dac_fix = 1,
4423		.input_mux = &alc880_capture_source,
4424	},
4425	[ALC880_ASUS_W1V] = {
4426		.mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
4427		.init_verbs = { alc880_volume_init_verbs,
4428				alc880_pin_asus_init_verbs,
4429				alc880_gpio1_init_verbs },
4430		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4431		.dac_nids = alc880_asus_dac_nids,
4432		.dig_out_nid = ALC880_DIGOUT_NID,
4433		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4434		.channel_mode = alc880_asus_modes,
4435		.need_dac_fix = 1,
4436		.input_mux = &alc880_capture_source,
4437	},
4438	[ALC880_UNIWILL_DIG] = {
4439		.mixers = { alc880_asus_mixer },
4440		.init_verbs = { alc880_volume_init_verbs,
4441				alc880_pin_asus_init_verbs },
4442		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4443		.dac_nids = alc880_asus_dac_nids,
4444		.dig_out_nid = ALC880_DIGOUT_NID,
4445		.num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4446		.channel_mode = alc880_asus_modes,
4447		.need_dac_fix = 1,
4448		.input_mux = &alc880_capture_source,
4449	},
4450	[ALC880_UNIWILL] = {
4451		.mixers = { alc880_uniwill_mixer },
4452		.init_verbs = { alc880_volume_init_verbs,
4453				alc880_uniwill_init_verbs },
4454		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4455		.dac_nids = alc880_asus_dac_nids,
4456		.dig_out_nid = ALC880_DIGOUT_NID,
4457		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4458		.channel_mode = alc880_threestack_modes,
4459		.need_dac_fix = 1,
4460		.input_mux = &alc880_capture_source,
4461		.unsol_event = alc880_uniwill_unsol_event,
4462		.setup = alc880_uniwill_setup,
4463		.init_hook = alc880_uniwill_init_hook,
4464	},
4465	[ALC880_UNIWILL_P53] = {
4466		.mixers = { alc880_uniwill_p53_mixer },
4467		.init_verbs = { alc880_volume_init_verbs,
4468				alc880_uniwill_p53_init_verbs },
4469		.num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4470		.dac_nids = alc880_asus_dac_nids,
4471		.num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4472		.channel_mode = alc880_threestack_modes,
4473		.input_mux = &alc880_capture_source,
4474		.unsol_event = alc880_uniwill_p53_unsol_event,
4475		.setup = alc880_uniwill_p53_setup,
4476		.init_hook = alc_automute_amp,
4477	},
4478	[ALC880_FUJITSU] = {
4479		.mixers = { alc880_fujitsu_mixer },
4480		.init_verbs = { alc880_volume_init_verbs,
4481				alc880_uniwill_p53_init_verbs,
4482	       			alc880_beep_init_verbs },
4483		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4484		.dac_nids = alc880_dac_nids,
4485		.dig_out_nid = ALC880_DIGOUT_NID,
4486		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4487		.channel_mode = alc880_2_jack_modes,
4488		.input_mux = &alc880_capture_source,
4489		.unsol_event = alc880_uniwill_p53_unsol_event,
4490		.setup = alc880_uniwill_p53_setup,
4491		.init_hook = alc_automute_amp,
4492	},
4493	[ALC880_CLEVO] = {
4494		.mixers = { alc880_three_stack_mixer },
4495		.init_verbs = { alc880_volume_init_verbs,
4496				alc880_pin_clevo_init_verbs },
4497		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4498		.dac_nids = alc880_dac_nids,
4499		.hp_nid = 0x03,
4500		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4501		.channel_mode = alc880_threestack_modes,
4502		.need_dac_fix = 1,
4503		.input_mux = &alc880_capture_source,
4504	},
4505	[ALC880_LG] = {
4506		.mixers = { alc880_lg_mixer },
4507		.init_verbs = { alc880_volume_init_verbs,
4508				alc880_lg_init_verbs },
4509		.num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4510		.dac_nids = alc880_lg_dac_nids,
4511		.dig_out_nid = ALC880_DIGOUT_NID,
4512		.num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4513		.channel_mode = alc880_lg_ch_modes,
4514		.need_dac_fix = 1,
4515		.input_mux = &alc880_lg_capture_source,
4516		.unsol_event = alc_automute_amp_unsol_event,
4517		.setup = alc880_lg_setup,
4518		.init_hook = alc_automute_amp,
4519#ifdef CONFIG_SND_HDA_POWER_SAVE
4520		.loopbacks = alc880_lg_loopbacks,
4521#endif
4522	},
4523	[ALC880_LG_LW] = {
4524		.mixers = { alc880_lg_lw_mixer },
4525		.init_verbs = { alc880_volume_init_verbs,
4526				alc880_lg_lw_init_verbs },
4527		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4528		.dac_nids = alc880_dac_nids,
4529		.dig_out_nid = ALC880_DIGOUT_NID,
4530		.num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4531		.channel_mode = alc880_lg_lw_modes,
4532		.input_mux = &alc880_lg_lw_capture_source,
4533		.unsol_event = alc_automute_amp_unsol_event,
4534		.setup = alc880_lg_lw_setup,
4535		.init_hook = alc_automute_amp,
4536	},
4537	[ALC880_MEDION_RIM] = {
4538		.mixers = { alc880_medion_rim_mixer },
4539		.init_verbs = { alc880_volume_init_verbs,
4540				alc880_medion_rim_init_verbs,
4541				alc_gpio2_init_verbs },
4542		.num_dacs = ARRAY_SIZE(alc880_dac_nids),
4543		.dac_nids = alc880_dac_nids,
4544		.dig_out_nid = ALC880_DIGOUT_NID,
4545		.num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4546		.channel_mode = alc880_2_jack_modes,
4547		.input_mux = &alc880_medion_rim_capture_source,
4548		.unsol_event = alc880_medion_rim_unsol_event,
4549		.setup = alc880_medion_rim_setup,
4550		.init_hook = alc880_medion_rim_automute,
4551	},
4552#ifdef CONFIG_SND_DEBUG
4553	[ALC880_TEST] = {
4554		.mixers = { alc880_test_mixer },
4555		.init_verbs = { alc880_test_init_verbs },
4556		.num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4557		.dac_nids = alc880_test_dac_nids,
4558		.dig_out_nid = ALC880_DIGOUT_NID,
4559		.num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4560		.channel_mode = alc880_test_modes,
4561		.input_mux = &alc880_test_capture_source,
4562	},
4563#endif
4564};
4565
4566/*
4567 * Automatic parse of I/O pins from the BIOS configuration
4568 */
4569
4570enum {
4571	ALC_CTL_WIDGET_VOL,
4572	ALC_CTL_WIDGET_MUTE,
4573	ALC_CTL_BIND_MUTE,
4574};
4575static struct snd_kcontrol_new alc880_control_templates[] = {
4576	HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4577	HDA_CODEC_MUTE(NULL, 0, 0, 0),
4578	HDA_BIND_MUTE(NULL, 0, 0, 0),
4579};
4580
4581/* add dynamic controls */
4582static int add_control(struct alc_spec *spec, int type, const char *name,
4583		       unsigned long val)
4584{
4585	struct snd_kcontrol_new *knew;
4586
4587	snd_array_init(&spec->kctls, sizeof(*knew), 32);
4588	knew = snd_array_new(&spec->kctls);
4589	if (!knew)
4590		return -ENOMEM;
4591	*knew = alc880_control_templates[type];
4592	knew->name = kstrdup(name, GFP_KERNEL);
4593	if (!knew->name)
4594		return -ENOMEM;
4595	if (get_amp_nid_(val))
4596		knew->subdevice = HDA_SUBDEV_AMP_FLAG;
4597	knew->private_value = val;
4598	return 0;
4599}
4600
4601static int add_control_with_pfx(struct alc_spec *spec, int type,
4602				const char *pfx, const char *dir,
4603				const char *sfx, unsigned long val)
4604{
4605	char name[32];
4606	snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
4607	return add_control(spec, type, name, val);
4608}
4609
4610#define add_pb_vol_ctrl(spec, type, pfx, val) \
4611	add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val)
4612#define add_pb_sw_ctrl(spec, type, pfx, val) \
4613	add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val)
4614
4615#define alc880_is_fixed_pin(nid)	((nid) >= 0x14 && (nid) <= 0x17)
4616#define alc880_fixed_pin_idx(nid)	((nid) - 0x14)
4617#define alc880_is_multi_pin(nid)	((nid) >= 0x18)
4618#define alc880_multi_pin_idx(nid)	((nid) - 0x18)
4619#define alc880_idx_to_dac(nid)		((nid) + 0x02)
4620#define alc880_dac_to_idx(nid)		((nid) - 0x02)
4621#define alc880_idx_to_mixer(nid)	((nid) + 0x0c)
4622#define alc880_idx_to_selector(nid)	((nid) + 0x10)
4623#define ALC880_PIN_CD_NID		0x1c
4624
4625/* fill in the dac_nids table from the parsed pin configuration */
4626static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4627				     const struct auto_pin_cfg *cfg)
4628{
4629	hda_nid_t nid;
4630	int assigned[4];
4631	int i, j;
4632
4633	memset(assigned, 0, sizeof(assigned));
4634	spec->multiout.dac_nids = spec->private_dac_nids;
4635
4636	/* check the pins hardwired to audio widget */
4637	for (i = 0; i < cfg->line_outs; i++) {
4638		nid = cfg->line_out_pins[i];
4639		if (alc880_is_fixed_pin(nid)) {
4640			int idx = alc880_fixed_pin_idx(nid);
4641			spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
4642			assigned[idx] = 1;
4643		}
4644	}
4645	/* left pins can be connect to any audio widget */
4646	for (i = 0; i < cfg->line_outs; i++) {
4647		nid = cfg->line_out_pins[i];
4648		if (alc880_is_fixed_pin(nid))
4649			continue;
4650		/* search for an empty channel */
4651		for (j = 0; j < cfg->line_outs; j++) {
4652			if (!assigned[j]) {
4653				spec->multiout.dac_nids[i] =
4654					alc880_idx_to_dac(j);
4655				assigned[j] = 1;
4656				break;
4657			}
4658		}
4659	}
4660	spec->multiout.num_dacs = cfg->line_outs;
4661	return 0;
4662}
4663
4664/* add playback controls from the parsed DAC table */
4665static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4666					     const struct auto_pin_cfg *cfg)
4667{
4668	static const char *chname[4] = {
4669		"Front", "Surround", NULL /*CLFE*/, "Side"
4670	};
4671	hda_nid_t nid;
4672	int i, err;
4673
4674	for (i = 0; i < cfg->line_outs; i++) {
4675		if (!spec->multiout.dac_nids[i])
4676			continue;
4677		nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4678		if (i == 2) {
4679			/* Center/LFE */
4680			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4681					      "Center",
4682					  HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4683							      HDA_OUTPUT));
4684			if (err < 0)
4685				return err;
4686			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4687					      "LFE",
4688					  HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4689							      HDA_OUTPUT));
4690			if (err < 0)
4691				return err;
4692			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4693					     "Center",
4694					  HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4695							      HDA_INPUT));
4696			if (err < 0)
4697				return err;
4698			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4699					     "LFE",
4700					  HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4701							      HDA_INPUT));
4702			if (err < 0)
4703				return err;
4704		} else {
4705			const char *pfx;
4706			if (cfg->line_outs == 1 &&
4707			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4708				pfx = "Speaker";
4709			else
4710				pfx = chname[i];
4711			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4712					  HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4713							      HDA_OUTPUT));
4714			if (err < 0)
4715				return err;
4716			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4717					  HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4718							      HDA_INPUT));
4719			if (err < 0)
4720				return err;
4721		}
4722	}
4723	return 0;
4724}
4725
4726/* add playback controls for speaker and HP outputs */
4727static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4728					const char *pfx)
4729{
4730	hda_nid_t nid;
4731	int err;
4732
4733	if (!pin)
4734		return 0;
4735
4736	if (alc880_is_fixed_pin(pin)) {
4737		nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
4738		/* specify the DAC as the extra output */
4739		if (!spec->multiout.hp_nid)
4740			spec->multiout.hp_nid = nid;
4741		else
4742			spec->multiout.extra_out_nid[0] = nid;
4743		/* control HP volume/switch on the output mixer amp */
4744		nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
4745		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4746				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4747		if (err < 0)
4748			return err;
4749		err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4750				  HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4751		if (err < 0)
4752			return err;
4753	} else if (alc880_is_multi_pin(pin)) {
4754		/* set manual connection */
4755		/* we have only a switch on HP-out PIN */
4756		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
4757				  HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4758		if (err < 0)
4759			return err;
4760	}
4761	return 0;
4762}
4763
4764/* create input playback/capture controls for the given pin */
4765static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4766			    const char *ctlname,
4767			    int idx, hda_nid_t mix_nid)
4768{
4769	int err;
4770
4771	err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
4772			  HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4773	if (err < 0)
4774		return err;
4775	err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
4776			  HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4777	if (err < 0)
4778		return err;
4779	return 0;
4780}
4781
4782static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4783{
4784	unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4785	return (pincap & AC_PINCAP_IN) != 0;
4786}
4787
4788/* create playback/capture controls for input pins */
4789static int alc_auto_create_input_ctls(struct hda_codec *codec,
4790				      const struct auto_pin_cfg *cfg,
4791				      hda_nid_t mixer,
4792				      hda_nid_t cap1, hda_nid_t cap2)
4793{
4794	struct alc_spec *spec = codec->spec;
4795	struct hda_input_mux *imux = &spec->private_imux[0];
4796	int i, err, idx;
4797
4798	for (i = 0; i < AUTO_PIN_LAST; i++) {
4799		hda_nid_t pin;
4800
4801		pin = cfg->input_pins[i];
4802		if (!alc_is_input_pin(codec, pin))
4803			continue;
4804
4805		if (mixer) {
4806			idx = get_connection_index(codec, mixer, pin);
4807			if (idx >= 0) {
4808				err = new_analog_input(spec, pin,
4809						       auto_pin_cfg_labels[i],
4810						       idx, mixer);
4811				if (err < 0)
4812					return err;
4813			}
4814		}
4815
4816		if (!cap1)
4817			continue;
4818		idx = get_connection_index(codec, cap1, pin);
4819		if (idx < 0 && cap2)
4820			idx = get_connection_index(codec, cap2, pin);
4821		if (idx >= 0) {
4822			imux->items[imux->num_items].label =
4823				auto_pin_cfg_labels[i];
4824			imux->items[imux->num_items].index = idx;
4825			imux->num_items++;
4826		}
4827	}
4828	return 0;
4829}
4830
4831static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4832						const struct auto_pin_cfg *cfg)
4833{
4834	return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4835}
4836
4837static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4838			       unsigned int pin_type)
4839{
4840	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4841			    pin_type);
4842	/* unmute pin */
4843	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4844			    AMP_OUT_UNMUTE);
4845}
4846
4847static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4848					      hda_nid_t nid, int pin_type,
4849					      int dac_idx)
4850{
4851	alc_set_pin_output(codec, nid, pin_type);
4852	/* need the manual connection? */
4853	if (alc880_is_multi_pin(nid)) {
4854		struct alc_spec *spec = codec->spec;
4855		int idx = alc880_multi_pin_idx(nid);
4856		snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4857				    AC_VERB_SET_CONNECT_SEL,
4858				    alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
4859	}
4860}
4861
4862static int get_pin_type(int line_out_type)
4863{
4864	if (line_out_type == AUTO_PIN_HP_OUT)
4865		return PIN_HP;
4866	else
4867		return PIN_OUT;
4868}
4869
4870static void alc880_auto_init_multi_out(struct hda_codec *codec)
4871{
4872	struct alc_spec *spec = codec->spec;
4873	int i;
4874
4875	for (i = 0; i < spec->autocfg.line_outs; i++) {
4876		hda_nid_t nid = spec->autocfg.line_out_pins[i];
4877		int pin_type = get_pin_type(spec->autocfg.line_out_type);
4878		alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
4879	}
4880}
4881
4882static void alc880_auto_init_extra_out(struct hda_codec *codec)
4883{
4884	struct alc_spec *spec = codec->spec;
4885	hda_nid_t pin;
4886
4887	pin = spec->autocfg.speaker_pins[0];
4888	if (pin) /* connect to front */
4889		alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
4890	pin = spec->autocfg.hp_pins[0];
4891	if (pin) /* connect to front */
4892		alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
4893}
4894
4895static void alc880_auto_init_analog_input(struct hda_codec *codec)
4896{
4897	struct alc_spec *spec = codec->spec;
4898	int i;
4899
4900	for (i = 0; i < AUTO_PIN_LAST; i++) {
4901		hda_nid_t nid = spec->autocfg.input_pins[i];
4902		if (alc_is_input_pin(codec, nid)) {
4903			alc_set_input_pin(codec, nid, i);
4904			if (nid != ALC880_PIN_CD_NID &&
4905			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
4906				snd_hda_codec_write(codec, nid, 0,
4907						    AC_VERB_SET_AMP_GAIN_MUTE,
4908						    AMP_OUT_MUTE);
4909		}
4910	}
4911}
4912
4913static void alc880_auto_init_input_src(struct hda_codec *codec)
4914{
4915	struct alc_spec *spec = codec->spec;
4916	int c;
4917
4918	for (c = 0; c < spec->num_adc_nids; c++) {
4919		unsigned int mux_idx;
4920		const struct hda_input_mux *imux;
4921		mux_idx = c >= spec->num_mux_defs ? 0 : c;
4922		imux = &spec->input_mux[mux_idx];
4923		if (!imux->num_items && mux_idx > 0)
4924			imux = &spec->input_mux[0];
4925		if (imux)
4926			snd_hda_codec_write(codec, spec->adc_nids[c], 0,
4927					    AC_VERB_SET_CONNECT_SEL,
4928					    imux->items[0].index);
4929	}
4930}
4931
4932/* parse the BIOS configuration and set up the alc_spec */
4933/* return 1 if successful, 0 if the proper config is not found,
4934 * or a negative error code
4935 */
4936static int alc880_parse_auto_config(struct hda_codec *codec)
4937{
4938	struct alc_spec *spec = codec->spec;
4939	int i, err;
4940	static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
4941
4942	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4943					   alc880_ignore);
4944	if (err < 0)
4945		return err;
4946	if (!spec->autocfg.line_outs)
4947		return 0; /* can't find valid BIOS pin config */
4948
4949	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
4950	if (err < 0)
4951		return err;
4952	err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
4953	if (err < 0)
4954		return err;
4955	err = alc880_auto_create_extra_out(spec,
4956					   spec->autocfg.speaker_pins[0],
4957					   "Speaker");
4958	if (err < 0)
4959		return err;
4960	err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
4961					   "Headphone");
4962	if (err < 0)
4963		return err;
4964	err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
4965	if (err < 0)
4966		return err;
4967
4968	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4969
4970	/* check multiple SPDIF-out (for recent codecs) */
4971	for (i = 0; i < spec->autocfg.dig_outs; i++) {
4972		hda_nid_t dig_nid;
4973		err = snd_hda_get_connections(codec,
4974					      spec->autocfg.dig_out_pins[i],
4975					      &dig_nid, 1);
4976		if (err < 0)
4977			continue;
4978		if (!i)
4979			spec->multiout.dig_out_nid = dig_nid;
4980		else {
4981			spec->multiout.slave_dig_outs = spec->slave_dig_outs;
4982			if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
4983				break;
4984			spec->slave_dig_outs[i - 1] = dig_nid;
4985		}
4986	}
4987	if (spec->autocfg.dig_in_pin)
4988		spec->dig_in_nid = ALC880_DIGIN_NID;
4989
4990	if (spec->kctls.list)
4991		add_mixer(spec, spec->kctls.list);
4992
4993	add_verb(spec, alc880_volume_init_verbs);
4994
4995	spec->num_mux_defs = 1;
4996	spec->input_mux = &spec->private_imux[0];
4997
4998	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4999
5000	return 1;
5001}
5002
5003/* additional initialization for auto-configuration model */
5004static void alc880_auto_init(struct hda_codec *codec)
5005{
5006	struct alc_spec *spec = codec->spec;
5007	alc880_auto_init_multi_out(codec);
5008	alc880_auto_init_extra_out(codec);
5009	alc880_auto_init_analog_input(codec);
5010	alc880_auto_init_input_src(codec);
5011	if (spec->unsol_event)
5012		alc_inithook(codec);
5013}
5014
5015/* check the ADC/MUX contains all input pins; some ADC/MUX contains only
5016 * one of two digital mic pins, e.g. on ALC272
5017 */
5018static void fixup_automic_adc(struct hda_codec *codec)
5019{
5020	struct alc_spec *spec = codec->spec;
5021	int i;
5022
5023	for (i = 0; i < spec->num_adc_nids; i++) {
5024		hda_nid_t cap = spec->capsrc_nids ?
5025			spec->capsrc_nids[i] : spec->adc_nids[i];
5026		int iidx, eidx;
5027
5028		iidx = get_connection_index(codec, cap, spec->int_mic.pin);
5029		if (iidx < 0)
5030			continue;
5031		eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
5032		if (eidx < 0)
5033			continue;
5034		spec->int_mic.mux_idx = iidx;
5035		spec->ext_mic.mux_idx = eidx;
5036		if (spec->capsrc_nids)
5037			spec->capsrc_nids += i;
5038		spec->adc_nids += i;
5039		spec->num_adc_nids = 1;
5040		return;
5041	}
5042	snd_printd(KERN_INFO "hda_codec: %s: "
5043		   "No ADC/MUX containing both 0x%x and 0x%x pins\n",
5044		   codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
5045	spec->auto_mic = 0; /* disable auto-mic to be sure */
5046}
5047
5048/* choose the ADC/MUX containing the input pin and initialize the setup */
5049static void fixup_single_adc(struct hda_codec *codec)
5050{
5051	struct alc_spec *spec = codec->spec;
5052	hda_nid_t pin = 0;
5053	int i;
5054
5055	/* search for the input pin; there must be only one */
5056	for (i = 0; i < AUTO_PIN_LAST; i++) {
5057		if (spec->autocfg.input_pins[i]) {
5058			pin = spec->autocfg.input_pins[i];
5059			break;
5060		}
5061	}
5062	if (!pin)
5063		return;
5064
5065	/* set the default connection to that pin */
5066	for (i = 0; i < spec->num_adc_nids; i++) {
5067		hda_nid_t cap = spec->capsrc_nids ?
5068			spec->capsrc_nids[i] : spec->adc_nids[i];
5069		int idx;
5070
5071		idx = get_connection_index(codec, cap, pin);
5072		if (idx < 0)
5073			continue;
5074		/* use only this ADC */
5075		if (spec->capsrc_nids)
5076			spec->capsrc_nids += i;
5077		spec->adc_nids += i;
5078		spec->num_adc_nids = 1;
5079		/* select or unmute this route */
5080		if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
5081			snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
5082						 HDA_AMP_MUTE, 0);
5083		} else {
5084			snd_hda_codec_write_cache(codec, cap, 0,
5085					  AC_VERB_SET_CONNECT_SEL, idx);
5086		}
5087		return;
5088	}
5089}
5090
5091static void set_capture_mixer(struct hda_codec *codec)
5092{
5093	struct alc_spec *spec = codec->spec;
5094	static struct snd_kcontrol_new *caps[2][3] = {
5095		{ alc_capture_mixer_nosrc1,
5096		  alc_capture_mixer_nosrc2,
5097		  alc_capture_mixer_nosrc3 },
5098		{ alc_capture_mixer1,
5099		  alc_capture_mixer2,
5100		  alc_capture_mixer3 },
5101	};
5102	if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
5103		int mux = 0;
5104		if (spec->auto_mic)
5105			fixup_automic_adc(codec);
5106		else if (spec->input_mux) {
5107			if (spec->input_mux->num_items > 1)
5108				mux = 1;
5109			else if (spec->input_mux->num_items == 1)
5110				fixup_single_adc(codec);
5111		}
5112		spec->cap_mixer = caps[mux][spec->num_adc_nids - 1];
5113	}
5114}
5115
5116/* fill adc_nids (and capsrc_nids) containing all active input pins */
5117static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids,
5118				 int num_nids)
5119{
5120	struct alc_spec *spec = codec->spec;
5121	int n;
5122	hda_nid_t fallback_adc = 0, fallback_cap = 0;
5123
5124	for (n = 0; n < num_nids; n++) {
5125		hda_nid_t adc, cap;
5126		hda_nid_t conn[HDA_MAX_NUM_INPUTS];
5127		int nconns, i, j;
5128
5129		adc = nids[n];
5130		if (get_wcaps_type(get_wcaps(codec, adc)) != AC_WID_AUD_IN)
5131			continue;
5132		cap = adc;
5133		nconns = snd_hda_get_connections(codec, cap, conn,
5134						 ARRAY_SIZE(conn));
5135		if (nconns == 1) {
5136			cap = conn[0];
5137			nconns = snd_hda_get_connections(codec, cap, conn,
5138							 ARRAY_SIZE(conn));
5139		}
5140		if (nconns <= 0)
5141			continue;
5142		if (!fallback_adc) {
5143			fallback_adc = adc;
5144			fallback_cap = cap;
5145		}
5146		for (i = 0; i < AUTO_PIN_LAST; i++) {
5147			hda_nid_t nid = spec->autocfg.input_pins[i];
5148			if (!nid)
5149				continue;
5150			for (j = 0; j < nconns; j++) {
5151				if (conn[j] == nid)
5152					break;
5153			}
5154			if (j >= nconns)
5155				break;
5156		}
5157		if (i >= AUTO_PIN_LAST) {
5158			int num_adcs = spec->num_adc_nids;
5159			spec->private_adc_nids[num_adcs] = adc;
5160			spec->private_capsrc_nids[num_adcs] = cap;
5161			spec->num_adc_nids++;
5162			spec->adc_nids = spec->private_adc_nids;
5163			if (adc != cap)
5164				spec->capsrc_nids = spec->private_capsrc_nids;
5165		}
5166	}
5167	if (!spec->num_adc_nids) {
5168		printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
5169		       " using fallback 0x%x\n",
5170		       codec->chip_name, fallback_adc);
5171		spec->private_adc_nids[0] = fallback_adc;
5172		spec->adc_nids = spec->private_adc_nids;
5173		if (fallback_adc != fallback_cap) {
5174			spec->private_capsrc_nids[0] = fallback_cap;
5175			spec->capsrc_nids = spec->private_adc_nids;
5176		}
5177	}
5178}
5179
5180#ifdef CONFIG_SND_HDA_INPUT_BEEP
5181#define set_beep_amp(spec, nid, idx, dir) \
5182	((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
5183#else
5184#define set_beep_amp(spec, nid, idx, dir) /* NOP */
5185#endif
5186
5187/*
5188 * OK, here we have finally the patch for ALC880
5189 */
5190
5191static int patch_alc880(struct hda_codec *codec)
5192{
5193	struct alc_spec *spec;
5194	int board_config;
5195	int err;
5196
5197	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5198	if (spec == NULL)
5199		return -ENOMEM;
5200
5201	codec->spec = spec;
5202
5203	board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
5204						  alc880_models,
5205						  alc880_cfg_tbl);
5206	if (board_config < 0) {
5207		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5208		       codec->chip_name);
5209		board_config = ALC880_AUTO;
5210	}
5211
5212	if (board_config == ALC880_AUTO) {
5213		/* automatic parse from the BIOS config */
5214		err = alc880_parse_auto_config(codec);
5215		if (err < 0) {
5216			alc_free(codec);
5217			return err;
5218		} else if (!err) {
5219			printk(KERN_INFO
5220			       "hda_codec: Cannot set up configuration "
5221			       "from BIOS.  Using 3-stack mode...\n");
5222			board_config = ALC880_3ST;
5223		}
5224	}
5225
5226	err = snd_hda_attach_beep_device(codec, 0x1);
5227	if (err < 0) {
5228		alc_free(codec);
5229		return err;
5230	}
5231
5232	if (board_config != ALC880_AUTO)
5233		setup_preset(codec, &alc880_presets[board_config]);
5234
5235	spec->stream_analog_playback = &alc880_pcm_analog_playback;
5236	spec->stream_analog_capture = &alc880_pcm_analog_capture;
5237	spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
5238
5239	spec->stream_digital_playback = &alc880_pcm_digital_playback;
5240	spec->stream_digital_capture = &alc880_pcm_digital_capture;
5241
5242	if (!spec->adc_nids && spec->input_mux) {
5243		/* check whether NID 0x07 is valid */
5244		unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
5245		/* get type */
5246		wcap = get_wcaps_type(wcap);
5247		if (wcap != AC_WID_AUD_IN) {
5248			spec->adc_nids = alc880_adc_nids_alt;
5249			spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
5250		} else {
5251			spec->adc_nids = alc880_adc_nids;
5252			spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
5253		}
5254	}
5255	set_capture_mixer(codec);
5256	set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
5257
5258	spec->vmaster_nid = 0x0c;
5259
5260	codec->patch_ops = alc_patch_ops;
5261	if (board_config == ALC880_AUTO)
5262		spec->init_hook = alc880_auto_init;
5263#ifdef CONFIG_SND_HDA_POWER_SAVE
5264	if (!spec->loopback.amplist)
5265		spec->loopback.amplist = alc880_loopbacks;
5266#endif
5267
5268	return 0;
5269}
5270
5271
5272/*
5273 * ALC260 support
5274 */
5275
5276static hda_nid_t alc260_dac_nids[1] = {
5277	/* front */
5278	0x02,
5279};
5280
5281static hda_nid_t alc260_adc_nids[1] = {
5282	/* ADC0 */
5283	0x04,
5284};
5285
5286static hda_nid_t alc260_adc_nids_alt[1] = {
5287	/* ADC1 */
5288	0x05,
5289};
5290
5291/* NIDs used when simultaneous access to both ADCs makes sense.  Note that
5292 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
5293 */
5294static hda_nid_t alc260_dual_adc_nids[2] = {
5295	/* ADC0, ADC1 */
5296	0x04, 0x05
5297};
5298
5299#define ALC260_DIGOUT_NID	0x03
5300#define ALC260_DIGIN_NID	0x06
5301
5302static struct hda_input_mux alc260_capture_source = {
5303	.num_items = 4,
5304	.items = {
5305		{ "Mic", 0x0 },
5306		{ "Front Mic", 0x1 },
5307		{ "Line", 0x2 },
5308		{ "CD", 0x4 },
5309	},
5310};
5311
5312/* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
5313 * headphone jack and the internal CD lines since these are the only pins at
5314 * which audio can appear.  For flexibility, also allow the option of
5315 * recording the mixer output on the second ADC (ADC0 doesn't have a
5316 * connection to the mixer output).
5317 */
5318static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5319	{
5320		.num_items = 3,
5321		.items = {
5322			{ "Mic/Line", 0x0 },
5323			{ "CD", 0x4 },
5324			{ "Headphone", 0x2 },
5325		},
5326	},
5327	{
5328		.num_items = 4,
5329		.items = {
5330			{ "Mic/Line", 0x0 },
5331			{ "CD", 0x4 },
5332			{ "Headphone", 0x2 },
5333			{ "Mixer", 0x5 },
5334		},
5335	},
5336
5337};
5338
5339/* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5340 * the Fujitsu S702x, but jacks are marked differently.
5341 */
5342static struct hda_input_mux alc260_acer_capture_sources[2] = {
5343	{
5344		.num_items = 4,
5345		.items = {
5346			{ "Mic", 0x0 },
5347			{ "Line", 0x2 },
5348			{ "CD", 0x4 },
5349			{ "Headphone", 0x5 },
5350		},
5351	},
5352	{
5353		.num_items = 5,
5354		.items = {
5355			{ "Mic", 0x0 },
5356			{ "Line", 0x2 },
5357			{ "CD", 0x4 },
5358			{ "Headphone", 0x6 },
5359			{ "Mixer", 0x5 },
5360		},
5361	},
5362};
5363
5364/* Maxdata Favorit 100XS */
5365static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5366	{
5367		.num_items = 2,
5368		.items = {
5369			{ "Line/Mic", 0x0 },
5370			{ "CD", 0x4 },
5371		},
5372	},
5373	{
5374		.num_items = 3,
5375		.items = {
5376			{ "Line/Mic", 0x0 },
5377			{ "CD", 0x4 },
5378			{ "Mixer", 0x5 },
5379		},
5380	},
5381};
5382
5383/*
5384 * This is just place-holder, so there's something for alc_build_pcms to look
5385 * at when it calculates the maximum number of channels. ALC260 has no mixer
5386 * element which allows changing the channel mode, so the verb list is
5387 * never used.
5388 */
5389static struct hda_channel_mode alc260_modes[1] = {
5390	{ 2, NULL },
5391};
5392
5393
5394/* Mixer combinations
5395 *
5396 * basic: base_output + input + pc_beep + capture
5397 * HP: base_output + input + capture_alt
5398 * HP_3013: hp_3013 + input + capture
5399 * fujitsu: fujitsu + capture
5400 * acer: acer + capture
5401 */
5402
5403static struct snd_kcontrol_new alc260_base_output_mixer[] = {
5404	HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5405	HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5406	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5407	HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5408	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5409	HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5410	{ } /* end */
5411};
5412
5413static struct snd_kcontrol_new alc260_input_mixer[] = {
5414	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5415	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5416	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5417	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5418	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5419	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5420	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5421	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
5422	{ } /* end */
5423};
5424
5425/* update HP, line and mono out pins according to the master switch */
5426static void alc260_hp_master_update(struct hda_codec *codec,
5427				    hda_nid_t hp, hda_nid_t line,
5428				    hda_nid_t mono)
5429{
5430	struct alc_spec *spec = codec->spec;
5431	unsigned int val = spec->master_sw ? PIN_HP : 0;
5432	/* change HP and line-out pins */
5433	snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5434			    val);
5435	snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5436			    val);
5437	/* mono (speaker) depending on the HP jack sense */
5438	val = (val && !spec->jack_present) ? PIN_OUT : 0;
5439	snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5440			    val);
5441}
5442
5443static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5444				   struct snd_ctl_elem_value *ucontrol)
5445{
5446	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5447	struct alc_spec *spec = codec->spec;
5448	*ucontrol->value.integer.value = spec->master_sw;
5449	return 0;
5450}
5451
5452static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5453				   struct snd_ctl_elem_value *ucontrol)
5454{
5455	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5456	struct alc_spec *spec = codec->spec;
5457	int val = !!*ucontrol->value.integer.value;
5458	hda_nid_t hp, line, mono;
5459
5460	if (val == spec->master_sw)
5461		return 0;
5462	spec->master_sw = val;
5463	hp = (kcontrol->private_value >> 16) & 0xff;
5464	line = (kcontrol->private_value >> 8) & 0xff;
5465	mono = kcontrol->private_value & 0xff;
5466	alc260_hp_master_update(codec, hp, line, mono);
5467	return 1;
5468}
5469
5470static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5471	{
5472		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5473		.name = "Master Playback Switch",
5474		.subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5475		.info = snd_ctl_boolean_mono_info,
5476		.get = alc260_hp_master_sw_get,
5477		.put = alc260_hp_master_sw_put,
5478		.private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5479	},
5480	HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5481	HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5482	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5483	HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5484	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5485			      HDA_OUTPUT),
5486	HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5487	{ } /* end */
5488};
5489
5490static struct hda_verb alc260_hp_unsol_verbs[] = {
5491	{0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5492	{},
5493};
5494
5495static void alc260_hp_automute(struct hda_codec *codec)
5496{
5497	struct alc_spec *spec = codec->spec;
5498
5499	spec->jack_present = snd_hda_jack_detect(codec, 0x10);
5500	alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5501}
5502
5503static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5504{
5505	if ((res >> 26) == ALC880_HP_EVENT)
5506		alc260_hp_automute(codec);
5507}
5508
5509static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5510	{
5511		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5512		.name = "Master Playback Switch",
5513		.subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5514		.info = snd_ctl_boolean_mono_info,
5515		.get = alc260_hp_master_sw_get,
5516		.put = alc260_hp_master_sw_put,
5517		.private_value = (0x15 << 16) | (0x10 << 8) | 0x11
5518	},
5519	HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5520	HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5521	HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5522	HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5523	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5524	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
5525	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5526	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
5527	{ } /* end */
5528};
5529
5530static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5531	.ops = &snd_hda_bind_vol,
5532	.values = {
5533		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5534		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5535		HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5536		0
5537	},
5538};
5539
5540static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5541	.ops = &snd_hda_bind_sw,
5542	.values = {
5543		HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5544		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5545		0
5546	},
5547};
5548
5549static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5550	HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5551	HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5552	HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5553	HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5554	{ } /* end */
5555};
5556
5557static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5558	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5559	{},
5560};
5561
5562static void alc260_hp_3013_automute(struct hda_codec *codec)
5563{
5564	struct alc_spec *spec = codec->spec;
5565
5566	spec->jack_present = snd_hda_jack_detect(codec, 0x15);
5567	alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
5568}
5569
5570static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5571				       unsigned int res)
5572{
5573	if ((res >> 26) == ALC880_HP_EVENT)
5574		alc260_hp_3013_automute(codec);
5575}
5576
5577static void alc260_hp_3012_automute(struct hda_codec *codec)
5578{
5579	unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
5580
5581	snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5582			    bits);
5583	snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5584			    bits);
5585	snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5586			    bits);
5587}
5588
5589static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5590				       unsigned int res)
5591{
5592	if ((res >> 26) == ALC880_HP_EVENT)
5593		alc260_hp_3012_automute(codec);
5594}
5595
5596/* Fujitsu S702x series laptops.  ALC260 pin usage: Mic/Line jack = 0x12,
5597 * HP jack = 0x14, CD audio =  0x16, internal speaker = 0x10.
5598 */
5599static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
5600	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5601	HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
5602	ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5603	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5604	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5605	HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5606	HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
5607	ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
5608	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5609	HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
5610	{ } /* end */
5611};
5612
5613/* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks.  Note that current
5614 * versions of the ALC260 don't act on requests to enable mic bias from NID
5615 * 0x0f (used to drive the headphone jack in these laptops).  The ALC260
5616 * datasheet doesn't mention this restriction.  At this stage it's not clear
5617 * whether this behaviour is intentional or is a hardware bug in chip
5618 * revisions available in early 2006.  Therefore for now allow the
5619 * "Headphone Jack Mode" control to span all choices, but if it turns out
5620 * that the lack of mic bias for this NID is intentional we could change the
5621 * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5622 *
5623 * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5624 * don't appear to make the mic bias available from the "line" jack, even
5625 * though the NID used for this jack (0x14) can supply it.  The theory is
5626 * that perhaps Acer have included blocking capacitors between the ALC260
5627 * and the output jack.  If this turns out to be the case for all such
5628 * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5629 * to ALC_PIN_DIR_INOUT_NOMICBIAS.
5630 *
5631 * The C20x Tablet series have a mono internal speaker which is controlled
5632 * via the chip's Mono sum widget and pin complex, so include the necessary
5633 * controls for such models.  On models without a "mono speaker" the control
5634 * won't do anything.
5635 */
5636static struct snd_kcontrol_new alc260_acer_mixer[] = {
5637	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5638	HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5639	ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5640	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5641			      HDA_OUTPUT),
5642	HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
5643			   HDA_INPUT),
5644	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5645	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5646	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5647	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5648	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5649	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5650	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5651	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5652	{ } /* end */
5653};
5654
5655/* Maxdata Favorit 100XS: one output and one input (0x12) jack
5656 */
5657static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5658	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5659	HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5660	ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5661	HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5662	HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5663	ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5664	{ } /* end */
5665};
5666
5667/* Packard bell V7900  ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5668 * Line In jack = 0x14, CD audio =  0x16, pc beep = 0x17.
5669 */
5670static struct snd_kcontrol_new alc260_will_mixer[] = {
5671	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5672	HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5673	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5674	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5675	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5676	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5677	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5678	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5679	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5680	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5681	{ } /* end */
5682};
5683
5684/* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5685 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5686 */
5687static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5688	HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5689	HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5690	HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5691	HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5692	ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5693	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5694	HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5695	HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5696	HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5697	ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5698	{ } /* end */
5699};
5700
5701/*
5702 * initialization verbs
5703 */
5704static struct hda_verb alc260_init_verbs[] = {
5705	/* Line In pin widget for input */
5706	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5707	/* CD pin widget for input */
5708	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5709	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5710	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5711	/* Mic2 (front panel) pin widget for input and vref at 80% */
5712	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5713	/* LINE-2 is used for line-out in rear */
5714	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5715	/* select line-out */
5716	{0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
5717	/* LINE-OUT pin */
5718	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5719	/* enable HP */
5720	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5721	/* enable Mono */
5722	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5723	/* mute capture amp left and right */
5724	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5725	/* set connection select to line in (default select for this ADC) */
5726	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5727	/* mute capture amp left and right */
5728	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5729	/* set connection select to line in (default select for this ADC) */
5730	{0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
5731	/* set vol=0 Line-Out mixer amp left and right */
5732	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5733	/* unmute pin widget amp left and right (no gain on this amp) */
5734	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5735	/* set vol=0 HP mixer amp left and right */
5736	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5737	/* unmute pin widget amp left and right (no gain on this amp) */
5738	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5739	/* set vol=0 Mono mixer amp left and right */
5740	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5741	/* unmute pin widget amp left and right (no gain on this amp) */
5742	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5743	/* unmute LINE-2 out pin */
5744	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5745	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5746	 * Line In 2 = 0x03
5747	 */
5748	/* mute analog inputs */
5749	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5750	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5751	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5752	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5753	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5754	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5755	/* mute Front out path */
5756	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5757	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5758	/* mute Headphone out path */
5759	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5760	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5761	/* mute Mono out path */
5762	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5763	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5764	{ }
5765};
5766
5767#if 0 /* should be identical with alc260_init_verbs? */
5768static struct hda_verb alc260_hp_init_verbs[] = {
5769	/* Headphone and output */
5770	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5771	/* mono output */
5772	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5773	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5774	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5775	/* Mic2 (front panel) pin widget for input and vref at 80% */
5776	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5777	/* Line In pin widget for input */
5778	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5779	/* Line-2 pin widget for output */
5780	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5781	/* CD pin widget for input */
5782	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5783	/* unmute amp left and right */
5784	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5785	/* set connection select to line in (default select for this ADC) */
5786	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5787	/* unmute Line-Out mixer amp left and right (volume = 0) */
5788	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5789	/* mute pin widget amp left and right (no gain on this amp) */
5790	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5791	/* unmute HP mixer amp left and right (volume = 0) */
5792	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5793	/* mute pin widget amp left and right (no gain on this amp) */
5794	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5795	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5796	 * Line In 2 = 0x03
5797	 */
5798	/* mute analog inputs */
5799	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5800	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5801	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5802	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5803	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5804	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5805	/* Unmute Front out path */
5806	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5807	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5808	/* Unmute Headphone out path */
5809	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5810	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5811	/* Unmute Mono out path */
5812	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5813	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5814	{ }
5815};
5816#endif
5817
5818static struct hda_verb alc260_hp_3013_init_verbs[] = {
5819	/* Line out and output */
5820	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5821	/* mono output */
5822	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5823	/* Mic1 (rear panel) pin widget for input and vref at 80% */
5824	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5825	/* Mic2 (front panel) pin widget for input and vref at 80% */
5826	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5827	/* Line In pin widget for input */
5828	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5829	/* Headphone pin widget for output */
5830	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5831	/* CD pin widget for input */
5832	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5833	/* unmute amp left and right */
5834	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5835	/* set connection select to line in (default select for this ADC) */
5836	{0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5837	/* unmute Line-Out mixer amp left and right (volume = 0) */
5838	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5839	/* mute pin widget amp left and right (no gain on this amp) */
5840	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5841	/* unmute HP mixer amp left and right (volume = 0) */
5842	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5843	/* mute pin widget amp left and right (no gain on this amp) */
5844	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5845	/* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5846	 * Line In 2 = 0x03
5847	 */
5848	/* mute analog inputs */
5849	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5850	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5851	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5852	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5853	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5854	/* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5855	/* Unmute Front out path */
5856	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5857	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5858	/* Unmute Headphone out path */
5859	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5860	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5861	/* Unmute Mono out path */
5862	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5863	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5864	{ }
5865};
5866
5867/* Initialisation sequence for ALC260 as configured in Fujitsu S702x
5868 * laptops.  ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
5869 * audio = 0x16, internal speaker = 0x10.
5870 */
5871static struct hda_verb alc260_fujitsu_init_verbs[] = {
5872	/* Disable all GPIOs */
5873	{0x01, AC_VERB_SET_GPIO_MASK, 0},
5874	/* Internal speaker is connected to headphone pin */
5875	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5876	/* Headphone/Line-out jack connects to Line1 pin; make it an output */
5877	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5878	/* Mic/Line-in jack is connected to mic1 pin, so make it an input */
5879	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5880	/* Ensure all other unused pins are disabled and muted. */
5881	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5882	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5883	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5884	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5885	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5886	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5887	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5888	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5889
5890	/* Disable digital (SPDIF) pins */
5891	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5892	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5893
5894	/* Ensure Line1 pin widget takes its input from the OUT1 sum bus
5895	 * when acting as an output.
5896	 */
5897	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5898
5899	/* Start with output sum widgets muted and their output gains at min */
5900	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5901	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5902	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5903	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5904	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5905	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5906	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5907	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5908	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5909
5910	/* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
5911	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5912	/* Unmute Line1 pin widget output buffer since it starts as an output.
5913	 * If the pin mode is changed by the user the pin mode control will
5914	 * take care of enabling the pin's input/output buffers as needed.
5915	 * Therefore there's no need to enable the input buffer at this
5916	 * stage.
5917	 */
5918	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5919	/* Unmute input buffer of pin widget used for Line-in (no equiv
5920	 * mixer ctrl)
5921	 */
5922	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5923
5924	/* Mute capture amp left and right */
5925	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5926	/* Set ADC connection select to match default mixer setting - line
5927	 * in (on mic1 pin)
5928	 */
5929	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5930
5931	/* Do the same for the second ADC: mute capture input amp and
5932	 * set ADC connection to line in (on mic1 pin)
5933	 */
5934	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5935	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5936
5937	/* Mute all inputs to mixer widget (even unconnected ones) */
5938	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5939	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5940	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5941	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5942	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5943	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5944	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5945	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5946
5947	{ }
5948};
5949
5950/* Initialisation sequence for ALC260 as configured in Acer TravelMate and
5951 * similar laptops (adapted from Fujitsu init verbs).
5952 */
5953static struct hda_verb alc260_acer_init_verbs[] = {
5954	/* On TravelMate laptops, GPIO 0 enables the internal speaker and
5955	 * the headphone jack.  Turn this on and rely on the standard mute
5956	 * methods whenever the user wants to turn these outputs off.
5957	 */
5958	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5959	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5960	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5961	/* Internal speaker/Headphone jack is connected to Line-out pin */
5962	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5963	/* Internal microphone/Mic jack is connected to Mic1 pin */
5964	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5965	/* Line In jack is connected to Line1 pin */
5966	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5967	/* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
5968	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5969	/* Ensure all other unused pins are disabled and muted. */
5970	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5971	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5972	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5973	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5974	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5975	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5976	/* Disable digital (SPDIF) pins */
5977	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5978	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5979
5980	/* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5981	 * bus when acting as outputs.
5982	 */
5983	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5984	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5985
5986	/* Start with output sum widgets muted and their output gains at min */
5987	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5988	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5989	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5990	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5991	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5992	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5993	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5994	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5995	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5996
5997	/* Unmute Line-out pin widget amp left and right
5998	 * (no equiv mixer ctrl)
5999	 */
6000	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6001	/* Unmute mono pin widget amp output (no equiv mixer ctrl) */
6002	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6003	/* Unmute Mic1 and Line1 pin widget input buffers since they start as
6004	 * inputs. If the pin mode is changed by the user the pin mode control
6005	 * will take care of enabling the pin's input/output buffers as needed.
6006	 * Therefore there's no need to enable the input buffer at this
6007	 * stage.
6008	 */
6009	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6010	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6011
6012	/* Mute capture amp left and right */
6013	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6014	/* Set ADC connection select to match default mixer setting - mic
6015	 * (on mic1 pin)
6016	 */
6017	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6018
6019	/* Do similar with the second ADC: mute capture input amp and
6020	 * set ADC connection to mic to match ALSA's default state.
6021	 */
6022	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6023	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6024
6025	/* Mute all inputs to mixer widget (even unconnected ones) */
6026	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6027	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6028	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6029	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6030	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6031	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6032	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6033	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6034
6035	{ }
6036};
6037
6038/* Initialisation sequence for Maxdata Favorit 100XS
6039 * (adapted from Acer init verbs).
6040 */
6041static struct hda_verb alc260_favorit100_init_verbs[] = {
6042	/* GPIO 0 enables the output jack.
6043	 * Turn this on and rely on the standard mute
6044	 * methods whenever the user wants to turn these outputs off.
6045	 */
6046	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6047	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6048	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
6049	/* Line/Mic input jack is connected to Mic1 pin */
6050	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
6051	/* Ensure all other unused pins are disabled and muted. */
6052	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6053	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6054	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6055	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6056	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6057	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6058	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6059	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6060	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6061	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6062	/* Disable digital (SPDIF) pins */
6063	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6064	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6065
6066	/* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
6067	 * bus when acting as outputs.
6068	 */
6069	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6070	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6071
6072	/* Start with output sum widgets muted and their output gains at min */
6073	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6074	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6075	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6076	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6077	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6078	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6079	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6080	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6081	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6082
6083	/* Unmute Line-out pin widget amp left and right
6084	 * (no equiv mixer ctrl)
6085	 */
6086	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6087	/* Unmute Mic1 and Line1 pin widget input buffers since they start as
6088	 * inputs. If the pin mode is changed by the user the pin mode control
6089	 * will take care of enabling the pin's input/output buffers as needed.
6090	 * Therefore there's no need to enable the input buffer at this
6091	 * stage.
6092	 */
6093	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6094
6095	/* Mute capture amp left and right */
6096	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6097	/* Set ADC connection select to match default mixer setting - mic
6098	 * (on mic1 pin)
6099	 */
6100	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6101
6102	/* Do similar with the second ADC: mute capture input amp and
6103	 * set ADC connection to mic to match ALSA's default state.
6104	 */
6105	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6106	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6107
6108	/* Mute all inputs to mixer widget (even unconnected ones) */
6109	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6110	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6111	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6112	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6113	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6114	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6115	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6116	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6117
6118	{ }
6119};
6120
6121static struct hda_verb alc260_will_verbs[] = {
6122	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6123	{0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
6124	{0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
6125	{0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6126	{0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6127	{0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
6128	{}
6129};
6130
6131static struct hda_verb alc260_replacer_672v_verbs[] = {
6132	{0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6133	{0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6134	{0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
6135
6136	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6137	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6138	{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6139
6140	{0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6141	{}
6142};
6143
6144/* toggle speaker-output according to the hp-jack state */
6145static void alc260_replacer_672v_automute(struct hda_codec *codec)
6146{
6147        unsigned int present;
6148
6149	/* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
6150	present = snd_hda_jack_detect(codec, 0x0f);
6151	if (present) {
6152		snd_hda_codec_write_cache(codec, 0x01, 0,
6153					  AC_VERB_SET_GPIO_DATA, 1);
6154		snd_hda_codec_write_cache(codec, 0x0f, 0,
6155					  AC_VERB_SET_PIN_WIDGET_CONTROL,
6156					  PIN_HP);
6157	} else {
6158		snd_hda_codec_write_cache(codec, 0x01, 0,
6159					  AC_VERB_SET_GPIO_DATA, 0);
6160		snd_hda_codec_write_cache(codec, 0x0f, 0,
6161					  AC_VERB_SET_PIN_WIDGET_CONTROL,
6162					  PIN_OUT);
6163	}
6164}
6165
6166static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
6167                                       unsigned int res)
6168{
6169        if ((res >> 26) == ALC880_HP_EVENT)
6170                alc260_replacer_672v_automute(codec);
6171}
6172
6173static struct hda_verb alc260_hp_dc7600_verbs[] = {
6174	{0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
6175	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6176	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6177	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6178	{0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6179	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6180	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
6181	{0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6182	{0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6183	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6184	{}
6185};
6186
6187/* Test configuration for debugging, modelled after the ALC880 test
6188 * configuration.
6189 */
6190#ifdef CONFIG_SND_DEBUG
6191static hda_nid_t alc260_test_dac_nids[1] = {
6192	0x02,
6193};
6194static hda_nid_t alc260_test_adc_nids[2] = {
6195	0x04, 0x05,
6196};
6197/* For testing the ALC260, each input MUX needs its own definition since
6198 * the signal assignments are different.  This assumes that the first ADC
6199 * is NID 0x04.
6200 */
6201static struct hda_input_mux alc260_test_capture_sources[2] = {
6202	{
6203		.num_items = 7,
6204		.items = {
6205			{ "MIC1 pin", 0x0 },
6206			{ "MIC2 pin", 0x1 },
6207			{ "LINE1 pin", 0x2 },
6208			{ "LINE2 pin", 0x3 },
6209			{ "CD pin", 0x4 },
6210			{ "LINE-OUT pin", 0x5 },
6211			{ "HP-OUT pin", 0x6 },
6212		},
6213        },
6214	{
6215		.num_items = 8,
6216		.items = {
6217			{ "MIC1 pin", 0x0 },
6218			{ "MIC2 pin", 0x1 },
6219			{ "LINE1 pin", 0x2 },
6220			{ "LINE2 pin", 0x3 },
6221			{ "CD pin", 0x4 },
6222			{ "Mixer", 0x5 },
6223			{ "LINE-OUT pin", 0x6 },
6224			{ "HP-OUT pin", 0x7 },
6225		},
6226        },
6227};
6228static struct snd_kcontrol_new alc260_test_mixer[] = {
6229	/* Output driver widgets */
6230	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
6231	HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
6232	HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6233	HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
6234	HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6235	HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
6236
6237	/* Modes for retasking pin widgets
6238	 * Note: the ALC260 doesn't seem to act on requests to enable mic
6239         * bias from NIDs 0x0f and 0x10.  The ALC260 datasheet doesn't
6240         * mention this restriction.  At this stage it's not clear whether
6241         * this behaviour is intentional or is a hardware bug in chip
6242         * revisions available at least up until early 2006.  Therefore for
6243         * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
6244         * choices, but if it turns out that the lack of mic bias for these
6245         * NIDs is intentional we could change their modes from
6246         * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
6247	 */
6248	ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
6249	ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
6250	ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
6251	ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
6252	ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
6253	ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
6254
6255	/* Loopback mixer controls */
6256	HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
6257	HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
6258	HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
6259	HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
6260	HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
6261	HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
6262	HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
6263	HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
6264	HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6265	HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
6266	HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
6267	HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
6268	HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
6269	HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
6270
6271	/* Controls for GPIO pins, assuming they are configured as outputs */
6272	ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
6273	ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
6274	ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
6275	ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
6276
6277	/* Switches to allow the digital IO pins to be enabled.  The datasheet
6278	 * is ambigious as to which NID is which; testing on laptops which
6279	 * make this output available should provide clarification.
6280	 */
6281	ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
6282	ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
6283
6284	/* A switch allowing EAPD to be enabled.  Some laptops seem to use
6285	 * this output to turn on an external amplifier.
6286	 */
6287	ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
6288	ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
6289
6290	{ } /* end */
6291};
6292static struct hda_verb alc260_test_init_verbs[] = {
6293	/* Enable all GPIOs as outputs with an initial value of 0 */
6294	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
6295	{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6296	{0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
6297
6298	/* Enable retasking pins as output, initially without power amp */
6299	{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6300	{0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6301	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6302	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6303	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6304	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6305
6306	/* Disable digital (SPDIF) pins initially, but users can enable
6307	 * them via a mixer switch.  In the case of SPDIF-out, this initverb
6308	 * payload also sets the generation to 0, output to be in "consumer"
6309	 * PCM format, copyright asserted, no pre-emphasis and no validity
6310	 * control.
6311	 */
6312	{0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6313	{0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6314
6315	/* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
6316	 * OUT1 sum bus when acting as an output.
6317	 */
6318	{0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6319	{0x0c, AC_VERB_SET_CONNECT_SEL, 0},
6320	{0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6321	{0x0e, AC_VERB_SET_CONNECT_SEL, 0},
6322
6323	/* Start with output sum widgets muted and their output gains at min */
6324	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6325	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6326	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6327	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6328	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6329	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6330	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6331	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6332	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6333
6334	/* Unmute retasking pin widget output buffers since the default
6335	 * state appears to be output.  As the pin mode is changed by the
6336	 * user the pin mode control will take care of enabling the pin's
6337	 * input/output buffers as needed.
6338	 */
6339	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6340	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6341	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6342	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6343	{0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6344	{0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6345	/* Also unmute the mono-out pin widget */
6346	{0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6347
6348	/* Mute capture amp left and right */
6349	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6350	/* Set ADC connection select to match default mixer setting (mic1
6351	 * pin)
6352	 */
6353	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6354
6355	/* Do the same for the second ADC: mute capture input amp and
6356	 * set ADC connection to mic1 pin
6357	 */
6358	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6359	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6360
6361	/* Mute all inputs to mixer widget (even unconnected ones) */
6362	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6363	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6364	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6365	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6366	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6367	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6368	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6369	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6370
6371	{ }
6372};
6373#endif
6374
6375#define alc260_pcm_analog_playback	alc880_pcm_analog_alt_playback
6376#define alc260_pcm_analog_capture	alc880_pcm_analog_capture
6377
6378#define alc260_pcm_digital_playback	alc880_pcm_digital_playback
6379#define alc260_pcm_digital_capture	alc880_pcm_digital_capture
6380
6381/*
6382 * for BIOS auto-configuration
6383 */
6384
6385static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
6386					const char *pfx, int *vol_bits)
6387{
6388	hda_nid_t nid_vol;
6389	unsigned long vol_val, sw_val;
6390	int err;
6391
6392	if (nid >= 0x0f && nid < 0x11) {
6393		nid_vol = nid - 0x7;
6394		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6395		sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6396	} else if (nid == 0x11) {
6397		nid_vol = nid - 0x7;
6398		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6399		sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6400	} else if (nid >= 0x12 && nid <= 0x15) {
6401		nid_vol = 0x08;
6402		vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6403		sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6404	} else
6405		return 0; /* N/A */
6406
6407	if (!(*vol_bits & (1 << nid_vol))) {
6408		/* first control for the volume widget */
6409		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
6410		if (err < 0)
6411			return err;
6412		*vol_bits |= (1 << nid_vol);
6413	}
6414	err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
6415	if (err < 0)
6416		return err;
6417	return 1;
6418}
6419
6420/* add playback controls from the parsed DAC table */
6421static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6422					     const struct auto_pin_cfg *cfg)
6423{
6424	hda_nid_t nid;
6425	int err;
6426	int vols = 0;
6427
6428	spec->multiout.num_dacs = 1;
6429	spec->multiout.dac_nids = spec->private_dac_nids;
6430	spec->multiout.dac_nids[0] = 0x02;
6431
6432	nid = cfg->line_out_pins[0];
6433	if (nid) {
6434		const char *pfx;
6435		if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6436			pfx = "Master";
6437		else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6438			pfx = "Speaker";
6439		else
6440			pfx = "Front";
6441		err = alc260_add_playback_controls(spec, nid, pfx, &vols);
6442		if (err < 0)
6443			return err;
6444	}
6445
6446	nid = cfg->speaker_pins[0];
6447	if (nid) {
6448		err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
6449		if (err < 0)
6450			return err;
6451	}
6452
6453	nid = cfg->hp_pins[0];
6454	if (nid) {
6455		err = alc260_add_playback_controls(spec, nid, "Headphone",
6456						   &vols);
6457		if (err < 0)
6458			return err;
6459	}
6460	return 0;
6461}
6462
6463/* create playback/capture controls for input pins */
6464static int alc260_auto_create_input_ctls(struct hda_codec *codec,
6465						const struct auto_pin_cfg *cfg)
6466{
6467	return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
6468}
6469
6470static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6471					      hda_nid_t nid, int pin_type,
6472					      int sel_idx)
6473{
6474	alc_set_pin_output(codec, nid, pin_type);
6475	/* need the manual connection? */
6476	if (nid >= 0x12) {
6477		int idx = nid - 0x12;
6478		snd_hda_codec_write(codec, idx + 0x0b, 0,
6479				    AC_VERB_SET_CONNECT_SEL, sel_idx);
6480	}
6481}
6482
6483static void alc260_auto_init_multi_out(struct hda_codec *codec)
6484{
6485	struct alc_spec *spec = codec->spec;
6486	hda_nid_t nid;
6487
6488	nid = spec->autocfg.line_out_pins[0];
6489	if (nid) {
6490		int pin_type = get_pin_type(spec->autocfg.line_out_type);
6491		alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6492	}
6493
6494	nid = spec->autocfg.speaker_pins[0];
6495	if (nid)
6496		alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6497
6498	nid = spec->autocfg.hp_pins[0];
6499	if (nid)
6500		alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
6501}
6502
6503#define ALC260_PIN_CD_NID		0x16
6504static void alc260_auto_init_analog_input(struct hda_codec *codec)
6505{
6506	struct alc_spec *spec = codec->spec;
6507	int i;
6508
6509	for (i = 0; i < AUTO_PIN_LAST; i++) {
6510		hda_nid_t nid = spec->autocfg.input_pins[i];
6511		if (nid >= 0x12) {
6512			alc_set_input_pin(codec, nid, i);
6513			if (nid != ALC260_PIN_CD_NID &&
6514			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
6515				snd_hda_codec_write(codec, nid, 0,
6516						    AC_VERB_SET_AMP_GAIN_MUTE,
6517						    AMP_OUT_MUTE);
6518		}
6519	}
6520}
6521
6522#define alc260_auto_init_input_src	alc880_auto_init_input_src
6523
6524/*
6525 * generic initialization of ADC, input mixers and output mixers
6526 */
6527static struct hda_verb alc260_volume_init_verbs[] = {
6528	/*
6529	 * Unmute ADC0-1 and set the default input to mic-in
6530	 */
6531	{0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6532	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6533	{0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6534	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6535
6536	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6537	 * mixer widget
6538	 * Note: PASD motherboards uses the Line In 2 as the input for
6539	 * front panel mic (mic 2)
6540	 */
6541	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
6542	/* mute analog inputs */
6543	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6544	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6545	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6546	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6547	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6548
6549	/*
6550	 * Set up output mixers (0x08 - 0x0a)
6551	 */
6552	/* set vol=0 to output mixers */
6553	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6554	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6555	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6556	/* set up input amps for analog loopback */
6557	/* Amp Indices: DAC = 0, mixer = 1 */
6558	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6559	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6560	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6561	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6562	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6563	{0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6564
6565	{ }
6566};
6567
6568static int alc260_parse_auto_config(struct hda_codec *codec)
6569{
6570	struct alc_spec *spec = codec->spec;
6571	int err;
6572	static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6573
6574	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6575					   alc260_ignore);
6576	if (err < 0)
6577		return err;
6578	err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6579	if (err < 0)
6580		return err;
6581	if (!spec->kctls.list)
6582		return 0; /* can't find valid BIOS pin config */
6583	err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
6584	if (err < 0)
6585		return err;
6586
6587	spec->multiout.max_channels = 2;
6588
6589	if (spec->autocfg.dig_outs)
6590		spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
6591	if (spec->kctls.list)
6592		add_mixer(spec, spec->kctls.list);
6593
6594	add_verb(spec, alc260_volume_init_verbs);
6595
6596	spec->num_mux_defs = 1;
6597	spec->input_mux = &spec->private_imux[0];
6598
6599	alc_ssid_check(codec, 0x10, 0x15, 0x0f, 0);
6600
6601	return 1;
6602}
6603
6604/* additional initialization for auto-configuration model */
6605static void alc260_auto_init(struct hda_codec *codec)
6606{
6607	struct alc_spec *spec = codec->spec;
6608	alc260_auto_init_multi_out(codec);
6609	alc260_auto_init_analog_input(codec);
6610	alc260_auto_init_input_src(codec);
6611	if (spec->unsol_event)
6612		alc_inithook(codec);
6613}
6614
6615#ifdef CONFIG_SND_HDA_POWER_SAVE
6616static struct hda_amp_list alc260_loopbacks[] = {
6617	{ 0x07, HDA_INPUT, 0 },
6618	{ 0x07, HDA_INPUT, 1 },
6619	{ 0x07, HDA_INPUT, 2 },
6620	{ 0x07, HDA_INPUT, 3 },
6621	{ 0x07, HDA_INPUT, 4 },
6622	{ } /* end */
6623};
6624#endif
6625
6626/*
6627 * ALC260 configurations
6628 */
6629static const char *alc260_models[ALC260_MODEL_LAST] = {
6630	[ALC260_BASIC]		= "basic",
6631	[ALC260_HP]		= "hp",
6632	[ALC260_HP_3013]	= "hp-3013",
6633	[ALC260_HP_DC7600]	= "hp-dc7600",
6634	[ALC260_FUJITSU_S702X]	= "fujitsu",
6635	[ALC260_ACER]		= "acer",
6636	[ALC260_WILL]		= "will",
6637	[ALC260_REPLACER_672V]	= "replacer",
6638	[ALC260_FAVORIT100]	= "favorit100",
6639#ifdef CONFIG_SND_DEBUG
6640	[ALC260_TEST]		= "test",
6641#endif
6642	[ALC260_AUTO]		= "auto",
6643};
6644
6645static struct snd_pci_quirk alc260_cfg_tbl[] = {
6646	SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
6647	SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
6648	SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
6649	SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
6650	SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
6651	SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
6652	SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
6653	SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
6654	SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
6655	SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6656	SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6657	SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6658	SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6659	SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6660	SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6661	SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6662	SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6663	SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
6664	SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
6665	SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
6666	{}
6667};
6668
6669static struct alc_config_preset alc260_presets[] = {
6670	[ALC260_BASIC] = {
6671		.mixers = { alc260_base_output_mixer,
6672			    alc260_input_mixer },
6673		.init_verbs = { alc260_init_verbs },
6674		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6675		.dac_nids = alc260_dac_nids,
6676		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6677		.adc_nids = alc260_dual_adc_nids,
6678		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6679		.channel_mode = alc260_modes,
6680		.input_mux = &alc260_capture_source,
6681	},
6682	[ALC260_HP] = {
6683		.mixers = { alc260_hp_output_mixer,
6684			    alc260_input_mixer },
6685		.init_verbs = { alc260_init_verbs,
6686				alc260_hp_unsol_verbs },
6687		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6688		.dac_nids = alc260_dac_nids,
6689		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6690		.adc_nids = alc260_adc_nids_alt,
6691		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6692		.channel_mode = alc260_modes,
6693		.input_mux = &alc260_capture_source,
6694		.unsol_event = alc260_hp_unsol_event,
6695		.init_hook = alc260_hp_automute,
6696	},
6697	[ALC260_HP_DC7600] = {
6698		.mixers = { alc260_hp_dc7600_mixer,
6699			    alc260_input_mixer },
6700		.init_verbs = { alc260_init_verbs,
6701				alc260_hp_dc7600_verbs },
6702		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6703		.dac_nids = alc260_dac_nids,
6704		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6705		.adc_nids = alc260_adc_nids_alt,
6706		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6707		.channel_mode = alc260_modes,
6708		.input_mux = &alc260_capture_source,
6709		.unsol_event = alc260_hp_3012_unsol_event,
6710		.init_hook = alc260_hp_3012_automute,
6711	},
6712	[ALC260_HP_3013] = {
6713		.mixers = { alc260_hp_3013_mixer,
6714			    alc260_input_mixer },
6715		.init_verbs = { alc260_hp_3013_init_verbs,
6716				alc260_hp_3013_unsol_verbs },
6717		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6718		.dac_nids = alc260_dac_nids,
6719		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6720		.adc_nids = alc260_adc_nids_alt,
6721		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6722		.channel_mode = alc260_modes,
6723		.input_mux = &alc260_capture_source,
6724		.unsol_event = alc260_hp_3013_unsol_event,
6725		.init_hook = alc260_hp_3013_automute,
6726	},
6727	[ALC260_FUJITSU_S702X] = {
6728		.mixers = { alc260_fujitsu_mixer },
6729		.init_verbs = { alc260_fujitsu_init_verbs },
6730		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6731		.dac_nids = alc260_dac_nids,
6732		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6733		.adc_nids = alc260_dual_adc_nids,
6734		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6735		.channel_mode = alc260_modes,
6736		.num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6737		.input_mux = alc260_fujitsu_capture_sources,
6738	},
6739	[ALC260_ACER] = {
6740		.mixers = { alc260_acer_mixer },
6741		.init_verbs = { alc260_acer_init_verbs },
6742		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6743		.dac_nids = alc260_dac_nids,
6744		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6745		.adc_nids = alc260_dual_adc_nids,
6746		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6747		.channel_mode = alc260_modes,
6748		.num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6749		.input_mux = alc260_acer_capture_sources,
6750	},
6751	[ALC260_FAVORIT100] = {
6752		.mixers = { alc260_favorit100_mixer },
6753		.init_verbs = { alc260_favorit100_init_verbs },
6754		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6755		.dac_nids = alc260_dac_nids,
6756		.num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6757		.adc_nids = alc260_dual_adc_nids,
6758		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6759		.channel_mode = alc260_modes,
6760		.num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6761		.input_mux = alc260_favorit100_capture_sources,
6762	},
6763	[ALC260_WILL] = {
6764		.mixers = { alc260_will_mixer },
6765		.init_verbs = { alc260_init_verbs, alc260_will_verbs },
6766		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6767		.dac_nids = alc260_dac_nids,
6768		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6769		.adc_nids = alc260_adc_nids,
6770		.dig_out_nid = ALC260_DIGOUT_NID,
6771		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6772		.channel_mode = alc260_modes,
6773		.input_mux = &alc260_capture_source,
6774	},
6775	[ALC260_REPLACER_672V] = {
6776		.mixers = { alc260_replacer_672v_mixer },
6777		.init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6778		.num_dacs = ARRAY_SIZE(alc260_dac_nids),
6779		.dac_nids = alc260_dac_nids,
6780		.num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6781		.adc_nids = alc260_adc_nids,
6782		.dig_out_nid = ALC260_DIGOUT_NID,
6783		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6784		.channel_mode = alc260_modes,
6785		.input_mux = &alc260_capture_source,
6786		.unsol_event = alc260_replacer_672v_unsol_event,
6787		.init_hook = alc260_replacer_672v_automute,
6788	},
6789#ifdef CONFIG_SND_DEBUG
6790	[ALC260_TEST] = {
6791		.mixers = { alc260_test_mixer },
6792		.init_verbs = { alc260_test_init_verbs },
6793		.num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6794		.dac_nids = alc260_test_dac_nids,
6795		.num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6796		.adc_nids = alc260_test_adc_nids,
6797		.num_channel_mode = ARRAY_SIZE(alc260_modes),
6798		.channel_mode = alc260_modes,
6799		.num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6800		.input_mux = alc260_test_capture_sources,
6801	},
6802#endif
6803};
6804
6805static int patch_alc260(struct hda_codec *codec)
6806{
6807	struct alc_spec *spec;
6808	int err, board_config;
6809
6810	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6811	if (spec == NULL)
6812		return -ENOMEM;
6813
6814	codec->spec = spec;
6815
6816	board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
6817						  alc260_models,
6818						  alc260_cfg_tbl);
6819	if (board_config < 0) {
6820		snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6821			   codec->chip_name);
6822		board_config = ALC260_AUTO;
6823	}
6824
6825	if (board_config == ALC260_AUTO) {
6826		/* automatic parse from the BIOS config */
6827		err = alc260_parse_auto_config(codec);
6828		if (err < 0) {
6829			alc_free(codec);
6830			return err;
6831		} else if (!err) {
6832			printk(KERN_INFO
6833			       "hda_codec: Cannot set up configuration "
6834			       "from BIOS.  Using base mode...\n");
6835			board_config = ALC260_BASIC;
6836		}
6837	}
6838
6839	err = snd_hda_attach_beep_device(codec, 0x1);
6840	if (err < 0) {
6841		alc_free(codec);
6842		return err;
6843	}
6844
6845	if (board_config != ALC260_AUTO)
6846		setup_preset(codec, &alc260_presets[board_config]);
6847
6848	spec->stream_analog_playback = &alc260_pcm_analog_playback;
6849	spec->stream_analog_capture = &alc260_pcm_analog_capture;
6850
6851	spec->stream_digital_playback = &alc260_pcm_digital_playback;
6852	spec->stream_digital_capture = &alc260_pcm_digital_capture;
6853
6854	if (!spec->adc_nids && spec->input_mux) {
6855		/* check whether NID 0x04 is valid */
6856		unsigned int wcap = get_wcaps(codec, 0x04);
6857		wcap = get_wcaps_type(wcap);
6858		/* get type */
6859		if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
6860			spec->adc_nids = alc260_adc_nids_alt;
6861			spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
6862		} else {
6863			spec->adc_nids = alc260_adc_nids;
6864			spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
6865		}
6866	}
6867	set_capture_mixer(codec);
6868	set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
6869
6870	spec->vmaster_nid = 0x08;
6871
6872	codec->patch_ops = alc_patch_ops;
6873	if (board_config == ALC260_AUTO)
6874		spec->init_hook = alc260_auto_init;
6875#ifdef CONFIG_SND_HDA_POWER_SAVE
6876	if (!spec->loopback.amplist)
6877		spec->loopback.amplist = alc260_loopbacks;
6878#endif
6879
6880	return 0;
6881}
6882
6883
6884/*
6885 * ALC882/883/885/888/889 support
6886 *
6887 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
6888 * configuration.  Each pin widget can choose any input DACs and a mixer.
6889 * Each ADC is connected from a mixer of all inputs.  This makes possible
6890 * 6-channel independent captures.
6891 *
6892 * In addition, an independent DAC for the multi-playback (not used in this
6893 * driver yet).
6894 */
6895#define ALC882_DIGOUT_NID	0x06
6896#define ALC882_DIGIN_NID	0x0a
6897#define ALC883_DIGOUT_NID	ALC882_DIGOUT_NID
6898#define ALC883_DIGIN_NID	ALC882_DIGIN_NID
6899#define ALC1200_DIGOUT_NID	0x10
6900
6901
6902static struct hda_channel_mode alc882_ch_modes[1] = {
6903	{ 8, NULL }
6904};
6905
6906/* DACs */
6907static hda_nid_t alc882_dac_nids[4] = {
6908	/* front, rear, clfe, rear_surr */
6909	0x02, 0x03, 0x04, 0x05
6910};
6911#define alc883_dac_nids		alc882_dac_nids
6912
6913/* ADCs */
6914#define alc882_adc_nids		alc880_adc_nids
6915#define alc882_adc_nids_alt	alc880_adc_nids_alt
6916#define alc883_adc_nids		alc882_adc_nids_alt
6917static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
6918static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
6919#define alc889_adc_nids		alc880_adc_nids
6920
6921static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
6922static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
6923#define alc883_capsrc_nids	alc882_capsrc_nids_alt
6924static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
6925#define alc889_capsrc_nids	alc882_capsrc_nids
6926
6927/* input MUX */
6928/* FIXME: should be a matrix-type input source selection */
6929
6930static struct hda_input_mux alc882_capture_source = {
6931	.num_items = 4,
6932	.items = {
6933		{ "Mic", 0x0 },
6934		{ "Front Mic", 0x1 },
6935		{ "Line", 0x2 },
6936		{ "CD", 0x4 },
6937	},
6938};
6939
6940#define alc883_capture_source	alc882_capture_source
6941
6942static struct hda_input_mux alc889_capture_source = {
6943	.num_items = 3,
6944	.items = {
6945		{ "Front Mic", 0x0 },
6946		{ "Mic", 0x3 },
6947		{ "Line", 0x2 },
6948	},
6949};
6950
6951static struct hda_input_mux mb5_capture_source = {
6952	.num_items = 3,
6953	.items = {
6954		{ "Mic", 0x1 },
6955		{ "Line", 0x7 },
6956		{ "CD", 0x4 },
6957	},
6958};
6959
6960static struct hda_input_mux macmini3_capture_source = {
6961	.num_items = 2,
6962	.items = {
6963		{ "Line", 0x2 },
6964		{ "CD", 0x4 },
6965	},
6966};
6967
6968static struct hda_input_mux alc883_3stack_6ch_intel = {
6969	.num_items = 4,
6970	.items = {
6971		{ "Mic", 0x1 },
6972		{ "Front Mic", 0x0 },
6973		{ "Line", 0x2 },
6974		{ "CD", 0x4 },
6975	},
6976};
6977
6978static struct hda_input_mux alc883_lenovo_101e_capture_source = {
6979	.num_items = 2,
6980	.items = {
6981		{ "Mic", 0x1 },
6982		{ "Line", 0x2 },
6983	},
6984};
6985
6986static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
6987	.num_items = 4,
6988	.items = {
6989		{ "Mic", 0x0 },
6990		{ "iMic", 0x1 },
6991		{ "Line", 0x2 },
6992		{ "CD", 0x4 },
6993	},
6994};
6995
6996static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
6997	.num_items = 2,
6998	.items = {
6999		{ "Mic", 0x0 },
7000		{ "Int Mic", 0x1 },
7001	},
7002};
7003
7004static struct hda_input_mux alc883_lenovo_sky_capture_source = {
7005	.num_items = 3,
7006	.items = {
7007		{ "Mic", 0x0 },
7008		{ "Front Mic", 0x1 },
7009		{ "Line", 0x4 },
7010	},
7011};
7012
7013static struct hda_input_mux alc883_asus_eee1601_capture_source = {
7014	.num_items = 2,
7015	.items = {
7016		{ "Mic", 0x0 },
7017		{ "Line", 0x2 },
7018	},
7019};
7020
7021static struct hda_input_mux alc889A_mb31_capture_source = {
7022	.num_items = 2,
7023	.items = {
7024		{ "Mic", 0x0 },
7025		/* Front Mic (0x01) unused */
7026		{ "Line", 0x2 },
7027		/* Line 2 (0x03) unused */
7028		/* CD (0x04) unused? */
7029	},
7030};
7031
7032static struct hda_input_mux alc889A_imac91_capture_source = {
7033	.num_items = 2,
7034	.items = {
7035		{ "Mic", 0x01 },
7036		{ "Line", 0x2 }, /* Not sure! */
7037	},
7038};
7039
7040/*
7041 * 2ch mode
7042 */
7043static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
7044	{ 2, NULL }
7045};
7046
7047/*
7048 * 2ch mode
7049 */
7050static struct hda_verb alc882_3ST_ch2_init[] = {
7051	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7052	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7053	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7054	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7055	{ } /* end */
7056};
7057
7058/*
7059 * 4ch mode
7060 */
7061static struct hda_verb alc882_3ST_ch4_init[] = {
7062	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7063	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7064	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7065	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7066	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7067	{ } /* end */
7068};
7069
7070/*
7071 * 6ch mode
7072 */
7073static struct hda_verb alc882_3ST_ch6_init[] = {
7074	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7075	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7076	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7077	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7078	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7079	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7080	{ } /* end */
7081};
7082
7083static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
7084	{ 2, alc882_3ST_ch2_init },
7085	{ 4, alc882_3ST_ch4_init },
7086	{ 6, alc882_3ST_ch6_init },
7087};
7088
7089#define alc883_3ST_6ch_modes	alc882_3ST_6ch_modes
7090
7091/*
7092 * 2ch mode
7093 */
7094static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
7095	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
7096	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7097	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7098	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7099	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7100	{ } /* end */
7101};
7102
7103/*
7104 * 4ch mode
7105 */
7106static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
7107	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7108	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7109	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7110	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7111	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7112	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7113	{ } /* end */
7114};
7115
7116/*
7117 * 6ch mode
7118 */
7119static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
7120	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7121	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7122	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7123	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7124	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7125	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7126	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7127	{ } /* end */
7128};
7129
7130static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
7131	{ 2, alc883_3ST_ch2_clevo_init },
7132	{ 4, alc883_3ST_ch4_clevo_init },
7133	{ 6, alc883_3ST_ch6_clevo_init },
7134};
7135
7136
7137/*
7138 * 6ch mode
7139 */
7140static struct hda_verb alc882_sixstack_ch6_init[] = {
7141	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7142	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7143	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7144	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7145	{ } /* end */
7146};
7147
7148/*
7149 * 8ch mode
7150 */
7151static struct hda_verb alc882_sixstack_ch8_init[] = {
7152	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7153	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7154	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7155	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7156	{ } /* end */
7157};
7158
7159static struct hda_channel_mode alc882_sixstack_modes[2] = {
7160	{ 6, alc882_sixstack_ch6_init },
7161	{ 8, alc882_sixstack_ch8_init },
7162};
7163
7164
7165/* Macbook Air 2,1 */
7166
7167static struct hda_channel_mode alc885_mba21_ch_modes[1] = {
7168      { 2, NULL },
7169};
7170
7171/*
7172 * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
7173 */
7174
7175/*
7176 * 2ch mode
7177 */
7178static struct hda_verb alc885_mbp_ch2_init[] = {
7179	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7180	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7181	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7182	{ } /* end */
7183};
7184
7185/*
7186 * 4ch mode
7187 */
7188static struct hda_verb alc885_mbp_ch4_init[] = {
7189	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7190	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7191	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7192	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7193	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7194	{ } /* end */
7195};
7196
7197static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
7198	{ 2, alc885_mbp_ch2_init },
7199	{ 4, alc885_mbp_ch4_init },
7200};
7201
7202/*
7203 * 2ch
7204 * Speakers/Woofer/HP = Front
7205 * LineIn = Input
7206 */
7207static struct hda_verb alc885_mb5_ch2_init[] = {
7208	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7209	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7210	{ } /* end */
7211};
7212
7213/*
7214 * 6ch mode
7215 * Speakers/HP = Front
7216 * Woofer = LFE
7217 * LineIn = Surround
7218 */
7219static struct hda_verb alc885_mb5_ch6_init[] = {
7220	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7221	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7222	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7223	{ } /* end */
7224};
7225
7226static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
7227	{ 2, alc885_mb5_ch2_init },
7228	{ 6, alc885_mb5_ch6_init },
7229};
7230
7231#define alc885_macmini3_6ch_modes	alc885_mb5_6ch_modes
7232
7233/*
7234 * 2ch mode
7235 */
7236static struct hda_verb alc883_4ST_ch2_init[] = {
7237	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7238	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7239	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7240	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7241	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7242	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7243	{ } /* end */
7244};
7245
7246/*
7247 * 4ch mode
7248 */
7249static struct hda_verb alc883_4ST_ch4_init[] = {
7250	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7251	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7252	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7253	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7254	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7255	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7256	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7257	{ } /* end */
7258};
7259
7260/*
7261 * 6ch mode
7262 */
7263static struct hda_verb alc883_4ST_ch6_init[] = {
7264	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7265	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7266	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7267	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7268	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7269	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7270	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7271	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7272	{ } /* end */
7273};
7274
7275/*
7276 * 8ch mode
7277 */
7278static struct hda_verb alc883_4ST_ch8_init[] = {
7279	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7280	{ 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7281	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7282	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7283	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7284	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7285	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7286	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7287	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7288	{ } /* end */
7289};
7290
7291static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
7292	{ 2, alc883_4ST_ch2_init },
7293	{ 4, alc883_4ST_ch4_init },
7294	{ 6, alc883_4ST_ch6_init },
7295	{ 8, alc883_4ST_ch8_init },
7296};
7297
7298
7299/*
7300 * 2ch mode
7301 */
7302static struct hda_verb alc883_3ST_ch2_intel_init[] = {
7303	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7304	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7305	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7306	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7307	{ } /* end */
7308};
7309
7310/*
7311 * 4ch mode
7312 */
7313static struct hda_verb alc883_3ST_ch4_intel_init[] = {
7314	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7315	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7316	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7317	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7318	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7319	{ } /* end */
7320};
7321
7322/*
7323 * 6ch mode
7324 */
7325static struct hda_verb alc883_3ST_ch6_intel_init[] = {
7326	{ 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7327	{ 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7328	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
7329	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7330	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7331	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7332	{ } /* end */
7333};
7334
7335static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7336	{ 2, alc883_3ST_ch2_intel_init },
7337	{ 4, alc883_3ST_ch4_intel_init },
7338	{ 6, alc883_3ST_ch6_intel_init },
7339};
7340
7341/*
7342 * 2ch mode
7343 */
7344static struct hda_verb alc889_ch2_intel_init[] = {
7345	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7346	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
7347	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
7348	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
7349	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7350	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7351	{ } /* end */
7352};
7353
7354/*
7355 * 6ch mode
7356 */
7357static struct hda_verb alc889_ch6_intel_init[] = {
7358	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7359	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7360	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7361	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7362	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7363	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7364	{ } /* end */
7365};
7366
7367/*
7368 * 8ch mode
7369 */
7370static struct hda_verb alc889_ch8_intel_init[] = {
7371	{ 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7372	{ 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7373	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7374	{ 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7375	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
7376	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7377	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7378	{ } /* end */
7379};
7380
7381static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7382	{ 2, alc889_ch2_intel_init },
7383	{ 6, alc889_ch6_intel_init },
7384	{ 8, alc889_ch8_intel_init },
7385};
7386
7387/*
7388 * 6ch mode
7389 */
7390static struct hda_verb alc883_sixstack_ch6_init[] = {
7391	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7392	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7393	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7394	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7395	{ } /* end */
7396};
7397
7398/*
7399 * 8ch mode
7400 */
7401static struct hda_verb alc883_sixstack_ch8_init[] = {
7402	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7403	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7404	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7405	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7406	{ } /* end */
7407};
7408
7409static struct hda_channel_mode alc883_sixstack_modes[2] = {
7410	{ 6, alc883_sixstack_ch6_init },
7411	{ 8, alc883_sixstack_ch8_init },
7412};
7413
7414
7415/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7416 *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7417 */
7418static struct snd_kcontrol_new alc882_base_mixer[] = {
7419	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7420	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7421	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7422	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7423	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7424	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7425	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7426	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7427	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7428	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7429	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7430	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7431	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7432	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7433	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7434	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7435	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7436	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7437	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7438	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7439	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7440	{ } /* end */
7441};
7442
7443/* Macbook Air 2,1 same control for HP and internal Speaker */
7444
7445static struct snd_kcontrol_new alc885_mba21_mixer[] = {
7446      HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7447      HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
7448     { }
7449};
7450
7451
7452static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7453	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7454	HDA_BIND_MUTE   ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7455	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7456	HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7457	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7458	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7459	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7460	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7461	HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7462	HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
7463	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7464	{ } /* end */
7465};
7466
7467static struct snd_kcontrol_new alc885_mb5_mixer[] = {
7468	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7469	HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7470	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7471	HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7472	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7473	HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7474	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7475	HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7476	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7477	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
7478	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7479	HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7480	HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7481	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7482	{ } /* end */
7483};
7484
7485static struct snd_kcontrol_new alc885_macmini3_mixer[] = {
7486	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7487	HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7488	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7489	HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7490	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7491	HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7492	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7493	HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7494	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7495	HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
7496	HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7497	{ } /* end */
7498};
7499
7500static struct snd_kcontrol_new alc885_imac91_mixer[] = {
7501	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7502	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7503	{ } /* end */
7504};
7505
7506
7507static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7508	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7509	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7510	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7511	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7512	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7513	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7514	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7515	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7516	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7517	{ } /* end */
7518};
7519
7520static struct snd_kcontrol_new alc882_targa_mixer[] = {
7521	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7522	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7523	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7524	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7525	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7526	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7527	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7528	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7529	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7530	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7531	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7532	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7533	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7534	{ } /* end */
7535};
7536
7537/* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7538 *                 Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7539 */
7540static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7541	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7542	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7543	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7544	HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7545	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7546	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7547	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7548	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7549	HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7550	HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7551	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7552	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7553	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7554	{ } /* end */
7555};
7556
7557static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7558	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7559	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7560	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7561	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7562	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7563	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7564	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7565	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7566	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7567	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7568	{ } /* end */
7569};
7570
7571static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7572	{
7573		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7574		.name = "Channel Mode",
7575		.info = alc_ch_mode_info,
7576		.get = alc_ch_mode_get,
7577		.put = alc_ch_mode_put,
7578	},
7579	{ } /* end */
7580};
7581
7582static struct hda_verb alc882_base_init_verbs[] = {
7583	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7584	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7585	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7586	/* Rear mixer */
7587	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7588	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7589	/* CLFE mixer */
7590	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7591	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7592	/* Side mixer */
7593	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7594	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7595
7596	/* Front Pin: output 0 (0x0c) */
7597	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7598	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7599	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7600	/* Rear Pin: output 1 (0x0d) */
7601	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7602	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7603	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7604	/* CLFE Pin: output 2 (0x0e) */
7605	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7606	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7607	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7608	/* Side Pin: output 3 (0x0f) */
7609	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7610	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7611	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7612	/* Mic (rear) pin: input vref at 80% */
7613	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7614	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7615	/* Front Mic pin: input vref at 80% */
7616	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7617	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7618	/* Line In pin: input */
7619	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7620	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7621	/* Line-2 In: Headphone output (output 0 - 0x0c) */
7622	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7623	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7624	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
7625	/* CD pin widget for input */
7626	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7627
7628	/* FIXME: use matrix-type input source selection */
7629	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7630	/* Input mixer2 */
7631	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7632	/* Input mixer3 */
7633	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7634	/* ADC2: mute amp left and right */
7635	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7636	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7637	/* ADC3: mute amp left and right */
7638	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7639	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7640
7641	{ }
7642};
7643
7644static struct hda_verb alc882_adc1_init_verbs[] = {
7645	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7646	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7647	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7648	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7649	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7650	/* ADC1: mute amp left and right */
7651	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7652	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7653	{ }
7654};
7655
7656static struct hda_verb alc882_eapd_verbs[] = {
7657	/* change to EAPD mode */
7658	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7659	{0x20, AC_VERB_SET_PROC_COEF, 0x3060},
7660	{ }
7661};
7662
7663static struct hda_verb alc889_eapd_verbs[] = {
7664	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7665	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7666	{ }
7667};
7668
7669static struct hda_verb alc_hp15_unsol_verbs[] = {
7670	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7671	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7672	{}
7673};
7674
7675static struct hda_verb alc885_init_verbs[] = {
7676	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7677	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7678	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7679	/* Rear mixer */
7680	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7681	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7682	/* CLFE mixer */
7683	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7684	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7685	/* Side mixer */
7686	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7687	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7688
7689	/* Front HP Pin: output 0 (0x0c) */
7690	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7691	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7692	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7693	/* Front Pin: output 0 (0x0c) */
7694	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7695	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7696	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7697	/* Rear Pin: output 1 (0x0d) */
7698	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7699	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7700	{0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7701	/* CLFE Pin: output 2 (0x0e) */
7702	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7703	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7704	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7705	/* Side Pin: output 3 (0x0f) */
7706	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7707	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7708	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7709	/* Mic (rear) pin: input vref at 80% */
7710	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7711	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7712	/* Front Mic pin: input vref at 80% */
7713	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7714	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7715	/* Line In pin: input */
7716	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7717	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7718
7719	/* Mixer elements: 0x18, , 0x1a, 0x1b */
7720	/* Input mixer1 */
7721	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7722	/* Input mixer2 */
7723	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7724	/* Input mixer3 */
7725	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7726	/* ADC2: mute amp left and right */
7727	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7728	/* ADC3: mute amp left and right */
7729	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7730
7731	{ }
7732};
7733
7734static struct hda_verb alc885_init_input_verbs[] = {
7735	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7736	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7737	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7738	{ }
7739};
7740
7741
7742/* Unmute Selector 24h and set the default input to front mic */
7743static struct hda_verb alc889_init_input_verbs[] = {
7744	{0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7745	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7746	{ }
7747};
7748
7749
7750#define alc883_init_verbs	alc882_base_init_verbs
7751
7752/* Mac Pro test */
7753static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7754	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7755	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7756	HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7757	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7758	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
7759	/* FIXME: this looks suspicious...
7760	HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
7761	HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
7762	*/
7763	{ } /* end */
7764};
7765
7766static struct hda_verb alc882_macpro_init_verbs[] = {
7767	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7768	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7769	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7770	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7771	/* Front Pin: output 0 (0x0c) */
7772	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7773	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7774	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7775	/* Front Mic pin: input vref at 80% */
7776	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7777	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7778	/* Speaker:  output */
7779	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7780	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7781	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7782	/* Headphone output (output 0 - 0x0c) */
7783	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7784	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7785	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7786
7787	/* FIXME: use matrix-type input source selection */
7788	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7789	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7790	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7791	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7792	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7793	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7794	/* Input mixer2 */
7795	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7796	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7797	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7798	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7799	/* Input mixer3 */
7800	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7801	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7802	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7803	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7804	/* ADC1: mute amp left and right */
7805	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7806	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7807	/* ADC2: mute amp left and right */
7808	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7809	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7810	/* ADC3: mute amp left and right */
7811	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7812	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7813
7814	{ }
7815};
7816
7817/* Macbook 5,1 */
7818static struct hda_verb alc885_mb5_init_verbs[] = {
7819	/* DACs */
7820	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7821	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7822	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7823	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7824	/* Front mixer */
7825	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7826	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7827	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7828	/* Surround mixer */
7829	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7830	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7831	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7832	/* LFE mixer */
7833	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7834	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7835	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7836	/* HP mixer */
7837	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7838	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7839	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7840	/* Front Pin (0x0c) */
7841	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7842	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7843	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7844	/* LFE Pin (0x0e) */
7845	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7846	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7847	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7848	/* HP Pin (0x0f) */
7849	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7850	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7851	{0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7852	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7853	/* Front Mic pin: input vref at 80% */
7854	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7855	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7856	/* Line In pin */
7857	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7858	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7859
7860	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0x1)},
7861	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x7)},
7862	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x4)},
7863	{ }
7864};
7865
7866/* Macmini 3,1 */
7867static struct hda_verb alc885_macmini3_init_verbs[] = {
7868	/* DACs */
7869	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7870	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7871	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7872	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7873	/* Front mixer */
7874	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7875	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7876	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7877	/* Surround mixer */
7878	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7879	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7880	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7881	/* LFE mixer */
7882	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7883	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7884	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7885	/* HP mixer */
7886	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7887	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7888	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7889	/* Front Pin (0x0c) */
7890	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7891	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7892	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7893	/* LFE Pin (0x0e) */
7894	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7895	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7896	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7897	/* HP Pin (0x0f) */
7898	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7899	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7900	{0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7901	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7902	/* Line In pin */
7903	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7904	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7905
7906	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7907	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7908	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7909	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7910	{ }
7911};
7912
7913
7914static struct hda_verb alc885_mba21_init_verbs[] = {
7915	/*Internal and HP Speaker Mixer*/
7916	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7917	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7918	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7919	/*Internal Speaker Pin (0x0c)*/
7920	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
7921	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7922	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7923	/* HP Pin: output 0 (0x0e) */
7924	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7925	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7926	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7927	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
7928	/* Line in (is hp when jack connected)*/
7929	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
7930	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7931
7932	{ }
7933 };
7934
7935
7936/* Macbook Pro rev3 */
7937static struct hda_verb alc885_mbp3_init_verbs[] = {
7938	/* Front mixer: unmute input/output amp left and right (volume = 0) */
7939	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7940	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7941	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7942	/* Rear mixer */
7943	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7944	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7945	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7946	/* HP mixer */
7947	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7948	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7949	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7950	/* Front Pin: output 0 (0x0c) */
7951	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7952	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7953	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7954	/* HP Pin: output 0 (0x0e) */
7955	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7956	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7957	{0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
7958	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7959	/* Mic (rear) pin: input vref at 80% */
7960	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7961	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7962	/* Front Mic pin: input vref at 80% */
7963	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7964	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7965	/* Line In pin: use output 1 when in LineOut mode */
7966	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7967	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7968	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7969
7970	/* FIXME: use matrix-type input source selection */
7971	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7972	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7973	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7974	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7975	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7976	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7977	/* Input mixer2 */
7978	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7979	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7980	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7981	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7982	/* Input mixer3 */
7983	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7984	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7985	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7986	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7987	/* ADC1: mute amp left and right */
7988	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7989	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7990	/* ADC2: mute amp left and right */
7991	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7992	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7993	/* ADC3: mute amp left and right */
7994	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7995	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7996
7997	{ }
7998};
7999
8000/* iMac 9,1 */
8001static struct hda_verb alc885_imac91_init_verbs[] = {
8002	/* Internal Speaker Pin (0x0c) */
8003	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8004	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8005	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8006	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8007	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8008	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8009	/* HP Pin: Rear */
8010	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8011	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8012	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8013	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
8014	/* Line in Rear */
8015	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
8016	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8017	/* Front Mic pin: input vref at 80% */
8018	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8019	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8020	/* Rear mixer */
8021	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8022	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8023	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8024	/* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
8025	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8026	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8027	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8028	/* 0x24 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8029	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8030	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8031	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8032	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8033	/* 0x23 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8034	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8035	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8036	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8037	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8038	/* 0x22 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8039	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8040	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8041	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8042	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8043	/* 0x07 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8044	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8045	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8046	/* 0x08 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8047	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8048	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8049	/* 0x09 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8050	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8051	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8052	{ }
8053};
8054
8055/* iMac 24 mixer. */
8056static struct snd_kcontrol_new alc885_imac24_mixer[] = {
8057	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8058	HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
8059	{ } /* end */
8060};
8061
8062/* iMac 24 init verbs. */
8063static struct hda_verb alc885_imac24_init_verbs[] = {
8064	/* Internal speakers: output 0 (0x0c) */
8065	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8066	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8067	{0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8068	/* Internal speakers: output 0 (0x0c) */
8069	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8070	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8071	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8072	/* Headphone: output 0 (0x0c) */
8073	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8074	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8075	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8076	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8077	/* Front Mic: input vref at 80% */
8078	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8079	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8080	{ }
8081};
8082
8083/* Toggle speaker-output according to the hp-jack state */
8084static void alc885_imac24_setup(struct hda_codec *codec)
8085{
8086	struct alc_spec *spec = codec->spec;
8087
8088	spec->autocfg.hp_pins[0] = 0x14;
8089	spec->autocfg.speaker_pins[0] = 0x18;
8090	spec->autocfg.speaker_pins[1] = 0x1a;
8091}
8092
8093#define alc885_mb5_setup	alc885_imac24_setup
8094#define alc885_macmini3_setup	alc885_imac24_setup
8095
8096/* Macbook Air 2,1 */
8097static void alc885_mba21_setup(struct hda_codec *codec)
8098{
8099       struct alc_spec *spec = codec->spec;
8100
8101       spec->autocfg.hp_pins[0] = 0x14;
8102       spec->autocfg.speaker_pins[0] = 0x18;
8103}
8104
8105
8106
8107static void alc885_mbp3_setup(struct hda_codec *codec)
8108{
8109	struct alc_spec *spec = codec->spec;
8110
8111	spec->autocfg.hp_pins[0] = 0x15;
8112	spec->autocfg.speaker_pins[0] = 0x14;
8113}
8114
8115static void alc885_imac91_setup(struct hda_codec *codec)
8116{
8117	struct alc_spec *spec = codec->spec;
8118
8119	spec->autocfg.hp_pins[0] = 0x14;
8120	spec->autocfg.speaker_pins[0] = 0x18;
8121	spec->autocfg.speaker_pins[1] = 0x1a;
8122}
8123
8124static struct hda_verb alc882_targa_verbs[] = {
8125	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8126	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8127
8128	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8129	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8130
8131	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8132	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8133	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8134
8135	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8136	{ } /* end */
8137};
8138
8139/* toggle speaker-output according to the hp-jack state */
8140static void alc882_targa_automute(struct hda_codec *codec)
8141{
8142	struct alc_spec *spec = codec->spec;
8143	alc_automute_amp(codec);
8144	snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
8145				  spec->jack_present ? 1 : 3);
8146}
8147
8148static void alc882_targa_setup(struct hda_codec *codec)
8149{
8150	struct alc_spec *spec = codec->spec;
8151
8152	spec->autocfg.hp_pins[0] = 0x14;
8153	spec->autocfg.speaker_pins[0] = 0x1b;
8154}
8155
8156static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
8157{
8158	if ((res >> 26) == ALC880_HP_EVENT)
8159		alc882_targa_automute(codec);
8160}
8161
8162static struct hda_verb alc882_asus_a7j_verbs[] = {
8163	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8164	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8165
8166	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8167	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8168	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8169
8170	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8171	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8172	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8173
8174	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8175	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8176	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8177	{ } /* end */
8178};
8179
8180static struct hda_verb alc882_asus_a7m_verbs[] = {
8181	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8182	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8183
8184	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8185	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8186	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8187
8188	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8189	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8190	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8191
8192	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8193	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8194	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8195 	{ } /* end */
8196};
8197
8198static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
8199{
8200	unsigned int gpiostate, gpiomask, gpiodir;
8201
8202	gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
8203				       AC_VERB_GET_GPIO_DATA, 0);
8204
8205	if (!muted)
8206		gpiostate |= (1 << pin);
8207	else
8208		gpiostate &= ~(1 << pin);
8209
8210	gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
8211				      AC_VERB_GET_GPIO_MASK, 0);
8212	gpiomask |= (1 << pin);
8213
8214	gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
8215				     AC_VERB_GET_GPIO_DIRECTION, 0);
8216	gpiodir |= (1 << pin);
8217
8218
8219	snd_hda_codec_write(codec, codec->afg, 0,
8220			    AC_VERB_SET_GPIO_MASK, gpiomask);
8221	snd_hda_codec_write(codec, codec->afg, 0,
8222			    AC_VERB_SET_GPIO_DIRECTION, gpiodir);
8223
8224	msleep(1);
8225
8226	snd_hda_codec_write(codec, codec->afg, 0,
8227			    AC_VERB_SET_GPIO_DATA, gpiostate);
8228}
8229
8230/* set up GPIO at initialization */
8231static void alc885_macpro_init_hook(struct hda_codec *codec)
8232{
8233	alc882_gpio_mute(codec, 0, 0);
8234	alc882_gpio_mute(codec, 1, 0);
8235}
8236
8237/* set up GPIO and update auto-muting at initialization */
8238static void alc885_imac24_init_hook(struct hda_codec *codec)
8239{
8240	alc885_macpro_init_hook(codec);
8241	alc_automute_amp(codec);
8242}
8243
8244/*
8245 * generic initialization of ADC, input mixers and output mixers
8246 */
8247static struct hda_verb alc883_auto_init_verbs[] = {
8248	/*
8249	 * Unmute ADC0-2 and set the default input to mic-in
8250	 */
8251	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8252	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8253	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8254	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8255
8256	/*
8257	 * Set up output mixers (0x0c - 0x0f)
8258	 */
8259	/* set vol=0 to output mixers */
8260	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8261	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8262	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8263	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8264	/* set up input amps for analog loopback */
8265	/* Amp Indices: DAC = 0, mixer = 1 */
8266	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8267	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8268	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8269	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8270	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8271	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8272	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8273	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8274	{0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8275	{0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8276
8277	/* FIXME: use matrix-type input source selection */
8278	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8279	/* Input mixer2 */
8280	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8281	/* Input mixer3 */
8282	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8283	{ }
8284};
8285
8286/* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
8287static struct hda_verb alc889A_mb31_ch2_init[] = {
8288	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8289	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8290	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8291	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8292	{ } /* end */
8293};
8294
8295/* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
8296static struct hda_verb alc889A_mb31_ch4_init[] = {
8297	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8298	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8299	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8300	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8301	{ } /* end */
8302};
8303
8304/* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
8305static struct hda_verb alc889A_mb31_ch5_init[] = {
8306	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as rear */
8307	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8308	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8309	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8310	{ } /* end */
8311};
8312
8313/* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
8314static struct hda_verb alc889A_mb31_ch6_init[] = {
8315	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as front */
8316	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Subwoofer off */
8317	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8318	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8319	{ } /* end */
8320};
8321
8322static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
8323	{ 2, alc889A_mb31_ch2_init },
8324	{ 4, alc889A_mb31_ch4_init },
8325	{ 5, alc889A_mb31_ch5_init },
8326	{ 6, alc889A_mb31_ch6_init },
8327};
8328
8329static struct hda_verb alc883_medion_eapd_verbs[] = {
8330        /* eanable EAPD on medion laptop */
8331	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8332	{0x20, AC_VERB_SET_PROC_COEF, 0x3070},
8333	{ }
8334};
8335
8336#define alc883_base_mixer	alc882_base_mixer
8337
8338static struct snd_kcontrol_new alc883_mitac_mixer[] = {
8339	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8340	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8341	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8342	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8343	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8344	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8345	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8346	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8347	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8348	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8349	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8350	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8351	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8352	{ } /* end */
8353};
8354
8355static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
8356	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8357	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8358	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8359	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8360	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8361	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8362	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8363	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8364	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8365	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8366	{ } /* end */
8367};
8368
8369static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8370	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8371	HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8372	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8373	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8374	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8375	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8376	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8377	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8378	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8379	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8380	{ } /* end */
8381};
8382
8383static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8384	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8385	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8386	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8387	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8388	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8389	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8390	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8391	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8392	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8393	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8394	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8395	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8396	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8397	{ } /* end */
8398};
8399
8400static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8401	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8402	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8403	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8404	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8405	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8406	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8407	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8408	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8409	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8410	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8411	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8412	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8413	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8414	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8415	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8416	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8417	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8418	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8419	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8420	{ } /* end */
8421};
8422
8423static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8424	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8425	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8426	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8427	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8428	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8429			      HDA_OUTPUT),
8430	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8431	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8432	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8433	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8434	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8435	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8436	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8437	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8438	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8439	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8440	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8441	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8442	HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8443	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8444	{ } /* end */
8445};
8446
8447static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8448	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8449	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8450	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8451	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8452	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8453			      HDA_OUTPUT),
8454	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8455	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8456	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8457	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8458	HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
8459	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8460	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8461	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8462	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
8463	HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
8464	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
8465	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8466	HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8467	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8468	{ } /* end */
8469};
8470
8471static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
8472	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8473	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8474	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8475	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8476	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8477	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8478	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8479	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8480	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8481	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8482	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8483	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8484	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8485	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8486	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8487	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8488	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8489	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8490	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8491	{ } /* end */
8492};
8493
8494static struct snd_kcontrol_new alc883_targa_mixer[] = {
8495	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8496	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8497	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8498	HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8499	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8500	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8501	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8502	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8503	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8504	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8505	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8506	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8507	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8508	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8509	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8510	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8511	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8512	{ } /* end */
8513};
8514
8515static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
8516	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8517	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8518	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8519	HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8520	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8521	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8522	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8523	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8524	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8525	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8526	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8527	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8528	{ } /* end */
8529};
8530
8531static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
8532	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8533	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8534	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8535	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8536	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8537	{ } /* end */
8538};
8539
8540static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
8541	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8542	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8543	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8544	HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8545	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8546	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8547	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8548	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8549	{ } /* end */
8550};
8551
8552static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
8553	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8554	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
8555	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8556	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8557	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8558	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8559	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8560	HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8561	HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8562	{ } /* end */
8563};
8564
8565static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8566	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8567	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8568	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8569	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8570	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8571	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8572	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8573	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8574	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8575	{ } /* end */
8576};
8577
8578static struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = {
8579	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8580	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8581	HDA_CODEC_MUTE("Speaker Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8582	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT),
8583	HDA_CODEC_VOLUME("Line Playback Volume", 0x08, 0x0, HDA_INPUT),
8584	HDA_CODEC_MUTE("Line Playback Switch", 0x08, 0x0, HDA_INPUT),
8585	{ } /* end */
8586};
8587
8588static struct hda_verb alc883_medion_wim2160_verbs[] = {
8589	/* Unmute front mixer */
8590	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8591	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8592
8593	/* Set speaker pin to front mixer */
8594	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8595
8596	/* Init headphone pin */
8597	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8598	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8599	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8600	{0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8601
8602	{ } /* end */
8603};
8604
8605/* toggle speaker-output according to the hp-jack state */
8606static void alc883_medion_wim2160_setup(struct hda_codec *codec)
8607{
8608	struct alc_spec *spec = codec->spec;
8609
8610	spec->autocfg.hp_pins[0] = 0x1a;
8611	spec->autocfg.speaker_pins[0] = 0x15;
8612}
8613
8614static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
8615	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8616	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8617	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8618	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8619	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8620	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8621	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8622	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8623	{ } /* end */
8624};
8625
8626static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8627	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8628	HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8629	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8630	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8631	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8632	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8633	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8634	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8635	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8636	{ } /* end */
8637};
8638
8639static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8640	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8641	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8642	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8643	HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8644	HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8645						0x0d, 1, 0x0, HDA_OUTPUT),
8646	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8647	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8648	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8649	HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8650	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8651	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8652	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8653	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8654	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8655	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8656	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8657	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8658	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8659	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8660	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8661	{ } /* end */
8662};
8663
8664static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8665	/* Output mixers */
8666	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8667	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8668	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8669	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8670	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8671		HDA_OUTPUT),
8672	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8673	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8674	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8675	/* Output switches */
8676	HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8677	HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8678	HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8679	/* Boost mixers */
8680	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8681	HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8682	/* Input mixers */
8683	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8684	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8685	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8686	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8687	{ } /* end */
8688};
8689
8690static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8691	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8692	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8693	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8694	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8695	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8696	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8697	{ } /* end */
8698};
8699
8700static struct hda_bind_ctls alc883_bind_cap_vol = {
8701	.ops = &snd_hda_bind_vol,
8702	.values = {
8703		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8704		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8705		0
8706	},
8707};
8708
8709static struct hda_bind_ctls alc883_bind_cap_switch = {
8710	.ops = &snd_hda_bind_sw,
8711	.values = {
8712		HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8713		HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8714		0
8715	},
8716};
8717
8718static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8719	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8720	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8721	HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8722	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8723	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8724	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8725	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8726	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8727	{ } /* end */
8728};
8729
8730static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8731	HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8732	HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8733	{
8734		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8735		/* .name = "Capture Source", */
8736		.name = "Input Source",
8737		.count = 1,
8738		.info = alc_mux_enum_info,
8739		.get = alc_mux_enum_get,
8740		.put = alc_mux_enum_put,
8741	},
8742	{ } /* end */
8743};
8744
8745static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8746	{
8747		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8748		.name = "Channel Mode",
8749		.info = alc_ch_mode_info,
8750		.get = alc_ch_mode_get,
8751		.put = alc_ch_mode_put,
8752	},
8753	{ } /* end */
8754};
8755
8756/* toggle speaker-output according to the hp-jack state */
8757static void alc883_mitac_setup(struct hda_codec *codec)
8758{
8759	struct alc_spec *spec = codec->spec;
8760
8761	spec->autocfg.hp_pins[0] = 0x15;
8762	spec->autocfg.speaker_pins[0] = 0x14;
8763	spec->autocfg.speaker_pins[1] = 0x17;
8764}
8765
8766/* auto-toggle front mic */
8767/*
8768static void alc883_mitac_mic_automute(struct hda_codec *codec)
8769{
8770	unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0;
8771
8772	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8773}
8774*/
8775
8776static struct hda_verb alc883_mitac_verbs[] = {
8777	/* HP */
8778	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8779	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8780	/* Subwoofer */
8781	{0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8782	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8783
8784	/* enable unsolicited event */
8785	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8786	/* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8787
8788	{ } /* end */
8789};
8790
8791static struct hda_verb alc883_clevo_m540r_verbs[] = {
8792	/* HP */
8793	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8794	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8795	/* Int speaker */
8796	/*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8797
8798	/* enable unsolicited event */
8799	/*
8800	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8801	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8802	*/
8803
8804	{ } /* end */
8805};
8806
8807static struct hda_verb alc883_clevo_m720_verbs[] = {
8808	/* HP */
8809	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8810	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8811	/* Int speaker */
8812	{0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
8813	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8814
8815	/* enable unsolicited event */
8816	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8817	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8818
8819	{ } /* end */
8820};
8821
8822static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
8823	/* HP */
8824	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8825	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8826	/* Subwoofer */
8827	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8828	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8829
8830	/* enable unsolicited event */
8831	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8832
8833	{ } /* end */
8834};
8835
8836static struct hda_verb alc883_targa_verbs[] = {
8837	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8838	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8839
8840	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8841	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8842
8843/* Connect Line-Out side jack (SPDIF) to Side */
8844	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8845	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8846	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8847/* Connect Mic jack to CLFE */
8848	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8849	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8850	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
8851/* Connect Line-in jack to Surround */
8852	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8853	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8854	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8855/* Connect HP out jack to Front */
8856	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8857	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8858	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8859
8860	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8861
8862	{ } /* end */
8863};
8864
8865static struct hda_verb alc883_lenovo_101e_verbs[] = {
8866	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8867	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
8868        {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
8869	{ } /* end */
8870};
8871
8872static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
8873        {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8874	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8875        {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8876        {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8877	{ } /* end */
8878};
8879
8880static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
8881	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8882	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8883	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8884	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
8885	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT    | AC_USRSP_EN},
8886	{ } /* end */
8887};
8888
8889static struct hda_verb alc883_haier_w66_verbs[] = {
8890	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8891	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8892
8893	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8894
8895	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8896	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8897	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8898	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8899	{ } /* end */
8900};
8901
8902static struct hda_verb alc888_lenovo_sky_verbs[] = {
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	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8906	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8907	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8908	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8909	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8910	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8911	{ } /* end */
8912};
8913
8914static struct hda_verb alc888_6st_dell_verbs[] = {
8915	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8916	{ }
8917};
8918
8919static struct hda_verb alc883_vaiott_verbs[] = {
8920	/* HP */
8921	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8922	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8923
8924	/* enable unsolicited event */
8925	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8926
8927	{ } /* end */
8928};
8929
8930static void alc888_3st_hp_setup(struct hda_codec *codec)
8931{
8932	struct alc_spec *spec = codec->spec;
8933
8934	spec->autocfg.hp_pins[0] = 0x1b;
8935	spec->autocfg.speaker_pins[0] = 0x14;
8936	spec->autocfg.speaker_pins[1] = 0x16;
8937	spec->autocfg.speaker_pins[2] = 0x18;
8938}
8939
8940static struct hda_verb alc888_3st_hp_verbs[] = {
8941	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Front: output 0 (0x0c) */
8942	{0x16, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Rear : output 1 (0x0d) */
8943	{0x18, AC_VERB_SET_CONNECT_SEL, 0x02},	/* CLFE : output 2 (0x0e) */
8944	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8945	{ } /* end */
8946};
8947
8948/*
8949 * 2ch mode
8950 */
8951static struct hda_verb alc888_3st_hp_2ch_init[] = {
8952	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8953	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8954	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
8955	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8956	{ } /* end */
8957};
8958
8959/*
8960 * 4ch mode
8961 */
8962static struct hda_verb alc888_3st_hp_4ch_init[] = {
8963	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8964	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8965	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8966	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8967	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8968	{ } /* end */
8969};
8970
8971/*
8972 * 6ch mode
8973 */
8974static struct hda_verb alc888_3st_hp_6ch_init[] = {
8975	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8976	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8977	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
8978	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8979	{ 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8980	{ 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8981	{ } /* end */
8982};
8983
8984static struct hda_channel_mode alc888_3st_hp_modes[3] = {
8985	{ 2, alc888_3st_hp_2ch_init },
8986	{ 4, alc888_3st_hp_4ch_init },
8987	{ 6, alc888_3st_hp_6ch_init },
8988};
8989
8990/* toggle front-jack and RCA according to the hp-jack state */
8991static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
8992{
8993 	unsigned int present = snd_hda_jack_detect(codec, 0x1b);
8994
8995	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8996				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8997	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8998				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8999}
9000
9001/* toggle RCA according to the front-jack state */
9002static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
9003{
9004 	unsigned int present = snd_hda_jack_detect(codec, 0x14);
9005
9006	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9007				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9008}
9009
9010static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
9011					     unsigned int res)
9012{
9013	if ((res >> 26) == ALC880_HP_EVENT)
9014		alc888_lenovo_ms7195_front_automute(codec);
9015	if ((res >> 26) == ALC880_FRONT_EVENT)
9016		alc888_lenovo_ms7195_rca_automute(codec);
9017}
9018
9019static struct hda_verb alc883_medion_md2_verbs[] = {
9020	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9021	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9022
9023	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9024
9025	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9026	{ } /* end */
9027};
9028
9029/* toggle speaker-output according to the hp-jack state */
9030static void alc883_medion_md2_setup(struct hda_codec *codec)
9031{
9032	struct alc_spec *spec = codec->spec;
9033
9034	spec->autocfg.hp_pins[0] = 0x14;
9035	spec->autocfg.speaker_pins[0] = 0x15;
9036}
9037
9038/* toggle speaker-output according to the hp-jack state */
9039#define alc883_targa_init_hook		alc882_targa_init_hook
9040#define alc883_targa_unsol_event	alc882_targa_unsol_event
9041
9042static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
9043{
9044	unsigned int present;
9045
9046	present = snd_hda_jack_detect(codec, 0x18);
9047	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
9048				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9049}
9050
9051static void alc883_clevo_m720_setup(struct hda_codec *codec)
9052{
9053	struct alc_spec *spec = codec->spec;
9054
9055	spec->autocfg.hp_pins[0] = 0x15;
9056	spec->autocfg.speaker_pins[0] = 0x14;
9057}
9058
9059static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
9060{
9061	alc_automute_amp(codec);
9062	alc883_clevo_m720_mic_automute(codec);
9063}
9064
9065static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
9066					   unsigned int res)
9067{
9068	switch (res >> 26) {
9069	case ALC880_MIC_EVENT:
9070		alc883_clevo_m720_mic_automute(codec);
9071		break;
9072	default:
9073		alc_automute_amp_unsol_event(codec, res);
9074		break;
9075	}
9076}
9077
9078/* toggle speaker-output according to the hp-jack state */
9079static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
9080{
9081	struct alc_spec *spec = codec->spec;
9082
9083	spec->autocfg.hp_pins[0] = 0x14;
9084	spec->autocfg.speaker_pins[0] = 0x15;
9085}
9086
9087static void alc883_haier_w66_setup(struct hda_codec *codec)
9088{
9089	struct alc_spec *spec = codec->spec;
9090
9091	spec->autocfg.hp_pins[0] = 0x1b;
9092	spec->autocfg.speaker_pins[0] = 0x14;
9093}
9094
9095static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
9096{
9097	int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
9098
9099	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9100				 HDA_AMP_MUTE, bits);
9101}
9102
9103static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
9104{
9105	int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
9106
9107	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9108				 HDA_AMP_MUTE, bits);
9109	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9110				 HDA_AMP_MUTE, bits);
9111}
9112
9113static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
9114					   unsigned int res)
9115{
9116	if ((res >> 26) == ALC880_HP_EVENT)
9117		alc883_lenovo_101e_all_automute(codec);
9118	if ((res >> 26) == ALC880_FRONT_EVENT)
9119		alc883_lenovo_101e_ispeaker_automute(codec);
9120}
9121
9122/* toggle speaker-output according to the hp-jack state */
9123static void alc883_acer_aspire_setup(struct hda_codec *codec)
9124{
9125	struct alc_spec *spec = codec->spec;
9126
9127	spec->autocfg.hp_pins[0] = 0x14;
9128	spec->autocfg.speaker_pins[0] = 0x15;
9129	spec->autocfg.speaker_pins[1] = 0x16;
9130}
9131
9132static struct hda_verb alc883_acer_eapd_verbs[] = {
9133	/* HP Pin: output 0 (0x0c) */
9134	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9135	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9136	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
9137	/* Front Pin: output 0 (0x0c) */
9138	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9139	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9140	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9141	{0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
9142        /* eanable EAPD on medion laptop */
9143	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
9144	{0x20, AC_VERB_SET_PROC_COEF, 0x3050},
9145	/* enable unsolicited event */
9146	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9147	{ }
9148};
9149
9150static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
9151	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9152	{0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
9153	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9154	{ } /* end */
9155};
9156
9157static void alc888_6st_dell_setup(struct hda_codec *codec)
9158{
9159	struct alc_spec *spec = codec->spec;
9160
9161	spec->autocfg.hp_pins[0] = 0x1b;
9162	spec->autocfg.speaker_pins[0] = 0x14;
9163	spec->autocfg.speaker_pins[1] = 0x15;
9164	spec->autocfg.speaker_pins[2] = 0x16;
9165	spec->autocfg.speaker_pins[3] = 0x17;
9166}
9167
9168static void alc888_lenovo_sky_setup(struct hda_codec *codec)
9169{
9170	struct alc_spec *spec = codec->spec;
9171
9172	spec->autocfg.hp_pins[0] = 0x1b;
9173	spec->autocfg.speaker_pins[0] = 0x14;
9174	spec->autocfg.speaker_pins[1] = 0x15;
9175	spec->autocfg.speaker_pins[2] = 0x16;
9176	spec->autocfg.speaker_pins[3] = 0x17;
9177	spec->autocfg.speaker_pins[4] = 0x1a;
9178}
9179
9180static void alc883_vaiott_setup(struct hda_codec *codec)
9181{
9182	struct alc_spec *spec = codec->spec;
9183
9184	spec->autocfg.hp_pins[0] = 0x15;
9185	spec->autocfg.speaker_pins[0] = 0x14;
9186	spec->autocfg.speaker_pins[1] = 0x17;
9187}
9188
9189static struct hda_verb alc888_asus_m90v_verbs[] = {
9190	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9191	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9192	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9193	/* enable unsolicited event */
9194	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9195	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9196	{ } /* end */
9197};
9198
9199static void alc883_mode2_setup(struct hda_codec *codec)
9200{
9201	struct alc_spec *spec = codec->spec;
9202
9203	spec->autocfg.hp_pins[0] = 0x1b;
9204	spec->autocfg.speaker_pins[0] = 0x14;
9205	spec->autocfg.speaker_pins[1] = 0x15;
9206	spec->autocfg.speaker_pins[2] = 0x16;
9207	spec->ext_mic.pin = 0x18;
9208	spec->int_mic.pin = 0x19;
9209	spec->ext_mic.mux_idx = 0;
9210	spec->int_mic.mux_idx = 1;
9211	spec->auto_mic = 1;
9212}
9213
9214static struct hda_verb alc888_asus_eee1601_verbs[] = {
9215	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9216	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9217	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9218	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9219	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
9220	{0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
9221	{0x20, AC_VERB_SET_PROC_COEF,  0x0838},
9222	/* enable unsolicited event */
9223	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9224	{ } /* end */
9225};
9226
9227static void alc883_eee1601_inithook(struct hda_codec *codec)
9228{
9229	struct alc_spec *spec = codec->spec;
9230
9231	spec->autocfg.hp_pins[0] = 0x14;
9232	spec->autocfg.speaker_pins[0] = 0x1b;
9233	alc_automute_pin(codec);
9234}
9235
9236static struct hda_verb alc889A_mb31_verbs[] = {
9237	/* Init rear pin (used as headphone output) */
9238	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},    /* Apple Headphones */
9239	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},           /* Connect to front */
9240	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9241	/* Init line pin (used as output in 4ch and 6ch mode) */
9242	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},           /* Connect to CLFE */
9243	/* Init line 2 pin (used as headphone out by default) */
9244	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},  /* Use as input */
9245	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
9246	{ } /* end */
9247};
9248
9249/* Mute speakers according to the headphone jack state */
9250static void alc889A_mb31_automute(struct hda_codec *codec)
9251{
9252	unsigned int present;
9253
9254	/* Mute only in 2ch or 4ch mode */
9255	if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
9256	    == 0x00) {
9257		present = snd_hda_jack_detect(codec, 0x15);
9258		snd_hda_codec_amp_stereo(codec, 0x14,  HDA_OUTPUT, 0,
9259			HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9260		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
9261			HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9262	}
9263}
9264
9265static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
9266{
9267	if ((res >> 26) == ALC880_HP_EVENT)
9268		alc889A_mb31_automute(codec);
9269}
9270
9271
9272#ifdef CONFIG_SND_HDA_POWER_SAVE
9273#define alc882_loopbacks	alc880_loopbacks
9274#endif
9275
9276/* pcm configuration: identical with ALC880 */
9277#define alc882_pcm_analog_playback	alc880_pcm_analog_playback
9278#define alc882_pcm_analog_capture	alc880_pcm_analog_capture
9279#define alc882_pcm_digital_playback	alc880_pcm_digital_playback
9280#define alc882_pcm_digital_capture	alc880_pcm_digital_capture
9281
9282static hda_nid_t alc883_slave_dig_outs[] = {
9283	ALC1200_DIGOUT_NID, 0,
9284};
9285
9286static hda_nid_t alc1200_slave_dig_outs[] = {
9287	ALC883_DIGOUT_NID, 0,
9288};
9289
9290/*
9291 * configuration and preset
9292 */
9293static const char *alc882_models[ALC882_MODEL_LAST] = {
9294	[ALC882_3ST_DIG]	= "3stack-dig",
9295	[ALC882_6ST_DIG]	= "6stack-dig",
9296	[ALC882_ARIMA]		= "arima",
9297	[ALC882_W2JC]		= "w2jc",
9298	[ALC882_TARGA]		= "targa",
9299	[ALC882_ASUS_A7J]	= "asus-a7j",
9300	[ALC882_ASUS_A7M]	= "asus-a7m",
9301	[ALC885_MACPRO]		= "macpro",
9302	[ALC885_MB5]		= "mb5",
9303	[ALC885_MACMINI3]	= "macmini3",
9304	[ALC885_MBA21]		= "mba21",
9305	[ALC885_MBP3]		= "mbp3",
9306	[ALC885_IMAC24]		= "imac24",
9307	[ALC885_IMAC91]		= "imac91",
9308	[ALC883_3ST_2ch_DIG]	= "3stack-2ch-dig",
9309	[ALC883_3ST_6ch_DIG]	= "3stack-6ch-dig",
9310	[ALC883_3ST_6ch]	= "3stack-6ch",
9311	[ALC883_6ST_DIG]	= "alc883-6stack-dig",
9312	[ALC883_TARGA_DIG]	= "targa-dig",
9313	[ALC883_TARGA_2ch_DIG]	= "targa-2ch-dig",
9314	[ALC883_TARGA_8ch_DIG]	= "targa-8ch-dig",
9315	[ALC883_ACER]		= "acer",
9316	[ALC883_ACER_ASPIRE]	= "acer-aspire",
9317	[ALC888_ACER_ASPIRE_4930G]	= "acer-aspire-4930g",
9318	[ALC888_ACER_ASPIRE_6530G]	= "acer-aspire-6530g",
9319	[ALC888_ACER_ASPIRE_8930G]	= "acer-aspire-8930g",
9320	[ALC888_ACER_ASPIRE_7730G]	= "acer-aspire-7730g",
9321	[ALC883_MEDION]		= "medion",
9322	[ALC883_MEDION_MD2]	= "medion-md2",
9323	[ALC883_MEDION_WIM2160]	= "medion-wim2160",
9324	[ALC883_LAPTOP_EAPD]	= "laptop-eapd",
9325	[ALC883_LENOVO_101E_2ch] = "lenovo-101e",
9326	[ALC883_LENOVO_NB0763]	= "lenovo-nb0763",
9327	[ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
9328	[ALC888_LENOVO_SKY] = "lenovo-sky",
9329	[ALC883_HAIER_W66] 	= "haier-w66",
9330	[ALC888_3ST_HP]		= "3stack-hp",
9331	[ALC888_6ST_DELL]	= "6stack-dell",
9332	[ALC883_MITAC]		= "mitac",
9333	[ALC883_CLEVO_M540R]	= "clevo-m540r",
9334	[ALC883_CLEVO_M720]	= "clevo-m720",
9335	[ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
9336	[ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
9337	[ALC883_3ST_6ch_INTEL]	= "3stack-6ch-intel",
9338	[ALC889A_INTEL]		= "intel-alc889a",
9339	[ALC889_INTEL]		= "intel-x58",
9340	[ALC1200_ASUS_P5Q]	= "asus-p5q",
9341	[ALC889A_MB31]		= "mb31",
9342	[ALC883_SONY_VAIO_TT]	= "sony-vaio-tt",
9343	[ALC882_AUTO]		= "auto",
9344};
9345
9346static struct snd_pci_quirk alc882_cfg_tbl[] = {
9347	SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
9348
9349	SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
9350	SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
9351	SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
9352	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
9353	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
9354	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
9355	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
9356		ALC888_ACER_ASPIRE_4930G),
9357	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
9358		ALC888_ACER_ASPIRE_4930G),
9359	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
9360		ALC888_ACER_ASPIRE_8930G),
9361	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
9362		ALC888_ACER_ASPIRE_8930G),
9363	SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
9364	SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
9365	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
9366		ALC888_ACER_ASPIRE_6530G),
9367	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
9368		ALC888_ACER_ASPIRE_6530G),
9369	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
9370		ALC888_ACER_ASPIRE_7730G),
9371	/* default Acer -- disabled as it causes more problems.
9372	 *    model=auto should work fine now
9373	 */
9374	/* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
9375
9376	SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
9377
9378	SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
9379	SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
9380	SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
9381	SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
9382	SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
9383	SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
9384
9385	SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
9386	SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
9387	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
9388	SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
9389	SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
9390	SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
9391	SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
9392	SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
9393	SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
9394	SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
9395	SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
9396
9397	SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
9398	SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
9399	SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
9400	SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
9401	SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
9402	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
9403	SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
9404	SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
9405	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
9406
9407	SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
9408	SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
9409	SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
9410	SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */
9411	SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
9412	SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
9413	SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
9414	SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
9415	SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
9416	SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
9417	SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
9418	SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
9419	SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
9420	SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
9421	SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
9422	SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
9423	SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
9424	SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
9425	SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG),
9426	SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
9427	SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
9428	SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
9429	SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
9430	SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
9431	SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
9432	SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
9433	SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
9434	SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
9435	SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG),
9436	SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
9437	SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
9438
9439	SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
9440	SND_PCI_QUIRK(0x1558, 0x0571, "Clevo laptop M570U", ALC883_3ST_6ch_DIG),
9441	SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
9442	SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
9443	SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
9444	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
9445	SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
9446	/* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
9447	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
9448	SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
9449		      ALC883_FUJITSU_PI2515),
9450	SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
9451		ALC888_FUJITSU_XA3530),
9452	SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
9453	SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9454	SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9455	SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9456	SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
9457	SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
9458	SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
9459	SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
9460	SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
9461
9462	SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
9463	SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
9464	SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
9465	SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
9466	SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
9467	SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
9468	SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG),
9469
9470	{}
9471};
9472
9473/* codec SSID table for Intel Mac */
9474static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9475	SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9476	SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9477	SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
9478	SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
9479	SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
9480	SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
9481	SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
9482	SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31),
9483	SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_ASUS_A7M),
9484	SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3),
9485	SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21),
9486	SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
9487	SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
9488	SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
9489	SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
9490	SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
9491	SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5),
9492	/* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
9493	 * so apparently no perfect solution yet
9494	 */
9495	SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
9496	SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
9497	SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
9498	{} /* terminator */
9499};
9500
9501static struct alc_config_preset alc882_presets[] = {
9502	[ALC882_3ST_DIG] = {
9503		.mixers = { alc882_base_mixer },
9504		.init_verbs = { alc882_base_init_verbs,
9505				alc882_adc1_init_verbs },
9506		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9507		.dac_nids = alc882_dac_nids,
9508		.dig_out_nid = ALC882_DIGOUT_NID,
9509		.dig_in_nid = ALC882_DIGIN_NID,
9510		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9511		.channel_mode = alc882_ch_modes,
9512		.need_dac_fix = 1,
9513		.input_mux = &alc882_capture_source,
9514	},
9515	[ALC882_6ST_DIG] = {
9516		.mixers = { alc882_base_mixer, alc882_chmode_mixer },
9517		.init_verbs = { alc882_base_init_verbs,
9518				alc882_adc1_init_verbs },
9519		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9520		.dac_nids = alc882_dac_nids,
9521		.dig_out_nid = ALC882_DIGOUT_NID,
9522		.dig_in_nid = ALC882_DIGIN_NID,
9523		.num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9524		.channel_mode = alc882_sixstack_modes,
9525		.input_mux = &alc882_capture_source,
9526	},
9527	[ALC882_ARIMA] = {
9528		.mixers = { alc882_base_mixer, alc882_chmode_mixer },
9529		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9530				alc882_eapd_verbs },
9531		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9532		.dac_nids = alc882_dac_nids,
9533		.num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9534		.channel_mode = alc882_sixstack_modes,
9535		.input_mux = &alc882_capture_source,
9536	},
9537	[ALC882_W2JC] = {
9538		.mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
9539		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9540				alc882_eapd_verbs, alc880_gpio1_init_verbs },
9541		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9542		.dac_nids = alc882_dac_nids,
9543		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9544		.channel_mode = alc880_threestack_modes,
9545		.need_dac_fix = 1,
9546		.input_mux = &alc882_capture_source,
9547		.dig_out_nid = ALC882_DIGOUT_NID,
9548	},
9549	   [ALC885_MBA21] = {
9550			.mixers = { alc885_mba21_mixer },
9551			.init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
9552			.num_dacs = 2,
9553			.dac_nids = alc882_dac_nids,
9554			.channel_mode = alc885_mba21_ch_modes,
9555			.num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9556			.input_mux = &alc882_capture_source,
9557			.unsol_event = alc_automute_amp_unsol_event,
9558			.setup = alc885_mba21_setup,
9559			.init_hook = alc_automute_amp,
9560       },
9561	[ALC885_MBP3] = {
9562		.mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
9563		.init_verbs = { alc885_mbp3_init_verbs,
9564				alc880_gpio1_init_verbs },
9565		.num_dacs = 2,
9566		.dac_nids = alc882_dac_nids,
9567		.hp_nid = 0x04,
9568		.channel_mode = alc885_mbp_4ch_modes,
9569		.num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9570		.input_mux = &alc882_capture_source,
9571		.dig_out_nid = ALC882_DIGOUT_NID,
9572		.dig_in_nid = ALC882_DIGIN_NID,
9573		.unsol_event = alc_automute_amp_unsol_event,
9574		.setup = alc885_mbp3_setup,
9575		.init_hook = alc_automute_amp,
9576	},
9577	[ALC885_MB5] = {
9578		.mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
9579		.init_verbs = { alc885_mb5_init_verbs,
9580				alc880_gpio1_init_verbs },
9581		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9582		.dac_nids = alc882_dac_nids,
9583		.channel_mode = alc885_mb5_6ch_modes,
9584		.num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
9585		.input_mux = &mb5_capture_source,
9586		.dig_out_nid = ALC882_DIGOUT_NID,
9587		.dig_in_nid = ALC882_DIGIN_NID,
9588		.unsol_event = alc_automute_amp_unsol_event,
9589		.setup = alc885_mb5_setup,
9590		.init_hook = alc_automute_amp,
9591	},
9592	[ALC885_MACMINI3] = {
9593		.mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
9594		.init_verbs = { alc885_macmini3_init_verbs,
9595				alc880_gpio1_init_verbs },
9596		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9597		.dac_nids = alc882_dac_nids,
9598		.channel_mode = alc885_macmini3_6ch_modes,
9599		.num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
9600		.input_mux = &macmini3_capture_source,
9601		.dig_out_nid = ALC882_DIGOUT_NID,
9602		.dig_in_nid = ALC882_DIGIN_NID,
9603		.unsol_event = alc_automute_amp_unsol_event,
9604		.setup = alc885_macmini3_setup,
9605		.init_hook = alc_automute_amp,
9606	},
9607	[ALC885_MACPRO] = {
9608		.mixers = { alc882_macpro_mixer },
9609		.init_verbs = { alc882_macpro_init_verbs },
9610		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9611		.dac_nids = alc882_dac_nids,
9612		.dig_out_nid = ALC882_DIGOUT_NID,
9613		.dig_in_nid = ALC882_DIGIN_NID,
9614		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9615		.channel_mode = alc882_ch_modes,
9616		.input_mux = &alc882_capture_source,
9617		.init_hook = alc885_macpro_init_hook,
9618	},
9619	[ALC885_IMAC24] = {
9620		.mixers = { alc885_imac24_mixer },
9621		.init_verbs = { alc885_imac24_init_verbs },
9622		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9623		.dac_nids = alc882_dac_nids,
9624		.dig_out_nid = ALC882_DIGOUT_NID,
9625		.dig_in_nid = ALC882_DIGIN_NID,
9626		.num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9627		.channel_mode = alc882_ch_modes,
9628		.input_mux = &alc882_capture_source,
9629		.unsol_event = alc_automute_amp_unsol_event,
9630		.setup = alc885_imac24_setup,
9631		.init_hook = alc885_imac24_init_hook,
9632	},
9633	[ALC885_IMAC91] = {
9634		.mixers = {alc885_imac91_mixer},
9635		.init_verbs = { alc885_imac91_init_verbs,
9636				alc880_gpio1_init_verbs },
9637		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9638		.dac_nids = alc882_dac_nids,
9639		.channel_mode = alc885_mba21_ch_modes,
9640		.num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9641		.input_mux = &alc889A_imac91_capture_source,
9642		.dig_out_nid = ALC882_DIGOUT_NID,
9643		.dig_in_nid = ALC882_DIGIN_NID,
9644		.unsol_event = alc_automute_amp_unsol_event,
9645		.setup = alc885_imac91_setup,
9646		.init_hook = alc_automute_amp,
9647	},
9648	[ALC882_TARGA] = {
9649		.mixers = { alc882_targa_mixer, alc882_chmode_mixer },
9650		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9651				alc880_gpio3_init_verbs, alc882_targa_verbs},
9652		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9653		.dac_nids = alc882_dac_nids,
9654		.dig_out_nid = ALC882_DIGOUT_NID,
9655		.num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9656		.adc_nids = alc882_adc_nids,
9657		.capsrc_nids = alc882_capsrc_nids,
9658		.num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9659		.channel_mode = alc882_3ST_6ch_modes,
9660		.need_dac_fix = 1,
9661		.input_mux = &alc882_capture_source,
9662		.unsol_event = alc882_targa_unsol_event,
9663		.setup = alc882_targa_setup,
9664		.init_hook = alc882_targa_automute,
9665	},
9666	[ALC882_ASUS_A7J] = {
9667		.mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
9668		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9669				alc882_asus_a7j_verbs},
9670		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9671		.dac_nids = alc882_dac_nids,
9672		.dig_out_nid = ALC882_DIGOUT_NID,
9673		.num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9674		.adc_nids = alc882_adc_nids,
9675		.capsrc_nids = alc882_capsrc_nids,
9676		.num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9677		.channel_mode = alc882_3ST_6ch_modes,
9678		.need_dac_fix = 1,
9679		.input_mux = &alc882_capture_source,
9680	},
9681	[ALC882_ASUS_A7M] = {
9682		.mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
9683		.init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9684				alc882_eapd_verbs, alc880_gpio1_init_verbs,
9685				alc882_asus_a7m_verbs },
9686		.num_dacs = ARRAY_SIZE(alc882_dac_nids),
9687		.dac_nids = alc882_dac_nids,
9688		.dig_out_nid = ALC882_DIGOUT_NID,
9689		.num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9690		.channel_mode = alc880_threestack_modes,
9691		.need_dac_fix = 1,
9692		.input_mux = &alc882_capture_source,
9693	},
9694	[ALC883_3ST_2ch_DIG] = {
9695		.mixers = { alc883_3ST_2ch_mixer },
9696		.init_verbs = { alc883_init_verbs },
9697		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9698		.dac_nids = alc883_dac_nids,
9699		.dig_out_nid = ALC883_DIGOUT_NID,
9700		.dig_in_nid = ALC883_DIGIN_NID,
9701		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9702		.channel_mode = alc883_3ST_2ch_modes,
9703		.input_mux = &alc883_capture_source,
9704	},
9705	[ALC883_3ST_6ch_DIG] = {
9706		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9707		.init_verbs = { alc883_init_verbs },
9708		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9709		.dac_nids = alc883_dac_nids,
9710		.dig_out_nid = ALC883_DIGOUT_NID,
9711		.dig_in_nid = ALC883_DIGIN_NID,
9712		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9713		.channel_mode = alc883_3ST_6ch_modes,
9714		.need_dac_fix = 1,
9715		.input_mux = &alc883_capture_source,
9716	},
9717	[ALC883_3ST_6ch] = {
9718		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9719		.init_verbs = { alc883_init_verbs },
9720		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9721		.dac_nids = alc883_dac_nids,
9722		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9723		.channel_mode = alc883_3ST_6ch_modes,
9724		.need_dac_fix = 1,
9725		.input_mux = &alc883_capture_source,
9726	},
9727	[ALC883_3ST_6ch_INTEL] = {
9728		.mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9729		.init_verbs = { alc883_init_verbs },
9730		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9731		.dac_nids = alc883_dac_nids,
9732		.dig_out_nid = ALC883_DIGOUT_NID,
9733		.dig_in_nid = ALC883_DIGIN_NID,
9734		.slave_dig_outs = alc883_slave_dig_outs,
9735		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9736		.channel_mode = alc883_3ST_6ch_intel_modes,
9737		.need_dac_fix = 1,
9738		.input_mux = &alc883_3stack_6ch_intel,
9739	},
9740	[ALC889A_INTEL] = {
9741		.mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9742		.init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9743				alc_hp15_unsol_verbs },
9744		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9745		.dac_nids = alc883_dac_nids,
9746		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9747		.adc_nids = alc889_adc_nids,
9748		.dig_out_nid = ALC883_DIGOUT_NID,
9749		.dig_in_nid = ALC883_DIGIN_NID,
9750		.slave_dig_outs = alc883_slave_dig_outs,
9751		.num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9752		.channel_mode = alc889_8ch_intel_modes,
9753		.capsrc_nids = alc889_capsrc_nids,
9754		.input_mux = &alc889_capture_source,
9755		.setup = alc889_automute_setup,
9756		.init_hook = alc_automute_amp,
9757		.unsol_event = alc_automute_amp_unsol_event,
9758		.need_dac_fix = 1,
9759	},
9760	[ALC889_INTEL] = {
9761		.mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9762		.init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
9763				alc889_eapd_verbs, alc_hp15_unsol_verbs},
9764		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9765		.dac_nids = alc883_dac_nids,
9766		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9767		.adc_nids = alc889_adc_nids,
9768		.dig_out_nid = ALC883_DIGOUT_NID,
9769		.dig_in_nid = ALC883_DIGIN_NID,
9770		.slave_dig_outs = alc883_slave_dig_outs,
9771		.num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9772		.channel_mode = alc889_8ch_intel_modes,
9773		.capsrc_nids = alc889_capsrc_nids,
9774		.input_mux = &alc889_capture_source,
9775		.setup = alc889_automute_setup,
9776		.init_hook = alc889_intel_init_hook,
9777		.unsol_event = alc_automute_amp_unsol_event,
9778		.need_dac_fix = 1,
9779	},
9780	[ALC883_6ST_DIG] = {
9781		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
9782		.init_verbs = { alc883_init_verbs },
9783		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9784		.dac_nids = alc883_dac_nids,
9785		.dig_out_nid = ALC883_DIGOUT_NID,
9786		.dig_in_nid = ALC883_DIGIN_NID,
9787		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9788		.channel_mode = alc883_sixstack_modes,
9789		.input_mux = &alc883_capture_source,
9790	},
9791	[ALC883_TARGA_DIG] = {
9792		.mixers = { alc883_targa_mixer, alc883_chmode_mixer },
9793		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9794				alc883_targa_verbs},
9795		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9796		.dac_nids = alc883_dac_nids,
9797		.dig_out_nid = ALC883_DIGOUT_NID,
9798		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9799		.channel_mode = alc883_3ST_6ch_modes,
9800		.need_dac_fix = 1,
9801		.input_mux = &alc883_capture_source,
9802		.unsol_event = alc883_targa_unsol_event,
9803		.setup = alc882_targa_setup,
9804		.init_hook = alc882_targa_automute,
9805	},
9806	[ALC883_TARGA_2ch_DIG] = {
9807		.mixers = { alc883_targa_2ch_mixer},
9808		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9809				alc883_targa_verbs},
9810		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9811		.dac_nids = alc883_dac_nids,
9812		.adc_nids = alc883_adc_nids_alt,
9813		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9814		.capsrc_nids = alc883_capsrc_nids,
9815		.dig_out_nid = ALC883_DIGOUT_NID,
9816		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9817		.channel_mode = alc883_3ST_2ch_modes,
9818		.input_mux = &alc883_capture_source,
9819		.unsol_event = alc883_targa_unsol_event,
9820		.setup = alc882_targa_setup,
9821		.init_hook = alc882_targa_automute,
9822	},
9823	[ALC883_TARGA_8ch_DIG] = {
9824		.mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
9825			    alc883_chmode_mixer },
9826		.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9827				alc883_targa_verbs },
9828		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9829		.dac_nids = alc883_dac_nids,
9830		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9831		.adc_nids = alc883_adc_nids_rev,
9832		.capsrc_nids = alc883_capsrc_nids_rev,
9833		.dig_out_nid = ALC883_DIGOUT_NID,
9834		.dig_in_nid = ALC883_DIGIN_NID,
9835		.num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
9836		.channel_mode = alc883_4ST_8ch_modes,
9837		.need_dac_fix = 1,
9838		.input_mux = &alc883_capture_source,
9839		.unsol_event = alc883_targa_unsol_event,
9840		.setup = alc882_targa_setup,
9841		.init_hook = alc882_targa_automute,
9842	},
9843	[ALC883_ACER] = {
9844		.mixers = { alc883_base_mixer },
9845		/* On TravelMate laptops, GPIO 0 enables the internal speaker
9846		 * and the headphone jack.  Turn this on and rely on the
9847		 * standard mute methods whenever the user wants to turn
9848		 * these outputs off.
9849		 */
9850		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
9851		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9852		.dac_nids = alc883_dac_nids,
9853		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9854		.channel_mode = alc883_3ST_2ch_modes,
9855		.input_mux = &alc883_capture_source,
9856	},
9857	[ALC883_ACER_ASPIRE] = {
9858		.mixers = { alc883_acer_aspire_mixer },
9859		.init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
9860		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9861		.dac_nids = alc883_dac_nids,
9862		.dig_out_nid = ALC883_DIGOUT_NID,
9863		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9864		.channel_mode = alc883_3ST_2ch_modes,
9865		.input_mux = &alc883_capture_source,
9866		.unsol_event = alc_automute_amp_unsol_event,
9867		.setup = alc883_acer_aspire_setup,
9868		.init_hook = alc_automute_amp,
9869	},
9870	[ALC888_ACER_ASPIRE_4930G] = {
9871		.mixers = { alc888_base_mixer,
9872				alc883_chmode_mixer },
9873		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9874				alc888_acer_aspire_4930g_verbs },
9875		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9876		.dac_nids = alc883_dac_nids,
9877		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9878		.adc_nids = alc883_adc_nids_rev,
9879		.capsrc_nids = alc883_capsrc_nids_rev,
9880		.dig_out_nid = ALC883_DIGOUT_NID,
9881		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9882		.channel_mode = alc883_3ST_6ch_modes,
9883		.need_dac_fix = 1,
9884		.const_channel_count = 6,
9885		.num_mux_defs =
9886			ARRAY_SIZE(alc888_2_capture_sources),
9887		.input_mux = alc888_2_capture_sources,
9888		.unsol_event = alc_automute_amp_unsol_event,
9889		.setup = alc888_acer_aspire_4930g_setup,
9890		.init_hook = alc_automute_amp,
9891	},
9892	[ALC888_ACER_ASPIRE_6530G] = {
9893		.mixers = { alc888_acer_aspire_6530_mixer },
9894		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9895				alc888_acer_aspire_6530g_verbs },
9896		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9897		.dac_nids = alc883_dac_nids,
9898		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9899		.adc_nids = alc883_adc_nids_rev,
9900		.capsrc_nids = alc883_capsrc_nids_rev,
9901		.dig_out_nid = ALC883_DIGOUT_NID,
9902		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9903		.channel_mode = alc883_3ST_2ch_modes,
9904		.num_mux_defs =
9905			ARRAY_SIZE(alc888_2_capture_sources),
9906		.input_mux = alc888_acer_aspire_6530_sources,
9907		.unsol_event = alc_automute_amp_unsol_event,
9908		.setup = alc888_acer_aspire_6530g_setup,
9909		.init_hook = alc_automute_amp,
9910	},
9911	[ALC888_ACER_ASPIRE_8930G] = {
9912		.mixers = { alc889_acer_aspire_8930g_mixer,
9913				alc883_chmode_mixer },
9914		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9915				alc889_acer_aspire_8930g_verbs,
9916				alc889_eapd_verbs},
9917		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9918		.dac_nids = alc883_dac_nids,
9919		.num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9920		.adc_nids = alc889_adc_nids,
9921		.capsrc_nids = alc889_capsrc_nids,
9922		.dig_out_nid = ALC883_DIGOUT_NID,
9923		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9924		.channel_mode = alc883_3ST_6ch_modes,
9925		.need_dac_fix = 1,
9926		.const_channel_count = 6,
9927		.num_mux_defs =
9928			ARRAY_SIZE(alc889_capture_sources),
9929		.input_mux = alc889_capture_sources,
9930		.unsol_event = alc_automute_amp_unsol_event,
9931		.setup = alc889_acer_aspire_8930g_setup,
9932		.init_hook = alc_automute_amp,
9933#ifdef CONFIG_SND_HDA_POWER_SAVE
9934		.power_hook = alc_power_eapd,
9935#endif
9936	},
9937	[ALC888_ACER_ASPIRE_7730G] = {
9938		.mixers = { alc883_3ST_6ch_mixer,
9939				alc883_chmode_mixer },
9940		.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9941				alc888_acer_aspire_7730G_verbs },
9942		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9943		.dac_nids = alc883_dac_nids,
9944		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9945		.adc_nids = alc883_adc_nids_rev,
9946		.capsrc_nids = alc883_capsrc_nids_rev,
9947		.dig_out_nid = ALC883_DIGOUT_NID,
9948		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9949		.channel_mode = alc883_3ST_6ch_modes,
9950		.need_dac_fix = 1,
9951		.const_channel_count = 6,
9952		.input_mux = &alc883_capture_source,
9953		.unsol_event = alc_automute_amp_unsol_event,
9954		.setup = alc888_acer_aspire_6530g_setup,
9955		.init_hook = alc_automute_amp,
9956	},
9957	[ALC883_MEDION] = {
9958		.mixers = { alc883_fivestack_mixer,
9959			    alc883_chmode_mixer },
9960		.init_verbs = { alc883_init_verbs,
9961				alc883_medion_eapd_verbs },
9962		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9963		.dac_nids = alc883_dac_nids,
9964		.adc_nids = alc883_adc_nids_alt,
9965		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9966		.capsrc_nids = alc883_capsrc_nids,
9967		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9968		.channel_mode = alc883_sixstack_modes,
9969		.input_mux = &alc883_capture_source,
9970	},
9971	[ALC883_MEDION_MD2] = {
9972		.mixers = { alc883_medion_md2_mixer},
9973		.init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
9974		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9975		.dac_nids = alc883_dac_nids,
9976		.dig_out_nid = ALC883_DIGOUT_NID,
9977		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9978		.channel_mode = alc883_3ST_2ch_modes,
9979		.input_mux = &alc883_capture_source,
9980		.unsol_event = alc_automute_amp_unsol_event,
9981		.setup = alc883_medion_md2_setup,
9982		.init_hook = alc_automute_amp,
9983	},
9984	[ALC883_MEDION_WIM2160] = {
9985		.mixers = { alc883_medion_wim2160_mixer },
9986		.init_verbs = { alc883_init_verbs, alc883_medion_wim2160_verbs },
9987		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
9988		.dac_nids = alc883_dac_nids,
9989		.dig_out_nid = ALC883_DIGOUT_NID,
9990		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
9991		.adc_nids = alc883_adc_nids,
9992		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9993		.channel_mode = alc883_3ST_2ch_modes,
9994		.input_mux = &alc883_capture_source,
9995		.unsol_event = alc_automute_amp_unsol_event,
9996		.setup = alc883_medion_wim2160_setup,
9997		.init_hook = alc_automute_amp,
9998	},
9999	[ALC883_LAPTOP_EAPD] = {
10000		.mixers = { alc883_base_mixer },
10001		.init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
10002		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10003		.dac_nids = alc883_dac_nids,
10004		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10005		.channel_mode = alc883_3ST_2ch_modes,
10006		.input_mux = &alc883_capture_source,
10007	},
10008	[ALC883_CLEVO_M540R] = {
10009		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10010		.init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
10011		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10012		.dac_nids = alc883_dac_nids,
10013		.dig_out_nid = ALC883_DIGOUT_NID,
10014		.dig_in_nid = ALC883_DIGIN_NID,
10015		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
10016		.channel_mode = alc883_3ST_6ch_clevo_modes,
10017		.need_dac_fix = 1,
10018		.input_mux = &alc883_capture_source,
10019		/* This machine has the hardware HP auto-muting, thus
10020		 * we need no software mute via unsol event
10021		 */
10022	},
10023	[ALC883_CLEVO_M720] = {
10024		.mixers = { alc883_clevo_m720_mixer },
10025		.init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
10026		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10027		.dac_nids = alc883_dac_nids,
10028		.dig_out_nid = ALC883_DIGOUT_NID,
10029		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10030		.channel_mode = alc883_3ST_2ch_modes,
10031		.input_mux = &alc883_capture_source,
10032		.unsol_event = alc883_clevo_m720_unsol_event,
10033		.setup = alc883_clevo_m720_setup,
10034		.init_hook = alc883_clevo_m720_init_hook,
10035	},
10036	[ALC883_LENOVO_101E_2ch] = {
10037		.mixers = { alc883_lenovo_101e_2ch_mixer},
10038		.init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
10039		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10040		.dac_nids = alc883_dac_nids,
10041		.adc_nids = alc883_adc_nids_alt,
10042		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
10043		.capsrc_nids = alc883_capsrc_nids,
10044		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10045		.channel_mode = alc883_3ST_2ch_modes,
10046		.input_mux = &alc883_lenovo_101e_capture_source,
10047		.unsol_event = alc883_lenovo_101e_unsol_event,
10048		.init_hook = alc883_lenovo_101e_all_automute,
10049	},
10050	[ALC883_LENOVO_NB0763] = {
10051		.mixers = { alc883_lenovo_nb0763_mixer },
10052		.init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
10053		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10054		.dac_nids = alc883_dac_nids,
10055		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10056		.channel_mode = alc883_3ST_2ch_modes,
10057		.need_dac_fix = 1,
10058		.input_mux = &alc883_lenovo_nb0763_capture_source,
10059		.unsol_event = alc_automute_amp_unsol_event,
10060		.setup = alc883_medion_md2_setup,
10061		.init_hook = alc_automute_amp,
10062	},
10063	[ALC888_LENOVO_MS7195_DIG] = {
10064		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10065		.init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
10066		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10067		.dac_nids = alc883_dac_nids,
10068		.dig_out_nid = ALC883_DIGOUT_NID,
10069		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10070		.channel_mode = alc883_3ST_6ch_modes,
10071		.need_dac_fix = 1,
10072		.input_mux = &alc883_capture_source,
10073		.unsol_event = alc883_lenovo_ms7195_unsol_event,
10074		.init_hook = alc888_lenovo_ms7195_front_automute,
10075	},
10076	[ALC883_HAIER_W66] = {
10077		.mixers = { alc883_targa_2ch_mixer},
10078		.init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
10079		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10080		.dac_nids = alc883_dac_nids,
10081		.dig_out_nid = ALC883_DIGOUT_NID,
10082		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10083		.channel_mode = alc883_3ST_2ch_modes,
10084		.input_mux = &alc883_capture_source,
10085		.unsol_event = alc_automute_amp_unsol_event,
10086		.setup = alc883_haier_w66_setup,
10087		.init_hook = alc_automute_amp,
10088	},
10089	[ALC888_3ST_HP] = {
10090		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10091		.init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
10092		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10093		.dac_nids = alc883_dac_nids,
10094		.num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
10095		.channel_mode = alc888_3st_hp_modes,
10096		.need_dac_fix = 1,
10097		.input_mux = &alc883_capture_source,
10098		.unsol_event = alc_automute_amp_unsol_event,
10099		.setup = alc888_3st_hp_setup,
10100		.init_hook = alc_automute_amp,
10101	},
10102	[ALC888_6ST_DELL] = {
10103		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
10104		.init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
10105		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10106		.dac_nids = alc883_dac_nids,
10107		.dig_out_nid = ALC883_DIGOUT_NID,
10108		.dig_in_nid = ALC883_DIGIN_NID,
10109		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10110		.channel_mode = alc883_sixstack_modes,
10111		.input_mux = &alc883_capture_source,
10112		.unsol_event = alc_automute_amp_unsol_event,
10113		.setup = alc888_6st_dell_setup,
10114		.init_hook = alc_automute_amp,
10115	},
10116	[ALC883_MITAC] = {
10117		.mixers = { alc883_mitac_mixer },
10118		.init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
10119		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10120		.dac_nids = alc883_dac_nids,
10121		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10122		.channel_mode = alc883_3ST_2ch_modes,
10123		.input_mux = &alc883_capture_source,
10124		.unsol_event = alc_automute_amp_unsol_event,
10125		.setup = alc883_mitac_setup,
10126		.init_hook = alc_automute_amp,
10127	},
10128	[ALC883_FUJITSU_PI2515] = {
10129		.mixers = { alc883_2ch_fujitsu_pi2515_mixer },
10130		.init_verbs = { alc883_init_verbs,
10131				alc883_2ch_fujitsu_pi2515_verbs},
10132		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10133		.dac_nids = alc883_dac_nids,
10134		.dig_out_nid = ALC883_DIGOUT_NID,
10135		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10136		.channel_mode = alc883_3ST_2ch_modes,
10137		.input_mux = &alc883_fujitsu_pi2515_capture_source,
10138		.unsol_event = alc_automute_amp_unsol_event,
10139		.setup = alc883_2ch_fujitsu_pi2515_setup,
10140		.init_hook = alc_automute_amp,
10141	},
10142	[ALC888_FUJITSU_XA3530] = {
10143		.mixers = { alc888_base_mixer, alc883_chmode_mixer },
10144		.init_verbs = { alc883_init_verbs,
10145			alc888_fujitsu_xa3530_verbs },
10146		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10147		.dac_nids = alc883_dac_nids,
10148		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10149		.adc_nids = alc883_adc_nids_rev,
10150		.capsrc_nids = alc883_capsrc_nids_rev,
10151		.dig_out_nid = ALC883_DIGOUT_NID,
10152		.num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
10153		.channel_mode = alc888_4ST_8ch_intel_modes,
10154		.num_mux_defs =
10155			ARRAY_SIZE(alc888_2_capture_sources),
10156		.input_mux = alc888_2_capture_sources,
10157		.unsol_event = alc_automute_amp_unsol_event,
10158		.setup = alc888_fujitsu_xa3530_setup,
10159		.init_hook = alc_automute_amp,
10160	},
10161	[ALC888_LENOVO_SKY] = {
10162		.mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
10163		.init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
10164		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10165		.dac_nids = alc883_dac_nids,
10166		.dig_out_nid = ALC883_DIGOUT_NID,
10167		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10168		.channel_mode = alc883_sixstack_modes,
10169		.need_dac_fix = 1,
10170		.input_mux = &alc883_lenovo_sky_capture_source,
10171		.unsol_event = alc_automute_amp_unsol_event,
10172		.setup = alc888_lenovo_sky_setup,
10173		.init_hook = alc_automute_amp,
10174	},
10175	[ALC888_ASUS_M90V] = {
10176		.mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10177		.init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
10178		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10179		.dac_nids = alc883_dac_nids,
10180		.dig_out_nid = ALC883_DIGOUT_NID,
10181		.dig_in_nid = ALC883_DIGIN_NID,
10182		.num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10183		.channel_mode = alc883_3ST_6ch_modes,
10184		.need_dac_fix = 1,
10185		.input_mux = &alc883_fujitsu_pi2515_capture_source,
10186		.unsol_event = alc_sku_unsol_event,
10187		.setup = alc883_mode2_setup,
10188		.init_hook = alc_inithook,
10189	},
10190	[ALC888_ASUS_EEE1601] = {
10191		.mixers = { alc883_asus_eee1601_mixer },
10192		.cap_mixer = alc883_asus_eee1601_cap_mixer,
10193		.init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
10194		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10195		.dac_nids = alc883_dac_nids,
10196		.dig_out_nid = ALC883_DIGOUT_NID,
10197		.dig_in_nid = ALC883_DIGIN_NID,
10198		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10199		.channel_mode = alc883_3ST_2ch_modes,
10200		.need_dac_fix = 1,
10201		.input_mux = &alc883_asus_eee1601_capture_source,
10202		.unsol_event = alc_sku_unsol_event,
10203		.init_hook = alc883_eee1601_inithook,
10204	},
10205	[ALC1200_ASUS_P5Q] = {
10206		.mixers = { alc883_base_mixer, alc883_chmode_mixer },
10207		.init_verbs = { alc883_init_verbs },
10208		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10209		.dac_nids = alc883_dac_nids,
10210		.dig_out_nid = ALC1200_DIGOUT_NID,
10211		.dig_in_nid = ALC883_DIGIN_NID,
10212		.slave_dig_outs = alc1200_slave_dig_outs,
10213		.num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10214		.channel_mode = alc883_sixstack_modes,
10215		.input_mux = &alc883_capture_source,
10216	},
10217	[ALC889A_MB31] = {
10218		.mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
10219		.init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
10220			alc880_gpio1_init_verbs },
10221		.adc_nids = alc883_adc_nids,
10222		.num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
10223		.capsrc_nids = alc883_capsrc_nids,
10224		.dac_nids = alc883_dac_nids,
10225		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10226		.channel_mode = alc889A_mb31_6ch_modes,
10227		.num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
10228		.input_mux = &alc889A_mb31_capture_source,
10229		.dig_out_nid = ALC883_DIGOUT_NID,
10230		.unsol_event = alc889A_mb31_unsol_event,
10231		.init_hook = alc889A_mb31_automute,
10232	},
10233	[ALC883_SONY_VAIO_TT] = {
10234		.mixers = { alc883_vaiott_mixer },
10235		.init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
10236		.num_dacs = ARRAY_SIZE(alc883_dac_nids),
10237		.dac_nids = alc883_dac_nids,
10238		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10239		.channel_mode = alc883_3ST_2ch_modes,
10240		.input_mux = &alc883_capture_source,
10241		.unsol_event = alc_automute_amp_unsol_event,
10242		.setup = alc883_vaiott_setup,
10243		.init_hook = alc_automute_amp,
10244	},
10245};
10246
10247
10248/*
10249 * Pin config fixes
10250 */
10251enum {
10252	PINFIX_ABIT_AW9D_MAX
10253};
10254
10255static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
10256	{ 0x15, 0x01080104 }, /* side */
10257	{ 0x16, 0x01011012 }, /* rear */
10258	{ 0x17, 0x01016011 }, /* clfe */
10259	{ }
10260};
10261
10262static const struct alc_fixup alc882_fixups[] = {
10263	[PINFIX_ABIT_AW9D_MAX] = {
10264		.pins = alc882_abit_aw9d_pinfix
10265	},
10266};
10267
10268static struct snd_pci_quirk alc882_fixup_tbl[] = {
10269	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
10270	{}
10271};
10272
10273/*
10274 * BIOS auto configuration
10275 */
10276static int alc882_auto_create_input_ctls(struct hda_codec *codec,
10277						const struct auto_pin_cfg *cfg)
10278{
10279	return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
10280}
10281
10282static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
10283					      hda_nid_t nid, int pin_type,
10284					      hda_nid_t dac)
10285{
10286	int idx;
10287
10288	/* set as output */
10289	alc_set_pin_output(codec, nid, pin_type);
10290
10291	if (dac == 0x25)
10292		idx = 4;
10293	else if (dac >= 0x02 && dac <= 0x05)
10294		idx = dac - 2;
10295	else
10296		return;
10297	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
10298}
10299
10300static void alc882_auto_init_multi_out(struct hda_codec *codec)
10301{
10302	struct alc_spec *spec = codec->spec;
10303	int i;
10304
10305	for (i = 0; i <= HDA_SIDE; i++) {
10306		hda_nid_t nid = spec->autocfg.line_out_pins[i];
10307		int pin_type = get_pin_type(spec->autocfg.line_out_type);
10308		if (nid)
10309			alc882_auto_set_output_and_unmute(codec, nid, pin_type,
10310					spec->multiout.dac_nids[i]);
10311	}
10312}
10313
10314static void alc882_auto_init_hp_out(struct hda_codec *codec)
10315{
10316	struct alc_spec *spec = codec->spec;
10317	hda_nid_t pin, dac;
10318
10319	pin = spec->autocfg.hp_pins[0];
10320	if (pin) {
10321		dac = spec->multiout.hp_nid;
10322		if (!dac)
10323			dac = spec->multiout.dac_nids[0]; /* to front */
10324		alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, dac);
10325	}
10326	pin = spec->autocfg.speaker_pins[0];
10327	if (pin) {
10328		dac = spec->multiout.extra_out_nid[0];
10329		if (!dac)
10330			dac = spec->multiout.dac_nids[0]; /* to front */
10331		alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, dac);
10332	}
10333}
10334
10335static void alc882_auto_init_analog_input(struct hda_codec *codec)
10336{
10337	struct alc_spec *spec = codec->spec;
10338	int i;
10339
10340	for (i = 0; i < AUTO_PIN_LAST; i++) {
10341		hda_nid_t nid = spec->autocfg.input_pins[i];
10342		if (!nid)
10343			continue;
10344		alc_set_input_pin(codec, nid, i);
10345		if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
10346			snd_hda_codec_write(codec, nid, 0,
10347					    AC_VERB_SET_AMP_GAIN_MUTE,
10348					    AMP_OUT_MUTE);
10349	}
10350}
10351
10352static void alc882_auto_init_input_src(struct hda_codec *codec)
10353{
10354	struct alc_spec *spec = codec->spec;
10355	int c;
10356
10357	for (c = 0; c < spec->num_adc_nids; c++) {
10358		hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
10359		hda_nid_t nid = spec->capsrc_nids[c];
10360		unsigned int mux_idx;
10361		const struct hda_input_mux *imux;
10362		int conns, mute, idx, item;
10363
10364		conns = snd_hda_get_connections(codec, nid, conn_list,
10365						ARRAY_SIZE(conn_list));
10366		if (conns < 0)
10367			continue;
10368		mux_idx = c >= spec->num_mux_defs ? 0 : c;
10369		imux = &spec->input_mux[mux_idx];
10370		if (!imux->num_items && mux_idx > 0)
10371			imux = &spec->input_mux[0];
10372		for (idx = 0; idx < conns; idx++) {
10373			/* if the current connection is the selected one,
10374			 * unmute it as default - otherwise mute it
10375			 */
10376			mute = AMP_IN_MUTE(idx);
10377			for (item = 0; item < imux->num_items; item++) {
10378				if (imux->items[item].index == idx) {
10379					if (spec->cur_mux[c] == item)
10380						mute = AMP_IN_UNMUTE(idx);
10381					break;
10382				}
10383			}
10384			/* check if we have a selector or mixer
10385			 * we could check for the widget type instead, but
10386			 * just check for Amp-In presence (in case of mixer
10387			 * without amp-in there is something wrong, this
10388			 * function shouldn't be used or capsrc nid is wrong)
10389			 */
10390			if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
10391				snd_hda_codec_write(codec, nid, 0,
10392						    AC_VERB_SET_AMP_GAIN_MUTE,
10393						    mute);
10394			else if (mute != AMP_IN_MUTE(idx))
10395				snd_hda_codec_write(codec, nid, 0,
10396						    AC_VERB_SET_CONNECT_SEL,
10397						    idx);
10398		}
10399	}
10400}
10401
10402/* add mic boosts if needed */
10403static int alc_auto_add_mic_boost(struct hda_codec *codec)
10404{
10405	struct alc_spec *spec = codec->spec;
10406	int err;
10407	hda_nid_t nid;
10408
10409	nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
10410	if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10411		err = add_control(spec, ALC_CTL_WIDGET_VOL,
10412				  "Mic Boost",
10413				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10414		if (err < 0)
10415			return err;
10416	}
10417	nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
10418	if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10419		err = add_control(spec, ALC_CTL_WIDGET_VOL,
10420				  "Front Mic Boost",
10421				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10422		if (err < 0)
10423			return err;
10424	}
10425	return 0;
10426}
10427
10428/* almost identical with ALC880 parser... */
10429static int alc882_parse_auto_config(struct hda_codec *codec)
10430{
10431	struct alc_spec *spec = codec->spec;
10432	static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
10433	int i, err;
10434
10435	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
10436					   alc882_ignore);
10437	if (err < 0)
10438		return err;
10439	if (!spec->autocfg.line_outs)
10440		return 0; /* can't find valid BIOS pin config */
10441
10442	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
10443	if (err < 0)
10444		return err;
10445	err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
10446	if (err < 0)
10447		return err;
10448	err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
10449					   "Headphone");
10450	if (err < 0)
10451		return err;
10452	err = alc880_auto_create_extra_out(spec,
10453					   spec->autocfg.speaker_pins[0],
10454					   "Speaker");
10455	if (err < 0)
10456		return err;
10457	err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
10458	if (err < 0)
10459		return err;
10460
10461	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
10462
10463	/* check multiple SPDIF-out (for recent codecs) */
10464	for (i = 0; i < spec->autocfg.dig_outs; i++) {
10465		hda_nid_t dig_nid;
10466		err = snd_hda_get_connections(codec,
10467					      spec->autocfg.dig_out_pins[i],
10468					      &dig_nid, 1);
10469		if (err < 0)
10470			continue;
10471		if (!i)
10472			spec->multiout.dig_out_nid = dig_nid;
10473		else {
10474			spec->multiout.slave_dig_outs = spec->slave_dig_outs;
10475			if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
10476				break;
10477			spec->slave_dig_outs[i - 1] = dig_nid;
10478		}
10479	}
10480	if (spec->autocfg.dig_in_pin)
10481		spec->dig_in_nid = ALC880_DIGIN_NID;
10482
10483	if (spec->kctls.list)
10484		add_mixer(spec, spec->kctls.list);
10485
10486	add_verb(spec, alc883_auto_init_verbs);
10487	/* if ADC 0x07 is available, initialize it, too */
10488	if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
10489		add_verb(spec, alc882_adc1_init_verbs);
10490
10491	spec->num_mux_defs = 1;
10492	spec->input_mux = &spec->private_imux[0];
10493
10494	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
10495
10496	err = alc_auto_add_mic_boost(codec);
10497	if (err < 0)
10498		return err;
10499
10500	return 1; /* config found */
10501}
10502
10503/* additional initialization for auto-configuration model */
10504static void alc882_auto_init(struct hda_codec *codec)
10505{
10506	struct alc_spec *spec = codec->spec;
10507	alc882_auto_init_multi_out(codec);
10508	alc882_auto_init_hp_out(codec);
10509	alc882_auto_init_analog_input(codec);
10510	alc882_auto_init_input_src(codec);
10511	if (spec->unsol_event)
10512		alc_inithook(codec);
10513}
10514
10515static int patch_alc882(struct hda_codec *codec)
10516{
10517	struct alc_spec *spec;
10518	int err, board_config;
10519
10520	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
10521	if (spec == NULL)
10522		return -ENOMEM;
10523
10524	codec->spec = spec;
10525
10526	alc_auto_parse_customize_define(codec);
10527
10528	switch (codec->vendor_id) {
10529	case 0x10ec0882:
10530	case 0x10ec0885:
10531		break;
10532	default:
10533		/* ALC883 and variants */
10534		alc_fix_pll_init(codec, 0x20, 0x0a, 10);
10535		break;
10536	}
10537
10538	board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
10539						  alc882_models,
10540						  alc882_cfg_tbl);
10541
10542	if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
10543		board_config = snd_hda_check_board_codec_sid_config(codec,
10544			ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
10545
10546	if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
10547		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
10548		       codec->chip_name);
10549		board_config = ALC882_AUTO;
10550	}
10551
10552	if (board_config == ALC882_AUTO)
10553		alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 1);
10554
10555	if (board_config == ALC882_AUTO) {
10556		/* automatic parse from the BIOS config */
10557		err = alc882_parse_auto_config(codec);
10558		if (err < 0) {
10559			alc_free(codec);
10560			return err;
10561		} else if (!err) {
10562			printk(KERN_INFO
10563			       "hda_codec: Cannot set up configuration "
10564			       "from BIOS.  Using base mode...\n");
10565			board_config = ALC882_3ST_DIG;
10566		}
10567	}
10568
10569	if (spec->cdefine.enable_pcbeep) {
10570		err = snd_hda_attach_beep_device(codec, 0x1);
10571		if (err < 0) {
10572			alc_free(codec);
10573			return err;
10574		}
10575	}
10576
10577	if (board_config != ALC882_AUTO)
10578		setup_preset(codec, &alc882_presets[board_config]);
10579
10580	spec->stream_analog_playback = &alc882_pcm_analog_playback;
10581	spec->stream_analog_capture = &alc882_pcm_analog_capture;
10582	/* FIXME: setup DAC5 */
10583	/*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
10584	spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
10585
10586	spec->stream_digital_playback = &alc882_pcm_digital_playback;
10587	spec->stream_digital_capture = &alc882_pcm_digital_capture;
10588
10589	if (!spec->adc_nids && spec->input_mux) {
10590		int i, j;
10591		spec->num_adc_nids = 0;
10592		for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
10593			const struct hda_input_mux *imux = spec->input_mux;
10594			hda_nid_t cap;
10595			hda_nid_t items[16];
10596			hda_nid_t nid = alc882_adc_nids[i];
10597			unsigned int wcap = get_wcaps(codec, nid);
10598			/* get type */
10599			wcap = get_wcaps_type(wcap);
10600			if (wcap != AC_WID_AUD_IN)
10601				continue;
10602			spec->private_adc_nids[spec->num_adc_nids] = nid;
10603			err = snd_hda_get_connections(codec, nid, &cap, 1);
10604			if (err < 0)
10605				continue;
10606			err = snd_hda_get_connections(codec, cap, items,
10607						      ARRAY_SIZE(items));
10608			if (err < 0)
10609				continue;
10610			for (j = 0; j < imux->num_items; j++)
10611				if (imux->items[j].index >= err)
10612					break;
10613			if (j < imux->num_items)
10614				continue;
10615			spec->private_capsrc_nids[spec->num_adc_nids] = cap;
10616			spec->num_adc_nids++;
10617		}
10618		spec->adc_nids = spec->private_adc_nids;
10619		spec->capsrc_nids = spec->private_capsrc_nids;
10620	}
10621
10622	set_capture_mixer(codec);
10623
10624	if (spec->cdefine.enable_pcbeep)
10625		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10626
10627	if (board_config == ALC882_AUTO)
10628		alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 0);
10629
10630	spec->vmaster_nid = 0x0c;
10631
10632	codec->patch_ops = alc_patch_ops;
10633	if (board_config == ALC882_AUTO)
10634		spec->init_hook = alc882_auto_init;
10635#ifdef CONFIG_SND_HDA_POWER_SAVE
10636	if (!spec->loopback.amplist)
10637		spec->loopback.amplist = alc882_loopbacks;
10638#endif
10639
10640	return 0;
10641}
10642
10643
10644/*
10645 * ALC262 support
10646 */
10647
10648#define ALC262_DIGOUT_NID	ALC880_DIGOUT_NID
10649#define ALC262_DIGIN_NID	ALC880_DIGIN_NID
10650
10651#define alc262_dac_nids		alc260_dac_nids
10652#define alc262_adc_nids		alc882_adc_nids
10653#define alc262_adc_nids_alt	alc882_adc_nids_alt
10654#define alc262_capsrc_nids	alc882_capsrc_nids
10655#define alc262_capsrc_nids_alt	alc882_capsrc_nids_alt
10656
10657#define alc262_modes		alc260_modes
10658#define alc262_capture_source	alc882_capture_source
10659
10660static hda_nid_t alc262_dmic_adc_nids[1] = {
10661	/* ADC0 */
10662	0x09
10663};
10664
10665static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
10666
10667static struct snd_kcontrol_new alc262_base_mixer[] = {
10668	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10669	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10670	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10671	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10672	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10673	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10674	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10675	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10676	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10677	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10678	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10679	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10680	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
10681	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10682	HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
10683	HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
10684	{ } /* end */
10685};
10686
10687/* update HP, line and mono-out pins according to the master switch */
10688static void alc262_hp_master_update(struct hda_codec *codec)
10689{
10690	struct alc_spec *spec = codec->spec;
10691	int val = spec->master_sw;
10692
10693	/* HP & line-out */
10694	snd_hda_codec_write_cache(codec, 0x1b, 0,
10695				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10696				  val ? PIN_HP : 0);
10697	snd_hda_codec_write_cache(codec, 0x15, 0,
10698				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10699				  val ? PIN_HP : 0);
10700	/* mono (speaker) depending on the HP jack sense */
10701	val = val && !spec->jack_present;
10702	snd_hda_codec_write_cache(codec, 0x16, 0,
10703				  AC_VERB_SET_PIN_WIDGET_CONTROL,
10704				  val ? PIN_OUT : 0);
10705}
10706
10707static void alc262_hp_bpc_automute(struct hda_codec *codec)
10708{
10709	struct alc_spec *spec = codec->spec;
10710
10711	spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
10712	alc262_hp_master_update(codec);
10713}
10714
10715static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10716{
10717	if ((res >> 26) != ALC880_HP_EVENT)
10718		return;
10719	alc262_hp_bpc_automute(codec);
10720}
10721
10722static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10723{
10724	struct alc_spec *spec = codec->spec;
10725
10726	spec->jack_present = snd_hda_jack_detect(codec, 0x15);
10727	alc262_hp_master_update(codec);
10728}
10729
10730static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10731					   unsigned int res)
10732{
10733	if ((res >> 26) != ALC880_HP_EVENT)
10734		return;
10735	alc262_hp_wildwest_automute(codec);
10736}
10737
10738#define alc262_hp_master_sw_get		alc260_hp_master_sw_get
10739
10740static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10741				   struct snd_ctl_elem_value *ucontrol)
10742{
10743	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10744	struct alc_spec *spec = codec->spec;
10745	int val = !!*ucontrol->value.integer.value;
10746
10747	if (val == spec->master_sw)
10748		return 0;
10749	spec->master_sw = val;
10750	alc262_hp_master_update(codec);
10751	return 1;
10752}
10753
10754#define ALC262_HP_MASTER_SWITCH					\
10755	{							\
10756		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		\
10757		.name = "Master Playback Switch",		\
10758		.info = snd_ctl_boolean_mono_info,		\
10759		.get = alc262_hp_master_sw_get,			\
10760		.put = alc262_hp_master_sw_put,			\
10761	}, \
10762	{							\
10763		.iface = NID_MAPPING,				\
10764		.name = "Master Playback Switch",		\
10765		.private_value = 0x15 | (0x16 << 8) | (0x1b << 16),	\
10766	}
10767
10768
10769static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
10770	ALC262_HP_MASTER_SWITCH,
10771	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10772	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10773	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10774	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10775			      HDA_OUTPUT),
10776	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10777			    HDA_OUTPUT),
10778	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10779	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10780	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10781	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10782	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10783	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10784	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10785	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10786	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10787	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10788	HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10789	HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10790	{ } /* end */
10791};
10792
10793static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
10794	ALC262_HP_MASTER_SWITCH,
10795	HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10796	HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10797	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10798	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10799	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10800			      HDA_OUTPUT),
10801	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10802			    HDA_OUTPUT),
10803	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10804	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
10805	HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
10806	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10807	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10808	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10809	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10810	{ } /* end */
10811};
10812
10813static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
10814	HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10815	HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10816	HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
10817	{ } /* end */
10818};
10819
10820/* mute/unmute internal speaker according to the hp jack and mute state */
10821static void alc262_hp_t5735_setup(struct hda_codec *codec)
10822{
10823	struct alc_spec *spec = codec->spec;
10824
10825	spec->autocfg.hp_pins[0] = 0x15;
10826	spec->autocfg.speaker_pins[0] = 0x14;
10827}
10828
10829static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
10830	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10831	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10832	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10833	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10834	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10835	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10836	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10837	{ } /* end */
10838};
10839
10840static struct hda_verb alc262_hp_t5735_verbs[] = {
10841	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10842	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10843
10844	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
10845	{ }
10846};
10847
10848static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
10849	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10850	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10851	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
10852	HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
10853	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10854	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10855	{ } /* end */
10856};
10857
10858static struct hda_verb alc262_hp_rp5700_verbs[] = {
10859	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10860	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10861	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10862	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10863	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10864	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10865	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10866	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10867	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10868	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10869	{}
10870};
10871
10872static struct hda_input_mux alc262_hp_rp5700_capture_source = {
10873	.num_items = 1,
10874	.items = {
10875		{ "Line", 0x1 },
10876	},
10877};
10878
10879/* bind hp and internal speaker mute (with plug check) as master switch */
10880static void alc262_hippo_master_update(struct hda_codec *codec)
10881{
10882	struct alc_spec *spec = codec->spec;
10883	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10884	hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
10885	hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
10886	unsigned int mute;
10887
10888	/* HP */
10889	mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
10890	snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
10891				 HDA_AMP_MUTE, mute);
10892	/* mute internal speaker per jack sense */
10893	if (spec->jack_present)
10894		mute = HDA_AMP_MUTE;
10895	if (line_nid)
10896		snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
10897					 HDA_AMP_MUTE, mute);
10898	if (speaker_nid && speaker_nid != line_nid)
10899		snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
10900					 HDA_AMP_MUTE, mute);
10901}
10902
10903#define alc262_hippo_master_sw_get	alc262_hp_master_sw_get
10904
10905static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
10906				      struct snd_ctl_elem_value *ucontrol)
10907{
10908	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10909	struct alc_spec *spec = codec->spec;
10910	int val = !!*ucontrol->value.integer.value;
10911
10912	if (val == spec->master_sw)
10913		return 0;
10914	spec->master_sw = val;
10915	alc262_hippo_master_update(codec);
10916	return 1;
10917}
10918
10919#define ALC262_HIPPO_MASTER_SWITCH				\
10920	{							\
10921		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		\
10922		.name = "Master Playback Switch",		\
10923		.info = snd_ctl_boolean_mono_info,		\
10924		.get = alc262_hippo_master_sw_get,		\
10925		.put = alc262_hippo_master_sw_put,		\
10926	},							\
10927	{							\
10928		.iface = NID_MAPPING,				\
10929		.name = "Master Playback Switch",		\
10930		.subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
10931			     (SUBDEV_SPEAKER(0) << 16), \
10932	}
10933
10934static struct snd_kcontrol_new alc262_hippo_mixer[] = {
10935	ALC262_HIPPO_MASTER_SWITCH,
10936	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10937	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10938	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10939	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10940	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10941	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10942	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10943	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10944	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10945	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10946	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10947	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10948	{ } /* end */
10949};
10950
10951static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
10952	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10953	ALC262_HIPPO_MASTER_SWITCH,
10954	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10955	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10956	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10957	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10958	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10959	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10960	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10961	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10962	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10963	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10964	{ } /* end */
10965};
10966
10967/* mute/unmute internal speaker according to the hp jack and mute state */
10968static void alc262_hippo_automute(struct hda_codec *codec)
10969{
10970	struct alc_spec *spec = codec->spec;
10971	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10972
10973	spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
10974	alc262_hippo_master_update(codec);
10975}
10976
10977static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
10978{
10979	if ((res >> 26) != ALC880_HP_EVENT)
10980		return;
10981	alc262_hippo_automute(codec);
10982}
10983
10984static void alc262_hippo_setup(struct hda_codec *codec)
10985{
10986	struct alc_spec *spec = codec->spec;
10987
10988	spec->autocfg.hp_pins[0] = 0x15;
10989	spec->autocfg.speaker_pins[0] = 0x14;
10990}
10991
10992static void alc262_hippo1_setup(struct hda_codec *codec)
10993{
10994	struct alc_spec *spec = codec->spec;
10995
10996	spec->autocfg.hp_pins[0] = 0x1b;
10997	spec->autocfg.speaker_pins[0] = 0x14;
10998}
10999
11000
11001static struct snd_kcontrol_new alc262_sony_mixer[] = {
11002	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11003	ALC262_HIPPO_MASTER_SWITCH,
11004	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11005	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11006	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11007	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11008	{ } /* end */
11009};
11010
11011static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
11012	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11013	ALC262_HIPPO_MASTER_SWITCH,
11014	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11015	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11016	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11017	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11018	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11019	{ } /* end */
11020};
11021
11022static struct snd_kcontrol_new alc262_tyan_mixer[] = {
11023	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11024	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11025	HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
11026	HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
11027	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11028	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11029	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11030	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11031	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11032	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11033	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11034	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11035	{ } /* end */
11036};
11037
11038static struct hda_verb alc262_tyan_verbs[] = {
11039	/* Headphone automute */
11040	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11041	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11042	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11043
11044	/* P11 AUX_IN, white 4-pin connector */
11045	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11046	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
11047	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
11048	{0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
11049
11050	{}
11051};
11052
11053/* unsolicited event for HP jack sensing */
11054static void alc262_tyan_setup(struct hda_codec *codec)
11055{
11056	struct alc_spec *spec = codec->spec;
11057
11058	spec->autocfg.hp_pins[0] = 0x1b;
11059	spec->autocfg.speaker_pins[0] = 0x15;
11060}
11061
11062
11063#define alc262_capture_mixer		alc882_capture_mixer
11064#define alc262_capture_alt_mixer	alc882_capture_alt_mixer
11065
11066/*
11067 * generic initialization of ADC, input mixers and output mixers
11068 */
11069static struct hda_verb alc262_init_verbs[] = {
11070	/*
11071	 * Unmute ADC0-2 and set the default input to mic-in
11072	 */
11073	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11074	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11075	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11076	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11077	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11078	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11079
11080	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11081	 * mixer widget
11082	 * Note: PASD motherboards uses the Line In 2 as the input for
11083	 * front panel mic (mic 2)
11084	 */
11085	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11086	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11087	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11088	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11089	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11090	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11091
11092	/*
11093	 * Set up output mixers (0x0c - 0x0e)
11094	 */
11095	/* set vol=0 to output mixers */
11096	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11097	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11098	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11099	/* set up input amps for analog loopback */
11100	/* Amp Indices: DAC = 0, mixer = 1 */
11101	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11102	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11103	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11104	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11105	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11106	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11107
11108	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11109	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11110	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11111	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11112	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11113	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11114
11115	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11116	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11117	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11118	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11119	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11120
11121	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11122	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11123
11124	/* FIXME: use matrix-type input source selection */
11125	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11126	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11127	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11128	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11129	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11130	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11131	/* Input mixer2 */
11132	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11133	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11134	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11135	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11136	/* Input mixer3 */
11137	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11138	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11139	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11140	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11141
11142	{ }
11143};
11144
11145static struct hda_verb alc262_eapd_verbs[] = {
11146	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
11147	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
11148	{ }
11149};
11150
11151static struct hda_verb alc262_hippo1_unsol_verbs[] = {
11152	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11153	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11154	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11155
11156	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11157	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11158	{}
11159};
11160
11161static struct hda_verb alc262_sony_unsol_verbs[] = {
11162	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11163	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11164	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},	// Front Mic
11165
11166	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11167	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11168	{}
11169};
11170
11171static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
11172	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11173	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11174	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11175	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11176	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11177	{ } /* end */
11178};
11179
11180static struct hda_verb alc262_toshiba_s06_verbs[] = {
11181	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11182	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11183	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11184	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11185	{0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
11186	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11187	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
11188	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11189	{}
11190};
11191
11192static void alc262_toshiba_s06_setup(struct hda_codec *codec)
11193{
11194	struct alc_spec *spec = codec->spec;
11195
11196	spec->autocfg.hp_pins[0] = 0x15;
11197	spec->autocfg.speaker_pins[0] = 0x14;
11198	spec->ext_mic.pin = 0x18;
11199	spec->ext_mic.mux_idx = 0;
11200	spec->int_mic.pin = 0x12;
11201	spec->int_mic.mux_idx = 9;
11202	spec->auto_mic = 1;
11203}
11204
11205/*
11206 * nec model
11207 *  0x15 = headphone
11208 *  0x16 = internal speaker
11209 *  0x18 = external mic
11210 */
11211
11212static struct snd_kcontrol_new alc262_nec_mixer[] = {
11213	HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
11214	HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
11215
11216	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11217	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11218	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11219
11220	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11221	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11222	{ } /* end */
11223};
11224
11225static struct hda_verb alc262_nec_verbs[] = {
11226	/* Unmute Speaker */
11227	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11228
11229	/* Headphone */
11230	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11231	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11232
11233	/* External mic to headphone */
11234	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11235	/* External mic to speaker */
11236	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11237	{}
11238};
11239
11240/*
11241 * fujitsu model
11242 *  0x14 = headphone/spdif-out, 0x15 = internal speaker,
11243 *  0x1b = port replicator headphone out
11244 */
11245
11246#define ALC_HP_EVENT	0x37
11247
11248static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
11249	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11250	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11251	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11252	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11253	{}
11254};
11255
11256static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
11257	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11258	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11259	{}
11260};
11261
11262static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
11263	/* Front Mic pin: input vref at 50% */
11264	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
11265	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11266	{}
11267};
11268
11269static struct hda_input_mux alc262_fujitsu_capture_source = {
11270	.num_items = 3,
11271	.items = {
11272		{ "Mic", 0x0 },
11273		{ "Int Mic", 0x1 },
11274		{ "CD", 0x4 },
11275	},
11276};
11277
11278static struct hda_input_mux alc262_HP_capture_source = {
11279	.num_items = 5,
11280	.items = {
11281		{ "Mic", 0x0 },
11282		{ "Front Mic", 0x1 },
11283		{ "Line", 0x2 },
11284		{ "CD", 0x4 },
11285		{ "AUX IN", 0x6 },
11286	},
11287};
11288
11289static struct hda_input_mux alc262_HP_D7000_capture_source = {
11290	.num_items = 4,
11291	.items = {
11292		{ "Mic", 0x0 },
11293		{ "Front Mic", 0x2 },
11294		{ "Line", 0x1 },
11295		{ "CD", 0x4 },
11296	},
11297};
11298
11299/* mute/unmute internal speaker according to the hp jacks and mute state */
11300static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
11301{
11302	struct alc_spec *spec = codec->spec;
11303	unsigned int mute;
11304
11305	if (force || !spec->sense_updated) {
11306		spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
11307				     snd_hda_jack_detect(codec, 0x1b);
11308		spec->sense_updated = 1;
11309	}
11310	/* unmute internal speaker only if both HPs are unplugged and
11311	 * master switch is on
11312	 */
11313	if (spec->jack_present)
11314		mute = HDA_AMP_MUTE;
11315	else
11316		mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
11317	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11318				 HDA_AMP_MUTE, mute);
11319}
11320
11321/* unsolicited event for HP jack sensing */
11322static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
11323				       unsigned int res)
11324{
11325	if ((res >> 26) != ALC_HP_EVENT)
11326		return;
11327	alc262_fujitsu_automute(codec, 1);
11328}
11329
11330static void alc262_fujitsu_init_hook(struct hda_codec *codec)
11331{
11332	alc262_fujitsu_automute(codec, 1);
11333}
11334
11335/* bind volumes of both NID 0x0c and 0x0d */
11336static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
11337	.ops = &snd_hda_bind_vol,
11338	.values = {
11339		HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
11340		HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
11341		0
11342	},
11343};
11344
11345/* mute/unmute internal speaker according to the hp jack and mute state */
11346static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
11347{
11348	struct alc_spec *spec = codec->spec;
11349	unsigned int mute;
11350
11351	if (force || !spec->sense_updated) {
11352		spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
11353		spec->sense_updated = 1;
11354	}
11355	if (spec->jack_present) {
11356		/* mute internal speaker */
11357		snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11358					 HDA_AMP_MUTE, HDA_AMP_MUTE);
11359		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11360					 HDA_AMP_MUTE, HDA_AMP_MUTE);
11361	} else {
11362		/* unmute internal speaker if necessary */
11363		mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
11364		snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11365					 HDA_AMP_MUTE, mute);
11366		snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11367					 HDA_AMP_MUTE, mute);
11368	}
11369}
11370
11371/* unsolicited event for HP jack sensing */
11372static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
11373				       unsigned int res)
11374{
11375	if ((res >> 26) != ALC_HP_EVENT)
11376		return;
11377	alc262_lenovo_3000_automute(codec, 1);
11378}
11379
11380static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
11381				  int dir, int idx, long *valp)
11382{
11383	int i, change = 0;
11384
11385	for (i = 0; i < 2; i++, valp++)
11386		change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
11387						   HDA_AMP_MUTE,
11388						   *valp ? 0 : HDA_AMP_MUTE);
11389	return change;
11390}
11391
11392/* bind hp and internal speaker mute (with plug check) */
11393static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
11394					 struct snd_ctl_elem_value *ucontrol)
11395{
11396	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11397	long *valp = ucontrol->value.integer.value;
11398	int change;
11399
11400	change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11401	change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11402	if (change)
11403		alc262_fujitsu_automute(codec, 0);
11404	return change;
11405}
11406
11407static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
11408	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11409	{
11410		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11411		.name = "Master Playback Switch",
11412		.subdevice = HDA_SUBDEV_AMP_FLAG,
11413		.info = snd_hda_mixer_amp_switch_info,
11414		.get = snd_hda_mixer_amp_switch_get,
11415		.put = alc262_fujitsu_master_sw_put,
11416		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11417	},
11418	{
11419		.iface = NID_MAPPING,
11420		.name = "Master Playback Switch",
11421		.private_value = 0x1b,
11422	},
11423	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11424	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11425	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11426	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11427	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11428	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11429	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11430	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11431	{ } /* end */
11432};
11433
11434/* bind hp and internal speaker mute (with plug check) */
11435static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
11436					 struct snd_ctl_elem_value *ucontrol)
11437{
11438	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11439	long *valp = ucontrol->value.integer.value;
11440	int change;
11441
11442	change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11443	if (change)
11444		alc262_lenovo_3000_automute(codec, 0);
11445	return change;
11446}
11447
11448static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
11449	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11450	{
11451		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11452		.name = "Master Playback Switch",
11453		.subdevice = HDA_SUBDEV_AMP_FLAG,
11454		.info = snd_hda_mixer_amp_switch_info,
11455		.get = snd_hda_mixer_amp_switch_get,
11456		.put = alc262_lenovo_3000_master_sw_put,
11457		.private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
11458	},
11459	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11460	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11461	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11462	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11463	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11464	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11465	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11466	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11467	{ } /* end */
11468};
11469
11470static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11471	HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11472	ALC262_HIPPO_MASTER_SWITCH,
11473	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11474	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11475	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11476	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11477	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11478	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11479	{ } /* end */
11480};
11481
11482/* additional init verbs for Benq laptops */
11483static struct hda_verb alc262_EAPD_verbs[] = {
11484	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11485	{0x20, AC_VERB_SET_PROC_COEF,  0x3070},
11486	{}
11487};
11488
11489static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11490	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11491	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11492
11493	{0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11494	{0x20, AC_VERB_SET_PROC_COEF,  0x3050},
11495	{}
11496};
11497
11498/* Samsung Q1 Ultra Vista model setup */
11499static struct snd_kcontrol_new alc262_ultra_mixer[] = {
11500	HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11501	HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11502	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11503	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11504	HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
11505	HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
11506	{ } /* end */
11507};
11508
11509static struct hda_verb alc262_ultra_verbs[] = {
11510	/* output mixer */
11511	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11512	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11513	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11514	/* speaker */
11515	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11516	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11517	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11518	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11519	/* HP */
11520	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11521	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11522	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11523	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11524	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11525	/* internal mic */
11526	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11527	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11528	/* ADC, choose mic */
11529	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11530	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11531	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11532	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11533	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11534	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11535	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11536	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11537	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11538	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
11539	{}
11540};
11541
11542/* mute/unmute internal speaker according to the hp jack and mute state */
11543static void alc262_ultra_automute(struct hda_codec *codec)
11544{
11545	struct alc_spec *spec = codec->spec;
11546	unsigned int mute;
11547
11548	mute = 0;
11549	/* auto-mute only when HP is used as HP */
11550	if (!spec->cur_mux[0]) {
11551		spec->jack_present = snd_hda_jack_detect(codec, 0x15);
11552		if (spec->jack_present)
11553			mute = HDA_AMP_MUTE;
11554	}
11555	/* mute/unmute internal speaker */
11556	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11557				 HDA_AMP_MUTE, mute);
11558	/* mute/unmute HP */
11559	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11560				 HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
11561}
11562
11563/* unsolicited event for HP jack sensing */
11564static void alc262_ultra_unsol_event(struct hda_codec *codec,
11565				       unsigned int res)
11566{
11567	if ((res >> 26) != ALC880_HP_EVENT)
11568		return;
11569	alc262_ultra_automute(codec);
11570}
11571
11572static struct hda_input_mux alc262_ultra_capture_source = {
11573	.num_items = 2,
11574	.items = {
11575		{ "Mic", 0x1 },
11576		{ "Headphone", 0x7 },
11577	},
11578};
11579
11580static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
11581				     struct snd_ctl_elem_value *ucontrol)
11582{
11583	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11584	struct alc_spec *spec = codec->spec;
11585	int ret;
11586
11587	ret = alc_mux_enum_put(kcontrol, ucontrol);
11588	if (!ret)
11589		return 0;
11590	/* reprogram the HP pin as mic or HP according to the input source */
11591	snd_hda_codec_write_cache(codec, 0x15, 0,
11592				  AC_VERB_SET_PIN_WIDGET_CONTROL,
11593				  spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
11594	alc262_ultra_automute(codec); /* mute/unmute HP */
11595	return ret;
11596}
11597
11598static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
11599	HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
11600	HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
11601	{
11602		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11603		.name = "Capture Source",
11604		.info = alc_mux_enum_info,
11605		.get = alc_mux_enum_get,
11606		.put = alc262_ultra_mux_enum_put,
11607	},
11608	{
11609		.iface = NID_MAPPING,
11610		.name = "Capture Source",
11611		.private_value = 0x15,
11612	},
11613	{ } /* end */
11614};
11615
11616/* We use two mixers depending on the output pin; 0x16 is a mono output
11617 * and thus it's bound with a different mixer.
11618 * This function returns which mixer amp should be used.
11619 */
11620static int alc262_check_volbit(hda_nid_t nid)
11621{
11622	if (!nid)
11623		return 0;
11624	else if (nid == 0x16)
11625		return 2;
11626	else
11627		return 1;
11628}
11629
11630static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
11631				  const char *pfx, int *vbits)
11632{
11633	unsigned long val;
11634	int vbit;
11635
11636	vbit = alc262_check_volbit(nid);
11637	if (!vbit)
11638		return 0;
11639	if (*vbits & vbit) /* a volume control for this mixer already there */
11640		return 0;
11641	*vbits |= vbit;
11642	if (vbit == 2)
11643		val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
11644	else
11645		val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
11646	return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val);
11647}
11648
11649static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
11650				 const char *pfx)
11651{
11652	unsigned long val;
11653
11654	if (!nid)
11655		return 0;
11656	if (nid == 0x16)
11657		val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
11658	else
11659		val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
11660	return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val);
11661}
11662
11663/* add playback controls from the parsed DAC table */
11664static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
11665					     const struct auto_pin_cfg *cfg)
11666{
11667	const char *pfx;
11668	int vbits;
11669	int err;
11670
11671	spec->multiout.num_dacs = 1;	/* only use one dac */
11672	spec->multiout.dac_nids = spec->private_dac_nids;
11673	spec->multiout.dac_nids[0] = 2;
11674
11675	if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
11676		pfx = "Master";
11677	else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11678		pfx = "Speaker";
11679	else
11680		pfx = "Front";
11681	err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
11682	if (err < 0)
11683		return err;
11684	err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
11685	if (err < 0)
11686		return err;
11687	err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
11688	if (err < 0)
11689		return err;
11690
11691	vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
11692		alc262_check_volbit(cfg->speaker_pins[0]) |
11693		alc262_check_volbit(cfg->hp_pins[0]);
11694	if (vbits == 1 || vbits == 2)
11695		pfx = "Master"; /* only one mixer is used */
11696	else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11697		pfx = "Speaker";
11698	else
11699		pfx = "Front";
11700	vbits = 0;
11701	err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
11702	if (err < 0)
11703		return err;
11704	err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
11705				     &vbits);
11706	if (err < 0)
11707		return err;
11708	err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
11709				     &vbits);
11710	if (err < 0)
11711		return err;
11712	return 0;
11713}
11714
11715#define alc262_auto_create_input_ctls \
11716	alc882_auto_create_input_ctls
11717
11718/*
11719 * generic initialization of ADC, input mixers and output mixers
11720 */
11721static struct hda_verb alc262_volume_init_verbs[] = {
11722	/*
11723	 * Unmute ADC0-2 and set the default input to mic-in
11724	 */
11725	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11726	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11727	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11728	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11729	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11730	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11731
11732	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11733	 * mixer widget
11734	 * Note: PASD motherboards uses the Line In 2 as the input for
11735	 * front panel mic (mic 2)
11736	 */
11737	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11738	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11739	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11740	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11741	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11742	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11743
11744	/*
11745	 * Set up output mixers (0x0c - 0x0f)
11746	 */
11747	/* set vol=0 to output mixers */
11748	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11749	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11750	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11751
11752	/* set up input amps for analog loopback */
11753	/* Amp Indices: DAC = 0, mixer = 1 */
11754	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11755	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11756	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11757	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11758	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11759	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11760
11761	/* FIXME: use matrix-type input source selection */
11762	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11763	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11764	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11765	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11766	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11767	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11768	/* Input mixer2 */
11769	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11770	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11771	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11772	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11773	/* Input mixer3 */
11774	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11775	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11776	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11777	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11778
11779	{ }
11780};
11781
11782static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11783	/*
11784	 * Unmute ADC0-2 and set the default input to mic-in
11785	 */
11786	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11787	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11788	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11789	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11790	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11791	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11792
11793	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11794	 * mixer widget
11795	 * Note: PASD motherboards uses the Line In 2 as the input for
11796	 * front panel mic (mic 2)
11797	 */
11798	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11799	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11800	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11801	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11802	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11803	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11804	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11805        {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11806
11807	/*
11808	 * Set up output mixers (0x0c - 0x0e)
11809	 */
11810	/* set vol=0 to output mixers */
11811	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11812	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11813	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11814
11815	/* set up input amps for analog loopback */
11816	/* Amp Indices: DAC = 0, mixer = 1 */
11817	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11818	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11819	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11820	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11821	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11822	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11823
11824	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11825	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11826	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11827
11828	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11829	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11830
11831	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11832	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11833
11834	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11835	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11836        {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11837	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11838	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11839
11840	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11841	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11842        {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11843	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11844	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11845	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11846
11847
11848	/* FIXME: use matrix-type input source selection */
11849	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
11850	/* Input mixer1: only unmute Mic */
11851	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11852	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11853	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11854	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11855	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11856	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11857	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11858	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11859	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11860	/* Input mixer2 */
11861	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11862	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11863	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11864	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11865	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11866	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11867	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11868	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11869	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11870	/* Input mixer3 */
11871	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11872	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11873	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11874	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11875	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11876	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11877	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11878	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11879	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11880
11881	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11882
11883	{ }
11884};
11885
11886static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
11887	/*
11888	 * Unmute ADC0-2 and set the default input to mic-in
11889	 */
11890	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11891	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11892	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11893	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11894	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11895	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11896
11897	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11898	 * mixer widget
11899	 * Note: PASD motherboards uses the Line In 2 as the input for front
11900	 * panel mic (mic 2)
11901	 */
11902	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11903	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11904	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11905	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11906	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11907	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11908	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11909	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11910	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11911	/*
11912	 * Set up output mixers (0x0c - 0x0e)
11913	 */
11914	/* set vol=0 to output mixers */
11915	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11916	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11917	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11918
11919	/* set up input amps for analog loopback */
11920	/* Amp Indices: DAC = 0, mixer = 1 */
11921	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11922	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11923	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11924	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11925	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11926	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11927
11928
11929	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* HP */
11930	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Mono */
11931	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* rear MIC */
11932	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* Line in */
11933	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* Front MIC */
11934	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Line out */
11935	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* CD in */
11936
11937	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11938	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11939
11940	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11941	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11942
11943	/* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
11944	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11945	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11946	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
11947	{0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11948	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11949
11950	/* FIXME: use matrix-type input source selection */
11951	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11952	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11953	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
11954	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
11955	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
11956	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
11957	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
11958        /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))},  */
11959	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
11960	/* Input mixer2 */
11961	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11962	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11963	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11964	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11965	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11966        /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11967	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11968	/* Input mixer3 */
11969	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11970	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11971	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11972	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11973	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11974        /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11975	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11976
11977	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11978
11979	{ }
11980};
11981
11982static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
11983
11984	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* Front Speaker */
11985	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11986	{0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
11987
11988	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* MIC jack */
11989	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* Front MIC */
11990	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11991	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11992
11993	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* HP  jack */
11994	{0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11995	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11996	{}
11997};
11998
11999
12000#ifdef CONFIG_SND_HDA_POWER_SAVE
12001#define alc262_loopbacks	alc880_loopbacks
12002#endif
12003
12004/* pcm configuration: identical with ALC880 */
12005#define alc262_pcm_analog_playback	alc880_pcm_analog_playback
12006#define alc262_pcm_analog_capture	alc880_pcm_analog_capture
12007#define alc262_pcm_digital_playback	alc880_pcm_digital_playback
12008#define alc262_pcm_digital_capture	alc880_pcm_digital_capture
12009
12010/*
12011 * BIOS auto configuration
12012 */
12013static int alc262_parse_auto_config(struct hda_codec *codec)
12014{
12015	struct alc_spec *spec = codec->spec;
12016	int err;
12017	static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
12018
12019	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12020					   alc262_ignore);
12021	if (err < 0)
12022		return err;
12023	if (!spec->autocfg.line_outs) {
12024		if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
12025			spec->multiout.max_channels = 2;
12026			spec->no_analog = 1;
12027			goto dig_only;
12028		}
12029		return 0; /* can't find valid BIOS pin config */
12030	}
12031	err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
12032	if (err < 0)
12033		return err;
12034	err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
12035	if (err < 0)
12036		return err;
12037
12038	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
12039
12040 dig_only:
12041	if (spec->autocfg.dig_outs) {
12042		spec->multiout.dig_out_nid = ALC262_DIGOUT_NID;
12043		spec->dig_out_type = spec->autocfg.dig_out_type[0];
12044	}
12045	if (spec->autocfg.dig_in_pin)
12046		spec->dig_in_nid = ALC262_DIGIN_NID;
12047
12048	if (spec->kctls.list)
12049		add_mixer(spec, spec->kctls.list);
12050
12051	add_verb(spec, alc262_volume_init_verbs);
12052	spec->num_mux_defs = 1;
12053	spec->input_mux = &spec->private_imux[0];
12054
12055	err = alc_auto_add_mic_boost(codec);
12056	if (err < 0)
12057		return err;
12058
12059	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
12060
12061	return 1;
12062}
12063
12064#define alc262_auto_init_multi_out	alc882_auto_init_multi_out
12065#define alc262_auto_init_hp_out		alc882_auto_init_hp_out
12066#define alc262_auto_init_analog_input	alc882_auto_init_analog_input
12067#define alc262_auto_init_input_src	alc882_auto_init_input_src
12068
12069
12070/* init callback for auto-configuration model -- overriding the default init */
12071static void alc262_auto_init(struct hda_codec *codec)
12072{
12073	struct alc_spec *spec = codec->spec;
12074	alc262_auto_init_multi_out(codec);
12075	alc262_auto_init_hp_out(codec);
12076	alc262_auto_init_analog_input(codec);
12077	alc262_auto_init_input_src(codec);
12078	if (spec->unsol_event)
12079		alc_inithook(codec);
12080}
12081
12082/*
12083 * configuration and preset
12084 */
12085static const char *alc262_models[ALC262_MODEL_LAST] = {
12086	[ALC262_BASIC]		= "basic",
12087	[ALC262_HIPPO]		= "hippo",
12088	[ALC262_HIPPO_1]	= "hippo_1",
12089	[ALC262_FUJITSU]	= "fujitsu",
12090	[ALC262_HP_BPC]		= "hp-bpc",
12091	[ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
12092	[ALC262_HP_TC_T5735]	= "hp-tc-t5735",
12093	[ALC262_HP_RP5700]	= "hp-rp5700",
12094	[ALC262_BENQ_ED8]	= "benq",
12095	[ALC262_BENQ_T31]	= "benq-t31",
12096	[ALC262_SONY_ASSAMD]	= "sony-assamd",
12097	[ALC262_TOSHIBA_S06]	= "toshiba-s06",
12098	[ALC262_TOSHIBA_RX1]	= "toshiba-rx1",
12099	[ALC262_ULTRA]		= "ultra",
12100	[ALC262_LENOVO_3000]	= "lenovo-3000",
12101	[ALC262_NEC]		= "nec",
12102	[ALC262_TYAN]		= "tyan",
12103	[ALC262_AUTO]		= "auto",
12104};
12105
12106static struct snd_pci_quirk alc262_cfg_tbl[] = {
12107	SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
12108	SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
12109	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
12110			   ALC262_HP_BPC),
12111	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
12112			   ALC262_HP_BPC),
12113	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
12114			   ALC262_HP_BPC),
12115	SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
12116	SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
12117	SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
12118	SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
12119	SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
12120	SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
12121	SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
12122	SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
12123	SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
12124	SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
12125	SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
12126	SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
12127		      ALC262_HP_TC_T5735),
12128	SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
12129	SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
12130	SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
12131	SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
12132	SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
12133	SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
12134	SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
12135	SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
12136#if 0 /* disable the quirk since model=auto works better in recent versions */
12137	SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
12138			   ALC262_SONY_ASSAMD),
12139#endif
12140	SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
12141		      ALC262_TOSHIBA_RX1),
12142	SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
12143	SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
12144	SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
12145	SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
12146	SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
12147			   ALC262_ULTRA),
12148	SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
12149	SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
12150	SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
12151	SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
12152	SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
12153	{}
12154};
12155
12156static struct alc_config_preset alc262_presets[] = {
12157	[ALC262_BASIC] = {
12158		.mixers = { alc262_base_mixer },
12159		.init_verbs = { alc262_init_verbs },
12160		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12161		.dac_nids = alc262_dac_nids,
12162		.hp_nid = 0x03,
12163		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12164		.channel_mode = alc262_modes,
12165		.input_mux = &alc262_capture_source,
12166	},
12167	[ALC262_HIPPO] = {
12168		.mixers = { alc262_hippo_mixer },
12169		.init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
12170		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12171		.dac_nids = alc262_dac_nids,
12172		.hp_nid = 0x03,
12173		.dig_out_nid = ALC262_DIGOUT_NID,
12174		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12175		.channel_mode = alc262_modes,
12176		.input_mux = &alc262_capture_source,
12177		.unsol_event = alc262_hippo_unsol_event,
12178		.setup = alc262_hippo_setup,
12179		.init_hook = alc262_hippo_automute,
12180	},
12181	[ALC262_HIPPO_1] = {
12182		.mixers = { alc262_hippo1_mixer },
12183		.init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
12184		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12185		.dac_nids = alc262_dac_nids,
12186		.hp_nid = 0x02,
12187		.dig_out_nid = ALC262_DIGOUT_NID,
12188		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12189		.channel_mode = alc262_modes,
12190		.input_mux = &alc262_capture_source,
12191		.unsol_event = alc262_hippo_unsol_event,
12192		.setup = alc262_hippo1_setup,
12193		.init_hook = alc262_hippo_automute,
12194	},
12195	[ALC262_FUJITSU] = {
12196		.mixers = { alc262_fujitsu_mixer },
12197		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12198				alc262_fujitsu_unsol_verbs },
12199		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12200		.dac_nids = alc262_dac_nids,
12201		.hp_nid = 0x03,
12202		.dig_out_nid = ALC262_DIGOUT_NID,
12203		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12204		.channel_mode = alc262_modes,
12205		.input_mux = &alc262_fujitsu_capture_source,
12206		.unsol_event = alc262_fujitsu_unsol_event,
12207		.init_hook = alc262_fujitsu_init_hook,
12208	},
12209	[ALC262_HP_BPC] = {
12210		.mixers = { alc262_HP_BPC_mixer },
12211		.init_verbs = { alc262_HP_BPC_init_verbs },
12212		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12213		.dac_nids = alc262_dac_nids,
12214		.hp_nid = 0x03,
12215		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12216		.channel_mode = alc262_modes,
12217		.input_mux = &alc262_HP_capture_source,
12218		.unsol_event = alc262_hp_bpc_unsol_event,
12219		.init_hook = alc262_hp_bpc_automute,
12220	},
12221	[ALC262_HP_BPC_D7000_WF] = {
12222		.mixers = { alc262_HP_BPC_WildWest_mixer },
12223		.init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12224		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12225		.dac_nids = alc262_dac_nids,
12226		.hp_nid = 0x03,
12227		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12228		.channel_mode = alc262_modes,
12229		.input_mux = &alc262_HP_D7000_capture_source,
12230		.unsol_event = alc262_hp_wildwest_unsol_event,
12231		.init_hook = alc262_hp_wildwest_automute,
12232	},
12233	[ALC262_HP_BPC_D7000_WL] = {
12234		.mixers = { alc262_HP_BPC_WildWest_mixer,
12235			    alc262_HP_BPC_WildWest_option_mixer },
12236		.init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12237		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12238		.dac_nids = alc262_dac_nids,
12239		.hp_nid = 0x03,
12240		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12241		.channel_mode = alc262_modes,
12242		.input_mux = &alc262_HP_D7000_capture_source,
12243		.unsol_event = alc262_hp_wildwest_unsol_event,
12244		.init_hook = alc262_hp_wildwest_automute,
12245	},
12246	[ALC262_HP_TC_T5735] = {
12247		.mixers = { alc262_hp_t5735_mixer },
12248		.init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
12249		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12250		.dac_nids = alc262_dac_nids,
12251		.hp_nid = 0x03,
12252		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12253		.channel_mode = alc262_modes,
12254		.input_mux = &alc262_capture_source,
12255		.unsol_event = alc_sku_unsol_event,
12256		.setup = alc262_hp_t5735_setup,
12257		.init_hook = alc_inithook,
12258	},
12259	[ALC262_HP_RP5700] = {
12260		.mixers = { alc262_hp_rp5700_mixer },
12261		.init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
12262		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12263		.dac_nids = alc262_dac_nids,
12264		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12265		.channel_mode = alc262_modes,
12266		.input_mux = &alc262_hp_rp5700_capture_source,
12267        },
12268	[ALC262_BENQ_ED8] = {
12269		.mixers = { alc262_base_mixer },
12270		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
12271		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12272		.dac_nids = alc262_dac_nids,
12273		.hp_nid = 0x03,
12274		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12275		.channel_mode = alc262_modes,
12276		.input_mux = &alc262_capture_source,
12277	},
12278	[ALC262_SONY_ASSAMD] = {
12279		.mixers = { alc262_sony_mixer },
12280		.init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
12281		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12282		.dac_nids = alc262_dac_nids,
12283		.hp_nid = 0x02,
12284		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12285		.channel_mode = alc262_modes,
12286		.input_mux = &alc262_capture_source,
12287		.unsol_event = alc262_hippo_unsol_event,
12288		.setup = alc262_hippo_setup,
12289		.init_hook = alc262_hippo_automute,
12290	},
12291	[ALC262_BENQ_T31] = {
12292		.mixers = { alc262_benq_t31_mixer },
12293		.init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
12294				alc_hp15_unsol_verbs },
12295		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12296		.dac_nids = alc262_dac_nids,
12297		.hp_nid = 0x03,
12298		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12299		.channel_mode = alc262_modes,
12300		.input_mux = &alc262_capture_source,
12301		.unsol_event = alc262_hippo_unsol_event,
12302		.setup = alc262_hippo_setup,
12303		.init_hook = alc262_hippo_automute,
12304	},
12305	[ALC262_ULTRA] = {
12306		.mixers = { alc262_ultra_mixer },
12307		.cap_mixer = alc262_ultra_capture_mixer,
12308		.init_verbs = { alc262_ultra_verbs },
12309		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12310		.dac_nids = alc262_dac_nids,
12311		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12312		.channel_mode = alc262_modes,
12313		.input_mux = &alc262_ultra_capture_source,
12314		.adc_nids = alc262_adc_nids, /* ADC0 */
12315		.capsrc_nids = alc262_capsrc_nids,
12316		.num_adc_nids = 1, /* single ADC */
12317		.unsol_event = alc262_ultra_unsol_event,
12318		.init_hook = alc262_ultra_automute,
12319	},
12320	[ALC262_LENOVO_3000] = {
12321		.mixers = { alc262_lenovo_3000_mixer },
12322		.init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12323				alc262_lenovo_3000_unsol_verbs,
12324				alc262_lenovo_3000_init_verbs },
12325		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12326		.dac_nids = alc262_dac_nids,
12327		.hp_nid = 0x03,
12328		.dig_out_nid = ALC262_DIGOUT_NID,
12329		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12330		.channel_mode = alc262_modes,
12331		.input_mux = &alc262_fujitsu_capture_source,
12332		.unsol_event = alc262_lenovo_3000_unsol_event,
12333	},
12334	[ALC262_NEC] = {
12335		.mixers = { alc262_nec_mixer },
12336		.init_verbs = { alc262_nec_verbs },
12337		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12338		.dac_nids = alc262_dac_nids,
12339		.hp_nid = 0x03,
12340		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12341		.channel_mode = alc262_modes,
12342		.input_mux = &alc262_capture_source,
12343	},
12344	[ALC262_TOSHIBA_S06] = {
12345		.mixers = { alc262_toshiba_s06_mixer },
12346		.init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
12347							alc262_eapd_verbs },
12348		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12349		.capsrc_nids = alc262_dmic_capsrc_nids,
12350		.dac_nids = alc262_dac_nids,
12351		.adc_nids = alc262_dmic_adc_nids, /* ADC0 */
12352		.num_adc_nids = 1, /* single ADC */
12353		.dig_out_nid = ALC262_DIGOUT_NID,
12354		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12355		.channel_mode = alc262_modes,
12356		.unsol_event = alc_sku_unsol_event,
12357		.setup = alc262_toshiba_s06_setup,
12358		.init_hook = alc_inithook,
12359	},
12360	[ALC262_TOSHIBA_RX1] = {
12361		.mixers = { alc262_toshiba_rx1_mixer },
12362		.init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
12363		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12364		.dac_nids = alc262_dac_nids,
12365		.hp_nid = 0x03,
12366		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12367		.channel_mode = alc262_modes,
12368		.input_mux = &alc262_capture_source,
12369		.unsol_event = alc262_hippo_unsol_event,
12370		.setup = alc262_hippo_setup,
12371		.init_hook = alc262_hippo_automute,
12372	},
12373	[ALC262_TYAN] = {
12374		.mixers = { alc262_tyan_mixer },
12375		.init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
12376		.num_dacs = ARRAY_SIZE(alc262_dac_nids),
12377		.dac_nids = alc262_dac_nids,
12378		.hp_nid = 0x02,
12379		.dig_out_nid = ALC262_DIGOUT_NID,
12380		.num_channel_mode = ARRAY_SIZE(alc262_modes),
12381		.channel_mode = alc262_modes,
12382		.input_mux = &alc262_capture_source,
12383		.unsol_event = alc_automute_amp_unsol_event,
12384		.setup = alc262_tyan_setup,
12385		.init_hook = alc_automute_amp,
12386	},
12387};
12388
12389static int patch_alc262(struct hda_codec *codec)
12390{
12391	struct alc_spec *spec;
12392	int board_config;
12393	int err;
12394
12395	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
12396	if (spec == NULL)
12397		return -ENOMEM;
12398
12399	codec->spec = spec;
12400#if 0
12401	/* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
12402	 * under-run
12403	 */
12404	{
12405	int tmp;
12406	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12407	tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
12408	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12409	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
12410	}
12411#endif
12412	alc_auto_parse_customize_define(codec);
12413
12414	alc_fix_pll_init(codec, 0x20, 0x0a, 10);
12415
12416	board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
12417						  alc262_models,
12418						  alc262_cfg_tbl);
12419
12420	if (board_config < 0) {
12421		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12422		       codec->chip_name);
12423		board_config = ALC262_AUTO;
12424	}
12425
12426	if (board_config == ALC262_AUTO) {
12427		/* automatic parse from the BIOS config */
12428		err = alc262_parse_auto_config(codec);
12429		if (err < 0) {
12430			alc_free(codec);
12431			return err;
12432		} else if (!err) {
12433			printk(KERN_INFO
12434			       "hda_codec: Cannot set up configuration "
12435			       "from BIOS.  Using base mode...\n");
12436			board_config = ALC262_BASIC;
12437		}
12438	}
12439
12440	if (!spec->no_analog && spec->cdefine.enable_pcbeep) {
12441		err = snd_hda_attach_beep_device(codec, 0x1);
12442		if (err < 0) {
12443			alc_free(codec);
12444			return err;
12445		}
12446	}
12447
12448	if (board_config != ALC262_AUTO)
12449		setup_preset(codec, &alc262_presets[board_config]);
12450
12451	spec->stream_analog_playback = &alc262_pcm_analog_playback;
12452	spec->stream_analog_capture = &alc262_pcm_analog_capture;
12453
12454	spec->stream_digital_playback = &alc262_pcm_digital_playback;
12455	spec->stream_digital_capture = &alc262_pcm_digital_capture;
12456
12457	if (!spec->adc_nids && spec->input_mux) {
12458		int i;
12459		/* check whether the digital-mic has to be supported */
12460		for (i = 0; i < spec->input_mux->num_items; i++) {
12461			if (spec->input_mux->items[i].index >= 9)
12462				break;
12463		}
12464		if (i < spec->input_mux->num_items) {
12465			/* use only ADC0 */
12466			spec->adc_nids = alc262_dmic_adc_nids;
12467			spec->num_adc_nids = 1;
12468			spec->capsrc_nids = alc262_dmic_capsrc_nids;
12469		} else {
12470			/* all analog inputs */
12471			/* check whether NID 0x07 is valid */
12472			unsigned int wcap = get_wcaps(codec, 0x07);
12473
12474			/* get type */
12475			wcap = get_wcaps_type(wcap);
12476			if (wcap != AC_WID_AUD_IN) {
12477				spec->adc_nids = alc262_adc_nids_alt;
12478				spec->num_adc_nids =
12479					ARRAY_SIZE(alc262_adc_nids_alt);
12480				spec->capsrc_nids = alc262_capsrc_nids_alt;
12481			} else {
12482				spec->adc_nids = alc262_adc_nids;
12483				spec->num_adc_nids =
12484					ARRAY_SIZE(alc262_adc_nids);
12485				spec->capsrc_nids = alc262_capsrc_nids;
12486			}
12487		}
12488	}
12489	if (!spec->cap_mixer && !spec->no_analog)
12490		set_capture_mixer(codec);
12491	if (!spec->no_analog && spec->cdefine.enable_pcbeep)
12492		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12493
12494	spec->vmaster_nid = 0x0c;
12495
12496	codec->patch_ops = alc_patch_ops;
12497	if (board_config == ALC262_AUTO)
12498		spec->init_hook = alc262_auto_init;
12499#ifdef CONFIG_SND_HDA_POWER_SAVE
12500	if (!spec->loopback.amplist)
12501		spec->loopback.amplist = alc262_loopbacks;
12502#endif
12503
12504	return 0;
12505}
12506
12507/*
12508 *  ALC268 channel source setting (2 channel)
12509 */
12510#define ALC268_DIGOUT_NID	ALC880_DIGOUT_NID
12511#define alc268_modes		alc260_modes
12512
12513static hda_nid_t alc268_dac_nids[2] = {
12514	/* front, hp */
12515	0x02, 0x03
12516};
12517
12518static hda_nid_t alc268_adc_nids[2] = {
12519	/* ADC0-1 */
12520	0x08, 0x07
12521};
12522
12523static hda_nid_t alc268_adc_nids_alt[1] = {
12524	/* ADC0 */
12525	0x08
12526};
12527
12528static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
12529
12530static struct snd_kcontrol_new alc268_base_mixer[] = {
12531	/* output mixer control */
12532	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12533	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12534	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12535	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12536	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12537	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12538	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12539	{ }
12540};
12541
12542static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
12543	/* output mixer control */
12544	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12545	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12546	ALC262_HIPPO_MASTER_SWITCH,
12547	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12548	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12549	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12550	{ }
12551};
12552
12553/* bind Beep switches of both NID 0x0f and 0x10 */
12554static struct hda_bind_ctls alc268_bind_beep_sw = {
12555	.ops = &snd_hda_bind_sw,
12556	.values = {
12557		HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
12558		HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
12559		0
12560	},
12561};
12562
12563static struct snd_kcontrol_new alc268_beep_mixer[] = {
12564	HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
12565	HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
12566	{ }
12567};
12568
12569static struct hda_verb alc268_eapd_verbs[] = {
12570	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
12571	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
12572	{ }
12573};
12574
12575/* Toshiba specific */
12576static struct hda_verb alc268_toshiba_verbs[] = {
12577	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12578	{ } /* end */
12579};
12580
12581/* Acer specific */
12582/* bind volumes of both NID 0x02 and 0x03 */
12583static struct hda_bind_ctls alc268_acer_bind_master_vol = {
12584	.ops = &snd_hda_bind_vol,
12585	.values = {
12586		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
12587		HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
12588		0
12589	},
12590};
12591
12592/* mute/unmute internal speaker according to the hp jack and mute state */
12593static void alc268_acer_automute(struct hda_codec *codec, int force)
12594{
12595	struct alc_spec *spec = codec->spec;
12596	unsigned int mute;
12597
12598	if (force || !spec->sense_updated) {
12599		spec->jack_present = snd_hda_jack_detect(codec, 0x14);
12600		spec->sense_updated = 1;
12601	}
12602	if (spec->jack_present)
12603		mute = HDA_AMP_MUTE; /* mute internal speaker */
12604	else /* unmute internal speaker if necessary */
12605		mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
12606	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
12607				 HDA_AMP_MUTE, mute);
12608}
12609
12610
12611/* bind hp and internal speaker mute (with plug check) */
12612static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
12613				     struct snd_ctl_elem_value *ucontrol)
12614{
12615	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
12616	long *valp = ucontrol->value.integer.value;
12617	int change;
12618
12619	change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
12620	if (change)
12621		alc268_acer_automute(codec, 0);
12622	return change;
12623}
12624
12625static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
12626	/* output mixer control */
12627	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12628	{
12629		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12630		.name = "Master Playback Switch",
12631		.subdevice = HDA_SUBDEV_AMP_FLAG,
12632		.info = snd_hda_mixer_amp_switch_info,
12633		.get = snd_hda_mixer_amp_switch_get,
12634		.put = alc268_acer_master_sw_put,
12635		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12636	},
12637	HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
12638	{ }
12639};
12640
12641static struct snd_kcontrol_new alc268_acer_mixer[] = {
12642	/* output mixer control */
12643	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12644	{
12645		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12646		.name = "Master Playback Switch",
12647		.subdevice = HDA_SUBDEV_AMP_FLAG,
12648		.info = snd_hda_mixer_amp_switch_info,
12649		.get = snd_hda_mixer_amp_switch_get,
12650		.put = alc268_acer_master_sw_put,
12651		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12652	},
12653	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12654	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12655	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12656	{ }
12657};
12658
12659static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
12660	/* output mixer control */
12661	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12662	{
12663		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12664		.name = "Master Playback Switch",
12665		.subdevice = HDA_SUBDEV_AMP_FLAG,
12666		.info = snd_hda_mixer_amp_switch_info,
12667		.get = snd_hda_mixer_amp_switch_get,
12668		.put = alc268_acer_master_sw_put,
12669		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12670	},
12671	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12672	HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12673	{ }
12674};
12675
12676static struct hda_verb alc268_acer_aspire_one_verbs[] = {
12677	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12678	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12679	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12680	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12681	{0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
12682	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
12683	{ }
12684};
12685
12686static struct hda_verb alc268_acer_verbs[] = {
12687	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
12688	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12689	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12690	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
12691	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12692	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12693	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12694	{ }
12695};
12696
12697/* unsolicited event for HP jack sensing */
12698#define alc268_toshiba_unsol_event	alc262_hippo_unsol_event
12699#define alc268_toshiba_setup		alc262_hippo_setup
12700#define alc268_toshiba_automute		alc262_hippo_automute
12701
12702static void alc268_acer_unsol_event(struct hda_codec *codec,
12703				       unsigned int res)
12704{
12705	if ((res >> 26) != ALC880_HP_EVENT)
12706		return;
12707	alc268_acer_automute(codec, 1);
12708}
12709
12710static void alc268_acer_init_hook(struct hda_codec *codec)
12711{
12712	alc268_acer_automute(codec, 1);
12713}
12714
12715/* toggle speaker-output according to the hp-jack state */
12716static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
12717{
12718	unsigned int present;
12719	unsigned char bits;
12720
12721	present = snd_hda_jack_detect(codec, 0x15);
12722	bits = present ? HDA_AMP_MUTE : 0;
12723	snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
12724				 HDA_AMP_MUTE, bits);
12725	snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
12726				 HDA_AMP_MUTE, bits);
12727}
12728
12729static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
12730				    unsigned int res)
12731{
12732	switch (res >> 26) {
12733	case ALC880_HP_EVENT:
12734		alc268_aspire_one_speaker_automute(codec);
12735		break;
12736	case ALC880_MIC_EVENT:
12737		alc_mic_automute(codec);
12738		break;
12739	}
12740}
12741
12742static void alc268_acer_lc_setup(struct hda_codec *codec)
12743{
12744	struct alc_spec *spec = codec->spec;
12745	spec->ext_mic.pin = 0x18;
12746	spec->ext_mic.mux_idx = 0;
12747	spec->int_mic.pin = 0x12;
12748	spec->int_mic.mux_idx = 6;
12749	spec->auto_mic = 1;
12750}
12751
12752static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12753{
12754	alc268_aspire_one_speaker_automute(codec);
12755	alc_mic_automute(codec);
12756}
12757
12758static struct snd_kcontrol_new alc268_dell_mixer[] = {
12759	/* output mixer control */
12760	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12761	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12762	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12763	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12764	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12765	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12766	{ }
12767};
12768
12769static struct hda_verb alc268_dell_verbs[] = {
12770	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12771	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12772	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12773	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12774	{ }
12775};
12776
12777/* mute/unmute internal speaker according to the hp jack and mute state */
12778static void alc268_dell_setup(struct hda_codec *codec)
12779{
12780	struct alc_spec *spec = codec->spec;
12781
12782	spec->autocfg.hp_pins[0] = 0x15;
12783	spec->autocfg.speaker_pins[0] = 0x14;
12784	spec->ext_mic.pin = 0x18;
12785	spec->ext_mic.mux_idx = 0;
12786	spec->int_mic.pin = 0x19;
12787	spec->int_mic.mux_idx = 1;
12788	spec->auto_mic = 1;
12789}
12790
12791static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12792	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12793	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12794	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12795	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12796	HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12797	HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12798	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12799	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12800	{ }
12801};
12802
12803static struct hda_verb alc267_quanta_il1_verbs[] = {
12804	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12805	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12806	{ }
12807};
12808
12809static void alc267_quanta_il1_setup(struct hda_codec *codec)
12810{
12811	struct alc_spec *spec = codec->spec;
12812	spec->autocfg.hp_pins[0] = 0x15;
12813	spec->autocfg.speaker_pins[0] = 0x14;
12814	spec->ext_mic.pin = 0x18;
12815	spec->ext_mic.mux_idx = 0;
12816	spec->int_mic.pin = 0x19;
12817	spec->int_mic.mux_idx = 1;
12818	spec->auto_mic = 1;
12819}
12820
12821/*
12822 * generic initialization of ADC, input mixers and output mixers
12823 */
12824static struct hda_verb alc268_base_init_verbs[] = {
12825	/* Unmute DAC0-1 and set vol = 0 */
12826	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12827	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12828
12829	/*
12830	 * Set up output mixers (0x0c - 0x0e)
12831	 */
12832	/* set vol=0 to output mixers */
12833	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12834        {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
12835
12836	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12837	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12838
12839	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12840	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
12841	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12842	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12843	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12844	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12845	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12846	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12847
12848	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12849	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12850	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12851	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12852	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12853
12854	/* set PCBEEP vol = 0, mute connections */
12855	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12856	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12857	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12858
12859	/* Unmute Selector 23h,24h and set the default input to mic-in */
12860
12861	{0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
12862	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12863	{0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
12864	{0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12865
12866	{ }
12867};
12868
12869/*
12870 * generic initialization of ADC, input mixers and output mixers
12871 */
12872static struct hda_verb alc268_volume_init_verbs[] = {
12873	/* set output DAC */
12874	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12875	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12876
12877	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12878	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12879	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12880	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12881	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12882
12883	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12884	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12885	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12886
12887	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12888	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12889
12890	/* set PCBEEP vol = 0, mute connections */
12891	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12892	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12893	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12894
12895	{ }
12896};
12897
12898static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
12899	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12900	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12901	{ } /* end */
12902};
12903
12904static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
12905	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12906	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12907	_DEFINE_CAPSRC(1),
12908	{ } /* end */
12909};
12910
12911static struct snd_kcontrol_new alc268_capture_mixer[] = {
12912	HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12913	HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12914	HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
12915	HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
12916	_DEFINE_CAPSRC(2),
12917	{ } /* end */
12918};
12919
12920static struct hda_input_mux alc268_capture_source = {
12921	.num_items = 4,
12922	.items = {
12923		{ "Mic", 0x0 },
12924		{ "Front Mic", 0x1 },
12925		{ "Line", 0x2 },
12926		{ "CD", 0x3 },
12927	},
12928};
12929
12930static struct hda_input_mux alc268_acer_capture_source = {
12931	.num_items = 3,
12932	.items = {
12933		{ "Mic", 0x0 },
12934		{ "Internal Mic", 0x1 },
12935		{ "Line", 0x2 },
12936	},
12937};
12938
12939static struct hda_input_mux alc268_acer_dmic_capture_source = {
12940	.num_items = 3,
12941	.items = {
12942		{ "Mic", 0x0 },
12943		{ "Internal Mic", 0x6 },
12944		{ "Line", 0x2 },
12945	},
12946};
12947
12948#ifdef CONFIG_SND_DEBUG
12949static struct snd_kcontrol_new alc268_test_mixer[] = {
12950	/* Volume widgets */
12951	HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12952	HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12953	HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
12954	HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
12955	HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
12956	HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
12957	HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
12958	HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
12959	HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
12960	HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
12961	HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
12962	HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
12963	HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
12964	/* The below appears problematic on some hardwares */
12965	/*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
12966	HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12967	HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
12968	HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
12969	HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
12970
12971	/* Modes for retasking pin widgets */
12972	ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
12973	ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
12974	ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
12975	ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
12976
12977	/* Controls for GPIO pins, assuming they are configured as outputs */
12978	ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
12979	ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
12980	ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
12981	ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
12982
12983	/* Switches to allow the digital SPDIF output pin to be enabled.
12984	 * The ALC268 does not have an SPDIF input.
12985	 */
12986	ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
12987
12988	/* A switch allowing EAPD to be enabled.  Some laptops seem to use
12989	 * this output to turn on an external amplifier.
12990	 */
12991	ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
12992	ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
12993
12994	{ } /* end */
12995};
12996#endif
12997
12998/* create input playback/capture controls for the given pin */
12999static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
13000				    const char *ctlname, int idx)
13001{
13002	hda_nid_t dac;
13003	int err;
13004
13005	switch (nid) {
13006	case 0x14:
13007	case 0x16:
13008		dac = 0x02;
13009		break;
13010	case 0x15:
13011	case 0x21: /* ALC269vb has this pin, too */
13012		dac = 0x03;
13013		break;
13014	default:
13015		return 0;
13016	}
13017	if (spec->multiout.dac_nids[0] != dac &&
13018	    spec->multiout.dac_nids[1] != dac) {
13019		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
13020				  HDA_COMPOSE_AMP_VAL(dac, 3, idx,
13021						      HDA_OUTPUT));
13022		if (err < 0)
13023			return err;
13024		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
13025	}
13026
13027	if (nid != 0x16)
13028		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
13029			  HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
13030	else /* mono */
13031		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
13032			  HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
13033	if (err < 0)
13034		return err;
13035	return 0;
13036}
13037
13038/* add playback controls from the parsed DAC table */
13039static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
13040					     const struct auto_pin_cfg *cfg)
13041{
13042	hda_nid_t nid;
13043	int err;
13044
13045	spec->multiout.dac_nids = spec->private_dac_nids;
13046
13047	nid = cfg->line_out_pins[0];
13048	if (nid) {
13049		const char *name;
13050		if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
13051			name = "Speaker";
13052		else
13053			name = "Front";
13054		err = alc268_new_analog_output(spec, nid, name, 0);
13055		if (err < 0)
13056			return err;
13057	}
13058
13059	nid = cfg->speaker_pins[0];
13060	if (nid == 0x1d) {
13061		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
13062				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
13063		if (err < 0)
13064			return err;
13065	} else {
13066		err = alc268_new_analog_output(spec, nid, "Speaker", 0);
13067		if (err < 0)
13068			return err;
13069	}
13070	nid = cfg->hp_pins[0];
13071	if (nid) {
13072		err = alc268_new_analog_output(spec, nid, "Headphone", 0);
13073		if (err < 0)
13074			return err;
13075	}
13076
13077	nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
13078	if (nid == 0x16) {
13079		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
13080				  HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
13081		if (err < 0)
13082			return err;
13083	}
13084	return 0;
13085}
13086
13087/* create playback/capture controls for input pins */
13088static int alc268_auto_create_input_ctls(struct hda_codec *codec,
13089						const struct auto_pin_cfg *cfg)
13090{
13091	return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
13092}
13093
13094static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
13095					      hda_nid_t nid, int pin_type)
13096{
13097	int idx;
13098
13099	alc_set_pin_output(codec, nid, pin_type);
13100	if (nid == 0x14 || nid == 0x16)
13101		idx = 0;
13102	else
13103		idx = 1;
13104	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
13105}
13106
13107static void alc268_auto_init_multi_out(struct hda_codec *codec)
13108{
13109	struct alc_spec *spec = codec->spec;
13110	hda_nid_t nid = spec->autocfg.line_out_pins[0];
13111	if (nid) {
13112		int pin_type = get_pin_type(spec->autocfg.line_out_type);
13113		alc268_auto_set_output_and_unmute(codec, nid, pin_type);
13114	}
13115}
13116
13117static void alc268_auto_init_hp_out(struct hda_codec *codec)
13118{
13119	struct alc_spec *spec = codec->spec;
13120	hda_nid_t pin;
13121
13122	pin = spec->autocfg.hp_pins[0];
13123	if (pin)
13124		alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
13125	pin = spec->autocfg.speaker_pins[0];
13126	if (pin)
13127		alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
13128}
13129
13130static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
13131{
13132	struct alc_spec *spec = codec->spec;
13133	hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
13134	hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
13135	hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
13136	unsigned int	dac_vol1, dac_vol2;
13137
13138	if (line_nid == 0x1d || speaker_nid == 0x1d) {
13139		snd_hda_codec_write(codec, speaker_nid, 0,
13140				    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
13141		/* mute mixer inputs from 0x1d */
13142		snd_hda_codec_write(codec, 0x0f, 0,
13143				    AC_VERB_SET_AMP_GAIN_MUTE,
13144				    AMP_IN_UNMUTE(1));
13145		snd_hda_codec_write(codec, 0x10, 0,
13146				    AC_VERB_SET_AMP_GAIN_MUTE,
13147				    AMP_IN_UNMUTE(1));
13148	} else {
13149		/* unmute mixer inputs from 0x1d */
13150		snd_hda_codec_write(codec, 0x0f, 0,
13151				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13152		snd_hda_codec_write(codec, 0x10, 0,
13153				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13154	}
13155
13156	dac_vol1 = dac_vol2 = 0xb000 | 0x40;	/* set max volume  */
13157	if (line_nid == 0x14)
13158		dac_vol2 = AMP_OUT_ZERO;
13159	else if (line_nid == 0x15)
13160		dac_vol1 = AMP_OUT_ZERO;
13161	if (hp_nid == 0x14)
13162		dac_vol2 = AMP_OUT_ZERO;
13163	else if (hp_nid == 0x15)
13164		dac_vol1 = AMP_OUT_ZERO;
13165	if (line_nid != 0x16 || hp_nid != 0x16 ||
13166	    spec->autocfg.line_out_pins[1] != 0x16 ||
13167	    spec->autocfg.line_out_pins[2] != 0x16)
13168		dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
13169
13170	snd_hda_codec_write(codec, 0x02, 0,
13171			    AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
13172	snd_hda_codec_write(codec, 0x03, 0,
13173			    AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
13174}
13175
13176/* pcm configuration: identical with ALC880 */
13177#define alc268_pcm_analog_playback	alc880_pcm_analog_playback
13178#define alc268_pcm_analog_capture	alc880_pcm_analog_capture
13179#define alc268_pcm_analog_alt_capture	alc880_pcm_analog_alt_capture
13180#define alc268_pcm_digital_playback	alc880_pcm_digital_playback
13181
13182/*
13183 * BIOS auto configuration
13184 */
13185static int alc268_parse_auto_config(struct hda_codec *codec)
13186{
13187	struct alc_spec *spec = codec->spec;
13188	int err;
13189	static hda_nid_t alc268_ignore[] = { 0 };
13190
13191	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13192					   alc268_ignore);
13193	if (err < 0)
13194		return err;
13195	if (!spec->autocfg.line_outs) {
13196		if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
13197			spec->multiout.max_channels = 2;
13198			spec->no_analog = 1;
13199			goto dig_only;
13200		}
13201		return 0; /* can't find valid BIOS pin config */
13202	}
13203	err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
13204	if (err < 0)
13205		return err;
13206	err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
13207	if (err < 0)
13208		return err;
13209
13210	spec->multiout.max_channels = 2;
13211
13212 dig_only:
13213	/* digital only support output */
13214	if (spec->autocfg.dig_outs) {
13215		spec->multiout.dig_out_nid = ALC268_DIGOUT_NID;
13216		spec->dig_out_type = spec->autocfg.dig_out_type[0];
13217	}
13218	if (spec->kctls.list)
13219		add_mixer(spec, spec->kctls.list);
13220
13221	if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
13222		add_mixer(spec, alc268_beep_mixer);
13223
13224	add_verb(spec, alc268_volume_init_verbs);
13225	spec->num_mux_defs = 2;
13226	spec->input_mux = &spec->private_imux[0];
13227
13228	err = alc_auto_add_mic_boost(codec);
13229	if (err < 0)
13230		return err;
13231
13232	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
13233
13234	return 1;
13235}
13236
13237#define alc268_auto_init_analog_input	alc882_auto_init_analog_input
13238
13239/* init callback for auto-configuration model -- overriding the default init */
13240static void alc268_auto_init(struct hda_codec *codec)
13241{
13242	struct alc_spec *spec = codec->spec;
13243	alc268_auto_init_multi_out(codec);
13244	alc268_auto_init_hp_out(codec);
13245	alc268_auto_init_mono_speaker_out(codec);
13246	alc268_auto_init_analog_input(codec);
13247	if (spec->unsol_event)
13248		alc_inithook(codec);
13249}
13250
13251/*
13252 * configuration and preset
13253 */
13254static const char *alc268_models[ALC268_MODEL_LAST] = {
13255	[ALC267_QUANTA_IL1]	= "quanta-il1",
13256	[ALC268_3ST]		= "3stack",
13257	[ALC268_TOSHIBA]	= "toshiba",
13258	[ALC268_ACER]		= "acer",
13259	[ALC268_ACER_DMIC]	= "acer-dmic",
13260	[ALC268_ACER_ASPIRE_ONE]	= "acer-aspire",
13261	[ALC268_DELL]		= "dell",
13262	[ALC268_ZEPTO]		= "zepto",
13263#ifdef CONFIG_SND_DEBUG
13264	[ALC268_TEST]		= "test",
13265#endif
13266	[ALC268_AUTO]		= "auto",
13267};
13268
13269static struct snd_pci_quirk alc268_cfg_tbl[] = {
13270	SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
13271	SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
13272	SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
13273	SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
13274	SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
13275	SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
13276						ALC268_ACER_ASPIRE_ONE),
13277	SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
13278	SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
13279			"Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
13280	/* almost compatible with toshiba but with optional digital outs;
13281	 * auto-probing seems working fine
13282	 */
13283	SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
13284			   ALC268_AUTO),
13285	SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
13286	SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
13287	SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
13288	SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
13289	SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
13290	SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
13291	{}
13292};
13293
13294/* Toshiba laptops have no unique PCI SSID but only codec SSID */
13295static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
13296	SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
13297	SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
13298	SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
13299			   ALC268_TOSHIBA),
13300	{}
13301};
13302
13303static struct alc_config_preset alc268_presets[] = {
13304	[ALC267_QUANTA_IL1] = {
13305		.mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
13306			    alc268_capture_nosrc_mixer },
13307		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13308				alc267_quanta_il1_verbs },
13309		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13310		.dac_nids = alc268_dac_nids,
13311		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13312		.adc_nids = alc268_adc_nids_alt,
13313		.hp_nid = 0x03,
13314		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13315		.channel_mode = alc268_modes,
13316		.unsol_event = alc_sku_unsol_event,
13317		.setup = alc267_quanta_il1_setup,
13318		.init_hook = alc_inithook,
13319	},
13320	[ALC268_3ST] = {
13321		.mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13322			    alc268_beep_mixer },
13323		.init_verbs = { alc268_base_init_verbs },
13324		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13325		.dac_nids = alc268_dac_nids,
13326                .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13327                .adc_nids = alc268_adc_nids_alt,
13328		.capsrc_nids = alc268_capsrc_nids,
13329		.hp_nid = 0x03,
13330		.dig_out_nid = ALC268_DIGOUT_NID,
13331		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13332		.channel_mode = alc268_modes,
13333		.input_mux = &alc268_capture_source,
13334	},
13335	[ALC268_TOSHIBA] = {
13336		.mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
13337			    alc268_beep_mixer },
13338		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13339				alc268_toshiba_verbs },
13340		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13341		.dac_nids = alc268_dac_nids,
13342		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13343		.adc_nids = alc268_adc_nids_alt,
13344		.capsrc_nids = alc268_capsrc_nids,
13345		.hp_nid = 0x03,
13346		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13347		.channel_mode = alc268_modes,
13348		.input_mux = &alc268_capture_source,
13349		.unsol_event = alc268_toshiba_unsol_event,
13350		.setup = alc268_toshiba_setup,
13351		.init_hook = alc268_toshiba_automute,
13352	},
13353	[ALC268_ACER] = {
13354		.mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
13355			    alc268_beep_mixer },
13356		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13357				alc268_acer_verbs },
13358		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13359		.dac_nids = alc268_dac_nids,
13360		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13361		.adc_nids = alc268_adc_nids_alt,
13362		.capsrc_nids = alc268_capsrc_nids,
13363		.hp_nid = 0x02,
13364		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13365		.channel_mode = alc268_modes,
13366		.input_mux = &alc268_acer_capture_source,
13367		.unsol_event = alc268_acer_unsol_event,
13368		.init_hook = alc268_acer_init_hook,
13369	},
13370	[ALC268_ACER_DMIC] = {
13371		.mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
13372			    alc268_beep_mixer },
13373		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13374				alc268_acer_verbs },
13375		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13376		.dac_nids = alc268_dac_nids,
13377		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13378		.adc_nids = alc268_adc_nids_alt,
13379		.capsrc_nids = alc268_capsrc_nids,
13380		.hp_nid = 0x02,
13381		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13382		.channel_mode = alc268_modes,
13383		.input_mux = &alc268_acer_dmic_capture_source,
13384		.unsol_event = alc268_acer_unsol_event,
13385		.init_hook = alc268_acer_init_hook,
13386	},
13387	[ALC268_ACER_ASPIRE_ONE] = {
13388		.mixers = { alc268_acer_aspire_one_mixer,
13389			    alc268_beep_mixer,
13390			    alc268_capture_nosrc_mixer },
13391		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13392				alc268_acer_aspire_one_verbs },
13393		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13394		.dac_nids = alc268_dac_nids,
13395		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13396		.adc_nids = alc268_adc_nids_alt,
13397		.capsrc_nids = alc268_capsrc_nids,
13398		.hp_nid = 0x03,
13399		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13400		.channel_mode = alc268_modes,
13401		.unsol_event = alc268_acer_lc_unsol_event,
13402		.setup = alc268_acer_lc_setup,
13403		.init_hook = alc268_acer_lc_init_hook,
13404	},
13405	[ALC268_DELL] = {
13406		.mixers = { alc268_dell_mixer, alc268_beep_mixer,
13407			    alc268_capture_nosrc_mixer },
13408		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13409				alc268_dell_verbs },
13410		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13411		.dac_nids = alc268_dac_nids,
13412		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13413		.adc_nids = alc268_adc_nids_alt,
13414		.capsrc_nids = alc268_capsrc_nids,
13415		.hp_nid = 0x02,
13416		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13417		.channel_mode = alc268_modes,
13418		.unsol_event = alc_sku_unsol_event,
13419		.setup = alc268_dell_setup,
13420		.init_hook = alc_inithook,
13421	},
13422	[ALC268_ZEPTO] = {
13423		.mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13424			    alc268_beep_mixer },
13425		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13426				alc268_toshiba_verbs },
13427		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13428		.dac_nids = alc268_dac_nids,
13429		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13430		.adc_nids = alc268_adc_nids_alt,
13431		.capsrc_nids = alc268_capsrc_nids,
13432		.hp_nid = 0x03,
13433		.dig_out_nid = ALC268_DIGOUT_NID,
13434		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13435		.channel_mode = alc268_modes,
13436		.input_mux = &alc268_capture_source,
13437		.setup = alc268_toshiba_setup,
13438		.init_hook = alc268_toshiba_automute,
13439	},
13440#ifdef CONFIG_SND_DEBUG
13441	[ALC268_TEST] = {
13442		.mixers = { alc268_test_mixer, alc268_capture_mixer },
13443		.init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13444				alc268_volume_init_verbs },
13445		.num_dacs = ARRAY_SIZE(alc268_dac_nids),
13446		.dac_nids = alc268_dac_nids,
13447		.num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13448		.adc_nids = alc268_adc_nids_alt,
13449		.capsrc_nids = alc268_capsrc_nids,
13450		.hp_nid = 0x03,
13451		.dig_out_nid = ALC268_DIGOUT_NID,
13452		.num_channel_mode = ARRAY_SIZE(alc268_modes),
13453		.channel_mode = alc268_modes,
13454		.input_mux = &alc268_capture_source,
13455	},
13456#endif
13457};
13458
13459static int patch_alc268(struct hda_codec *codec)
13460{
13461	struct alc_spec *spec;
13462	int board_config;
13463	int i, has_beep, err;
13464
13465	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13466	if (spec == NULL)
13467		return -ENOMEM;
13468
13469	codec->spec = spec;
13470
13471	board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
13472						  alc268_models,
13473						  alc268_cfg_tbl);
13474
13475	if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
13476		board_config = snd_hda_check_board_codec_sid_config(codec,
13477			ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
13478
13479	if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
13480		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13481		       codec->chip_name);
13482		board_config = ALC268_AUTO;
13483	}
13484
13485	if (board_config == ALC268_AUTO) {
13486		/* automatic parse from the BIOS config */
13487		err = alc268_parse_auto_config(codec);
13488		if (err < 0) {
13489			alc_free(codec);
13490			return err;
13491		} else if (!err) {
13492			printk(KERN_INFO
13493			       "hda_codec: Cannot set up configuration "
13494			       "from BIOS.  Using base mode...\n");
13495			board_config = ALC268_3ST;
13496		}
13497	}
13498
13499	if (board_config != ALC268_AUTO)
13500		setup_preset(codec, &alc268_presets[board_config]);
13501
13502	spec->stream_analog_playback = &alc268_pcm_analog_playback;
13503	spec->stream_analog_capture = &alc268_pcm_analog_capture;
13504	spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
13505
13506	spec->stream_digital_playback = &alc268_pcm_digital_playback;
13507
13508	has_beep = 0;
13509	for (i = 0; i < spec->num_mixers; i++) {
13510		if (spec->mixers[i] == alc268_beep_mixer) {
13511			has_beep = 1;
13512			break;
13513		}
13514	}
13515
13516	if (has_beep) {
13517		err = snd_hda_attach_beep_device(codec, 0x1);
13518		if (err < 0) {
13519			alc_free(codec);
13520			return err;
13521		}
13522		if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
13523			/* override the amp caps for beep generator */
13524			snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
13525					  (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
13526					  (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
13527					  (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
13528					  (0 << AC_AMPCAP_MUTE_SHIFT));
13529	}
13530
13531	if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
13532		/* check whether NID 0x07 is valid */
13533		unsigned int wcap = get_wcaps(codec, 0x07);
13534		int i;
13535
13536		spec->capsrc_nids = alc268_capsrc_nids;
13537		/* get type */
13538		wcap = get_wcaps_type(wcap);
13539		if (spec->auto_mic ||
13540		    wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
13541			spec->adc_nids = alc268_adc_nids_alt;
13542			spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
13543			if (spec->auto_mic)
13544				fixup_automic_adc(codec);
13545			if (spec->auto_mic || spec->input_mux->num_items == 1)
13546				add_mixer(spec, alc268_capture_nosrc_mixer);
13547			else
13548				add_mixer(spec, alc268_capture_alt_mixer);
13549		} else {
13550			spec->adc_nids = alc268_adc_nids;
13551			spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
13552			add_mixer(spec, alc268_capture_mixer);
13553		}
13554		/* set default input source */
13555		for (i = 0; i < spec->num_adc_nids; i++)
13556			snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
13557				0, AC_VERB_SET_CONNECT_SEL,
13558				i < spec->num_mux_defs ?
13559				spec->input_mux[i].items[0].index :
13560				spec->input_mux->items[0].index);
13561	}
13562
13563	spec->vmaster_nid = 0x02;
13564
13565	codec->patch_ops = alc_patch_ops;
13566	if (board_config == ALC268_AUTO)
13567		spec->init_hook = alc268_auto_init;
13568
13569	return 0;
13570}
13571
13572/*
13573 *  ALC269 channel source setting (2 channel)
13574 */
13575#define ALC269_DIGOUT_NID	ALC880_DIGOUT_NID
13576
13577#define alc269_dac_nids		alc260_dac_nids
13578
13579static hda_nid_t alc269_adc_nids[1] = {
13580	/* ADC1 */
13581	0x08,
13582};
13583
13584static hda_nid_t alc269_capsrc_nids[1] = {
13585	0x23,
13586};
13587
13588static hda_nid_t alc269vb_adc_nids[1] = {
13589	/* ADC1 */
13590	0x09,
13591};
13592
13593static hda_nid_t alc269vb_capsrc_nids[1] = {
13594	0x22,
13595};
13596
13597static hda_nid_t alc269_adc_candidates[] = {
13598	0x08, 0x09, 0x07,
13599};
13600
13601#define alc269_modes		alc260_modes
13602#define alc269_capture_source	alc880_lg_lw_capture_source
13603
13604static struct snd_kcontrol_new alc269_base_mixer[] = {
13605	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13606	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13607	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
13608	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
13609	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13610	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13611	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13612	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13613	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13614	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
13615	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13616	HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
13617	{ } /* end */
13618};
13619
13620static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
13621	/* output mixer control */
13622	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13623	{
13624		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13625		.name = "Master Playback Switch",
13626		.subdevice = HDA_SUBDEV_AMP_FLAG,
13627		.info = snd_hda_mixer_amp_switch_info,
13628		.get = snd_hda_mixer_amp_switch_get,
13629		.put = alc268_acer_master_sw_put,
13630		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13631	},
13632	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13633	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13634	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13635	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13636	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13637	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13638	{ }
13639};
13640
13641static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
13642	/* output mixer control */
13643	HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13644	{
13645		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13646		.name = "Master Playback Switch",
13647		.subdevice = HDA_SUBDEV_AMP_FLAG,
13648		.info = snd_hda_mixer_amp_switch_info,
13649		.get = snd_hda_mixer_amp_switch_get,
13650		.put = alc268_acer_master_sw_put,
13651		.private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13652	},
13653	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13654	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13655	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13656	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13657	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13658	HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13659	HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
13660	HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
13661	HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
13662	{ }
13663};
13664
13665static struct snd_kcontrol_new alc269_laptop_mixer[] = {
13666	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13667	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13668	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13669	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13670	{ } /* end */
13671};
13672
13673static struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
13674	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13675	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13676	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
13677	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13678	{ } /* end */
13679};
13680
13681/* capture mixer elements */
13682static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
13683	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13684	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13685	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13686	HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13687	{ } /* end */
13688};
13689
13690static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
13691	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13692	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13693	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13694	{ } /* end */
13695};
13696
13697static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
13698	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13699	HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13700	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13701	HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13702	{ } /* end */
13703};
13704
13705static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
13706	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13707	HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13708	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13709	{ } /* end */
13710};
13711
13712/* FSC amilo */
13713#define alc269_fujitsu_mixer	alc269_laptop_mixer
13714
13715static struct hda_verb alc269_quanta_fl1_verbs[] = {
13716	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13717	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13718	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13719	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13720	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13721	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13722	{ }
13723};
13724
13725static struct hda_verb alc269_lifebook_verbs[] = {
13726	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13727	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
13728	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13729	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13730	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13731	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13732	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13733	{0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13734	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13735	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13736	{ }
13737};
13738
13739/* toggle speaker-output according to the hp-jack state */
13740static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
13741{
13742	unsigned int present;
13743	unsigned char bits;
13744
13745	present = snd_hda_jack_detect(codec, 0x15);
13746	bits = present ? HDA_AMP_MUTE : 0;
13747	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13748				 HDA_AMP_MUTE, bits);
13749	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13750				 HDA_AMP_MUTE, bits);
13751
13752	snd_hda_codec_write(codec, 0x20, 0,
13753			AC_VERB_SET_COEF_INDEX, 0x0c);
13754	snd_hda_codec_write(codec, 0x20, 0,
13755			AC_VERB_SET_PROC_COEF, 0x680);
13756
13757	snd_hda_codec_write(codec, 0x20, 0,
13758			AC_VERB_SET_COEF_INDEX, 0x0c);
13759	snd_hda_codec_write(codec, 0x20, 0,
13760			AC_VERB_SET_PROC_COEF, 0x480);
13761}
13762
13763/* toggle speaker-output according to the hp-jacks state */
13764static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
13765{
13766	unsigned int present;
13767	unsigned char bits;
13768
13769	/* Check laptop headphone socket */
13770	present = snd_hda_jack_detect(codec, 0x15);
13771
13772	/* Check port replicator headphone socket */
13773	present |= snd_hda_jack_detect(codec, 0x1a);
13774
13775	bits = present ? HDA_AMP_MUTE : 0;
13776	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13777				 HDA_AMP_MUTE, bits);
13778	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13779				 HDA_AMP_MUTE, bits);
13780
13781	snd_hda_codec_write(codec, 0x20, 0,
13782			AC_VERB_SET_COEF_INDEX, 0x0c);
13783	snd_hda_codec_write(codec, 0x20, 0,
13784			AC_VERB_SET_PROC_COEF, 0x680);
13785
13786	snd_hda_codec_write(codec, 0x20, 0,
13787			AC_VERB_SET_COEF_INDEX, 0x0c);
13788	snd_hda_codec_write(codec, 0x20, 0,
13789			AC_VERB_SET_PROC_COEF, 0x480);
13790}
13791
13792static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13793{
13794	unsigned int present_laptop;
13795	unsigned int present_dock;
13796
13797	present_laptop	= snd_hda_jack_detect(codec, 0x18);
13798	present_dock	= snd_hda_jack_detect(codec, 0x1b);
13799
13800	/* Laptop mic port overrides dock mic port, design decision */
13801	if (present_dock)
13802		snd_hda_codec_write(codec, 0x23, 0,
13803				AC_VERB_SET_CONNECT_SEL, 0x3);
13804	if (present_laptop)
13805		snd_hda_codec_write(codec, 0x23, 0,
13806				AC_VERB_SET_CONNECT_SEL, 0x0);
13807	if (!present_dock && !present_laptop)
13808		snd_hda_codec_write(codec, 0x23, 0,
13809				AC_VERB_SET_CONNECT_SEL, 0x1);
13810}
13811
13812static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
13813				    unsigned int res)
13814{
13815	switch (res >> 26) {
13816	case ALC880_HP_EVENT:
13817		alc269_quanta_fl1_speaker_automute(codec);
13818		break;
13819	case ALC880_MIC_EVENT:
13820		alc_mic_automute(codec);
13821		break;
13822	}
13823}
13824
13825static void alc269_lifebook_unsol_event(struct hda_codec *codec,
13826					unsigned int res)
13827{
13828	if ((res >> 26) == ALC880_HP_EVENT)
13829		alc269_lifebook_speaker_automute(codec);
13830	if ((res >> 26) == ALC880_MIC_EVENT)
13831		alc269_lifebook_mic_autoswitch(codec);
13832}
13833
13834static void alc269_quanta_fl1_setup(struct hda_codec *codec)
13835{
13836	struct alc_spec *spec = codec->spec;
13837	spec->autocfg.hp_pins[0] = 0x15;
13838	spec->autocfg.speaker_pins[0] = 0x14;
13839	spec->ext_mic.pin = 0x18;
13840	spec->ext_mic.mux_idx = 0;
13841	spec->int_mic.pin = 0x19;
13842	spec->int_mic.mux_idx = 1;
13843	spec->auto_mic = 1;
13844}
13845
13846static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
13847{
13848	alc269_quanta_fl1_speaker_automute(codec);
13849	alc_mic_automute(codec);
13850}
13851
13852static void alc269_lifebook_init_hook(struct hda_codec *codec)
13853{
13854	alc269_lifebook_speaker_automute(codec);
13855	alc269_lifebook_mic_autoswitch(codec);
13856}
13857
13858static struct hda_verb alc269_laptop_dmic_init_verbs[] = {
13859	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13860	{0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
13861	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13862	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13863	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13864	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13865	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13866	{}
13867};
13868
13869static struct hda_verb alc269_laptop_amic_init_verbs[] = {
13870	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13871	{0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
13872	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13873	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
13874	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13875	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13876	{}
13877};
13878
13879static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
13880	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13881	{0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
13882	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13883	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13884	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13885	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13886	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13887	{}
13888};
13889
13890static struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
13891	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13892	{0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
13893	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13894	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13895	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13896	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13897	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13898	{}
13899};
13900
13901/* toggle speaker-output according to the hp-jack state */
13902static void alc269_speaker_automute(struct hda_codec *codec)
13903{
13904	struct alc_spec *spec = codec->spec;
13905	unsigned int nid = spec->autocfg.hp_pins[0];
13906	unsigned int present;
13907	unsigned char bits;
13908
13909	present = snd_hda_jack_detect(codec, nid);
13910	bits = present ? HDA_AMP_MUTE : 0;
13911	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13912				 HDA_AMP_MUTE, bits);
13913	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13914				 HDA_AMP_MUTE, bits);
13915}
13916
13917/* unsolicited event for HP jack sensing */
13918static void alc269_laptop_unsol_event(struct hda_codec *codec,
13919				     unsigned int res)
13920{
13921	switch (res >> 26) {
13922	case ALC880_HP_EVENT:
13923		alc269_speaker_automute(codec);
13924		break;
13925	case ALC880_MIC_EVENT:
13926		alc_mic_automute(codec);
13927		break;
13928	}
13929}
13930
13931static void alc269_laptop_amic_setup(struct hda_codec *codec)
13932{
13933	struct alc_spec *spec = codec->spec;
13934	spec->autocfg.hp_pins[0] = 0x15;
13935	spec->autocfg.speaker_pins[0] = 0x14;
13936	spec->ext_mic.pin = 0x18;
13937	spec->ext_mic.mux_idx = 0;
13938	spec->int_mic.pin = 0x19;
13939	spec->int_mic.mux_idx = 1;
13940	spec->auto_mic = 1;
13941}
13942
13943static void alc269_laptop_dmic_setup(struct hda_codec *codec)
13944{
13945	struct alc_spec *spec = codec->spec;
13946	spec->autocfg.hp_pins[0] = 0x15;
13947	spec->autocfg.speaker_pins[0] = 0x14;
13948	spec->ext_mic.pin = 0x18;
13949	spec->ext_mic.mux_idx = 0;
13950	spec->int_mic.pin = 0x12;
13951	spec->int_mic.mux_idx = 5;
13952	spec->auto_mic = 1;
13953}
13954
13955static void alc269vb_laptop_amic_setup(struct hda_codec *codec)
13956{
13957	struct alc_spec *spec = codec->spec;
13958	spec->autocfg.hp_pins[0] = 0x21;
13959	spec->autocfg.speaker_pins[0] = 0x14;
13960	spec->ext_mic.pin = 0x18;
13961	spec->ext_mic.mux_idx = 0;
13962	spec->int_mic.pin = 0x19;
13963	spec->int_mic.mux_idx = 1;
13964	spec->auto_mic = 1;
13965}
13966
13967static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
13968{
13969	struct alc_spec *spec = codec->spec;
13970	spec->autocfg.hp_pins[0] = 0x21;
13971	spec->autocfg.speaker_pins[0] = 0x14;
13972	spec->ext_mic.pin = 0x18;
13973	spec->ext_mic.mux_idx = 0;
13974	spec->int_mic.pin = 0x12;
13975	spec->int_mic.mux_idx = 6;
13976	spec->auto_mic = 1;
13977}
13978
13979static void alc269_laptop_inithook(struct hda_codec *codec)
13980{
13981	alc269_speaker_automute(codec);
13982	alc_mic_automute(codec);
13983}
13984
13985/*
13986 * generic initialization of ADC, input mixers and output mixers
13987 */
13988static struct hda_verb alc269_init_verbs[] = {
13989	/*
13990	 * Unmute ADC0 and set the default input to mic-in
13991	 */
13992	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13993
13994	/*
13995	 * Set up output mixers (0x02 - 0x03)
13996	 */
13997	/* set vol=0 to output mixers */
13998	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13999	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14000
14001	/* set up input amps for analog loopback */
14002	/* Amp Indices: DAC = 0, mixer = 1 */
14003	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14004	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14005	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14006	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14007	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14008	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14009
14010	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14011	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14012	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14013	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14014	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14015	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14016	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14017
14018	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14019	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14020
14021	/* FIXME: use Mux-type input source selection */
14022	/* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14023	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14024	{0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
14025
14026	/* set EAPD */
14027	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14028	{ }
14029};
14030
14031static struct hda_verb alc269vb_init_verbs[] = {
14032	/*
14033	 * Unmute ADC0 and set the default input to mic-in
14034	 */
14035	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14036
14037	/*
14038	 * Set up output mixers (0x02 - 0x03)
14039	 */
14040	/* set vol=0 to output mixers */
14041	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14042	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14043
14044	/* set up input amps for analog loopback */
14045	/* Amp Indices: DAC = 0, mixer = 1 */
14046	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14047	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14048	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14049	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14050	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14051	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14052
14053	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14054	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14055	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14056	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14057	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14058	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14059	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14060
14061	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14062	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14063
14064	/* FIXME: use Mux-type input source selection */
14065	/* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14066	/* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14067	{0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
14068
14069	/* set EAPD */
14070	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14071	{ }
14072};
14073
14074#define alc269_auto_create_multi_out_ctls \
14075	alc268_auto_create_multi_out_ctls
14076#define alc269_auto_create_input_ctls \
14077	alc268_auto_create_input_ctls
14078
14079#ifdef CONFIG_SND_HDA_POWER_SAVE
14080#define alc269_loopbacks	alc880_loopbacks
14081#endif
14082
14083/* pcm configuration: identical with ALC880 */
14084#define alc269_pcm_analog_playback	alc880_pcm_analog_playback
14085#define alc269_pcm_analog_capture	alc880_pcm_analog_capture
14086#define alc269_pcm_digital_playback	alc880_pcm_digital_playback
14087#define alc269_pcm_digital_capture	alc880_pcm_digital_capture
14088
14089static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
14090	.substreams = 1,
14091	.channels_min = 2,
14092	.channels_max = 8,
14093	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14094	/* NID is set in alc_build_pcms */
14095	.ops = {
14096		.open = alc880_playback_pcm_open,
14097		.prepare = alc880_playback_pcm_prepare,
14098		.cleanup = alc880_playback_pcm_cleanup
14099	},
14100};
14101
14102static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
14103	.substreams = 1,
14104	.channels_min = 2,
14105	.channels_max = 2,
14106	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14107	/* NID is set in alc_build_pcms */
14108};
14109
14110#ifdef CONFIG_SND_HDA_POWER_SAVE
14111static int alc269_mic2_for_mute_led(struct hda_codec *codec)
14112{
14113	switch (codec->subsystem_id) {
14114	case 0x103c1586:
14115		return 1;
14116	}
14117	return 0;
14118}
14119
14120static int alc269_mic2_mute_check_ps(struct hda_codec *codec, hda_nid_t nid)
14121{
14122	/* update mute-LED according to the speaker mute state */
14123	if (nid == 0x01 || nid == 0x14) {
14124		int pinval;
14125		if (snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0) &
14126		    HDA_AMP_MUTE)
14127			pinval = 0x24;
14128		else
14129			pinval = 0x20;
14130		/* mic2 vref pin is used for mute LED control */
14131		snd_hda_codec_update_cache(codec, 0x19, 0,
14132					   AC_VERB_SET_PIN_WIDGET_CONTROL,
14133					   pinval);
14134	}
14135	return alc_check_power_status(codec, nid);
14136}
14137#endif /* CONFIG_SND_HDA_POWER_SAVE */
14138
14139/*
14140 * BIOS auto configuration
14141 */
14142static int alc269_parse_auto_config(struct hda_codec *codec)
14143{
14144	struct alc_spec *spec = codec->spec;
14145	int err;
14146	static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
14147
14148	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14149					   alc269_ignore);
14150	if (err < 0)
14151		return err;
14152
14153	err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
14154	if (err < 0)
14155		return err;
14156	err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
14157	if (err < 0)
14158		return err;
14159
14160	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
14161
14162	if (spec->autocfg.dig_outs)
14163		spec->multiout.dig_out_nid = ALC269_DIGOUT_NID;
14164
14165	if (spec->kctls.list)
14166		add_mixer(spec, spec->kctls.list);
14167
14168	if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010) {
14169		add_verb(spec, alc269vb_init_verbs);
14170		alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21);
14171	} else {
14172		add_verb(spec, alc269_init_verbs);
14173		alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
14174	}
14175
14176	spec->num_mux_defs = 1;
14177	spec->input_mux = &spec->private_imux[0];
14178	fillup_priv_adc_nids(codec, alc269_adc_candidates,
14179			     sizeof(alc269_adc_candidates));
14180
14181	/* set default input source */
14182	snd_hda_codec_write_cache(codec, spec->capsrc_nids[0],
14183				  0, AC_VERB_SET_CONNECT_SEL,
14184				  spec->input_mux->items[0].index);
14185
14186	err = alc_auto_add_mic_boost(codec);
14187	if (err < 0)
14188		return err;
14189
14190	if (!spec->cap_mixer && !spec->no_analog)
14191		set_capture_mixer(codec);
14192
14193	return 1;
14194}
14195
14196#define alc269_auto_init_multi_out	alc268_auto_init_multi_out
14197#define alc269_auto_init_hp_out		alc268_auto_init_hp_out
14198#define alc269_auto_init_analog_input	alc882_auto_init_analog_input
14199
14200
14201/* init callback for auto-configuration model -- overriding the default init */
14202static void alc269_auto_init(struct hda_codec *codec)
14203{
14204	struct alc_spec *spec = codec->spec;
14205	alc269_auto_init_multi_out(codec);
14206	alc269_auto_init_hp_out(codec);
14207	alc269_auto_init_analog_input(codec);
14208	if (spec->unsol_event)
14209		alc_inithook(codec);
14210}
14211
14212enum {
14213	ALC269_FIXUP_SONY_VAIO,
14214};
14215
14216static const struct hda_verb alc269_sony_vaio_fixup_verbs[] = {
14217	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
14218	{}
14219};
14220
14221static const struct alc_fixup alc269_fixups[] = {
14222	[ALC269_FIXUP_SONY_VAIO] = {
14223		.verbs = alc269_sony_vaio_fixup_verbs
14224	},
14225};
14226
14227static struct snd_pci_quirk alc269_fixup_tbl[] = {
14228	SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
14229	{}
14230};
14231
14232
14233/*
14234 * configuration and preset
14235 */
14236static const char *alc269_models[ALC269_MODEL_LAST] = {
14237	[ALC269_BASIC]			= "basic",
14238	[ALC269_QUANTA_FL1]		= "quanta",
14239	[ALC269_AMIC]			= "laptop-amic",
14240	[ALC269_DMIC]			= "laptop-dmic",
14241	[ALC269_FUJITSU]		= "fujitsu",
14242	[ALC269_LIFEBOOK]		= "lifebook",
14243	[ALC269_AUTO]			= "auto",
14244};
14245
14246static struct snd_pci_quirk alc269_cfg_tbl[] = {
14247	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
14248	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
14249		      ALC269_AMIC),
14250	SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
14251	SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
14252	SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
14253	SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
14254	SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
14255	SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
14256	SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
14257	SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
14258	SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
14259	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC),
14260	SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
14261	SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
14262	SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
14263	SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
14264	SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
14265	SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
14266	SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
14267	SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
14268	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
14269	SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
14270	SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
14271	SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
14272	SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
14273	SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
14274	SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
14275	SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
14276	SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
14277	SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
14278	SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
14279	SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
14280	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
14281	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
14282	SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
14283	SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
14284	SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
14285	SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
14286	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
14287		      ALC269_DMIC),
14288	SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
14289		      ALC269_DMIC),
14290	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
14291	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
14292	SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),
14293	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
14294	SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
14295	SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
14296	SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC),
14297	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC),
14298	SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC),
14299	SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC),
14300	{}
14301};
14302
14303static struct alc_config_preset alc269_presets[] = {
14304	[ALC269_BASIC] = {
14305		.mixers = { alc269_base_mixer },
14306		.init_verbs = { alc269_init_verbs },
14307		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14308		.dac_nids = alc269_dac_nids,
14309		.hp_nid = 0x03,
14310		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14311		.channel_mode = alc269_modes,
14312		.input_mux = &alc269_capture_source,
14313	},
14314	[ALC269_QUANTA_FL1] = {
14315		.mixers = { alc269_quanta_fl1_mixer },
14316		.init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
14317		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14318		.dac_nids = alc269_dac_nids,
14319		.hp_nid = 0x03,
14320		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14321		.channel_mode = alc269_modes,
14322		.input_mux = &alc269_capture_source,
14323		.unsol_event = alc269_quanta_fl1_unsol_event,
14324		.setup = alc269_quanta_fl1_setup,
14325		.init_hook = alc269_quanta_fl1_init_hook,
14326	},
14327	[ALC269_AMIC] = {
14328		.mixers = { alc269_laptop_mixer },
14329		.cap_mixer = alc269_laptop_analog_capture_mixer,
14330		.init_verbs = { alc269_init_verbs,
14331				alc269_laptop_amic_init_verbs },
14332		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14333		.dac_nids = alc269_dac_nids,
14334		.hp_nid = 0x03,
14335		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14336		.channel_mode = alc269_modes,
14337		.unsol_event = alc269_laptop_unsol_event,
14338		.setup = alc269_laptop_amic_setup,
14339		.init_hook = alc269_laptop_inithook,
14340	},
14341	[ALC269_DMIC] = {
14342		.mixers = { alc269_laptop_mixer },
14343		.cap_mixer = alc269_laptop_digital_capture_mixer,
14344		.init_verbs = { alc269_init_verbs,
14345				alc269_laptop_dmic_init_verbs },
14346		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14347		.dac_nids = alc269_dac_nids,
14348		.hp_nid = 0x03,
14349		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14350		.channel_mode = alc269_modes,
14351		.unsol_event = alc269_laptop_unsol_event,
14352		.setup = alc269_laptop_dmic_setup,
14353		.init_hook = alc269_laptop_inithook,
14354	},
14355	[ALC269VB_AMIC] = {
14356		.mixers = { alc269vb_laptop_mixer },
14357		.cap_mixer = alc269vb_laptop_analog_capture_mixer,
14358		.init_verbs = { alc269vb_init_verbs,
14359				alc269vb_laptop_amic_init_verbs },
14360		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14361		.dac_nids = alc269_dac_nids,
14362		.hp_nid = 0x03,
14363		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14364		.channel_mode = alc269_modes,
14365		.unsol_event = alc269_laptop_unsol_event,
14366		.setup = alc269vb_laptop_amic_setup,
14367		.init_hook = alc269_laptop_inithook,
14368	},
14369	[ALC269VB_DMIC] = {
14370		.mixers = { alc269vb_laptop_mixer },
14371		.cap_mixer = alc269vb_laptop_digital_capture_mixer,
14372		.init_verbs = { alc269vb_init_verbs,
14373				alc269vb_laptop_dmic_init_verbs },
14374		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14375		.dac_nids = alc269_dac_nids,
14376		.hp_nid = 0x03,
14377		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14378		.channel_mode = alc269_modes,
14379		.unsol_event = alc269_laptop_unsol_event,
14380		.setup = alc269vb_laptop_dmic_setup,
14381		.init_hook = alc269_laptop_inithook,
14382	},
14383	[ALC269_FUJITSU] = {
14384		.mixers = { alc269_fujitsu_mixer },
14385		.cap_mixer = alc269_laptop_digital_capture_mixer,
14386		.init_verbs = { alc269_init_verbs,
14387				alc269_laptop_dmic_init_verbs },
14388		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14389		.dac_nids = alc269_dac_nids,
14390		.hp_nid = 0x03,
14391		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14392		.channel_mode = alc269_modes,
14393		.unsol_event = alc269_laptop_unsol_event,
14394		.setup = alc269_laptop_dmic_setup,
14395		.init_hook = alc269_laptop_inithook,
14396	},
14397	[ALC269_LIFEBOOK] = {
14398		.mixers = { alc269_lifebook_mixer },
14399		.init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
14400		.num_dacs = ARRAY_SIZE(alc269_dac_nids),
14401		.dac_nids = alc269_dac_nids,
14402		.hp_nid = 0x03,
14403		.num_channel_mode = ARRAY_SIZE(alc269_modes),
14404		.channel_mode = alc269_modes,
14405		.input_mux = &alc269_capture_source,
14406		.unsol_event = alc269_lifebook_unsol_event,
14407		.init_hook = alc269_lifebook_init_hook,
14408	},
14409};
14410
14411static int patch_alc269(struct hda_codec *codec)
14412{
14413	struct alc_spec *spec;
14414	int board_config;
14415	int err;
14416	int is_alc269vb = 0;
14417
14418	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14419	if (spec == NULL)
14420		return -ENOMEM;
14421
14422	codec->spec = spec;
14423
14424	alc_auto_parse_customize_define(codec);
14425
14426	if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){
14427		if (codec->bus->pci->subsystem_vendor == 0x1025 &&
14428		    spec->cdefine.platform_type == 1)
14429			alc_codec_rename(codec, "ALC271X");
14430		else
14431			alc_codec_rename(codec, "ALC259");
14432		is_alc269vb = 1;
14433	} else
14434		alc_fix_pll_init(codec, 0x20, 0x04, 15);
14435
14436	board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
14437						  alc269_models,
14438						  alc269_cfg_tbl);
14439
14440	if (board_config < 0) {
14441		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14442		       codec->chip_name);
14443		board_config = ALC269_AUTO;
14444	}
14445
14446	if (board_config == ALC269_AUTO)
14447		alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 1);
14448
14449	if (board_config == ALC269_AUTO) {
14450		/* automatic parse from the BIOS config */
14451		err = alc269_parse_auto_config(codec);
14452		if (err < 0) {
14453			alc_free(codec);
14454			return err;
14455		} else if (!err) {
14456			printk(KERN_INFO
14457			       "hda_codec: Cannot set up configuration "
14458			       "from BIOS.  Using base mode...\n");
14459			board_config = ALC269_BASIC;
14460		}
14461	}
14462
14463	if (spec->cdefine.enable_pcbeep) {
14464		err = snd_hda_attach_beep_device(codec, 0x1);
14465		if (err < 0) {
14466			alc_free(codec);
14467			return err;
14468		}
14469	}
14470
14471	if (board_config != ALC269_AUTO)
14472		setup_preset(codec, &alc269_presets[board_config]);
14473
14474	if (board_config == ALC269_QUANTA_FL1) {
14475		/* Due to a hardware problem on Lenovo Ideadpad, we need to
14476		 * fix the sample rate of analog I/O to 44.1kHz
14477		 */
14478		spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
14479		spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
14480	} else {
14481		spec->stream_analog_playback = &alc269_pcm_analog_playback;
14482		spec->stream_analog_capture = &alc269_pcm_analog_capture;
14483	}
14484	spec->stream_digital_playback = &alc269_pcm_digital_playback;
14485	spec->stream_digital_capture = &alc269_pcm_digital_capture;
14486
14487	if (!spec->adc_nids) { /* wasn't filled automatically? use default */
14488		if (!is_alc269vb) {
14489			spec->adc_nids = alc269_adc_nids;
14490			spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
14491			spec->capsrc_nids = alc269_capsrc_nids;
14492		} else {
14493			spec->adc_nids = alc269vb_adc_nids;
14494			spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids);
14495			spec->capsrc_nids = alc269vb_capsrc_nids;
14496		}
14497	}
14498
14499	if (!spec->cap_mixer)
14500		set_capture_mixer(codec);
14501	if (spec->cdefine.enable_pcbeep)
14502		set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
14503
14504	if (board_config == ALC269_AUTO)
14505		alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 0);
14506
14507	spec->vmaster_nid = 0x02;
14508
14509	codec->patch_ops = alc_patch_ops;
14510	if (board_config == ALC269_AUTO)
14511		spec->init_hook = alc269_auto_init;
14512#ifdef CONFIG_SND_HDA_POWER_SAVE
14513	if (!spec->loopback.amplist)
14514		spec->loopback.amplist = alc269_loopbacks;
14515	if (alc269_mic2_for_mute_led(codec))
14516		codec->patch_ops.check_power_status = alc269_mic2_mute_check_ps;
14517#endif
14518
14519	return 0;
14520}
14521
14522/*
14523 *  ALC861 channel source setting (2/6 channel selection for 3-stack)
14524 */
14525
14526/*
14527 * set the path ways for 2 channel output
14528 * need to set the codec line out and mic 1 pin widgets to inputs
14529 */
14530static struct hda_verb alc861_threestack_ch2_init[] = {
14531	/* set pin widget 1Ah (line in) for input */
14532	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14533	/* set pin widget 18h (mic1/2) for input, for mic also enable
14534	 * the vref
14535	 */
14536	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14537
14538	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14539#if 0
14540	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14541	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14542#endif
14543	{ } /* end */
14544};
14545/*
14546 * 6ch mode
14547 * need to set the codec line out and mic 1 pin widgets to outputs
14548 */
14549static struct hda_verb alc861_threestack_ch6_init[] = {
14550	/* set pin widget 1Ah (line in) for output (Back Surround)*/
14551	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14552	/* set pin widget 18h (mic1) for output (CLFE)*/
14553	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14554
14555	{ 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14556	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14557
14558	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14559#if 0
14560	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14561	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14562#endif
14563	{ } /* end */
14564};
14565
14566static struct hda_channel_mode alc861_threestack_modes[2] = {
14567	{ 2, alc861_threestack_ch2_init },
14568	{ 6, alc861_threestack_ch6_init },
14569};
14570/* Set mic1 as input and unmute the mixer */
14571static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
14572	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14573	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14574	{ } /* end */
14575};
14576/* Set mic1 as output and mute mixer */
14577static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
14578	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14579	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14580	{ } /* end */
14581};
14582
14583static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
14584	{ 2, alc861_uniwill_m31_ch2_init },
14585	{ 4, alc861_uniwill_m31_ch4_init },
14586};
14587
14588/* Set mic1 and line-in as input and unmute the mixer */
14589static struct hda_verb alc861_asus_ch2_init[] = {
14590	/* set pin widget 1Ah (line in) for input */
14591	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14592	/* set pin widget 18h (mic1/2) for input, for mic also enable
14593	 * the vref
14594	 */
14595	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14596
14597	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14598#if 0
14599	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14600	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14601#endif
14602	{ } /* end */
14603};
14604/* Set mic1 nad line-in as output and mute mixer */
14605static struct hda_verb alc861_asus_ch6_init[] = {
14606	/* set pin widget 1Ah (line in) for output (Back Surround)*/
14607	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14608	/* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14609	/* set pin widget 18h (mic1) for output (CLFE)*/
14610	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14611	/* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14612	{ 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14613	{ 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14614
14615	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14616#if 0
14617	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14618	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14619#endif
14620	{ } /* end */
14621};
14622
14623static struct hda_channel_mode alc861_asus_modes[2] = {
14624	{ 2, alc861_asus_ch2_init },
14625	{ 6, alc861_asus_ch6_init },
14626};
14627
14628/* patch-ALC861 */
14629
14630static struct snd_kcontrol_new alc861_base_mixer[] = {
14631        /* output mixer control */
14632	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14633	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14634	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14635	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14636	HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14637
14638        /*Input mixer control */
14639	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14640	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14641	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14642	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14643	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14644	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14645	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14646	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14647	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14648	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14649
14650	{ } /* end */
14651};
14652
14653static struct snd_kcontrol_new alc861_3ST_mixer[] = {
14654        /* output mixer control */
14655	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14656	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14657	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14658	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14659	/*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14660
14661	/* Input mixer control */
14662	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14663	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14664	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14665	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14666	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14667	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14668	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14669	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14670	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14671	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14672
14673	{
14674		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14675		.name = "Channel Mode",
14676		.info = alc_ch_mode_info,
14677		.get = alc_ch_mode_get,
14678		.put = alc_ch_mode_put,
14679                .private_value = ARRAY_SIZE(alc861_threestack_modes),
14680	},
14681	{ } /* end */
14682};
14683
14684static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
14685        /* output mixer control */
14686	HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14687	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14688	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14689
14690	{ } /* end */
14691};
14692
14693static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
14694        /* output mixer control */
14695	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14696	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14697	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14698	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14699	/*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14700
14701	/* Input mixer control */
14702	/* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14703	   HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14704	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14705	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14706	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14707	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14708	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14709	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14710	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14711	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14712
14713	{
14714		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14715		.name = "Channel Mode",
14716		.info = alc_ch_mode_info,
14717		.get = alc_ch_mode_get,
14718		.put = alc_ch_mode_put,
14719                .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
14720	},
14721	{ } /* end */
14722};
14723
14724static struct snd_kcontrol_new alc861_asus_mixer[] = {
14725        /* output mixer control */
14726	HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14727	HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14728	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14729	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14730	HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14731
14732	/* Input mixer control */
14733	HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14734	HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
14735	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14736	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14737	HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14738	HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14739	HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14740	HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14741	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14742	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
14743
14744	{
14745		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14746		.name = "Channel Mode",
14747		.info = alc_ch_mode_info,
14748		.get = alc_ch_mode_get,
14749		.put = alc_ch_mode_put,
14750                .private_value = ARRAY_SIZE(alc861_asus_modes),
14751	},
14752	{ }
14753};
14754
14755/* additional mixer */
14756static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
14757	HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14758	HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14759	{ }
14760};
14761
14762/*
14763 * generic initialization of ADC, input mixers and output mixers
14764 */
14765static struct hda_verb alc861_base_init_verbs[] = {
14766	/*
14767	 * Unmute ADC0 and set the default input to mic-in
14768	 */
14769	/* port-A for surround (rear panel) */
14770	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14771	{ 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
14772	/* port-B for mic-in (rear panel) with vref */
14773	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14774	/* port-C for line-in (rear panel) */
14775	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14776	/* port-D for Front */
14777	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14778	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14779	/* port-E for HP out (front panel) */
14780	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14781	/* route front PCM to HP */
14782	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14783	/* port-F for mic-in (front panel) with vref */
14784	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14785	/* port-G for CLFE (rear panel) */
14786	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14787	{ 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14788	/* port-H for side (rear panel) */
14789	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14790	{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
14791	/* CD-in */
14792	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14793	/* route front mic to ADC1*/
14794	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14795	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14796
14797	/* Unmute DAC0~3 & spdif out*/
14798	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14799	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14800	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14801	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14802	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14803
14804	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14805	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14806        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14807	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14808        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14809
14810	/* Unmute Stereo Mixer 15 */
14811	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14812	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14813	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14814	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14815
14816	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14817	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14818	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14819	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14820	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14821	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14822	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14823	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14824	/* hp used DAC 3 (Front) */
14825	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14826        {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14827
14828	{ }
14829};
14830
14831static struct hda_verb alc861_threestack_init_verbs[] = {
14832	/*
14833	 * Unmute ADC0 and set the default input to mic-in
14834	 */
14835	/* port-A for surround (rear panel) */
14836	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14837	/* port-B for mic-in (rear panel) with vref */
14838	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14839	/* port-C for line-in (rear panel) */
14840	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14841	/* port-D for Front */
14842	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14843	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14844	/* port-E for HP out (front panel) */
14845	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14846	/* route front PCM to HP */
14847	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14848	/* port-F for mic-in (front panel) with vref */
14849	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14850	/* port-G for CLFE (rear panel) */
14851	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14852	/* port-H for side (rear panel) */
14853	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14854	/* CD-in */
14855	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14856	/* route front mic to ADC1*/
14857	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14858	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14859	/* Unmute DAC0~3 & spdif out*/
14860	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14861	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14862	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14863	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14864	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14865
14866	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14867	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14868        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14869	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14870        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14871
14872	/* Unmute Stereo Mixer 15 */
14873	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14874	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14875	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14876	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14877
14878	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14879	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14880	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14881	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14882	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14883	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14884	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14885	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14886	/* hp used DAC 3 (Front) */
14887	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14888        {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14889	{ }
14890};
14891
14892static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
14893	/*
14894	 * Unmute ADC0 and set the default input to mic-in
14895	 */
14896	/* port-A for surround (rear panel) */
14897	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14898	/* port-B for mic-in (rear panel) with vref */
14899	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14900	/* port-C for line-in (rear panel) */
14901	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14902	/* port-D for Front */
14903	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14904	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14905	/* port-E for HP out (front panel) */
14906	/* this has to be set to VREF80 */
14907	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14908	/* route front PCM to HP */
14909	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14910	/* port-F for mic-in (front panel) with vref */
14911	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14912	/* port-G for CLFE (rear panel) */
14913	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14914	/* port-H for side (rear panel) */
14915	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14916	/* CD-in */
14917	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14918	/* route front mic to ADC1*/
14919	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14920	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14921	/* Unmute DAC0~3 & spdif out*/
14922	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14923	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14924	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14925	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14926	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14927
14928	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14929	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14930        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14931	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14932        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14933
14934	/* Unmute Stereo Mixer 15 */
14935	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14936	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14937	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14938	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14939
14940	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14941	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14942	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14943	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14944	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14945	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14946	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14947	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14948	/* hp used DAC 3 (Front) */
14949	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14950        {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14951	{ }
14952};
14953
14954static struct hda_verb alc861_asus_init_verbs[] = {
14955	/*
14956	 * Unmute ADC0 and set the default input to mic-in
14957	 */
14958	/* port-A for surround (rear panel)
14959	 * according to codec#0 this is the HP jack
14960	 */
14961	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
14962	/* route front PCM to HP */
14963	{ 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
14964	/* port-B for mic-in (rear panel) with vref */
14965	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14966	/* port-C for line-in (rear panel) */
14967	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14968	/* port-D for Front */
14969	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14970	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14971	/* port-E for HP out (front panel) */
14972	/* this has to be set to VREF80 */
14973	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14974	/* route front PCM to HP */
14975	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14976	/* port-F for mic-in (front panel) with vref */
14977	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14978	/* port-G for CLFE (rear panel) */
14979	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14980	/* port-H for side (rear panel) */
14981	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14982	/* CD-in */
14983	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14984	/* route front mic to ADC1*/
14985	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14986	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14987	/* Unmute DAC0~3 & spdif out*/
14988	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14989	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14990	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14991	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14992	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14993	/* Unmute Mixer 14 (mic) 1c (Line in)*/
14994	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14995        {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14996	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14997        {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14998
14999	/* Unmute Stereo Mixer 15 */
15000	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15001	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15002	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15003	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
15004
15005	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15006	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15007	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15008	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15009	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15010	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15011	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15012	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15013	/* hp used DAC 3 (Front) */
15014	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15015	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15016	{ }
15017};
15018
15019/* additional init verbs for ASUS laptops */
15020static struct hda_verb alc861_asus_laptop_init_verbs[] = {
15021	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
15022	{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
15023	{ }
15024};
15025
15026/*
15027 * generic initialization of ADC, input mixers and output mixers
15028 */
15029static struct hda_verb alc861_auto_init_verbs[] = {
15030	/*
15031	 * Unmute ADC0 and set the default input to mic-in
15032	 */
15033	/* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
15034	{0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15035
15036	/* Unmute DAC0~3 & spdif out*/
15037	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15038	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15039	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15040	{0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15041	{0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15042
15043	/* Unmute Mixer 14 (mic) 1c (Line in)*/
15044	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15045	{0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15046	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15047	{0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15048
15049	/* Unmute Stereo Mixer 15 */
15050	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15051	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15052	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15053	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
15054
15055	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15056	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15057	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15058	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15059	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15060	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15061	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15062	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15063
15064	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15065	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15066	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15067	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15068	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15069	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15070	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15071	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15072
15073	{0x08, AC_VERB_SET_CONNECT_SEL, 0x00},	/* set Mic 1 */
15074
15075	{ }
15076};
15077
15078static struct hda_verb alc861_toshiba_init_verbs[] = {
15079	{0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15080
15081	{ }
15082};
15083
15084/* toggle speaker-output according to the hp-jack state */
15085static void alc861_toshiba_automute(struct hda_codec *codec)
15086{
15087	unsigned int present = snd_hda_jack_detect(codec, 0x0f);
15088
15089	snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
15090				 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
15091	snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
15092				 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
15093}
15094
15095static void alc861_toshiba_unsol_event(struct hda_codec *codec,
15096				       unsigned int res)
15097{
15098	if ((res >> 26) == ALC880_HP_EVENT)
15099		alc861_toshiba_automute(codec);
15100}
15101
15102/* pcm configuration: identical with ALC880 */
15103#define alc861_pcm_analog_playback	alc880_pcm_analog_playback
15104#define alc861_pcm_analog_capture	alc880_pcm_analog_capture
15105#define alc861_pcm_digital_playback	alc880_pcm_digital_playback
15106#define alc861_pcm_digital_capture	alc880_pcm_digital_capture
15107
15108
15109#define ALC861_DIGOUT_NID	0x07
15110
15111static struct hda_channel_mode alc861_8ch_modes[1] = {
15112	{ 8, NULL }
15113};
15114
15115static hda_nid_t alc861_dac_nids[4] = {
15116	/* front, surround, clfe, side */
15117	0x03, 0x06, 0x05, 0x04
15118};
15119
15120static hda_nid_t alc660_dac_nids[3] = {
15121	/* front, clfe, surround */
15122	0x03, 0x05, 0x06
15123};
15124
15125static hda_nid_t alc861_adc_nids[1] = {
15126	/* ADC0-2 */
15127	0x08,
15128};
15129
15130static struct hda_input_mux alc861_capture_source = {
15131	.num_items = 5,
15132	.items = {
15133		{ "Mic", 0x0 },
15134		{ "Front Mic", 0x3 },
15135		{ "Line", 0x1 },
15136		{ "CD", 0x4 },
15137		{ "Mixer", 0x5 },
15138	},
15139};
15140
15141static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
15142{
15143	struct alc_spec *spec = codec->spec;
15144	hda_nid_t mix, srcs[5];
15145	int i, j, num;
15146
15147	if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
15148		return 0;
15149	num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15150	if (num < 0)
15151		return 0;
15152	for (i = 0; i < num; i++) {
15153		unsigned int type;
15154		type = get_wcaps_type(get_wcaps(codec, srcs[i]));
15155		if (type != AC_WID_AUD_OUT)
15156			continue;
15157		for (j = 0; j < spec->multiout.num_dacs; j++)
15158			if (spec->multiout.dac_nids[j] == srcs[i])
15159				break;
15160		if (j >= spec->multiout.num_dacs)
15161			return srcs[i];
15162	}
15163	return 0;
15164}
15165
15166/* fill in the dac_nids table from the parsed pin configuration */
15167static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
15168				     const struct auto_pin_cfg *cfg)
15169{
15170	struct alc_spec *spec = codec->spec;
15171	int i;
15172	hda_nid_t nid, dac;
15173
15174	spec->multiout.dac_nids = spec->private_dac_nids;
15175	for (i = 0; i < cfg->line_outs; i++) {
15176		nid = cfg->line_out_pins[i];
15177		dac = alc861_look_for_dac(codec, nid);
15178		if (!dac)
15179			continue;
15180		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
15181	}
15182	return 0;
15183}
15184
15185static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
15186				hda_nid_t nid, unsigned int chs)
15187{
15188	return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx,
15189			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
15190}
15191
15192/* add playback controls from the parsed DAC table */
15193static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
15194					     const struct auto_pin_cfg *cfg)
15195{
15196	struct alc_spec *spec = codec->spec;
15197	static const char *chname[4] = {
15198		"Front", "Surround", NULL /*CLFE*/, "Side"
15199	};
15200	hda_nid_t nid;
15201	int i, err;
15202
15203	if (cfg->line_outs == 1) {
15204		const char *pfx = NULL;
15205		if (!cfg->hp_outs)
15206			pfx = "Master";
15207		else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
15208			pfx = "Speaker";
15209		if (pfx) {
15210			nid = spec->multiout.dac_nids[0];
15211			return alc861_create_out_sw(codec, pfx, nid, 3);
15212		}
15213	}
15214
15215	for (i = 0; i < cfg->line_outs; i++) {
15216		nid = spec->multiout.dac_nids[i];
15217		if (!nid)
15218			continue;
15219		if (i == 2) {
15220			/* Center/LFE */
15221			err = alc861_create_out_sw(codec, "Center", nid, 1);
15222			if (err < 0)
15223				return err;
15224			err = alc861_create_out_sw(codec, "LFE", nid, 2);
15225			if (err < 0)
15226				return err;
15227		} else {
15228			err = alc861_create_out_sw(codec, chname[i], nid, 3);
15229			if (err < 0)
15230				return err;
15231		}
15232	}
15233	return 0;
15234}
15235
15236static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
15237{
15238	struct alc_spec *spec = codec->spec;
15239	int err;
15240	hda_nid_t nid;
15241
15242	if (!pin)
15243		return 0;
15244
15245	if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
15246		nid = alc861_look_for_dac(codec, pin);
15247		if (nid) {
15248			err = alc861_create_out_sw(codec, "Headphone", nid, 3);
15249			if (err < 0)
15250				return err;
15251			spec->multiout.hp_nid = nid;
15252		}
15253	}
15254	return 0;
15255}
15256
15257/* create playback/capture controls for input pins */
15258static int alc861_auto_create_input_ctls(struct hda_codec *codec,
15259						const struct auto_pin_cfg *cfg)
15260{
15261	return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
15262}
15263
15264static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
15265					      hda_nid_t nid,
15266					      int pin_type, hda_nid_t dac)
15267{
15268	hda_nid_t mix, srcs[5];
15269	int i, num;
15270
15271	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
15272			    pin_type);
15273	snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15274			    AMP_OUT_UNMUTE);
15275	if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
15276		return;
15277	num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15278	if (num < 0)
15279		return;
15280	for (i = 0; i < num; i++) {
15281		unsigned int mute;
15282		if (srcs[i] == dac || srcs[i] == 0x15)
15283			mute = AMP_IN_UNMUTE(i);
15284		else
15285			mute = AMP_IN_MUTE(i);
15286		snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15287				    mute);
15288	}
15289}
15290
15291static void alc861_auto_init_multi_out(struct hda_codec *codec)
15292{
15293	struct alc_spec *spec = codec->spec;
15294	int i;
15295
15296	for (i = 0; i < spec->autocfg.line_outs; i++) {
15297		hda_nid_t nid = spec->autocfg.line_out_pins[i];
15298		int pin_type = get_pin_type(spec->autocfg.line_out_type);
15299		if (nid)
15300			alc861_auto_set_output_and_unmute(codec, nid, pin_type,
15301							  spec->multiout.dac_nids[i]);
15302	}
15303}
15304
15305static void alc861_auto_init_hp_out(struct hda_codec *codec)
15306{
15307	struct alc_spec *spec = codec->spec;
15308
15309	if (spec->autocfg.hp_outs)
15310		alc861_auto_set_output_and_unmute(codec,
15311						  spec->autocfg.hp_pins[0],
15312						  PIN_HP,
15313						  spec->multiout.hp_nid);
15314	if (spec->autocfg.speaker_outs)
15315		alc861_auto_set_output_and_unmute(codec,
15316						  spec->autocfg.speaker_pins[0],
15317						  PIN_OUT,
15318						  spec->multiout.dac_nids[0]);
15319}
15320
15321static void alc861_auto_init_analog_input(struct hda_codec *codec)
15322{
15323	struct alc_spec *spec = codec->spec;
15324	int i;
15325
15326	for (i = 0; i < AUTO_PIN_LAST; i++) {
15327		hda_nid_t nid = spec->autocfg.input_pins[i];
15328		if (nid >= 0x0c && nid <= 0x11)
15329			alc_set_input_pin(codec, nid, i);
15330	}
15331}
15332
15333/* parse the BIOS configuration and set up the alc_spec */
15334/* return 1 if successful, 0 if the proper config is not found,
15335 * or a negative error code
15336 */
15337static int alc861_parse_auto_config(struct hda_codec *codec)
15338{
15339	struct alc_spec *spec = codec->spec;
15340	int err;
15341	static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
15342
15343	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15344					   alc861_ignore);
15345	if (err < 0)
15346		return err;
15347	if (!spec->autocfg.line_outs)
15348		return 0; /* can't find valid BIOS pin config */
15349
15350	err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
15351	if (err < 0)
15352		return err;
15353	err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
15354	if (err < 0)
15355		return err;
15356	err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
15357	if (err < 0)
15358		return err;
15359	err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
15360	if (err < 0)
15361		return err;
15362
15363	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15364
15365	if (spec->autocfg.dig_outs)
15366		spec->multiout.dig_out_nid = ALC861_DIGOUT_NID;
15367
15368	if (spec->kctls.list)
15369		add_mixer(spec, spec->kctls.list);
15370
15371	add_verb(spec, alc861_auto_init_verbs);
15372
15373	spec->num_mux_defs = 1;
15374	spec->input_mux = &spec->private_imux[0];
15375
15376	spec->adc_nids = alc861_adc_nids;
15377	spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
15378	set_capture_mixer(codec);
15379
15380	alc_ssid_check(codec, 0x0e, 0x0f, 0x0b, 0);
15381
15382	return 1;
15383}
15384
15385/* additional initialization for auto-configuration model */
15386static void alc861_auto_init(struct hda_codec *codec)
15387{
15388	struct alc_spec *spec = codec->spec;
15389	alc861_auto_init_multi_out(codec);
15390	alc861_auto_init_hp_out(codec);
15391	alc861_auto_init_analog_input(codec);
15392	if (spec->unsol_event)
15393		alc_inithook(codec);
15394}
15395
15396#ifdef CONFIG_SND_HDA_POWER_SAVE
15397static struct hda_amp_list alc861_loopbacks[] = {
15398	{ 0x15, HDA_INPUT, 0 },
15399	{ 0x15, HDA_INPUT, 1 },
15400	{ 0x15, HDA_INPUT, 2 },
15401	{ 0x15, HDA_INPUT, 3 },
15402	{ } /* end */
15403};
15404#endif
15405
15406
15407/*
15408 * configuration and preset
15409 */
15410static const char *alc861_models[ALC861_MODEL_LAST] = {
15411	[ALC861_3ST]		= "3stack",
15412	[ALC660_3ST]		= "3stack-660",
15413	[ALC861_3ST_DIG]	= "3stack-dig",
15414	[ALC861_6ST_DIG]	= "6stack-dig",
15415	[ALC861_UNIWILL_M31]	= "uniwill-m31",
15416	[ALC861_TOSHIBA]	= "toshiba",
15417	[ALC861_ASUS]		= "asus",
15418	[ALC861_ASUS_LAPTOP]	= "asus-laptop",
15419	[ALC861_AUTO]		= "auto",
15420};
15421
15422static struct snd_pci_quirk alc861_cfg_tbl[] = {
15423	SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
15424	SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15425	SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15426	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
15427	SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
15428	SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
15429	SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
15430	/* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
15431	 *        Any other models that need this preset?
15432	 */
15433	/* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
15434	SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
15435	SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
15436	SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
15437	SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
15438	SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
15439	/* FIXME: the below seems conflict */
15440	/* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
15441	SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
15442	SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
15443	{}
15444};
15445
15446static struct alc_config_preset alc861_presets[] = {
15447	[ALC861_3ST] = {
15448		.mixers = { alc861_3ST_mixer },
15449		.init_verbs = { alc861_threestack_init_verbs },
15450		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15451		.dac_nids = alc861_dac_nids,
15452		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15453		.channel_mode = alc861_threestack_modes,
15454		.need_dac_fix = 1,
15455		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15456		.adc_nids = alc861_adc_nids,
15457		.input_mux = &alc861_capture_source,
15458	},
15459	[ALC861_3ST_DIG] = {
15460		.mixers = { alc861_base_mixer },
15461		.init_verbs = { alc861_threestack_init_verbs },
15462		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15463		.dac_nids = alc861_dac_nids,
15464		.dig_out_nid = ALC861_DIGOUT_NID,
15465		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15466		.channel_mode = alc861_threestack_modes,
15467		.need_dac_fix = 1,
15468		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15469		.adc_nids = alc861_adc_nids,
15470		.input_mux = &alc861_capture_source,
15471	},
15472	[ALC861_6ST_DIG] = {
15473		.mixers = { alc861_base_mixer },
15474		.init_verbs = { alc861_base_init_verbs },
15475		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15476		.dac_nids = alc861_dac_nids,
15477		.dig_out_nid = ALC861_DIGOUT_NID,
15478		.num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
15479		.channel_mode = alc861_8ch_modes,
15480		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15481		.adc_nids = alc861_adc_nids,
15482		.input_mux = &alc861_capture_source,
15483	},
15484	[ALC660_3ST] = {
15485		.mixers = { alc861_3ST_mixer },
15486		.init_verbs = { alc861_threestack_init_verbs },
15487		.num_dacs = ARRAY_SIZE(alc660_dac_nids),
15488		.dac_nids = alc660_dac_nids,
15489		.num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15490		.channel_mode = alc861_threestack_modes,
15491		.need_dac_fix = 1,
15492		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15493		.adc_nids = alc861_adc_nids,
15494		.input_mux = &alc861_capture_source,
15495	},
15496	[ALC861_UNIWILL_M31] = {
15497		.mixers = { alc861_uniwill_m31_mixer },
15498		.init_verbs = { alc861_uniwill_m31_init_verbs },
15499		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15500		.dac_nids = alc861_dac_nids,
15501		.dig_out_nid = ALC861_DIGOUT_NID,
15502		.num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
15503		.channel_mode = alc861_uniwill_m31_modes,
15504		.need_dac_fix = 1,
15505		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15506		.adc_nids = alc861_adc_nids,
15507		.input_mux = &alc861_capture_source,
15508	},
15509	[ALC861_TOSHIBA] = {
15510		.mixers = { alc861_toshiba_mixer },
15511		.init_verbs = { alc861_base_init_verbs,
15512				alc861_toshiba_init_verbs },
15513		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15514		.dac_nids = alc861_dac_nids,
15515		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15516		.channel_mode = alc883_3ST_2ch_modes,
15517		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15518		.adc_nids = alc861_adc_nids,
15519		.input_mux = &alc861_capture_source,
15520		.unsol_event = alc861_toshiba_unsol_event,
15521		.init_hook = alc861_toshiba_automute,
15522	},
15523	[ALC861_ASUS] = {
15524		.mixers = { alc861_asus_mixer },
15525		.init_verbs = { alc861_asus_init_verbs },
15526		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15527		.dac_nids = alc861_dac_nids,
15528		.dig_out_nid = ALC861_DIGOUT_NID,
15529		.num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
15530		.channel_mode = alc861_asus_modes,
15531		.need_dac_fix = 1,
15532		.hp_nid = 0x06,
15533		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15534		.adc_nids = alc861_adc_nids,
15535		.input_mux = &alc861_capture_source,
15536	},
15537	[ALC861_ASUS_LAPTOP] = {
15538		.mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
15539		.init_verbs = { alc861_asus_init_verbs,
15540				alc861_asus_laptop_init_verbs },
15541		.num_dacs = ARRAY_SIZE(alc861_dac_nids),
15542		.dac_nids = alc861_dac_nids,
15543		.dig_out_nid = ALC861_DIGOUT_NID,
15544		.num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15545		.channel_mode = alc883_3ST_2ch_modes,
15546		.need_dac_fix = 1,
15547		.num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15548		.adc_nids = alc861_adc_nids,
15549		.input_mux = &alc861_capture_source,
15550	},
15551};
15552
15553/* Pin config fixes */
15554enum {
15555	PINFIX_FSC_AMILO_PI1505,
15556};
15557
15558static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = {
15559	{ 0x0b, 0x0221101f }, /* HP */
15560	{ 0x0f, 0x90170310 }, /* speaker */
15561	{ }
15562};
15563
15564static const struct alc_fixup alc861_fixups[] = {
15565	[PINFIX_FSC_AMILO_PI1505] = {
15566		.pins = alc861_fsc_amilo_pi1505_pinfix
15567	},
15568};
15569
15570static struct snd_pci_quirk alc861_fixup_tbl[] = {
15571	SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
15572	{}
15573};
15574
15575static int patch_alc861(struct hda_codec *codec)
15576{
15577	struct alc_spec *spec;
15578	int board_config;
15579	int err;
15580
15581	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
15582	if (spec == NULL)
15583		return -ENOMEM;
15584
15585	codec->spec = spec;
15586
15587        board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
15588						  alc861_models,
15589						  alc861_cfg_tbl);
15590
15591	if (board_config < 0) {
15592		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15593		       codec->chip_name);
15594		board_config = ALC861_AUTO;
15595	}
15596
15597	if (board_config == ALC861_AUTO)
15598		alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 1);
15599
15600	if (board_config == ALC861_AUTO) {
15601		/* automatic parse from the BIOS config */
15602		err = alc861_parse_auto_config(codec);
15603		if (err < 0) {
15604			alc_free(codec);
15605			return err;
15606		} else if (!err) {
15607			printk(KERN_INFO
15608			       "hda_codec: Cannot set up configuration "
15609			       "from BIOS.  Using base mode...\n");
15610		   board_config = ALC861_3ST_DIG;
15611		}
15612	}
15613
15614	err = snd_hda_attach_beep_device(codec, 0x23);
15615	if (err < 0) {
15616		alc_free(codec);
15617		return err;
15618	}
15619
15620	if (board_config != ALC861_AUTO)
15621		setup_preset(codec, &alc861_presets[board_config]);
15622
15623	spec->stream_analog_playback = &alc861_pcm_analog_playback;
15624	spec->stream_analog_capture = &alc861_pcm_analog_capture;
15625
15626	spec->stream_digital_playback = &alc861_pcm_digital_playback;
15627	spec->stream_digital_capture = &alc861_pcm_digital_capture;
15628
15629	if (!spec->cap_mixer)
15630		set_capture_mixer(codec);
15631	set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
15632
15633	spec->vmaster_nid = 0x03;
15634
15635	if (board_config == ALC861_AUTO)
15636		alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 0);
15637
15638	codec->patch_ops = alc_patch_ops;
15639	if (board_config == ALC861_AUTO) {
15640		spec->init_hook = alc861_auto_init;
15641#ifdef CONFIG_SND_HDA_POWER_SAVE
15642		spec->power_hook = alc_power_eapd;
15643#endif
15644	}
15645#ifdef CONFIG_SND_HDA_POWER_SAVE
15646	if (!spec->loopback.amplist)
15647		spec->loopback.amplist = alc861_loopbacks;
15648#endif
15649
15650	return 0;
15651}
15652
15653/*
15654 * ALC861-VD support
15655 *
15656 * Based on ALC882
15657 *
15658 * In addition, an independent DAC
15659 */
15660#define ALC861VD_DIGOUT_NID	0x06
15661
15662static hda_nid_t alc861vd_dac_nids[4] = {
15663	/* front, surr, clfe, side surr */
15664	0x02, 0x03, 0x04, 0x05
15665};
15666
15667/* dac_nids for ALC660vd are in a different order - according to
15668 * Realtek's driver.
15669 * This should probably result in a different mixer for 6stack models
15670 * of ALC660vd codecs, but for now there is only 3stack mixer
15671 * - and it is the same as in 861vd.
15672 * adc_nids in ALC660vd are (is) the same as in 861vd
15673 */
15674static hda_nid_t alc660vd_dac_nids[3] = {
15675	/* front, rear, clfe, rear_surr */
15676	0x02, 0x04, 0x03
15677};
15678
15679static hda_nid_t alc861vd_adc_nids[1] = {
15680	/* ADC0 */
15681	0x09,
15682};
15683
15684static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
15685
15686/* input MUX */
15687/* FIXME: should be a matrix-type input source selection */
15688static struct hda_input_mux alc861vd_capture_source = {
15689	.num_items = 4,
15690	.items = {
15691		{ "Mic", 0x0 },
15692		{ "Front Mic", 0x1 },
15693		{ "Line", 0x2 },
15694		{ "CD", 0x4 },
15695	},
15696};
15697
15698static struct hda_input_mux alc861vd_dallas_capture_source = {
15699	.num_items = 2,
15700	.items = {
15701		{ "Ext Mic", 0x0 },
15702		{ "Int Mic", 0x1 },
15703	},
15704};
15705
15706static struct hda_input_mux alc861vd_hp_capture_source = {
15707	.num_items = 2,
15708	.items = {
15709		{ "Front Mic", 0x0 },
15710		{ "ATAPI Mic", 0x1 },
15711	},
15712};
15713
15714/*
15715 * 2ch mode
15716 */
15717static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
15718	{ 2, NULL }
15719};
15720
15721/*
15722 * 6ch mode
15723 */
15724static struct hda_verb alc861vd_6stack_ch6_init[] = {
15725	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15726	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15727	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15728	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15729	{ } /* end */
15730};
15731
15732/*
15733 * 8ch mode
15734 */
15735static struct hda_verb alc861vd_6stack_ch8_init[] = {
15736	{ 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15737	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15738	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15739	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15740	{ } /* end */
15741};
15742
15743static struct hda_channel_mode alc861vd_6stack_modes[2] = {
15744	{ 6, alc861vd_6stack_ch6_init },
15745	{ 8, alc861vd_6stack_ch8_init },
15746};
15747
15748static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
15749	{
15750		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15751		.name = "Channel Mode",
15752		.info = alc_ch_mode_info,
15753		.get = alc_ch_mode_get,
15754		.put = alc_ch_mode_put,
15755	},
15756	{ } /* end */
15757};
15758
15759/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
15760 *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
15761 */
15762static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
15763	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15764	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15765
15766	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15767	HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
15768
15769	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
15770				HDA_OUTPUT),
15771	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
15772				HDA_OUTPUT),
15773	HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
15774	HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
15775
15776	HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
15777	HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
15778
15779	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15780
15781	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15782	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15783	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15784
15785	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15786	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15787	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15788
15789	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15790	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15791
15792	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15793	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15794
15795	{ } /* end */
15796};
15797
15798static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
15799	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15800	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15801
15802	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15803
15804	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15805	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15806	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15807
15808	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15809	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15810	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15811
15812	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15813	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15814
15815	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15816	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15817
15818	{ } /* end */
15819};
15820
15821static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
15822	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15823	/*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
15824	HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
15825
15826	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15827
15828	HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15829	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15830	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15831
15832	HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15833	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15834	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15835
15836	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15837	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15838
15839	{ } /* end */
15840};
15841
15842/* Pin assignment: Speaker=0x14, HP = 0x15,
15843 *                 Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
15844 */
15845static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
15846	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15847	HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
15848	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15849	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15850	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
15851	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15852	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15853	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
15854	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15855	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15856	{ } /* end */
15857};
15858
15859/* Pin assignment: Speaker=0x14, Line-out = 0x15,
15860 *                 Front Mic=0x18, ATAPI Mic = 0x19,
15861 */
15862static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
15863	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15864	HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15865	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15866	HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15867	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15868	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15869	HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15870	HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15871
15872	{ } /* end */
15873};
15874
15875/*
15876 * generic initialization of ADC, input mixers and output mixers
15877 */
15878static struct hda_verb alc861vd_volume_init_verbs[] = {
15879	/*
15880	 * Unmute ADC0 and set the default input to mic-in
15881	 */
15882	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15883	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15884
15885	/* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
15886	 * the analog-loopback mixer widget
15887	 */
15888	/* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
15889	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15890	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15891	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15892	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15893	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15894
15895	/* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
15896	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15897	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15898	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15899	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
15900
15901	/*
15902	 * Set up output mixers (0x02 - 0x05)
15903	 */
15904	/* set vol=0 to output mixers */
15905	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15906	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15907	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15908	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15909
15910	/* set up input amps for analog loopback */
15911	/* Amp Indices: DAC = 0, mixer = 1 */
15912	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15913	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15914	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15915	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15916	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15917	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15918	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15919	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15920
15921	{ }
15922};
15923
15924/*
15925 * 3-stack pin configuration:
15926 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
15927 */
15928static struct hda_verb alc861vd_3stack_init_verbs[] = {
15929	/*
15930	 * Set pin mode and muting
15931	 */
15932	/* set front pin widgets 0x14 for output */
15933	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15934	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15935	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15936
15937	/* Mic (rear) pin: input vref at 80% */
15938	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15939	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15940	/* Front Mic pin: input vref at 80% */
15941	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15942	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15943	/* Line In pin: input */
15944	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15945	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15946	/* Line-2 In: Headphone output (output 0 - 0x0c) */
15947	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15948	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15949	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15950	/* CD pin widget for input */
15951	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15952
15953	{ }
15954};
15955
15956/*
15957 * 6-stack pin configuration:
15958 */
15959static struct hda_verb alc861vd_6stack_init_verbs[] = {
15960	/*
15961	 * Set pin mode and muting
15962	 */
15963	/* set front pin widgets 0x14 for output */
15964	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15965	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15966	{0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15967
15968	/* Rear Pin: output 1 (0x0d) */
15969	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15970	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15971	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
15972	/* CLFE Pin: output 2 (0x0e) */
15973	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15974	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15975	{0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
15976	/* Side Pin: output 3 (0x0f) */
15977	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15978	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15979	{0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
15980
15981	/* Mic (rear) pin: input vref at 80% */
15982	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15983	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15984	/* Front Mic pin: input vref at 80% */
15985	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15986	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15987	/* Line In pin: input */
15988	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15989	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15990	/* Line-2 In: Headphone output (output 0 - 0x0c) */
15991	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15992	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15993	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15994	/* CD pin widget for input */
15995	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15996
15997	{ }
15998};
15999
16000static struct hda_verb alc861vd_eapd_verbs[] = {
16001	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16002	{ }
16003};
16004
16005static struct hda_verb alc660vd_eapd_verbs[] = {
16006	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16007	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16008	{ }
16009};
16010
16011static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
16012	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16013	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16014	{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
16015	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16016	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16017	{}
16018};
16019
16020static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
16021{
16022	unsigned int present;
16023	unsigned char bits;
16024
16025	present = snd_hda_jack_detect(codec, 0x18);
16026	bits = present ? HDA_AMP_MUTE : 0;
16027
16028	snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
16029				 HDA_AMP_MUTE, bits);
16030}
16031
16032static void alc861vd_lenovo_setup(struct hda_codec *codec)
16033{
16034	struct alc_spec *spec = codec->spec;
16035	spec->autocfg.hp_pins[0] = 0x1b;
16036	spec->autocfg.speaker_pins[0] = 0x14;
16037}
16038
16039static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
16040{
16041	alc_automute_amp(codec);
16042	alc861vd_lenovo_mic_automute(codec);
16043}
16044
16045static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
16046					unsigned int res)
16047{
16048	switch (res >> 26) {
16049	case ALC880_MIC_EVENT:
16050		alc861vd_lenovo_mic_automute(codec);
16051		break;
16052	default:
16053		alc_automute_amp_unsol_event(codec, res);
16054		break;
16055	}
16056}
16057
16058static struct hda_verb alc861vd_dallas_verbs[] = {
16059	{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16060	{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16061	{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16062	{0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16063
16064	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16065	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16066	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16067	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16068	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16069	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16070	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16071	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16072
16073	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16074	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16075	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16076	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16077	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16078	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16079	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16080	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16081
16082	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16083	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16084	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16085	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16086	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16087	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16088	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16089	{0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16090
16091	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16092	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16093	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16094	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16095
16096	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16097	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16098	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16099
16100	{ } /* end */
16101};
16102
16103/* toggle speaker-output according to the hp-jack state */
16104static void alc861vd_dallas_setup(struct hda_codec *codec)
16105{
16106	struct alc_spec *spec = codec->spec;
16107
16108	spec->autocfg.hp_pins[0] = 0x15;
16109	spec->autocfg.speaker_pins[0] = 0x14;
16110}
16111
16112#ifdef CONFIG_SND_HDA_POWER_SAVE
16113#define alc861vd_loopbacks	alc880_loopbacks
16114#endif
16115
16116/* pcm configuration: identical with ALC880 */
16117#define alc861vd_pcm_analog_playback	alc880_pcm_analog_playback
16118#define alc861vd_pcm_analog_capture	alc880_pcm_analog_capture
16119#define alc861vd_pcm_digital_playback	alc880_pcm_digital_playback
16120#define alc861vd_pcm_digital_capture	alc880_pcm_digital_capture
16121
16122/*
16123 * configuration and preset
16124 */
16125static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
16126	[ALC660VD_3ST]		= "3stack-660",
16127	[ALC660VD_3ST_DIG]	= "3stack-660-digout",
16128	[ALC660VD_ASUS_V1S]	= "asus-v1s",
16129	[ALC861VD_3ST]		= "3stack",
16130	[ALC861VD_3ST_DIG]	= "3stack-digout",
16131	[ALC861VD_6ST_DIG]	= "6stack-digout",
16132	[ALC861VD_LENOVO]	= "lenovo",
16133	[ALC861VD_DALLAS]	= "dallas",
16134	[ALC861VD_HP]		= "hp",
16135	[ALC861VD_AUTO]		= "auto",
16136};
16137
16138static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
16139	SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
16140	SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
16141	SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
16142	/*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
16143	SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
16144	SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
16145	SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
16146	SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
16147	/*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
16148	SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
16149	SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
16150	SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
16151	SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
16152	SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
16153	SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
16154	{}
16155};
16156
16157static struct alc_config_preset alc861vd_presets[] = {
16158	[ALC660VD_3ST] = {
16159		.mixers = { alc861vd_3st_mixer },
16160		.init_verbs = { alc861vd_volume_init_verbs,
16161				 alc861vd_3stack_init_verbs },
16162		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16163		.dac_nids = alc660vd_dac_nids,
16164		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16165		.channel_mode = alc861vd_3stack_2ch_modes,
16166		.input_mux = &alc861vd_capture_source,
16167	},
16168	[ALC660VD_3ST_DIG] = {
16169		.mixers = { alc861vd_3st_mixer },
16170		.init_verbs = { alc861vd_volume_init_verbs,
16171				 alc861vd_3stack_init_verbs },
16172		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16173		.dac_nids = alc660vd_dac_nids,
16174		.dig_out_nid = ALC861VD_DIGOUT_NID,
16175		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16176		.channel_mode = alc861vd_3stack_2ch_modes,
16177		.input_mux = &alc861vd_capture_source,
16178	},
16179	[ALC861VD_3ST] = {
16180		.mixers = { alc861vd_3st_mixer },
16181		.init_verbs = { alc861vd_volume_init_verbs,
16182				 alc861vd_3stack_init_verbs },
16183		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16184		.dac_nids = alc861vd_dac_nids,
16185		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16186		.channel_mode = alc861vd_3stack_2ch_modes,
16187		.input_mux = &alc861vd_capture_source,
16188	},
16189	[ALC861VD_3ST_DIG] = {
16190		.mixers = { alc861vd_3st_mixer },
16191		.init_verbs = { alc861vd_volume_init_verbs,
16192		 		 alc861vd_3stack_init_verbs },
16193		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16194		.dac_nids = alc861vd_dac_nids,
16195		.dig_out_nid = ALC861VD_DIGOUT_NID,
16196		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16197		.channel_mode = alc861vd_3stack_2ch_modes,
16198		.input_mux = &alc861vd_capture_source,
16199	},
16200	[ALC861VD_6ST_DIG] = {
16201		.mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
16202		.init_verbs = { alc861vd_volume_init_verbs,
16203				alc861vd_6stack_init_verbs },
16204		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16205		.dac_nids = alc861vd_dac_nids,
16206		.dig_out_nid = ALC861VD_DIGOUT_NID,
16207		.num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
16208		.channel_mode = alc861vd_6stack_modes,
16209		.input_mux = &alc861vd_capture_source,
16210	},
16211	[ALC861VD_LENOVO] = {
16212		.mixers = { alc861vd_lenovo_mixer },
16213		.init_verbs = { alc861vd_volume_init_verbs,
16214				alc861vd_3stack_init_verbs,
16215				alc861vd_eapd_verbs,
16216				alc861vd_lenovo_unsol_verbs },
16217		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16218		.dac_nids = alc660vd_dac_nids,
16219		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16220		.channel_mode = alc861vd_3stack_2ch_modes,
16221		.input_mux = &alc861vd_capture_source,
16222		.unsol_event = alc861vd_lenovo_unsol_event,
16223		.setup = alc861vd_lenovo_setup,
16224		.init_hook = alc861vd_lenovo_init_hook,
16225	},
16226	[ALC861VD_DALLAS] = {
16227		.mixers = { alc861vd_dallas_mixer },
16228		.init_verbs = { alc861vd_dallas_verbs },
16229		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16230		.dac_nids = alc861vd_dac_nids,
16231		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16232		.channel_mode = alc861vd_3stack_2ch_modes,
16233		.input_mux = &alc861vd_dallas_capture_source,
16234		.unsol_event = alc_automute_amp_unsol_event,
16235		.setup = alc861vd_dallas_setup,
16236		.init_hook = alc_automute_amp,
16237	},
16238	[ALC861VD_HP] = {
16239		.mixers = { alc861vd_hp_mixer },
16240		.init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
16241		.num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16242		.dac_nids = alc861vd_dac_nids,
16243		.dig_out_nid = ALC861VD_DIGOUT_NID,
16244		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16245		.channel_mode = alc861vd_3stack_2ch_modes,
16246		.input_mux = &alc861vd_hp_capture_source,
16247		.unsol_event = alc_automute_amp_unsol_event,
16248		.setup = alc861vd_dallas_setup,
16249		.init_hook = alc_automute_amp,
16250	},
16251	[ALC660VD_ASUS_V1S] = {
16252		.mixers = { alc861vd_lenovo_mixer },
16253		.init_verbs = { alc861vd_volume_init_verbs,
16254				alc861vd_3stack_init_verbs,
16255				alc861vd_eapd_verbs,
16256				alc861vd_lenovo_unsol_verbs },
16257		.num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16258		.dac_nids = alc660vd_dac_nids,
16259		.dig_out_nid = ALC861VD_DIGOUT_NID,
16260		.num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16261		.channel_mode = alc861vd_3stack_2ch_modes,
16262		.input_mux = &alc861vd_capture_source,
16263		.unsol_event = alc861vd_lenovo_unsol_event,
16264		.setup = alc861vd_lenovo_setup,
16265		.init_hook = alc861vd_lenovo_init_hook,
16266	},
16267};
16268
16269/*
16270 * BIOS auto configuration
16271 */
16272static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
16273						const struct auto_pin_cfg *cfg)
16274{
16275	return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
16276}
16277
16278
16279static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
16280				hda_nid_t nid, int pin_type, int dac_idx)
16281{
16282	alc_set_pin_output(codec, nid, pin_type);
16283}
16284
16285static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
16286{
16287	struct alc_spec *spec = codec->spec;
16288	int i;
16289
16290	for (i = 0; i <= HDA_SIDE; i++) {
16291		hda_nid_t nid = spec->autocfg.line_out_pins[i];
16292		int pin_type = get_pin_type(spec->autocfg.line_out_type);
16293		if (nid)
16294			alc861vd_auto_set_output_and_unmute(codec, nid,
16295							    pin_type, i);
16296	}
16297}
16298
16299
16300static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
16301{
16302	struct alc_spec *spec = codec->spec;
16303	hda_nid_t pin;
16304
16305	pin = spec->autocfg.hp_pins[0];
16306	if (pin) /* connect to front and use dac 0 */
16307		alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
16308	pin = spec->autocfg.speaker_pins[0];
16309	if (pin)
16310		alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
16311}
16312
16313#define ALC861VD_PIN_CD_NID		ALC880_PIN_CD_NID
16314
16315static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
16316{
16317	struct alc_spec *spec = codec->spec;
16318	int i;
16319
16320	for (i = 0; i < AUTO_PIN_LAST; i++) {
16321		hda_nid_t nid = spec->autocfg.input_pins[i];
16322		if (alc_is_input_pin(codec, nid)) {
16323			alc_set_input_pin(codec, nid, i);
16324			if (nid != ALC861VD_PIN_CD_NID &&
16325			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
16326				snd_hda_codec_write(codec, nid, 0,
16327						AC_VERB_SET_AMP_GAIN_MUTE,
16328						AMP_OUT_MUTE);
16329		}
16330	}
16331}
16332
16333#define alc861vd_auto_init_input_src	alc882_auto_init_input_src
16334
16335#define alc861vd_idx_to_mixer_vol(nid)		((nid) + 0x02)
16336#define alc861vd_idx_to_mixer_switch(nid)	((nid) + 0x0c)
16337
16338/* add playback controls from the parsed DAC table */
16339/* Based on ALC880 version. But ALC861VD has separate,
16340 * different NIDs for mute/unmute switch and volume control */
16341static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
16342					     const struct auto_pin_cfg *cfg)
16343{
16344	static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
16345	hda_nid_t nid_v, nid_s;
16346	int i, err;
16347
16348	for (i = 0; i < cfg->line_outs; i++) {
16349		if (!spec->multiout.dac_nids[i])
16350			continue;
16351		nid_v = alc861vd_idx_to_mixer_vol(
16352				alc880_dac_to_idx(
16353					spec->multiout.dac_nids[i]));
16354		nid_s = alc861vd_idx_to_mixer_switch(
16355				alc880_dac_to_idx(
16356					spec->multiout.dac_nids[i]));
16357
16358		if (i == 2) {
16359			/* Center/LFE */
16360			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16361					      "Center",
16362					  HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
16363							      HDA_OUTPUT));
16364			if (err < 0)
16365				return err;
16366			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16367					      "LFE",
16368					  HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
16369							      HDA_OUTPUT));
16370			if (err < 0)
16371				return err;
16372			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16373					     "Center",
16374					  HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
16375							      HDA_INPUT));
16376			if (err < 0)
16377				return err;
16378			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16379					     "LFE",
16380					  HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
16381							      HDA_INPUT));
16382			if (err < 0)
16383				return err;
16384		} else {
16385			const char *pfx;
16386			if (cfg->line_outs == 1 &&
16387			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
16388				if (!cfg->hp_pins)
16389					pfx = "Speaker";
16390				else
16391					pfx = "PCM";
16392			} else
16393				pfx = chname[i];
16394			err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16395					  HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
16396							      HDA_OUTPUT));
16397			if (err < 0)
16398				return err;
16399			if (cfg->line_outs == 1 &&
16400			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
16401				pfx = "Speaker";
16402			err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16403					  HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
16404							      HDA_INPUT));
16405			if (err < 0)
16406				return err;
16407		}
16408	}
16409	return 0;
16410}
16411
16412/* add playback controls for speaker and HP outputs */
16413/* Based on ALC880 version. But ALC861VD has separate,
16414 * different NIDs for mute/unmute switch and volume control */
16415static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
16416					hda_nid_t pin, const char *pfx)
16417{
16418	hda_nid_t nid_v, nid_s;
16419	int err;
16420
16421	if (!pin)
16422		return 0;
16423
16424	if (alc880_is_fixed_pin(pin)) {
16425		nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
16426		/* specify the DAC as the extra output */
16427		if (!spec->multiout.hp_nid)
16428			spec->multiout.hp_nid = nid_v;
16429		else
16430			spec->multiout.extra_out_nid[0] = nid_v;
16431		/* control HP volume/switch on the output mixer amp */
16432		nid_v = alc861vd_idx_to_mixer_vol(
16433				alc880_fixed_pin_idx(pin));
16434		nid_s = alc861vd_idx_to_mixer_switch(
16435				alc880_fixed_pin_idx(pin));
16436
16437		err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16438				  HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
16439		if (err < 0)
16440			return err;
16441		err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16442				  HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
16443		if (err < 0)
16444			return err;
16445	} else if (alc880_is_multi_pin(pin)) {
16446		/* set manual connection */
16447		/* we have only a switch on HP-out PIN */
16448		err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
16449				  HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
16450		if (err < 0)
16451			return err;
16452	}
16453	return 0;
16454}
16455
16456/* parse the BIOS configuration and set up the alc_spec
16457 * return 1 if successful, 0 if the proper config is not found,
16458 * or a negative error code
16459 * Based on ALC880 version - had to change it to override
16460 * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
16461static int alc861vd_parse_auto_config(struct hda_codec *codec)
16462{
16463	struct alc_spec *spec = codec->spec;
16464	int err;
16465	static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
16466
16467	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
16468					   alc861vd_ignore);
16469	if (err < 0)
16470		return err;
16471	if (!spec->autocfg.line_outs)
16472		return 0; /* can't find valid BIOS pin config */
16473
16474	err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
16475	if (err < 0)
16476		return err;
16477	err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
16478	if (err < 0)
16479		return err;
16480	err = alc861vd_auto_create_extra_out(spec,
16481					     spec->autocfg.speaker_pins[0],
16482					     "Speaker");
16483	if (err < 0)
16484		return err;
16485	err = alc861vd_auto_create_extra_out(spec,
16486					     spec->autocfg.hp_pins[0],
16487					     "Headphone");
16488	if (err < 0)
16489		return err;
16490	err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
16491	if (err < 0)
16492		return err;
16493
16494	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
16495
16496	if (spec->autocfg.dig_outs)
16497		spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID;
16498
16499	if (spec->kctls.list)
16500		add_mixer(spec, spec->kctls.list);
16501
16502	add_verb(spec, alc861vd_volume_init_verbs);
16503
16504	spec->num_mux_defs = 1;
16505	spec->input_mux = &spec->private_imux[0];
16506
16507	err = alc_auto_add_mic_boost(codec);
16508	if (err < 0)
16509		return err;
16510
16511	alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
16512
16513	return 1;
16514}
16515
16516/* additional initialization for auto-configuration model */
16517static void alc861vd_auto_init(struct hda_codec *codec)
16518{
16519	struct alc_spec *spec = codec->spec;
16520	alc861vd_auto_init_multi_out(codec);
16521	alc861vd_auto_init_hp_out(codec);
16522	alc861vd_auto_init_analog_input(codec);
16523	alc861vd_auto_init_input_src(codec);
16524	if (spec->unsol_event)
16525		alc_inithook(codec);
16526}
16527
16528enum {
16529	ALC660VD_FIX_ASUS_GPIO1
16530};
16531
16532/* reset GPIO1 */
16533static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
16534	{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
16535	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
16536	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
16537	{ }
16538};
16539
16540static const struct alc_fixup alc861vd_fixups[] = {
16541	[ALC660VD_FIX_ASUS_GPIO1] = {
16542		.verbs = alc660vd_fix_asus_gpio1_verbs,
16543	},
16544};
16545
16546static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
16547	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
16548	{}
16549};
16550
16551static int patch_alc861vd(struct hda_codec *codec)
16552{
16553	struct alc_spec *spec;
16554	int err, board_config;
16555
16556	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
16557	if (spec == NULL)
16558		return -ENOMEM;
16559
16560	codec->spec = spec;
16561
16562	board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
16563						  alc861vd_models,
16564						  alc861vd_cfg_tbl);
16565
16566	if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
16567		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
16568		       codec->chip_name);
16569		board_config = ALC861VD_AUTO;
16570	}
16571
16572	if (board_config == ALC861VD_AUTO)
16573		alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 1);
16574
16575	if (board_config == ALC861VD_AUTO) {
16576		/* automatic parse from the BIOS config */
16577		err = alc861vd_parse_auto_config(codec);
16578		if (err < 0) {
16579			alc_free(codec);
16580			return err;
16581		} else if (!err) {
16582			printk(KERN_INFO
16583			       "hda_codec: Cannot set up configuration "
16584			       "from BIOS.  Using base mode...\n");
16585			board_config = ALC861VD_3ST;
16586		}
16587	}
16588
16589	err = snd_hda_attach_beep_device(codec, 0x23);
16590	if (err < 0) {
16591		alc_free(codec);
16592		return err;
16593	}
16594
16595	if (board_config != ALC861VD_AUTO)
16596		setup_preset(codec, &alc861vd_presets[board_config]);
16597
16598	if (codec->vendor_id == 0x10ec0660) {
16599		/* always turn on EAPD */
16600		add_verb(spec, alc660vd_eapd_verbs);
16601	}
16602
16603	spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
16604	spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
16605
16606	spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
16607	spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
16608
16609	if (!spec->adc_nids) {
16610		spec->adc_nids = alc861vd_adc_nids;
16611		spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
16612	}
16613	if (!spec->capsrc_nids)
16614		spec->capsrc_nids = alc861vd_capsrc_nids;
16615
16616	set_capture_mixer(codec);
16617	set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
16618
16619	spec->vmaster_nid = 0x02;
16620
16621	if (board_config == ALC861VD_AUTO)
16622		alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 0);
16623
16624	codec->patch_ops = alc_patch_ops;
16625
16626	if (board_config == ALC861VD_AUTO)
16627		spec->init_hook = alc861vd_auto_init;
16628#ifdef CONFIG_SND_HDA_POWER_SAVE
16629	if (!spec->loopback.amplist)
16630		spec->loopback.amplist = alc861vd_loopbacks;
16631#endif
16632
16633	return 0;
16634}
16635
16636/*
16637 * ALC662 support
16638 *
16639 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
16640 * configuration.  Each pin widget can choose any input DACs and a mixer.
16641 * Each ADC is connected from a mixer of all inputs.  This makes possible
16642 * 6-channel independent captures.
16643 *
16644 * In addition, an independent DAC for the multi-playback (not used in this
16645 * driver yet).
16646 */
16647#define ALC662_DIGOUT_NID	0x06
16648#define ALC662_DIGIN_NID	0x0a
16649
16650static hda_nid_t alc662_dac_nids[4] = {
16651	/* front, rear, clfe, rear_surr */
16652	0x02, 0x03, 0x04
16653};
16654
16655static hda_nid_t alc272_dac_nids[2] = {
16656	0x02, 0x03
16657};
16658
16659static hda_nid_t alc662_adc_nids[2] = {
16660	/* ADC1-2 */
16661	0x09, 0x08
16662};
16663
16664static hda_nid_t alc272_adc_nids[1] = {
16665	/* ADC1-2 */
16666	0x08,
16667};
16668
16669static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
16670static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
16671
16672
16673/* input MUX */
16674/* FIXME: should be a matrix-type input source selection */
16675static struct hda_input_mux alc662_capture_source = {
16676	.num_items = 4,
16677	.items = {
16678		{ "Mic", 0x0 },
16679		{ "Front Mic", 0x1 },
16680		{ "Line", 0x2 },
16681		{ "CD", 0x4 },
16682	},
16683};
16684
16685static struct hda_input_mux alc662_lenovo_101e_capture_source = {
16686	.num_items = 2,
16687	.items = {
16688		{ "Mic", 0x1 },
16689		{ "Line", 0x2 },
16690	},
16691};
16692
16693static struct hda_input_mux alc663_capture_source = {
16694	.num_items = 3,
16695	.items = {
16696		{ "Mic", 0x0 },
16697		{ "Front Mic", 0x1 },
16698		{ "Line", 0x2 },
16699	},
16700};
16701
16702#if 0 /* set to 1 for testing other input sources below */
16703static struct hda_input_mux alc272_nc10_capture_source = {
16704	.num_items = 16,
16705	.items = {
16706		{ "Autoselect Mic", 0x0 },
16707		{ "Internal Mic", 0x1 },
16708		{ "In-0x02", 0x2 },
16709		{ "In-0x03", 0x3 },
16710		{ "In-0x04", 0x4 },
16711		{ "In-0x05", 0x5 },
16712		{ "In-0x06", 0x6 },
16713		{ "In-0x07", 0x7 },
16714		{ "In-0x08", 0x8 },
16715		{ "In-0x09", 0x9 },
16716		{ "In-0x0a", 0x0a },
16717		{ "In-0x0b", 0x0b },
16718		{ "In-0x0c", 0x0c },
16719		{ "In-0x0d", 0x0d },
16720		{ "In-0x0e", 0x0e },
16721		{ "In-0x0f", 0x0f },
16722	},
16723};
16724#endif
16725
16726/*
16727 * 2ch mode
16728 */
16729static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
16730	{ 2, NULL }
16731};
16732
16733/*
16734 * 2ch mode
16735 */
16736static struct hda_verb alc662_3ST_ch2_init[] = {
16737	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
16738	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16739	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
16740	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16741	{ } /* end */
16742};
16743
16744/*
16745 * 6ch mode
16746 */
16747static struct hda_verb alc662_3ST_ch6_init[] = {
16748	{ 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16749	{ 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16750	{ 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
16751	{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16752	{ 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16753	{ 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
16754	{ } /* end */
16755};
16756
16757static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
16758	{ 2, alc662_3ST_ch2_init },
16759	{ 6, alc662_3ST_ch6_init },
16760};
16761
16762/*
16763 * 2ch mode
16764 */
16765static struct hda_verb alc662_sixstack_ch6_init[] = {
16766	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16767	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16768	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16769	{ } /* end */
16770};
16771
16772/*
16773 * 6ch mode
16774 */
16775static struct hda_verb alc662_sixstack_ch8_init[] = {
16776	{ 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16777	{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16778	{ 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16779	{ } /* end */
16780};
16781
16782static struct hda_channel_mode alc662_5stack_modes[2] = {
16783	{ 2, alc662_sixstack_ch6_init },
16784	{ 6, alc662_sixstack_ch8_init },
16785};
16786
16787/* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
16788 *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
16789 */
16790
16791static struct snd_kcontrol_new alc662_base_mixer[] = {
16792	/* output mixer control */
16793	HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
16794	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16795	HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
16796	HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16797	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16798	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16799	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16800	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16801	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16802
16803	/*Input mixer control */
16804	HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
16805	HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
16806	HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
16807	HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
16808	HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
16809	HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
16810	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
16811	HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
16812	{ } /* end */
16813};
16814
16815static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
16816	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16817	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16818	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16819	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16820	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16821	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16822	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16823	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16824	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16825	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16826	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16827	{ } /* end */
16828};
16829
16830static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
16831	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16832	HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16833	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16834	HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16835	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16836	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16837	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16838	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16839	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16840	HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16841	HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16842	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16843	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16844	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16845	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16846	HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16847	HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16848	{ } /* end */
16849};
16850
16851static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
16852	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16853	HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
16854	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16855	HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
16856	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16857	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16858	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16859	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16860	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16861	{ } /* end */
16862};
16863
16864static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
16865	HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16866	ALC262_HIPPO_MASTER_SWITCH,
16867
16868	HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
16869	HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16870	HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16871
16872	HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
16873	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16874	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16875	{ } /* end */
16876};
16877
16878static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
16879	ALC262_HIPPO_MASTER_SWITCH,
16880	HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16881	HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16882	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16883	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16884	HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
16885	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16886	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16887	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16888	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16889	{ } /* end */
16890};
16891
16892static struct hda_bind_ctls alc663_asus_bind_master_vol = {
16893	.ops = &snd_hda_bind_vol,
16894	.values = {
16895		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16896		HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
16897		0
16898	},
16899};
16900
16901static struct hda_bind_ctls alc663_asus_one_bind_switch = {
16902	.ops = &snd_hda_bind_sw,
16903	.values = {
16904		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16905		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16906		0
16907	},
16908};
16909
16910static struct snd_kcontrol_new alc663_m51va_mixer[] = {
16911	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16912	HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
16913	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16914	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16915	{ } /* end */
16916};
16917
16918static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
16919	.ops = &snd_hda_bind_sw,
16920	.values = {
16921		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16922		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16923		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16924		0
16925	},
16926};
16927
16928static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
16929	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16930	HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
16931	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16932	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16933	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16934	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16935
16936	{ } /* end */
16937};
16938
16939static struct hda_bind_ctls alc663_asus_four_bind_switch = {
16940	.ops = &snd_hda_bind_sw,
16941	.values = {
16942		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16943		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16944		HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16945		0
16946	},
16947};
16948
16949static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
16950	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16951	HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
16952	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16953	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16954	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16955	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16956	{ } /* end */
16957};
16958
16959static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
16960	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16961	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16962	HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16963	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16964	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16965	HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16966	HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16967	{ } /* end */
16968};
16969
16970static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
16971	.ops = &snd_hda_bind_vol,
16972	.values = {
16973		HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16974		HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
16975		0
16976	},
16977};
16978
16979static struct hda_bind_ctls alc663_asus_two_bind_switch = {
16980	.ops = &snd_hda_bind_sw,
16981	.values = {
16982		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16983		HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
16984		0
16985	},
16986};
16987
16988static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
16989	HDA_BIND_VOL("Master Playback Volume",
16990				&alc663_asus_two_bind_master_vol),
16991	HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16992	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16993	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16994	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16995	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16996	{ } /* end */
16997};
16998
16999static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
17000	HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17001	HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
17002	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17003	HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17004	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17005	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17006	{ } /* end */
17007};
17008
17009static struct snd_kcontrol_new alc663_g71v_mixer[] = {
17010	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17011	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17012	HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17013	HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17014	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17015
17016	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17017	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17018	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17019	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17020	{ } /* end */
17021};
17022
17023static struct snd_kcontrol_new alc663_g50v_mixer[] = {
17024	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17025	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17026	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17027
17028	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17029	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17030	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17031	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17032	HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17033	HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17034	{ } /* end */
17035};
17036
17037static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
17038	.ops = &snd_hda_bind_sw,
17039	.values = {
17040		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17041		HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
17042		HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17043		HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
17044		HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
17045		0
17046	},
17047};
17048
17049static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
17050	.ops = &snd_hda_bind_sw,
17051	.values = {
17052		HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17053		HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17054		0
17055	},
17056};
17057
17058static struct snd_kcontrol_new alc663_mode7_mixer[] = {
17059	HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17060	HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17061	HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17062	HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17063	HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17064	HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17065	HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17066	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17067	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17068	{ } /* end */
17069};
17070
17071static struct snd_kcontrol_new alc663_mode8_mixer[] = {
17072	HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17073	HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17074	HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17075	HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17076	HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17077	HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17078	HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17079	{ } /* end */
17080};
17081
17082
17083static struct snd_kcontrol_new alc662_chmode_mixer[] = {
17084	{
17085		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
17086		.name = "Channel Mode",
17087		.info = alc_ch_mode_info,
17088		.get = alc_ch_mode_get,
17089		.put = alc_ch_mode_put,
17090	},
17091	{ } /* end */
17092};
17093
17094static struct hda_verb alc662_init_verbs[] = {
17095	/* ADC: mute amp left and right */
17096	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17097	{0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
17098
17099	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17100	{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17101	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17102	{0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17103	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17104	{0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17105
17106	/* Front Pin: output 0 (0x0c) */
17107	{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17108	{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17109
17110	/* Rear Pin: output 1 (0x0d) */
17111	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17112	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17113
17114	/* CLFE Pin: output 2 (0x0e) */
17115	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17116	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17117
17118	/* Mic (rear) pin: input vref at 80% */
17119	{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17120	{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17121	/* Front Mic pin: input vref at 80% */
17122	{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17123	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17124	/* Line In pin: input */
17125	{0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17126	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17127	/* Line-2 In: Headphone output (output 0 - 0x0c) */
17128	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17129	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17130	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
17131	/* CD pin widget for input */
17132	{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17133
17134	/* FIXME: use matrix-type input source selection */
17135	/* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
17136	/* Input mixer */
17137	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17138	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17139
17140	/* always trun on EAPD */
17141	{0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
17142	{0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
17143
17144	{ }
17145};
17146
17147static struct hda_verb alc663_init_verbs[] = {
17148	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17149	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17150	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17151	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17152	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17153	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17154	{ }
17155};
17156
17157static struct hda_verb alc272_init_verbs[] = {
17158	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17159	{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17160	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17161	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17162	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17163	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17164	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17165	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17166	{ }
17167};
17168
17169static struct hda_verb alc662_sue_init_verbs[] = {
17170	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17171	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17172	{}
17173};
17174
17175static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
17176	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17177	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17178	{}
17179};
17180
17181/* Set Unsolicited Event*/
17182static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
17183	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17184	{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17185	{}
17186};
17187
17188static struct hda_verb alc663_m51va_init_verbs[] = {
17189	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17190	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17191	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17192	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17193	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17194	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17195	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17196	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17197	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17198	{}
17199};
17200
17201static struct hda_verb alc663_21jd_amic_init_verbs[] = {
17202	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17203	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17204	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17205	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17206	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17207	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17208	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17209	{}
17210};
17211
17212static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
17213	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17214	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17215	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17216	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
17217	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17218	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17219	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17220	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17221	{}
17222};
17223
17224static struct hda_verb alc663_15jd_amic_init_verbs[] = {
17225	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17226	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17227	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17228	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17229	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17230	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17231	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17232	{}
17233};
17234
17235static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
17236	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17237	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17238	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17239	{0x21, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Headphone */
17240	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17241	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17242	{0x15, AC_VERB_SET_CONNECT_SEL, 0x0},	/* Headphone */
17243	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17244	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17245	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17246	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17247	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17248	{}
17249};
17250
17251static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
17252	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17253	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17254	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17255	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17256	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17257	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17258	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17259	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17260	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17261	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17262	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17263	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17264	{}
17265};
17266
17267static struct hda_verb alc663_g71v_init_verbs[] = {
17268	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17269	/* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
17270	/* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
17271
17272	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17273	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17274	{0x21, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
17275
17276	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17277	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
17278	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17279	{}
17280};
17281
17282static struct hda_verb alc663_g50v_init_verbs[] = {
17283	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17284	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17285	{0x21, AC_VERB_SET_CONNECT_SEL, 0x00},	/* Headphone */
17286
17287	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17288	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17289	{}
17290};
17291
17292static struct hda_verb alc662_ecs_init_verbs[] = {
17293	{0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
17294	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17295	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17296	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17297	{}
17298};
17299
17300static struct hda_verb alc272_dell_zm1_init_verbs[] = {
17301	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17302	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17303	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17304	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17305	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17306	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17307	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17308	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17309	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17310	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17311	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17312	{}
17313};
17314
17315static struct hda_verb alc272_dell_init_verbs[] = {
17316	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17317	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17318	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17319	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17320	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17321	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17322	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17323	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17324	{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17325	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17326	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17327	{}
17328};
17329
17330static struct hda_verb alc663_mode7_init_verbs[] = {
17331	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17332	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17333	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17334	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17335	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17336	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17337	{0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
17338	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17339	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17340	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17341	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17342	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17343	{0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17344	{0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17345	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17346	{}
17347};
17348
17349static struct hda_verb alc663_mode8_init_verbs[] = {
17350	{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17351	{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17352	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17353	{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
17354	{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17355	{0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17356	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17357	{0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17358	{0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17359	{0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17360	{0x21, AC_VERB_SET_CONNECT_SEL, 0x01},	/* Headphone */
17361	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17362	{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17363	{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17364	{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17365	{0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17366	{}
17367};
17368
17369static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
17370	HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
17371	HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
17372	{ } /* end */
17373};
17374
17375static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
17376	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
17377	HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
17378	{ } /* end */
17379};
17380
17381static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
17382{
17383	unsigned int present;
17384	unsigned char bits;
17385
17386	present = snd_hda_jack_detect(codec, 0x14);
17387	bits = present ? HDA_AMP_MUTE : 0;
17388
17389	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17390				 HDA_AMP_MUTE, bits);
17391}
17392
17393static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
17394{
17395	unsigned int present;
17396	unsigned char bits;
17397
17398 	present = snd_hda_jack_detect(codec, 0x1b);
17399	bits = present ? HDA_AMP_MUTE : 0;
17400
17401	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17402				 HDA_AMP_MUTE, bits);
17403	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17404				 HDA_AMP_MUTE, bits);
17405}
17406
17407static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
17408					   unsigned int res)
17409{
17410	if ((res >> 26) == ALC880_HP_EVENT)
17411		alc662_lenovo_101e_all_automute(codec);
17412	if ((res >> 26) == ALC880_FRONT_EVENT)
17413		alc662_lenovo_101e_ispeaker_automute(codec);
17414}
17415
17416/* unsolicited event for HP jack sensing */
17417static void alc662_eeepc_unsol_event(struct hda_codec *codec,
17418				     unsigned int res)
17419{
17420	if ((res >> 26) == ALC880_MIC_EVENT)
17421		alc_mic_automute(codec);
17422	else
17423		alc262_hippo_unsol_event(codec, res);
17424}
17425
17426static void alc662_eeepc_setup(struct hda_codec *codec)
17427{
17428	struct alc_spec *spec = codec->spec;
17429
17430	alc262_hippo1_setup(codec);
17431	spec->ext_mic.pin = 0x18;
17432	spec->ext_mic.mux_idx = 0;
17433	spec->int_mic.pin = 0x19;
17434	spec->int_mic.mux_idx = 1;
17435	spec->auto_mic = 1;
17436}
17437
17438static void alc662_eeepc_inithook(struct hda_codec *codec)
17439{
17440	alc262_hippo_automute(codec);
17441	alc_mic_automute(codec);
17442}
17443
17444static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
17445{
17446	struct alc_spec *spec = codec->spec;
17447
17448	spec->autocfg.hp_pins[0] = 0x14;
17449	spec->autocfg.speaker_pins[0] = 0x1b;
17450}
17451
17452#define alc662_eeepc_ep20_inithook	alc262_hippo_master_update
17453
17454static void alc663_m51va_speaker_automute(struct hda_codec *codec)
17455{
17456	unsigned int present;
17457	unsigned char bits;
17458
17459	present = snd_hda_jack_detect(codec, 0x21);
17460	bits = present ? HDA_AMP_MUTE : 0;
17461	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17462				 HDA_AMP_MUTE, bits);
17463	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17464				 HDA_AMP_MUTE, bits);
17465}
17466
17467static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
17468{
17469	unsigned int present;
17470	unsigned char bits;
17471
17472	present = snd_hda_jack_detect(codec, 0x21);
17473	bits = present ? HDA_AMP_MUTE : 0;
17474	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17475				 HDA_AMP_MUTE, bits);
17476	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17477				 HDA_AMP_MUTE, bits);
17478	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
17479				 HDA_AMP_MUTE, bits);
17480	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17481				 HDA_AMP_MUTE, bits);
17482}
17483
17484static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
17485{
17486	unsigned int present;
17487	unsigned char bits;
17488
17489	present = snd_hda_jack_detect(codec, 0x15);
17490	bits = present ? HDA_AMP_MUTE : 0;
17491	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17492				 HDA_AMP_MUTE, bits);
17493	snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17494				 HDA_AMP_MUTE, bits);
17495	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
17496				 HDA_AMP_MUTE, bits);
17497	snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17498				 HDA_AMP_MUTE, bits);
17499}
17500
17501static void alc662_f5z_speaker_automute(struct hda_codec *codec)
17502{
17503	unsigned int present;
17504	unsigned char bits;
17505
17506	present = snd_hda_jack_detect(codec, 0x1b);
17507	bits = present ? 0 : PIN_OUT;
17508	snd_hda_codec_write(codec, 0x14, 0,
17509			 AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
17510}
17511
17512static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
17513{
17514	unsigned int present1, present2;
17515
17516	present1 = snd_hda_jack_detect(codec, 0x21);
17517	present2 = snd_hda_jack_detect(codec, 0x15);
17518
17519	if (present1 || present2) {
17520		snd_hda_codec_write_cache(codec, 0x14, 0,
17521			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17522	} else {
17523		snd_hda_codec_write_cache(codec, 0x14, 0,
17524			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17525	}
17526}
17527
17528static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
17529{
17530	unsigned int present1, present2;
17531
17532	present1 = snd_hda_jack_detect(codec, 0x1b);
17533	present2 = snd_hda_jack_detect(codec, 0x15);
17534
17535	if (present1 || present2) {
17536		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17537					 HDA_AMP_MUTE, HDA_AMP_MUTE);
17538		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17539					 HDA_AMP_MUTE, HDA_AMP_MUTE);
17540	} else {
17541		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17542					 HDA_AMP_MUTE, 0);
17543		snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17544					 HDA_AMP_MUTE, 0);
17545	}
17546}
17547
17548static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
17549{
17550	unsigned int present1, present2;
17551
17552	present1 = snd_hda_codec_read(codec, 0x1b, 0,
17553			AC_VERB_GET_PIN_SENSE, 0)
17554			& AC_PINSENSE_PRESENCE;
17555	present2 = snd_hda_codec_read(codec, 0x21, 0,
17556			AC_VERB_GET_PIN_SENSE, 0)
17557			& AC_PINSENSE_PRESENCE;
17558
17559	if (present1 || present2) {
17560		snd_hda_codec_write_cache(codec, 0x14, 0,
17561			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17562		snd_hda_codec_write_cache(codec, 0x17, 0,
17563			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17564	} else {
17565		snd_hda_codec_write_cache(codec, 0x14, 0,
17566			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17567		snd_hda_codec_write_cache(codec, 0x17, 0,
17568			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17569	}
17570}
17571
17572static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
17573{
17574	unsigned int present1, present2;
17575
17576	present1 = snd_hda_codec_read(codec, 0x21, 0,
17577			AC_VERB_GET_PIN_SENSE, 0)
17578			& AC_PINSENSE_PRESENCE;
17579	present2 = snd_hda_codec_read(codec, 0x15, 0,
17580			AC_VERB_GET_PIN_SENSE, 0)
17581			& AC_PINSENSE_PRESENCE;
17582
17583	if (present1 || present2) {
17584		snd_hda_codec_write_cache(codec, 0x14, 0,
17585			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17586		snd_hda_codec_write_cache(codec, 0x17, 0,
17587			AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17588	} else {
17589		snd_hda_codec_write_cache(codec, 0x14, 0,
17590			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17591		snd_hda_codec_write_cache(codec, 0x17, 0,
17592			AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17593	}
17594}
17595
17596static void alc663_m51va_unsol_event(struct hda_codec *codec,
17597					   unsigned int res)
17598{
17599	switch (res >> 26) {
17600	case ALC880_HP_EVENT:
17601		alc663_m51va_speaker_automute(codec);
17602		break;
17603	case ALC880_MIC_EVENT:
17604		alc_mic_automute(codec);
17605		break;
17606	}
17607}
17608
17609static void alc663_m51va_setup(struct hda_codec *codec)
17610{
17611	struct alc_spec *spec = codec->spec;
17612	spec->ext_mic.pin = 0x18;
17613	spec->ext_mic.mux_idx = 0;
17614	spec->int_mic.pin = 0x12;
17615	spec->int_mic.mux_idx = 9;
17616	spec->auto_mic = 1;
17617}
17618
17619static void alc663_m51va_inithook(struct hda_codec *codec)
17620{
17621	alc663_m51va_speaker_automute(codec);
17622	alc_mic_automute(codec);
17623}
17624
17625/* ***************** Mode1 ******************************/
17626#define alc663_mode1_unsol_event	alc663_m51va_unsol_event
17627
17628static void alc663_mode1_setup(struct hda_codec *codec)
17629{
17630	struct alc_spec *spec = codec->spec;
17631	spec->ext_mic.pin = 0x18;
17632	spec->ext_mic.mux_idx = 0;
17633	spec->int_mic.pin = 0x19;
17634	spec->int_mic.mux_idx = 1;
17635	spec->auto_mic = 1;
17636}
17637
17638#define alc663_mode1_inithook		alc663_m51va_inithook
17639
17640/* ***************** Mode2 ******************************/
17641static void alc662_mode2_unsol_event(struct hda_codec *codec,
17642					   unsigned int res)
17643{
17644	switch (res >> 26) {
17645	case ALC880_HP_EVENT:
17646		alc662_f5z_speaker_automute(codec);
17647		break;
17648	case ALC880_MIC_EVENT:
17649		alc_mic_automute(codec);
17650		break;
17651	}
17652}
17653
17654#define alc662_mode2_setup	alc663_mode1_setup
17655
17656static void alc662_mode2_inithook(struct hda_codec *codec)
17657{
17658	alc662_f5z_speaker_automute(codec);
17659	alc_mic_automute(codec);
17660}
17661/* ***************** Mode3 ******************************/
17662static void alc663_mode3_unsol_event(struct hda_codec *codec,
17663					   unsigned int res)
17664{
17665	switch (res >> 26) {
17666	case ALC880_HP_EVENT:
17667		alc663_two_hp_m1_speaker_automute(codec);
17668		break;
17669	case ALC880_MIC_EVENT:
17670		alc_mic_automute(codec);
17671		break;
17672	}
17673}
17674
17675#define alc663_mode3_setup	alc663_mode1_setup
17676
17677static void alc663_mode3_inithook(struct hda_codec *codec)
17678{
17679	alc663_two_hp_m1_speaker_automute(codec);
17680	alc_mic_automute(codec);
17681}
17682/* ***************** Mode4 ******************************/
17683static void alc663_mode4_unsol_event(struct hda_codec *codec,
17684					   unsigned int res)
17685{
17686	switch (res >> 26) {
17687	case ALC880_HP_EVENT:
17688		alc663_21jd_two_speaker_automute(codec);
17689		break;
17690	case ALC880_MIC_EVENT:
17691		alc_mic_automute(codec);
17692		break;
17693	}
17694}
17695
17696#define alc663_mode4_setup	alc663_mode1_setup
17697
17698static void alc663_mode4_inithook(struct hda_codec *codec)
17699{
17700	alc663_21jd_two_speaker_automute(codec);
17701	alc_mic_automute(codec);
17702}
17703/* ***************** Mode5 ******************************/
17704static void alc663_mode5_unsol_event(struct hda_codec *codec,
17705					   unsigned int res)
17706{
17707	switch (res >> 26) {
17708	case ALC880_HP_EVENT:
17709		alc663_15jd_two_speaker_automute(codec);
17710		break;
17711	case ALC880_MIC_EVENT:
17712		alc_mic_automute(codec);
17713		break;
17714	}
17715}
17716
17717#define alc663_mode5_setup	alc663_mode1_setup
17718
17719static void alc663_mode5_inithook(struct hda_codec *codec)
17720{
17721	alc663_15jd_two_speaker_automute(codec);
17722	alc_mic_automute(codec);
17723}
17724/* ***************** Mode6 ******************************/
17725static void alc663_mode6_unsol_event(struct hda_codec *codec,
17726					   unsigned int res)
17727{
17728	switch (res >> 26) {
17729	case ALC880_HP_EVENT:
17730		alc663_two_hp_m2_speaker_automute(codec);
17731		break;
17732	case ALC880_MIC_EVENT:
17733		alc_mic_automute(codec);
17734		break;
17735	}
17736}
17737
17738#define alc663_mode6_setup	alc663_mode1_setup
17739
17740static void alc663_mode6_inithook(struct hda_codec *codec)
17741{
17742	alc663_two_hp_m2_speaker_automute(codec);
17743	alc_mic_automute(codec);
17744}
17745
17746/* ***************** Mode7 ******************************/
17747static void alc663_mode7_unsol_event(struct hda_codec *codec,
17748					   unsigned int res)
17749{
17750	switch (res >> 26) {
17751	case ALC880_HP_EVENT:
17752		alc663_two_hp_m7_speaker_automute(codec);
17753		break;
17754	case ALC880_MIC_EVENT:
17755		alc_mic_automute(codec);
17756		break;
17757	}
17758}
17759
17760#define alc663_mode7_setup	alc663_mode1_setup
17761
17762static void alc663_mode7_inithook(struct hda_codec *codec)
17763{
17764	alc663_two_hp_m7_speaker_automute(codec);
17765	alc_mic_automute(codec);
17766}
17767
17768/* ***************** Mode8 ******************************/
17769static void alc663_mode8_unsol_event(struct hda_codec *codec,
17770					   unsigned int res)
17771{
17772	switch (res >> 26) {
17773	case ALC880_HP_EVENT:
17774		alc663_two_hp_m8_speaker_automute(codec);
17775		break;
17776	case ALC880_MIC_EVENT:
17777		alc_mic_automute(codec);
17778		break;
17779	}
17780}
17781
17782#define alc663_mode8_setup	alc663_m51va_setup
17783
17784static void alc663_mode8_inithook(struct hda_codec *codec)
17785{
17786	alc663_two_hp_m8_speaker_automute(codec);
17787	alc_mic_automute(codec);
17788}
17789
17790static void alc663_g71v_hp_automute(struct hda_codec *codec)
17791{
17792	unsigned int present;
17793	unsigned char bits;
17794
17795	present = snd_hda_jack_detect(codec, 0x21);
17796	bits = present ? HDA_AMP_MUTE : 0;
17797	snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17798				 HDA_AMP_MUTE, bits);
17799	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17800				 HDA_AMP_MUTE, bits);
17801}
17802
17803static void alc663_g71v_front_automute(struct hda_codec *codec)
17804{
17805	unsigned int present;
17806	unsigned char bits;
17807
17808	present = snd_hda_jack_detect(codec, 0x15);
17809	bits = present ? HDA_AMP_MUTE : 0;
17810	snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17811				 HDA_AMP_MUTE, bits);
17812}
17813
17814static void alc663_g71v_unsol_event(struct hda_codec *codec,
17815					   unsigned int res)
17816{
17817	switch (res >> 26) {
17818	case ALC880_HP_EVENT:
17819		alc663_g71v_hp_automute(codec);
17820		break;
17821	case ALC880_FRONT_EVENT:
17822		alc663_g71v_front_automute(codec);
17823		break;
17824	case ALC880_MIC_EVENT:
17825		alc_mic_automute(codec);
17826		break;
17827	}
17828}
17829
17830#define alc663_g71v_setup	alc663_m51va_setup
17831
17832static void alc663_g71v_inithook(struct hda_codec *codec)
17833{
17834	alc663_g71v_front_automute(codec);
17835	alc663_g71v_hp_automute(codec);
17836	alc_mic_automute(codec);
17837}
17838
17839static void alc663_g50v_unsol_event(struct hda_codec *codec,
17840					   unsigned int res)
17841{
17842	switch (res >> 26) {
17843	case ALC880_HP_EVENT:
17844		alc663_m51va_speaker_automute(codec);
17845		break;
17846	case ALC880_MIC_EVENT:
17847		alc_mic_automute(codec);
17848		break;
17849	}
17850}
17851
17852#define alc663_g50v_setup	alc663_m51va_setup
17853
17854static void alc663_g50v_inithook(struct hda_codec *codec)
17855{
17856	alc663_m51va_speaker_automute(codec);
17857	alc_mic_automute(codec);
17858}
17859
17860static struct snd_kcontrol_new alc662_ecs_mixer[] = {
17861	HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17862	ALC262_HIPPO_MASTER_SWITCH,
17863
17864	HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
17865	HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
17866	HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
17867
17868	HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
17869	HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17870	HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17871	{ } /* end */
17872};
17873
17874static struct snd_kcontrol_new alc272_nc10_mixer[] = {
17875	/* Master Playback automatically created from Speaker and Headphone */
17876	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17877	HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17878	HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17879	HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17880
17881	HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17882	HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17883	HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
17884
17885	HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17886	HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17887	HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
17888	{ } /* end */
17889};
17890
17891#ifdef CONFIG_SND_HDA_POWER_SAVE
17892#define alc662_loopbacks	alc880_loopbacks
17893#endif
17894
17895
17896/* pcm configuration: identical with ALC880 */
17897#define alc662_pcm_analog_playback	alc880_pcm_analog_playback
17898#define alc662_pcm_analog_capture	alc880_pcm_analog_capture
17899#define alc662_pcm_digital_playback	alc880_pcm_digital_playback
17900#define alc662_pcm_digital_capture	alc880_pcm_digital_capture
17901
17902/*
17903 * configuration and preset
17904 */
17905static const char *alc662_models[ALC662_MODEL_LAST] = {
17906	[ALC662_3ST_2ch_DIG]	= "3stack-dig",
17907	[ALC662_3ST_6ch_DIG]	= "3stack-6ch-dig",
17908	[ALC662_3ST_6ch]	= "3stack-6ch",
17909	[ALC662_5ST_DIG]	= "6stack-dig",
17910	[ALC662_LENOVO_101E]	= "lenovo-101e",
17911	[ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
17912	[ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
17913	[ALC662_ECS] = "ecs",
17914	[ALC663_ASUS_M51VA] = "m51va",
17915	[ALC663_ASUS_G71V] = "g71v",
17916	[ALC663_ASUS_H13] = "h13",
17917	[ALC663_ASUS_G50V] = "g50v",
17918	[ALC663_ASUS_MODE1] = "asus-mode1",
17919	[ALC662_ASUS_MODE2] = "asus-mode2",
17920	[ALC663_ASUS_MODE3] = "asus-mode3",
17921	[ALC663_ASUS_MODE4] = "asus-mode4",
17922	[ALC663_ASUS_MODE5] = "asus-mode5",
17923	[ALC663_ASUS_MODE6] = "asus-mode6",
17924	[ALC663_ASUS_MODE7] = "asus-mode7",
17925	[ALC663_ASUS_MODE8] = "asus-mode8",
17926	[ALC272_DELL]		= "dell",
17927	[ALC272_DELL_ZM1]	= "dell-zm1",
17928	[ALC272_SAMSUNG_NC10]	= "samsung-nc10",
17929	[ALC662_AUTO]		= "auto",
17930};
17931
17932static struct snd_pci_quirk alc662_cfg_tbl[] = {
17933	SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
17934	SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
17935	SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
17936	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
17937	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
17938	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1),
17939	SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
17940	SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
17941	SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
17942	SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
17943	SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
17944	SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
17945	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
17946	SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
17947	SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
17948	SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
17949	SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
17950	SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
17951	SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
17952	SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
17953	SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
17954	SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
17955	SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
17956	SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
17957	SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
17958	SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
17959	SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
17960	SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
17961	SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
17962	SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
17963	SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
17964	SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
17965	SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
17966	SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
17967	SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
17968	SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
17969	SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
17970	/*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
17971	SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
17972	SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
17973	SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
17974	SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1),
17975	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
17976	SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
17977	SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
17978	SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
17979	SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
17980	SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
17981	SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
17982	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
17983	SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
17984	SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
17985	SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
17986	/*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
17987	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
17988	SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
17989	SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
17990	SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
17991	SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
17992	SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
17993	SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
17994	SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
17995	SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
17996	SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
17997		      ALC662_3ST_6ch_DIG),
17998	SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
17999	SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
18000	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
18001		      ALC662_3ST_6ch_DIG),
18002	SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13),
18003	SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
18004	SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
18005	SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
18006	SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
18007					ALC662_3ST_6ch_DIG),
18008	SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
18009			   ALC663_ASUS_H13),
18010	{}
18011};
18012
18013static struct alc_config_preset alc662_presets[] = {
18014	[ALC662_3ST_2ch_DIG] = {
18015		.mixers = { alc662_3ST_2ch_mixer },
18016		.init_verbs = { alc662_init_verbs },
18017		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18018		.dac_nids = alc662_dac_nids,
18019		.dig_out_nid = ALC662_DIGOUT_NID,
18020		.dig_in_nid = ALC662_DIGIN_NID,
18021		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18022		.channel_mode = alc662_3ST_2ch_modes,
18023		.input_mux = &alc662_capture_source,
18024	},
18025	[ALC662_3ST_6ch_DIG] = {
18026		.mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18027		.init_verbs = { alc662_init_verbs },
18028		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18029		.dac_nids = alc662_dac_nids,
18030		.dig_out_nid = ALC662_DIGOUT_NID,
18031		.dig_in_nid = ALC662_DIGIN_NID,
18032		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18033		.channel_mode = alc662_3ST_6ch_modes,
18034		.need_dac_fix = 1,
18035		.input_mux = &alc662_capture_source,
18036	},
18037	[ALC662_3ST_6ch] = {
18038		.mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18039		.init_verbs = { alc662_init_verbs },
18040		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18041		.dac_nids = alc662_dac_nids,
18042		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18043		.channel_mode = alc662_3ST_6ch_modes,
18044		.need_dac_fix = 1,
18045		.input_mux = &alc662_capture_source,
18046	},
18047	[ALC662_5ST_DIG] = {
18048		.mixers = { alc662_base_mixer, alc662_chmode_mixer },
18049		.init_verbs = { alc662_init_verbs },
18050		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18051		.dac_nids = alc662_dac_nids,
18052		.dig_out_nid = ALC662_DIGOUT_NID,
18053		.dig_in_nid = ALC662_DIGIN_NID,
18054		.num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
18055		.channel_mode = alc662_5stack_modes,
18056		.input_mux = &alc662_capture_source,
18057	},
18058	[ALC662_LENOVO_101E] = {
18059		.mixers = { alc662_lenovo_101e_mixer },
18060		.init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
18061		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18062		.dac_nids = alc662_dac_nids,
18063		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18064		.channel_mode = alc662_3ST_2ch_modes,
18065		.input_mux = &alc662_lenovo_101e_capture_source,
18066		.unsol_event = alc662_lenovo_101e_unsol_event,
18067		.init_hook = alc662_lenovo_101e_all_automute,
18068	},
18069	[ALC662_ASUS_EEEPC_P701] = {
18070		.mixers = { alc662_eeepc_p701_mixer },
18071		.init_verbs = { alc662_init_verbs,
18072				alc662_eeepc_sue_init_verbs },
18073		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18074		.dac_nids = alc662_dac_nids,
18075		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18076		.channel_mode = alc662_3ST_2ch_modes,
18077		.unsol_event = alc662_eeepc_unsol_event,
18078		.setup = alc662_eeepc_setup,
18079		.init_hook = alc662_eeepc_inithook,
18080	},
18081	[ALC662_ASUS_EEEPC_EP20] = {
18082		.mixers = { alc662_eeepc_ep20_mixer,
18083			    alc662_chmode_mixer },
18084		.init_verbs = { alc662_init_verbs,
18085				alc662_eeepc_ep20_sue_init_verbs },
18086		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18087		.dac_nids = alc662_dac_nids,
18088		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18089		.channel_mode = alc662_3ST_6ch_modes,
18090		.input_mux = &alc662_lenovo_101e_capture_source,
18091		.unsol_event = alc662_eeepc_unsol_event,
18092		.setup = alc662_eeepc_ep20_setup,
18093		.init_hook = alc662_eeepc_ep20_inithook,
18094	},
18095	[ALC662_ECS] = {
18096		.mixers = { alc662_ecs_mixer },
18097		.init_verbs = { alc662_init_verbs,
18098				alc662_ecs_init_verbs },
18099		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18100		.dac_nids = alc662_dac_nids,
18101		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18102		.channel_mode = alc662_3ST_2ch_modes,
18103		.unsol_event = alc662_eeepc_unsol_event,
18104		.setup = alc662_eeepc_setup,
18105		.init_hook = alc662_eeepc_inithook,
18106	},
18107	[ALC663_ASUS_M51VA] = {
18108		.mixers = { alc663_m51va_mixer },
18109		.init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18110		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18111		.dac_nids = alc662_dac_nids,
18112		.dig_out_nid = ALC662_DIGOUT_NID,
18113		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18114		.channel_mode = alc662_3ST_2ch_modes,
18115		.unsol_event = alc663_m51va_unsol_event,
18116		.setup = alc663_m51va_setup,
18117		.init_hook = alc663_m51va_inithook,
18118	},
18119	[ALC663_ASUS_G71V] = {
18120		.mixers = { alc663_g71v_mixer },
18121		.init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
18122		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18123		.dac_nids = alc662_dac_nids,
18124		.dig_out_nid = ALC662_DIGOUT_NID,
18125		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18126		.channel_mode = alc662_3ST_2ch_modes,
18127		.unsol_event = alc663_g71v_unsol_event,
18128		.setup = alc663_g71v_setup,
18129		.init_hook = alc663_g71v_inithook,
18130	},
18131	[ALC663_ASUS_H13] = {
18132		.mixers = { alc663_m51va_mixer },
18133		.init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18134		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18135		.dac_nids = alc662_dac_nids,
18136		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18137		.channel_mode = alc662_3ST_2ch_modes,
18138		.unsol_event = alc663_m51va_unsol_event,
18139		.init_hook = alc663_m51va_inithook,
18140	},
18141	[ALC663_ASUS_G50V] = {
18142		.mixers = { alc663_g50v_mixer },
18143		.init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
18144		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18145		.dac_nids = alc662_dac_nids,
18146		.dig_out_nid = ALC662_DIGOUT_NID,
18147		.num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18148		.channel_mode = alc662_3ST_6ch_modes,
18149		.input_mux = &alc663_capture_source,
18150		.unsol_event = alc663_g50v_unsol_event,
18151		.setup = alc663_g50v_setup,
18152		.init_hook = alc663_g50v_inithook,
18153	},
18154	[ALC663_ASUS_MODE1] = {
18155		.mixers = { alc663_m51va_mixer },
18156		.cap_mixer = alc662_auto_capture_mixer,
18157		.init_verbs = { alc662_init_verbs,
18158				alc663_21jd_amic_init_verbs },
18159		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18160		.hp_nid = 0x03,
18161		.dac_nids = alc662_dac_nids,
18162		.dig_out_nid = ALC662_DIGOUT_NID,
18163		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18164		.channel_mode = alc662_3ST_2ch_modes,
18165		.unsol_event = alc663_mode1_unsol_event,
18166		.setup = alc663_mode1_setup,
18167		.init_hook = alc663_mode1_inithook,
18168	},
18169	[ALC662_ASUS_MODE2] = {
18170		.mixers = { alc662_1bjd_mixer },
18171		.cap_mixer = alc662_auto_capture_mixer,
18172		.init_verbs = { alc662_init_verbs,
18173				alc662_1bjd_amic_init_verbs },
18174		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18175		.dac_nids = alc662_dac_nids,
18176		.dig_out_nid = ALC662_DIGOUT_NID,
18177		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18178		.channel_mode = alc662_3ST_2ch_modes,
18179		.unsol_event = alc662_mode2_unsol_event,
18180		.setup = alc662_mode2_setup,
18181		.init_hook = alc662_mode2_inithook,
18182	},
18183	[ALC663_ASUS_MODE3] = {
18184		.mixers = { alc663_two_hp_m1_mixer },
18185		.cap_mixer = alc662_auto_capture_mixer,
18186		.init_verbs = { alc662_init_verbs,
18187				alc663_two_hp_amic_m1_init_verbs },
18188		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18189		.hp_nid = 0x03,
18190		.dac_nids = alc662_dac_nids,
18191		.dig_out_nid = ALC662_DIGOUT_NID,
18192		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18193		.channel_mode = alc662_3ST_2ch_modes,
18194		.unsol_event = alc663_mode3_unsol_event,
18195		.setup = alc663_mode3_setup,
18196		.init_hook = alc663_mode3_inithook,
18197	},
18198	[ALC663_ASUS_MODE4] = {
18199		.mixers = { alc663_asus_21jd_clfe_mixer },
18200		.cap_mixer = alc662_auto_capture_mixer,
18201		.init_verbs = { alc662_init_verbs,
18202				alc663_21jd_amic_init_verbs},
18203		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18204		.hp_nid = 0x03,
18205		.dac_nids = alc662_dac_nids,
18206		.dig_out_nid = ALC662_DIGOUT_NID,
18207		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18208		.channel_mode = alc662_3ST_2ch_modes,
18209		.unsol_event = alc663_mode4_unsol_event,
18210		.setup = alc663_mode4_setup,
18211		.init_hook = alc663_mode4_inithook,
18212	},
18213	[ALC663_ASUS_MODE5] = {
18214		.mixers = { alc663_asus_15jd_clfe_mixer },
18215		.cap_mixer = alc662_auto_capture_mixer,
18216		.init_verbs = { alc662_init_verbs,
18217				alc663_15jd_amic_init_verbs },
18218		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18219		.hp_nid = 0x03,
18220		.dac_nids = alc662_dac_nids,
18221		.dig_out_nid = ALC662_DIGOUT_NID,
18222		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18223		.channel_mode = alc662_3ST_2ch_modes,
18224		.unsol_event = alc663_mode5_unsol_event,
18225		.setup = alc663_mode5_setup,
18226		.init_hook = alc663_mode5_inithook,
18227	},
18228	[ALC663_ASUS_MODE6] = {
18229		.mixers = { alc663_two_hp_m2_mixer },
18230		.cap_mixer = alc662_auto_capture_mixer,
18231		.init_verbs = { alc662_init_verbs,
18232				alc663_two_hp_amic_m2_init_verbs },
18233		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18234		.hp_nid = 0x03,
18235		.dac_nids = alc662_dac_nids,
18236		.dig_out_nid = ALC662_DIGOUT_NID,
18237		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18238		.channel_mode = alc662_3ST_2ch_modes,
18239		.unsol_event = alc663_mode6_unsol_event,
18240		.setup = alc663_mode6_setup,
18241		.init_hook = alc663_mode6_inithook,
18242	},
18243	[ALC663_ASUS_MODE7] = {
18244		.mixers = { alc663_mode7_mixer },
18245		.cap_mixer = alc662_auto_capture_mixer,
18246		.init_verbs = { alc662_init_verbs,
18247				alc663_mode7_init_verbs },
18248		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18249		.hp_nid = 0x03,
18250		.dac_nids = alc662_dac_nids,
18251		.dig_out_nid = ALC662_DIGOUT_NID,
18252		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18253		.channel_mode = alc662_3ST_2ch_modes,
18254		.unsol_event = alc663_mode7_unsol_event,
18255		.setup = alc663_mode7_setup,
18256		.init_hook = alc663_mode7_inithook,
18257	},
18258	[ALC663_ASUS_MODE8] = {
18259		.mixers = { alc663_mode8_mixer },
18260		.cap_mixer = alc662_auto_capture_mixer,
18261		.init_verbs = { alc662_init_verbs,
18262				alc663_mode8_init_verbs },
18263		.num_dacs = ARRAY_SIZE(alc662_dac_nids),
18264		.hp_nid = 0x03,
18265		.dac_nids = alc662_dac_nids,
18266		.dig_out_nid = ALC662_DIGOUT_NID,
18267		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18268		.channel_mode = alc662_3ST_2ch_modes,
18269		.unsol_event = alc663_mode8_unsol_event,
18270		.setup = alc663_mode8_setup,
18271		.init_hook = alc663_mode8_inithook,
18272	},
18273	[ALC272_DELL] = {
18274		.mixers = { alc663_m51va_mixer },
18275		.cap_mixer = alc272_auto_capture_mixer,
18276		.init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
18277		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
18278		.dac_nids = alc662_dac_nids,
18279		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18280		.adc_nids = alc272_adc_nids,
18281		.num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
18282		.capsrc_nids = alc272_capsrc_nids,
18283		.channel_mode = alc662_3ST_2ch_modes,
18284		.unsol_event = alc663_m51va_unsol_event,
18285		.setup = alc663_m51va_setup,
18286		.init_hook = alc663_m51va_inithook,
18287	},
18288	[ALC272_DELL_ZM1] = {
18289		.mixers = { alc663_m51va_mixer },
18290		.cap_mixer = alc662_auto_capture_mixer,
18291		.init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
18292		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
18293		.dac_nids = alc662_dac_nids,
18294		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18295		.adc_nids = alc662_adc_nids,
18296		.num_adc_nids = 1,
18297		.capsrc_nids = alc662_capsrc_nids,
18298		.channel_mode = alc662_3ST_2ch_modes,
18299		.unsol_event = alc663_m51va_unsol_event,
18300		.setup = alc663_m51va_setup,
18301		.init_hook = alc663_m51va_inithook,
18302	},
18303	[ALC272_SAMSUNG_NC10] = {
18304		.mixers = { alc272_nc10_mixer },
18305		.init_verbs = { alc662_init_verbs,
18306				alc663_21jd_amic_init_verbs },
18307		.num_dacs = ARRAY_SIZE(alc272_dac_nids),
18308		.dac_nids = alc272_dac_nids,
18309		.num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18310		.channel_mode = alc662_3ST_2ch_modes,
18311		/*.input_mux = &alc272_nc10_capture_source,*/
18312		.unsol_event = alc663_mode4_unsol_event,
18313		.setup = alc663_mode4_setup,
18314		.init_hook = alc663_mode4_inithook,
18315	},
18316};
18317
18318
18319/*
18320 * BIOS auto configuration
18321 */
18322
18323/* convert from MIX nid to DAC */
18324static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
18325{
18326	if (nid == 0x0f)
18327		return 0x02;
18328	else if (nid >= 0x0c && nid <= 0x0e)
18329		return nid - 0x0c + 0x02;
18330	else
18331		return 0;
18332}
18333
18334/* get MIX nid connected to the given pin targeted to DAC */
18335static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
18336				   hda_nid_t dac)
18337{
18338	hda_nid_t mix[4];
18339	int i, num;
18340
18341	num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
18342	for (i = 0; i < num; i++) {
18343		if (alc662_mix_to_dac(mix[i]) == dac)
18344			return mix[i];
18345	}
18346	return 0;
18347}
18348
18349/* look for an empty DAC slot */
18350static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
18351{
18352	struct alc_spec *spec = codec->spec;
18353	hda_nid_t srcs[5];
18354	int i, j, num;
18355
18356	num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
18357	if (num < 0)
18358		return 0;
18359	for (i = 0; i < num; i++) {
18360		hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
18361		if (!nid)
18362			continue;
18363		for (j = 0; j < spec->multiout.num_dacs; j++)
18364			if (spec->multiout.dac_nids[j] == nid)
18365				break;
18366		if (j >= spec->multiout.num_dacs)
18367			return nid;
18368	}
18369	return 0;
18370}
18371
18372/* fill in the dac_nids table from the parsed pin configuration */
18373static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
18374				     const struct auto_pin_cfg *cfg)
18375{
18376	struct alc_spec *spec = codec->spec;
18377	int i;
18378	hda_nid_t dac;
18379
18380	spec->multiout.dac_nids = spec->private_dac_nids;
18381	for (i = 0; i < cfg->line_outs; i++) {
18382		dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
18383		if (!dac)
18384			continue;
18385		spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
18386	}
18387	return 0;
18388}
18389
18390static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
18391			      hda_nid_t nid, unsigned int chs)
18392{
18393	return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
18394			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
18395}
18396
18397static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
18398			     hda_nid_t nid, unsigned int chs)
18399{
18400	return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18401			   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
18402}
18403
18404#define alc662_add_stereo_vol(spec, pfx, nid) \
18405	alc662_add_vol_ctl(spec, pfx, nid, 3)
18406#define alc662_add_stereo_sw(spec, pfx, nid) \
18407	alc662_add_sw_ctl(spec, pfx, nid, 3)
18408
18409/* add playback controls from the parsed DAC table */
18410static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
18411					     const struct auto_pin_cfg *cfg)
18412{
18413	struct alc_spec *spec = codec->spec;
18414	static const char *chname[4] = {
18415		"Front", "Surround", NULL /*CLFE*/, "Side"
18416	};
18417	hda_nid_t nid, mix;
18418	int i, err;
18419
18420	for (i = 0; i < cfg->line_outs; i++) {
18421		nid = spec->multiout.dac_nids[i];
18422		if (!nid)
18423			continue;
18424		mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
18425		if (!mix)
18426			continue;
18427		if (i == 2) {
18428			/* Center/LFE */
18429			err = alc662_add_vol_ctl(spec, "Center", nid, 1);
18430			if (err < 0)
18431				return err;
18432			err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
18433			if (err < 0)
18434				return err;
18435			err = alc662_add_sw_ctl(spec, "Center", mix, 1);
18436			if (err < 0)
18437				return err;
18438			err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
18439			if (err < 0)
18440				return err;
18441		} else {
18442			const char *pfx;
18443			if (cfg->line_outs == 1 &&
18444			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
18445				if (cfg->hp_outs)
18446					pfx = "Speaker";
18447				else
18448					pfx = "PCM";
18449			} else
18450				pfx = chname[i];
18451			err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18452			if (err < 0)
18453				return err;
18454			if (cfg->line_outs == 1 &&
18455			    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
18456				pfx = "Speaker";
18457			err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18458			if (err < 0)
18459				return err;
18460		}
18461	}
18462	return 0;
18463}
18464
18465/* add playback controls for speaker and HP outputs */
18466/* return DAC nid if any new DAC is assigned */
18467static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
18468					const char *pfx)
18469{
18470	struct alc_spec *spec = codec->spec;
18471	hda_nid_t nid, mix;
18472	int err;
18473
18474	if (!pin)
18475		return 0;
18476	nid = alc662_look_for_dac(codec, pin);
18477	if (!nid) {
18478		/* the corresponding DAC is already occupied */
18479		if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
18480			return 0; /* no way */
18481		/* create a switch only */
18482		return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18483				   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
18484	}
18485
18486	mix = alc662_dac_to_mix(codec, pin, nid);
18487	if (!mix)
18488		return 0;
18489	err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18490	if (err < 0)
18491		return err;
18492	err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18493	if (err < 0)
18494		return err;
18495	return nid;
18496}
18497
18498/* create playback/capture controls for input pins */
18499#define alc662_auto_create_input_ctls \
18500	alc882_auto_create_input_ctls
18501
18502static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
18503					      hda_nid_t nid, int pin_type,
18504					      hda_nid_t dac)
18505{
18506	int i, num;
18507	hda_nid_t srcs[4];
18508
18509	alc_set_pin_output(codec, nid, pin_type);
18510	/* need the manual connection? */
18511	num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
18512	if (num <= 1)
18513		return;
18514	for (i = 0; i < num; i++) {
18515		if (alc662_mix_to_dac(srcs[i]) != dac)
18516			continue;
18517		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
18518		return;
18519	}
18520}
18521
18522static void alc662_auto_init_multi_out(struct hda_codec *codec)
18523{
18524	struct alc_spec *spec = codec->spec;
18525	int pin_type = get_pin_type(spec->autocfg.line_out_type);
18526	int i;
18527
18528	for (i = 0; i <= HDA_SIDE; i++) {
18529		hda_nid_t nid = spec->autocfg.line_out_pins[i];
18530		if (nid)
18531			alc662_auto_set_output_and_unmute(codec, nid, pin_type,
18532					spec->multiout.dac_nids[i]);
18533	}
18534}
18535
18536static void alc662_auto_init_hp_out(struct hda_codec *codec)
18537{
18538	struct alc_spec *spec = codec->spec;
18539	hda_nid_t pin;
18540
18541	pin = spec->autocfg.hp_pins[0];
18542	if (pin)
18543		alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
18544						  spec->multiout.hp_nid);
18545	pin = spec->autocfg.speaker_pins[0];
18546	if (pin)
18547		alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
18548					spec->multiout.extra_out_nid[0]);
18549}
18550
18551#define ALC662_PIN_CD_NID		ALC880_PIN_CD_NID
18552
18553static void alc662_auto_init_analog_input(struct hda_codec *codec)
18554{
18555	struct alc_spec *spec = codec->spec;
18556	int i;
18557
18558	for (i = 0; i < AUTO_PIN_LAST; i++) {
18559		hda_nid_t nid = spec->autocfg.input_pins[i];
18560		if (alc_is_input_pin(codec, nid)) {
18561			alc_set_input_pin(codec, nid, i);
18562			if (nid != ALC662_PIN_CD_NID &&
18563			    (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
18564				snd_hda_codec_write(codec, nid, 0,
18565						    AC_VERB_SET_AMP_GAIN_MUTE,
18566						    AMP_OUT_MUTE);
18567		}
18568	}
18569}
18570
18571#define alc662_auto_init_input_src	alc882_auto_init_input_src
18572
18573static int alc662_parse_auto_config(struct hda_codec *codec)
18574{
18575	struct alc_spec *spec = codec->spec;
18576	int err;
18577	static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
18578
18579	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
18580					   alc662_ignore);
18581	if (err < 0)
18582		return err;
18583	if (!spec->autocfg.line_outs)
18584		return 0; /* can't find valid BIOS pin config */
18585
18586	err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
18587	if (err < 0)
18588		return err;
18589	err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
18590	if (err < 0)
18591		return err;
18592	err = alc662_auto_create_extra_out(codec,
18593					   spec->autocfg.speaker_pins[0],
18594					   "Speaker");
18595	if (err < 0)
18596		return err;
18597	if (err)
18598		spec->multiout.extra_out_nid[0] = err;
18599	err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
18600					   "Headphone");
18601	if (err < 0)
18602		return err;
18603	if (err)
18604		spec->multiout.hp_nid = err;
18605	err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
18606	if (err < 0)
18607		return err;
18608
18609	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
18610
18611	if (spec->autocfg.dig_outs)
18612		spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
18613
18614	if (spec->kctls.list)
18615		add_mixer(spec, spec->kctls.list);
18616
18617	spec->num_mux_defs = 1;
18618	spec->input_mux = &spec->private_imux[0];
18619
18620	add_verb(spec, alc662_init_verbs);
18621	if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18622	    codec->vendor_id == 0x10ec0665)
18623		add_verb(spec, alc663_init_verbs);
18624
18625	if (codec->vendor_id == 0x10ec0272)
18626		add_verb(spec, alc272_init_verbs);
18627
18628	err = alc_auto_add_mic_boost(codec);
18629	if (err < 0)
18630		return err;
18631
18632	if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18633	    codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
18634	    alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0x21);
18635	else
18636	    alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
18637
18638	return 1;
18639}
18640
18641/* additional initialization for auto-configuration model */
18642static void alc662_auto_init(struct hda_codec *codec)
18643{
18644	struct alc_spec *spec = codec->spec;
18645	alc662_auto_init_multi_out(codec);
18646	alc662_auto_init_hp_out(codec);
18647	alc662_auto_init_analog_input(codec);
18648	alc662_auto_init_input_src(codec);
18649	if (spec->unsol_event)
18650		alc_inithook(codec);
18651}
18652
18653static int patch_alc662(struct hda_codec *codec)
18654{
18655	struct alc_spec *spec;
18656	int err, board_config;
18657
18658	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
18659	if (!spec)
18660		return -ENOMEM;
18661
18662	codec->spec = spec;
18663
18664	alc_auto_parse_customize_define(codec);
18665
18666	alc_fix_pll_init(codec, 0x20, 0x04, 15);
18667
18668	if (alc_read_coef_idx(codec, 0) == 0x8020)
18669		alc_codec_rename(codec, "ALC661");
18670	else if ((alc_read_coef_idx(codec, 0) & (1 << 14)) &&
18671		 codec->bus->pci->subsystem_vendor == 0x1025 &&
18672		 spec->cdefine.platform_type == 1)
18673		alc_codec_rename(codec, "ALC272X");
18674
18675	board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
18676						  alc662_models,
18677			  	                  alc662_cfg_tbl);
18678	if (board_config < 0) {
18679		printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
18680		       codec->chip_name);
18681		board_config = ALC662_AUTO;
18682	}
18683
18684	if (board_config == ALC662_AUTO) {
18685		/* automatic parse from the BIOS config */
18686		err = alc662_parse_auto_config(codec);
18687		if (err < 0) {
18688			alc_free(codec);
18689			return err;
18690		} else if (!err) {
18691			printk(KERN_INFO
18692			       "hda_codec: Cannot set up configuration "
18693			       "from BIOS.  Using base mode...\n");
18694			board_config = ALC662_3ST_2ch_DIG;
18695		}
18696	}
18697
18698	if (spec->cdefine.enable_pcbeep) {
18699		err = snd_hda_attach_beep_device(codec, 0x1);
18700		if (err < 0) {
18701			alc_free(codec);
18702			return err;
18703		}
18704	}
18705
18706	if (board_config != ALC662_AUTO)
18707		setup_preset(codec, &alc662_presets[board_config]);
18708
18709	spec->stream_analog_playback = &alc662_pcm_analog_playback;
18710	spec->stream_analog_capture = &alc662_pcm_analog_capture;
18711
18712	spec->stream_digital_playback = &alc662_pcm_digital_playback;
18713	spec->stream_digital_capture = &alc662_pcm_digital_capture;
18714
18715	if (!spec->adc_nids) {
18716		spec->adc_nids = alc662_adc_nids;
18717		spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
18718	}
18719	if (!spec->capsrc_nids)
18720		spec->capsrc_nids = alc662_capsrc_nids;
18721
18722	if (!spec->cap_mixer)
18723		set_capture_mixer(codec);
18724
18725	if (spec->cdefine.enable_pcbeep) {
18726		switch (codec->vendor_id) {
18727		case 0x10ec0662:
18728			set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
18729			break;
18730		case 0x10ec0272:
18731		case 0x10ec0663:
18732		case 0x10ec0665:
18733			set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
18734			break;
18735		case 0x10ec0273:
18736			set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
18737			break;
18738		}
18739	}
18740	spec->vmaster_nid = 0x02;
18741
18742	codec->patch_ops = alc_patch_ops;
18743	if (board_config == ALC662_AUTO)
18744		spec->init_hook = alc662_auto_init;
18745#ifdef CONFIG_SND_HDA_POWER_SAVE
18746	if (!spec->loopback.amplist)
18747		spec->loopback.amplist = alc662_loopbacks;
18748#endif
18749
18750	return 0;
18751}
18752
18753static int patch_alc888(struct hda_codec *codec)
18754{
18755	if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
18756		kfree(codec->chip_name);
18757		codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
18758		if (!codec->chip_name) {
18759			alc_free(codec);
18760			return -ENOMEM;
18761		}
18762		return patch_alc662(codec);
18763	}
18764	return patch_alc882(codec);
18765}
18766
18767/*
18768 * patch entries
18769 */
18770static struct hda_codec_preset snd_hda_preset_realtek[] = {
18771	{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
18772	{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
18773	{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
18774	{ .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
18775	{ .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
18776	{ .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
18777	{ .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
18778	{ .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
18779	{ .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
18780	  .patch = patch_alc861 },
18781	{ .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
18782	{ .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
18783	{ .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
18784	{ .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
18785	  .patch = patch_alc882 },
18786	{ .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
18787	  .patch = patch_alc662 },
18788	{ .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
18789	{ .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
18790	{ .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
18791	{ .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
18792	{ .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
18793	{ .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
18794	{ .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
18795	  .patch = patch_alc882 },
18796	{ .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
18797	  .patch = patch_alc882 },
18798	{ .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
18799	{ .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
18800	{ .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
18801	  .patch = patch_alc882 },
18802	{ .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
18803	{ .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
18804	{ .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
18805	{} /* terminator */
18806};
18807
18808MODULE_ALIAS("snd-hda-codec-id:10ec*");
18809
18810MODULE_LICENSE("GPL");
18811MODULE_DESCRIPTION("Realtek HD-audio codec");
18812
18813static struct hda_codec_preset_list realtek_list = {
18814	.preset = snd_hda_preset_realtek,
18815	.owner = THIS_MODULE,
18816};
18817
18818static int __init patch_realtek_init(void)
18819{
18820	return snd_hda_add_codec_preset(&realtek_list);
18821}
18822
18823static void __exit patch_realtek_exit(void)
18824{
18825	snd_hda_delete_codec_preset(&realtek_list);
18826}
18827
18828module_init(patch_realtek_init)
18829module_exit(patch_realtek_exit)
18830