ALSA: hda - Don't set invalid connection index in Realtek initialiaiton
[safe/jmp/linux-2.6] / sound / pci / hda / patch_realtek.c
1 /*
2  * Universal Interface for Intel High Definition Audio Codec
3  *
4  * HD audio interface patch for ALC 260/880/882 codecs
5  *
6  * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
7  *                    PeiSen Hou <pshou@realtek.com.tw>
8  *                    Takashi Iwai <tiwai@suse.de>
9  *                    Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
10  *
11  *  This driver is free software; you can redistribute it and/or modify
12  *  it under the terms of the GNU General Public License as published by
13  *  the Free Software Foundation; either version 2 of the License, or
14  *  (at your option) any later version.
15  *
16  *  This driver is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *  GNU General Public License for more details.
20  *
21  *  You should have received a copy of the GNU General Public License
22  *  along with this program; if not, write to the Free Software
23  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
24  */
25
26 #include <linux/init.h>
27 #include <linux/delay.h>
28 #include <linux/slab.h>
29 #include <linux/pci.h>
30 #include <sound/core.h>
31 #include "hda_codec.h"
32 #include "hda_local.h"
33 #include "hda_beep.h"
34
35 #define ALC880_FRONT_EVENT              0x01
36 #define ALC880_DCVOL_EVENT              0x02
37 #define ALC880_HP_EVENT                 0x04
38 #define ALC880_MIC_EVENT                0x08
39
40 /* ALC880 board config type */
41 enum {
42         ALC880_3ST,
43         ALC880_3ST_DIG,
44         ALC880_5ST,
45         ALC880_5ST_DIG,
46         ALC880_W810,
47         ALC880_Z71V,
48         ALC880_6ST,
49         ALC880_6ST_DIG,
50         ALC880_F1734,
51         ALC880_ASUS,
52         ALC880_ASUS_DIG,
53         ALC880_ASUS_W1V,
54         ALC880_ASUS_DIG2,
55         ALC880_FUJITSU,
56         ALC880_UNIWILL_DIG,
57         ALC880_UNIWILL,
58         ALC880_UNIWILL_P53,
59         ALC880_CLEVO,
60         ALC880_TCL_S700,
61         ALC880_LG,
62         ALC880_LG_LW,
63         ALC880_MEDION_RIM,
64 #ifdef CONFIG_SND_DEBUG
65         ALC880_TEST,
66 #endif
67         ALC880_AUTO,
68         ALC880_MODEL_LAST /* last tag */
69 };
70
71 /* ALC260 models */
72 enum {
73         ALC260_BASIC,
74         ALC260_HP,
75         ALC260_HP_DC7600,
76         ALC260_HP_3013,
77         ALC260_FUJITSU_S702X,
78         ALC260_ACER,
79         ALC260_WILL,
80         ALC260_REPLACER_672V,
81         ALC260_FAVORIT100,
82 #ifdef CONFIG_SND_DEBUG
83         ALC260_TEST,
84 #endif
85         ALC260_AUTO,
86         ALC260_MODEL_LAST /* last tag */
87 };
88
89 /* ALC262 models */
90 enum {
91         ALC262_BASIC,
92         ALC262_HIPPO,
93         ALC262_HIPPO_1,
94         ALC262_FUJITSU,
95         ALC262_HP_BPC,
96         ALC262_HP_BPC_D7000_WL,
97         ALC262_HP_BPC_D7000_WF,
98         ALC262_HP_TC_T5735,
99         ALC262_HP_RP5700,
100         ALC262_BENQ_ED8,
101         ALC262_SONY_ASSAMD,
102         ALC262_BENQ_T31,
103         ALC262_ULTRA,
104         ALC262_LENOVO_3000,
105         ALC262_NEC,
106         ALC262_TOSHIBA_S06,
107         ALC262_TOSHIBA_RX1,
108         ALC262_TYAN,
109         ALC262_AUTO,
110         ALC262_MODEL_LAST /* last tag */
111 };
112
113 /* ALC268 models */
114 enum {
115         ALC267_QUANTA_IL1,
116         ALC268_3ST,
117         ALC268_TOSHIBA,
118         ALC268_ACER,
119         ALC268_ACER_DMIC,
120         ALC268_ACER_ASPIRE_ONE,
121         ALC268_DELL,
122         ALC268_ZEPTO,
123 #ifdef CONFIG_SND_DEBUG
124         ALC268_TEST,
125 #endif
126         ALC268_AUTO,
127         ALC268_MODEL_LAST /* last tag */
128 };
129
130 /* ALC269 models */
131 enum {
132         ALC269_BASIC,
133         ALC269_QUANTA_FL1,
134         ALC269_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 */
145 enum {
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 */
159 enum {
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 */
174 enum {
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 */
203 enum {
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_LAPTOP_EAPD,
234         ALC883_LENOVO_101E_2ch,
235         ALC883_LENOVO_NB0763,
236         ALC888_LENOVO_MS7195_DIG,
237         ALC888_LENOVO_SKY,
238         ALC883_HAIER_W66,
239         ALC888_3ST_HP,
240         ALC888_6ST_DELL,
241         ALC883_MITAC,
242         ALC883_CLEVO_M540R,
243         ALC883_CLEVO_M720,
244         ALC883_FUJITSU_PI2515,
245         ALC888_FUJITSU_XA3530,
246         ALC883_3ST_6ch_INTEL,
247         ALC889A_INTEL,
248         ALC889_INTEL,
249         ALC888_ASUS_M90V,
250         ALC888_ASUS_EEE1601,
251         ALC889A_MB31,
252         ALC1200_ASUS_P5Q,
253         ALC883_SONY_VAIO_TT,
254         ALC882_AUTO,
255         ALC882_MODEL_LAST,
256 };
257
258 /* for GPIO Poll */
259 #define GPIO_MASK       0x03
260
261 /* extra amp-initialization sequence types */
262 enum {
263         ALC_INIT_NONE,
264         ALC_INIT_DEFAULT,
265         ALC_INIT_GPIO1,
266         ALC_INIT_GPIO2,
267         ALC_INIT_GPIO3,
268 };
269
270 struct alc_mic_route {
271         hda_nid_t pin;
272         unsigned char mux_idx;
273         unsigned char amix_idx;
274 };
275
276 #define MUX_IDX_UNDEF   ((unsigned char)-1)
277
278 struct alc_spec {
279         /* codec parameterization */
280         struct snd_kcontrol_new *mixers[5];     /* mixer arrays */
281         unsigned int num_mixers;
282         struct snd_kcontrol_new *cap_mixer;     /* capture mixer */
283         unsigned int beep_amp;  /* beep amp value, set via set_beep_amp() */
284
285         const struct hda_verb *init_verbs[10];  /* initialization verbs
286                                                  * don't forget NULL
287                                                  * termination!
288                                                  */
289         unsigned int num_init_verbs;
290
291         char stream_name_analog[32];    /* analog PCM stream */
292         struct hda_pcm_stream *stream_analog_playback;
293         struct hda_pcm_stream *stream_analog_capture;
294         struct hda_pcm_stream *stream_analog_alt_playback;
295         struct hda_pcm_stream *stream_analog_alt_capture;
296
297         char stream_name_digital[32];   /* digital PCM stream */
298         struct hda_pcm_stream *stream_digital_playback;
299         struct hda_pcm_stream *stream_digital_capture;
300
301         /* playback */
302         struct hda_multi_out multiout;  /* playback set-up
303                                          * max_channels, dacs must be set
304                                          * dig_out_nid and hp_nid are optional
305                                          */
306         hda_nid_t alt_dac_nid;
307         hda_nid_t slave_dig_outs[3];    /* optional - for auto-parsing */
308         int dig_out_type;
309
310         /* capture */
311         unsigned int num_adc_nids;
312         hda_nid_t *adc_nids;
313         hda_nid_t *capsrc_nids;
314         hda_nid_t dig_in_nid;           /* digital-in NID; optional */
315
316         /* capture source */
317         unsigned int num_mux_defs;
318         const struct hda_input_mux *input_mux;
319         unsigned int cur_mux[3];
320         struct alc_mic_route ext_mic;
321         struct alc_mic_route int_mic;
322
323         /* channel model */
324         const struct hda_channel_mode *channel_mode;
325         int num_channel_mode;
326         int need_dac_fix;
327         int const_channel_count;
328         int ext_channel_count;
329
330         /* PCM information */
331         struct hda_pcm pcm_rec[3];      /* used in alc_build_pcms() */
332
333         /* dynamic controls, init_verbs and input_mux */
334         struct auto_pin_cfg autocfg;
335         struct snd_array kctls;
336         struct hda_input_mux private_imux[3];
337         hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
338         hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
339         hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
340
341         /* hooks */
342         void (*init_hook)(struct hda_codec *codec);
343         void (*unsol_event)(struct hda_codec *codec, unsigned int res);
344 #ifdef CONFIG_SND_HDA_POWER_SAVE
345         void (*power_hook)(struct hda_codec *codec);
346 #endif
347
348         /* for pin sensing */
349         unsigned int sense_updated: 1;
350         unsigned int jack_present: 1;
351         unsigned int master_sw: 1;
352         unsigned int auto_mic:1;
353
354         /* other flags */
355         unsigned int no_analog :1; /* digital I/O only */
356         int init_amp;
357
358         /* for virtual master */
359         hda_nid_t vmaster_nid;
360 #ifdef CONFIG_SND_HDA_POWER_SAVE
361         struct hda_loopback_check loopback;
362 #endif
363
364         /* for PLL fix */
365         hda_nid_t pll_nid;
366         unsigned int pll_coef_idx, pll_coef_bit;
367 };
368
369 /*
370  * configuration template - to be copied to the spec instance
371  */
372 struct alc_config_preset {
373         struct snd_kcontrol_new *mixers[5]; /* should be identical size
374                                              * with spec
375                                              */
376         struct snd_kcontrol_new *cap_mixer; /* capture mixer */
377         const struct hda_verb *init_verbs[5];
378         unsigned int num_dacs;
379         hda_nid_t *dac_nids;
380         hda_nid_t dig_out_nid;          /* optional */
381         hda_nid_t hp_nid;               /* optional */
382         hda_nid_t *slave_dig_outs;
383         unsigned int num_adc_nids;
384         hda_nid_t *adc_nids;
385         hda_nid_t *capsrc_nids;
386         hda_nid_t dig_in_nid;
387         unsigned int num_channel_mode;
388         const struct hda_channel_mode *channel_mode;
389         int need_dac_fix;
390         int const_channel_count;
391         unsigned int num_mux_defs;
392         const struct hda_input_mux *input_mux;
393         void (*unsol_event)(struct hda_codec *, unsigned int);
394         void (*setup)(struct hda_codec *);
395         void (*init_hook)(struct hda_codec *);
396 #ifdef CONFIG_SND_HDA_POWER_SAVE
397         struct hda_amp_list *loopbacks;
398         void (*power_hook)(struct hda_codec *codec);
399 #endif
400 };
401
402
403 /*
404  * input MUX handling
405  */
406 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
407                              struct snd_ctl_elem_info *uinfo)
408 {
409         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
410         struct alc_spec *spec = codec->spec;
411         unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
412         if (mux_idx >= spec->num_mux_defs)
413                 mux_idx = 0;
414         if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
415                 mux_idx = 0;
416         return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
417 }
418
419 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
420                             struct snd_ctl_elem_value *ucontrol)
421 {
422         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
423         struct alc_spec *spec = codec->spec;
424         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
425
426         ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
427         return 0;
428 }
429
430 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
431                             struct snd_ctl_elem_value *ucontrol)
432 {
433         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
434         struct alc_spec *spec = codec->spec;
435         const struct hda_input_mux *imux;
436         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
437         unsigned int mux_idx;
438         hda_nid_t nid = spec->capsrc_nids ?
439                 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
440         unsigned int type;
441
442         mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
443         imux = &spec->input_mux[mux_idx];
444         if (!imux->num_items && mux_idx > 0)
445                 imux = &spec->input_mux[0];
446
447         type = get_wcaps_type(get_wcaps(codec, nid));
448         if (type == AC_WID_AUD_MIX) {
449                 /* Matrix-mixer style (e.g. ALC882) */
450                 unsigned int *cur_val = &spec->cur_mux[adc_idx];
451                 unsigned int i, idx;
452
453                 idx = ucontrol->value.enumerated.item[0];
454                 if (idx >= imux->num_items)
455                         idx = imux->num_items - 1;
456                 if (*cur_val == idx)
457                         return 0;
458                 for (i = 0; i < imux->num_items; i++) {
459                         unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
460                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
461                                                  imux->items[i].index,
462                                                  HDA_AMP_MUTE, v);
463                 }
464                 *cur_val = idx;
465                 return 1;
466         } else {
467                 /* MUX style (e.g. ALC880) */
468                 return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
469                                              &spec->cur_mux[adc_idx]);
470         }
471 }
472
473 /*
474  * channel mode setting
475  */
476 static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
477                             struct snd_ctl_elem_info *uinfo)
478 {
479         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
480         struct alc_spec *spec = codec->spec;
481         return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
482                                     spec->num_channel_mode);
483 }
484
485 static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
486                            struct snd_ctl_elem_value *ucontrol)
487 {
488         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
489         struct alc_spec *spec = codec->spec;
490         return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
491                                    spec->num_channel_mode,
492                                    spec->ext_channel_count);
493 }
494
495 static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
496                            struct snd_ctl_elem_value *ucontrol)
497 {
498         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
499         struct alc_spec *spec = codec->spec;
500         int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
501                                       spec->num_channel_mode,
502                                       &spec->ext_channel_count);
503         if (err >= 0 && !spec->const_channel_count) {
504                 spec->multiout.max_channels = spec->ext_channel_count;
505                 if (spec->need_dac_fix)
506                         spec->multiout.num_dacs = spec->multiout.max_channels / 2;
507         }
508         return err;
509 }
510
511 /*
512  * Control the mode of pin widget settings via the mixer.  "pc" is used
513  * instead of "%" to avoid consequences of accidently treating the % as
514  * being part of a format specifier.  Maximum allowed length of a value is
515  * 63 characters plus NULL terminator.
516  *
517  * Note: some retasking pin complexes seem to ignore requests for input
518  * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
519  * are requested.  Therefore order this list so that this behaviour will not
520  * cause problems when mixer clients move through the enum sequentially.
521  * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
522  * March 2006.
523  */
524 static char *alc_pin_mode_names[] = {
525         "Mic 50pc bias", "Mic 80pc bias",
526         "Line in", "Line out", "Headphone out",
527 };
528 static unsigned char alc_pin_mode_values[] = {
529         PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
530 };
531 /* The control can present all 5 options, or it can limit the options based
532  * in the pin being assumed to be exclusively an input or an output pin.  In
533  * addition, "input" pins may or may not process the mic bias option
534  * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
535  * accept requests for bias as of chip versions up to March 2006) and/or
536  * wiring in the computer.
537  */
538 #define ALC_PIN_DIR_IN              0x00
539 #define ALC_PIN_DIR_OUT             0x01
540 #define ALC_PIN_DIR_INOUT           0x02
541 #define ALC_PIN_DIR_IN_NOMICBIAS    0x03
542 #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
543
544 /* Info about the pin modes supported by the different pin direction modes.
545  * For each direction the minimum and maximum values are given.
546  */
547 static signed char alc_pin_mode_dir_info[5][2] = {
548         { 0, 2 },    /* ALC_PIN_DIR_IN */
549         { 3, 4 },    /* ALC_PIN_DIR_OUT */
550         { 0, 4 },    /* ALC_PIN_DIR_INOUT */
551         { 2, 2 },    /* ALC_PIN_DIR_IN_NOMICBIAS */
552         { 2, 4 },    /* ALC_PIN_DIR_INOUT_NOMICBIAS */
553 };
554 #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
555 #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
556 #define alc_pin_mode_n_items(_dir) \
557         (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
558
559 static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
560                              struct snd_ctl_elem_info *uinfo)
561 {
562         unsigned int item_num = uinfo->value.enumerated.item;
563         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
564
565         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
566         uinfo->count = 1;
567         uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
568
569         if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
570                 item_num = alc_pin_mode_min(dir);
571         strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
572         return 0;
573 }
574
575 static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
576                             struct snd_ctl_elem_value *ucontrol)
577 {
578         unsigned int i;
579         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
580         hda_nid_t nid = kcontrol->private_value & 0xffff;
581         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
582         long *valp = ucontrol->value.integer.value;
583         unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
584                                                  AC_VERB_GET_PIN_WIDGET_CONTROL,
585                                                  0x00);
586
587         /* Find enumerated value for current pinctl setting */
588         i = alc_pin_mode_min(dir);
589         while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
590                 i++;
591         *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
592         return 0;
593 }
594
595 static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
596                             struct snd_ctl_elem_value *ucontrol)
597 {
598         signed int change;
599         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
600         hda_nid_t nid = kcontrol->private_value & 0xffff;
601         unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
602         long val = *ucontrol->value.integer.value;
603         unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
604                                                  AC_VERB_GET_PIN_WIDGET_CONTROL,
605                                                  0x00);
606
607         if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
608                 val = alc_pin_mode_min(dir);
609
610         change = pinctl != alc_pin_mode_values[val];
611         if (change) {
612                 /* Set pin mode to that requested */
613                 snd_hda_codec_write_cache(codec, nid, 0,
614                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
615                                           alc_pin_mode_values[val]);
616
617                 /* Also enable the retasking pin's input/output as required
618                  * for the requested pin mode.  Enum values of 2 or less are
619                  * input modes.
620                  *
621                  * Dynamically switching the input/output buffers probably
622                  * reduces noise slightly (particularly on input) so we'll
623                  * do it.  However, having both input and output buffers
624                  * enabled simultaneously doesn't seem to be problematic if
625                  * this turns out to be necessary in the future.
626                  */
627                 if (val <= 2) {
628                         snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
629                                                  HDA_AMP_MUTE, HDA_AMP_MUTE);
630                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
631                                                  HDA_AMP_MUTE, 0);
632                 } else {
633                         snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
634                                                  HDA_AMP_MUTE, HDA_AMP_MUTE);
635                         snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
636                                                  HDA_AMP_MUTE, 0);
637                 }
638         }
639         return change;
640 }
641
642 #define ALC_PIN_MODE(xname, nid, dir) \
643         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
644           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
645           .info = alc_pin_mode_info, \
646           .get = alc_pin_mode_get, \
647           .put = alc_pin_mode_put, \
648           .private_value = nid | (dir<<16) }
649
650 /* A switch control for ALC260 GPIO pins.  Multiple GPIOs can be ganged
651  * together using a mask with more than one bit set.  This control is
652  * currently used only by the ALC260 test model.  At this stage they are not
653  * needed for any "production" models.
654  */
655 #ifdef CONFIG_SND_DEBUG
656 #define alc_gpio_data_info      snd_ctl_boolean_mono_info
657
658 static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
659                              struct snd_ctl_elem_value *ucontrol)
660 {
661         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
662         hda_nid_t nid = kcontrol->private_value & 0xffff;
663         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
664         long *valp = ucontrol->value.integer.value;
665         unsigned int val = snd_hda_codec_read(codec, nid, 0,
666                                               AC_VERB_GET_GPIO_DATA, 0x00);
667
668         *valp = (val & mask) != 0;
669         return 0;
670 }
671 static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
672                              struct snd_ctl_elem_value *ucontrol)
673 {
674         signed int change;
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 val = *ucontrol->value.integer.value;
679         unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
680                                                     AC_VERB_GET_GPIO_DATA,
681                                                     0x00);
682
683         /* Set/unset the masked GPIO bit(s) as needed */
684         change = (val == 0 ? 0 : mask) != (gpio_data & mask);
685         if (val == 0)
686                 gpio_data &= ~mask;
687         else
688                 gpio_data |= mask;
689         snd_hda_codec_write_cache(codec, nid, 0,
690                                   AC_VERB_SET_GPIO_DATA, gpio_data);
691
692         return change;
693 }
694 #define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
695         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
696           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
697           .info = alc_gpio_data_info, \
698           .get = alc_gpio_data_get, \
699           .put = alc_gpio_data_put, \
700           .private_value = nid | (mask<<16) }
701 #endif   /* CONFIG_SND_DEBUG */
702
703 /* A switch control to allow the enabling of the digital IO pins on the
704  * ALC260.  This is incredibly simplistic; the intention of this control is
705  * to provide something in the test model allowing digital outputs to be
706  * identified if present.  If models are found which can utilise these
707  * outputs a more complete mixer control can be devised for those models if
708  * necessary.
709  */
710 #ifdef CONFIG_SND_DEBUG
711 #define alc_spdif_ctrl_info     snd_ctl_boolean_mono_info
712
713 static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
714                               struct snd_ctl_elem_value *ucontrol)
715 {
716         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
717         hda_nid_t nid = kcontrol->private_value & 0xffff;
718         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
719         long *valp = ucontrol->value.integer.value;
720         unsigned int val = snd_hda_codec_read(codec, nid, 0,
721                                               AC_VERB_GET_DIGI_CONVERT_1, 0x00);
722
723         *valp = (val & mask) != 0;
724         return 0;
725 }
726 static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
727                               struct snd_ctl_elem_value *ucontrol)
728 {
729         signed int change;
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 val = *ucontrol->value.integer.value;
734         unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
735                                                     AC_VERB_GET_DIGI_CONVERT_1,
736                                                     0x00);
737
738         /* Set/unset the masked control bit(s) as needed */
739         change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
740         if (val==0)
741                 ctrl_data &= ~mask;
742         else
743                 ctrl_data |= mask;
744         snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
745                                   ctrl_data);
746
747         return change;
748 }
749 #define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
750         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
751           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
752           .info = alc_spdif_ctrl_info, \
753           .get = alc_spdif_ctrl_get, \
754           .put = alc_spdif_ctrl_put, \
755           .private_value = nid | (mask<<16) }
756 #endif   /* CONFIG_SND_DEBUG */
757
758 /* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
759  * Again, this is only used in the ALC26x test models to help identify when
760  * the EAPD line must be asserted for features to work.
761  */
762 #ifdef CONFIG_SND_DEBUG
763 #define alc_eapd_ctrl_info      snd_ctl_boolean_mono_info
764
765 static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
766                               struct snd_ctl_elem_value *ucontrol)
767 {
768         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
769         hda_nid_t nid = kcontrol->private_value & 0xffff;
770         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
771         long *valp = ucontrol->value.integer.value;
772         unsigned int val = snd_hda_codec_read(codec, nid, 0,
773                                               AC_VERB_GET_EAPD_BTLENABLE, 0x00);
774
775         *valp = (val & mask) != 0;
776         return 0;
777 }
778
779 static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
780                               struct snd_ctl_elem_value *ucontrol)
781 {
782         int change;
783         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
784         hda_nid_t nid = kcontrol->private_value & 0xffff;
785         unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
786         long val = *ucontrol->value.integer.value;
787         unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
788                                                     AC_VERB_GET_EAPD_BTLENABLE,
789                                                     0x00);
790
791         /* Set/unset the masked control bit(s) as needed */
792         change = (!val ? 0 : mask) != (ctrl_data & mask);
793         if (!val)
794                 ctrl_data &= ~mask;
795         else
796                 ctrl_data |= mask;
797         snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
798                                   ctrl_data);
799
800         return change;
801 }
802
803 #define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
804         { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
805           .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
806           .info = alc_eapd_ctrl_info, \
807           .get = alc_eapd_ctrl_get, \
808           .put = alc_eapd_ctrl_put, \
809           .private_value = nid | (mask<<16) }
810 #endif   /* CONFIG_SND_DEBUG */
811
812 /*
813  * set up the input pin config (depending on the given auto-pin type)
814  */
815 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
816                               int auto_pin_type)
817 {
818         unsigned int val = PIN_IN;
819
820         if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
821                 unsigned int pincap;
822                 pincap = snd_hda_query_pin_caps(codec, nid);
823                 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
824                 if (pincap & AC_PINCAP_VREF_80)
825                         val = PIN_VREF80;
826                 else if (pincap & AC_PINCAP_VREF_50)
827                         val = PIN_VREF50;
828                 else if (pincap & AC_PINCAP_VREF_100)
829                         val = PIN_VREF100;
830                 else if (pincap & AC_PINCAP_VREF_GRD)
831                         val = PIN_VREFGRD;
832         }
833         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
834 }
835
836 /*
837  */
838 static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
839 {
840         if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
841                 return;
842         spec->mixers[spec->num_mixers++] = mix;
843 }
844
845 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
846 {
847         if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
848                 return;
849         spec->init_verbs[spec->num_init_verbs++] = verb;
850 }
851
852 /*
853  * set up from the preset table
854  */
855 static void setup_preset(struct hda_codec *codec,
856                          const struct alc_config_preset *preset)
857 {
858         struct alc_spec *spec = codec->spec;
859         int i;
860
861         for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
862                 add_mixer(spec, preset->mixers[i]);
863         spec->cap_mixer = preset->cap_mixer;
864         for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
865              i++)
866                 add_verb(spec, preset->init_verbs[i]);
867
868         spec->channel_mode = preset->channel_mode;
869         spec->num_channel_mode = preset->num_channel_mode;
870         spec->need_dac_fix = preset->need_dac_fix;
871         spec->const_channel_count = preset->const_channel_count;
872
873         if (preset->const_channel_count)
874                 spec->multiout.max_channels = preset->const_channel_count;
875         else
876                 spec->multiout.max_channels = spec->channel_mode[0].channels;
877         spec->ext_channel_count = spec->channel_mode[0].channels;
878
879         spec->multiout.num_dacs = preset->num_dacs;
880         spec->multiout.dac_nids = preset->dac_nids;
881         spec->multiout.dig_out_nid = preset->dig_out_nid;
882         spec->multiout.slave_dig_outs = preset->slave_dig_outs;
883         spec->multiout.hp_nid = preset->hp_nid;
884
885         spec->num_mux_defs = preset->num_mux_defs;
886         if (!spec->num_mux_defs)
887                 spec->num_mux_defs = 1;
888         spec->input_mux = preset->input_mux;
889
890         spec->num_adc_nids = preset->num_adc_nids;
891         spec->adc_nids = preset->adc_nids;
892         spec->capsrc_nids = preset->capsrc_nids;
893         spec->dig_in_nid = preset->dig_in_nid;
894
895         spec->unsol_event = preset->unsol_event;
896         spec->init_hook = preset->init_hook;
897 #ifdef CONFIG_SND_HDA_POWER_SAVE
898         spec->power_hook = preset->power_hook;
899         spec->loopback.amplist = preset->loopbacks;
900 #endif
901
902         if (preset->setup)
903                 preset->setup(codec);
904 }
905
906 /* Enable GPIO mask and set output */
907 static struct hda_verb alc_gpio1_init_verbs[] = {
908         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
909         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
910         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
911         { }
912 };
913
914 static struct hda_verb alc_gpio2_init_verbs[] = {
915         {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
916         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
917         {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
918         { }
919 };
920
921 static struct hda_verb alc_gpio3_init_verbs[] = {
922         {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
923         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
924         {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
925         { }
926 };
927
928 /*
929  * Fix hardware PLL issue
930  * On some codecs, the analog PLL gating control must be off while
931  * the default value is 1.
932  */
933 static void alc_fix_pll(struct hda_codec *codec)
934 {
935         struct alc_spec *spec = codec->spec;
936         unsigned int val;
937
938         if (!spec->pll_nid)
939                 return;
940         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
941                             spec->pll_coef_idx);
942         val = snd_hda_codec_read(codec, spec->pll_nid, 0,
943                                  AC_VERB_GET_PROC_COEF, 0);
944         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
945                             spec->pll_coef_idx);
946         snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
947                             val & ~(1 << spec->pll_coef_bit));
948 }
949
950 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
951                              unsigned int coef_idx, unsigned int coef_bit)
952 {
953         struct alc_spec *spec = codec->spec;
954         spec->pll_nid = nid;
955         spec->pll_coef_idx = coef_idx;
956         spec->pll_coef_bit = coef_bit;
957         alc_fix_pll(codec);
958 }
959
960 static void alc_automute_pin(struct hda_codec *codec)
961 {
962         struct alc_spec *spec = codec->spec;
963         unsigned int nid = spec->autocfg.hp_pins[0];
964         int i;
965
966         if (!nid)
967                 return;
968         spec->jack_present = snd_hda_jack_detect(codec, nid);
969         for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
970                 nid = spec->autocfg.speaker_pins[i];
971                 if (!nid)
972                         break;
973                 snd_hda_codec_write(codec, nid, 0,
974                                     AC_VERB_SET_PIN_WIDGET_CONTROL,
975                                     spec->jack_present ? 0 : PIN_OUT);
976         }
977 }
978
979 static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
980                                 hda_nid_t nid)
981 {
982         hda_nid_t conn[HDA_MAX_NUM_INPUTS];
983         int i, nums;
984
985         nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
986         for (i = 0; i < nums; i++)
987                 if (conn[i] == nid)
988                         return i;
989         return -1;
990 }
991
992 static void alc_mic_automute(struct hda_codec *codec)
993 {
994         struct alc_spec *spec = codec->spec;
995         struct alc_mic_route *dead, *alive;
996         unsigned int present, type;
997         hda_nid_t cap_nid;
998
999         if (!spec->auto_mic)
1000                 return;
1001         if (!spec->int_mic.pin || !spec->ext_mic.pin)
1002                 return;
1003         if (snd_BUG_ON(!spec->adc_nids))
1004                 return;
1005
1006         cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1007
1008         present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1009         if (present) {
1010                 alive = &spec->ext_mic;
1011                 dead = &spec->int_mic;
1012         } else {
1013                 alive = &spec->int_mic;
1014                 dead = &spec->ext_mic;
1015         }
1016
1017         type = get_wcaps_type(get_wcaps(codec, cap_nid));
1018         if (type == AC_WID_AUD_MIX) {
1019                 /* Matrix-mixer style (e.g. ALC882) */
1020                 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1021                                          alive->mux_idx,
1022                                          HDA_AMP_MUTE, 0);
1023                 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1024                                          dead->mux_idx,
1025                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
1026         } else {
1027                 /* MUX style (e.g. ALC880) */
1028                 snd_hda_codec_write_cache(codec, cap_nid, 0,
1029                                           AC_VERB_SET_CONNECT_SEL,
1030                                           alive->mux_idx);
1031         }
1032
1033         /* FIXME: analog mixer */
1034 }
1035
1036 /* unsolicited event for HP jack sensing */
1037 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1038 {
1039         if (codec->vendor_id == 0x10ec0880)
1040                 res >>= 28;
1041         else
1042                 res >>= 26;
1043         switch (res) {
1044         case ALC880_HP_EVENT:
1045                 alc_automute_pin(codec);
1046                 break;
1047         case ALC880_MIC_EVENT:
1048                 alc_mic_automute(codec);
1049                 break;
1050         }
1051 }
1052
1053 static void alc_inithook(struct hda_codec *codec)
1054 {
1055         alc_automute_pin(codec);
1056         alc_mic_automute(codec);
1057 }
1058
1059 /* additional initialization for ALC888 variants */
1060 static void alc888_coef_init(struct hda_codec *codec)
1061 {
1062         unsigned int tmp;
1063
1064         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1065         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1066         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1067         if ((tmp & 0xf0) == 0x20)
1068                 /* alc888S-VC */
1069                 snd_hda_codec_read(codec, 0x20, 0,
1070                                    AC_VERB_SET_PROC_COEF, 0x830);
1071          else
1072                  /* alc888-VB */
1073                  snd_hda_codec_read(codec, 0x20, 0,
1074                                     AC_VERB_SET_PROC_COEF, 0x3030);
1075 }
1076
1077 static void alc889_coef_init(struct hda_codec *codec)
1078 {
1079         unsigned int tmp;
1080
1081         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1082         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1083         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1084         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1085 }
1086
1087 /* turn on/off EAPD control (only if available) */
1088 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
1089 {
1090         if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
1091                 return;
1092         if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
1093                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
1094                                     on ? 2 : 0);
1095 }
1096
1097 static void alc_auto_init_amp(struct hda_codec *codec, int type)
1098 {
1099         unsigned int tmp;
1100
1101         switch (type) {
1102         case ALC_INIT_GPIO1:
1103                 snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1104                 break;
1105         case ALC_INIT_GPIO2:
1106                 snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1107                 break;
1108         case ALC_INIT_GPIO3:
1109                 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1110                 break;
1111         case ALC_INIT_DEFAULT:
1112                 switch (codec->vendor_id) {
1113                 case 0x10ec0260:
1114                         set_eapd(codec, 0x0f, 1);
1115                         set_eapd(codec, 0x10, 1);
1116                         break;
1117                 case 0x10ec0262:
1118                 case 0x10ec0267:
1119                 case 0x10ec0268:
1120                 case 0x10ec0269:
1121                 case 0x10ec0270:
1122                 case 0x10ec0272:
1123                 case 0x10ec0660:
1124                 case 0x10ec0662:
1125                 case 0x10ec0663:
1126                 case 0x10ec0862:
1127                 case 0x10ec0889:
1128                         set_eapd(codec, 0x14, 1);
1129                         set_eapd(codec, 0x15, 1);
1130                         break;
1131                 }
1132                 switch (codec->vendor_id) {
1133                 case 0x10ec0260:
1134                         snd_hda_codec_write(codec, 0x1a, 0,
1135                                             AC_VERB_SET_COEF_INDEX, 7);
1136                         tmp = snd_hda_codec_read(codec, 0x1a, 0,
1137                                                  AC_VERB_GET_PROC_COEF, 0);
1138                         snd_hda_codec_write(codec, 0x1a, 0,
1139                                             AC_VERB_SET_COEF_INDEX, 7);
1140                         snd_hda_codec_write(codec, 0x1a, 0,
1141                                             AC_VERB_SET_PROC_COEF,
1142                                             tmp | 0x2010);
1143                         break;
1144                 case 0x10ec0262:
1145                 case 0x10ec0880:
1146                 case 0x10ec0882:
1147                 case 0x10ec0883:
1148                 case 0x10ec0885:
1149                 case 0x10ec0887:
1150                 case 0x10ec0889:
1151                         alc889_coef_init(codec);
1152                         break;
1153                 case 0x10ec0888:
1154                         alc888_coef_init(codec);
1155                         break;
1156 #if 0 /* XXX: This may cause the silent output on speaker on some machines */
1157                 case 0x10ec0267:
1158                 case 0x10ec0268:
1159                         snd_hda_codec_write(codec, 0x20, 0,
1160                                             AC_VERB_SET_COEF_INDEX, 7);
1161                         tmp = snd_hda_codec_read(codec, 0x20, 0,
1162                                                  AC_VERB_GET_PROC_COEF, 0);
1163                         snd_hda_codec_write(codec, 0x20, 0,
1164                                             AC_VERB_SET_COEF_INDEX, 7);
1165                         snd_hda_codec_write(codec, 0x20, 0,
1166                                             AC_VERB_SET_PROC_COEF,
1167                                             tmp | 0x3000);
1168                         break;
1169 #endif /* XXX */
1170                 }
1171                 break;
1172         }
1173 }
1174
1175 static void alc_init_auto_hp(struct hda_codec *codec)
1176 {
1177         struct alc_spec *spec = codec->spec;
1178
1179         if (!spec->autocfg.hp_pins[0])
1180                 return;
1181
1182         if (!spec->autocfg.speaker_pins[0]) {
1183                 if (spec->autocfg.line_out_pins[0] &&
1184                     spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
1185                         spec->autocfg.speaker_pins[0] =
1186                                 spec->autocfg.line_out_pins[0];
1187                 else
1188                         return;
1189         }
1190
1191         snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1192                     spec->autocfg.hp_pins[0]);
1193         snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1194                                   AC_VERB_SET_UNSOLICITED_ENABLE,
1195                                   AC_USRSP_EN | ALC880_HP_EVENT);
1196         spec->unsol_event = alc_sku_unsol_event;
1197 }
1198
1199 static void alc_init_auto_mic(struct hda_codec *codec)
1200 {
1201         struct alc_spec *spec = codec->spec;
1202         struct auto_pin_cfg *cfg = &spec->autocfg;
1203         hda_nid_t fixed, ext;
1204         int i;
1205
1206         /* there must be only two mic inputs exclusively */
1207         for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1208                 if (cfg->input_pins[i])
1209                         return;
1210
1211         fixed = ext = 0;
1212         for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1213                 hda_nid_t nid = cfg->input_pins[i];
1214                 unsigned int defcfg;
1215                 if (!nid)
1216                         return;
1217                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1218                 switch (get_defcfg_connect(defcfg)) {
1219                 case AC_JACK_PORT_FIXED:
1220                         if (fixed)
1221                                 return; /* already occupied */
1222                         fixed = nid;
1223                         break;
1224                 case AC_JACK_PORT_COMPLEX:
1225                         if (ext)
1226                                 return; /* already occupied */
1227                         ext = nid;
1228                         break;
1229                 default:
1230                         return; /* invalid entry */
1231                 }
1232         }
1233         if (!ext || !fixed)
1234                 return;
1235         if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1236                 return; /* no unsol support */
1237         snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1238                     ext, fixed);
1239         spec->ext_mic.pin = ext;
1240         spec->int_mic.pin = fixed;
1241         spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1242         spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1243         spec->auto_mic = 1;
1244         snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1245                                   AC_VERB_SET_UNSOLICITED_ENABLE,
1246                                   AC_USRSP_EN | ALC880_MIC_EVENT);
1247         spec->unsol_event = alc_sku_unsol_event;
1248 }
1249
1250 /* check subsystem ID and set up device-specific initialization;
1251  * return 1 if initialized, 0 if invalid SSID
1252  */
1253 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1254  *      31 ~ 16 :       Manufacture ID
1255  *      15 ~ 8  :       SKU ID
1256  *      7  ~ 0  :       Assembly ID
1257  *      port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1258  */
1259 static int alc_subsystem_id(struct hda_codec *codec,
1260                             hda_nid_t porta, hda_nid_t porte,
1261                             hda_nid_t portd, hda_nid_t porti)
1262 {
1263         unsigned int ass, tmp, i;
1264         unsigned nid;
1265         struct alc_spec *spec = codec->spec;
1266
1267         ass = codec->subsystem_id & 0xffff;
1268         if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1269                 goto do_sku;
1270
1271         /* invalid SSID, check the special NID pin defcfg instead */
1272         /*
1273          * 31~30        : port connectivity
1274          * 29~21        : reserve
1275          * 20           : PCBEEP input
1276          * 19~16        : Check sum (15:1)
1277          * 15~1         : Custom
1278          * 0            : override
1279         */
1280         nid = 0x1d;
1281         if (codec->vendor_id == 0x10ec0260)
1282                 nid = 0x17;
1283         ass = snd_hda_codec_get_pincfg(codec, nid);
1284         snd_printd("realtek: No valid SSID, "
1285                    "checking pincfg 0x%08x for NID 0x%x\n",
1286                    ass, nid);
1287         if (!(ass & 1))
1288                 return 0;
1289         if ((ass >> 30) != 1)   /* no physical connection */
1290                 return 0;
1291
1292         /* check sum */
1293         tmp = 0;
1294         for (i = 1; i < 16; i++) {
1295                 if ((ass >> i) & 1)
1296                         tmp++;
1297         }
1298         if (((ass >> 16) & 0xf) != tmp)
1299                 return 0;
1300 do_sku:
1301         snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1302                    ass & 0xffff, codec->vendor_id);
1303         /*
1304          * 0 : override
1305          * 1 :  Swap Jack
1306          * 2 : 0 --> Desktop, 1 --> Laptop
1307          * 3~5 : External Amplifier control
1308          * 7~6 : Reserved
1309         */
1310         tmp = (ass & 0x38) >> 3;        /* external Amp control */
1311         switch (tmp) {
1312         case 1:
1313                 spec->init_amp = ALC_INIT_GPIO1;
1314                 break;
1315         case 3:
1316                 spec->init_amp = ALC_INIT_GPIO2;
1317                 break;
1318         case 7:
1319                 spec->init_amp = ALC_INIT_GPIO3;
1320                 break;
1321         case 5:
1322                 spec->init_amp = ALC_INIT_DEFAULT;
1323                 break;
1324         }
1325
1326         /* is laptop or Desktop and enable the function "Mute internal speaker
1327          * when the external headphone out jack is plugged"
1328          */
1329         if (!(ass & 0x8000))
1330                 return 1;
1331         /*
1332          * 10~8 : Jack location
1333          * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1334          * 14~13: Resvered
1335          * 15   : 1 --> enable the function "Mute internal speaker
1336          *              when the external headphone out jack is plugged"
1337          */
1338         if (!spec->autocfg.hp_pins[0]) {
1339                 hda_nid_t nid;
1340                 tmp = (ass >> 11) & 0x3;        /* HP to chassis */
1341                 if (tmp == 0)
1342                         nid = porta;
1343                 else if (tmp == 1)
1344                         nid = porte;
1345                 else if (tmp == 2)
1346                         nid = portd;
1347                 else if (tmp == 3)
1348                         nid = porti;
1349                 else
1350                         return 1;
1351                 for (i = 0; i < spec->autocfg.line_outs; i++)
1352                         if (spec->autocfg.line_out_pins[i] == nid)
1353                                 return 1;
1354                 spec->autocfg.hp_pins[0] = nid;
1355         }
1356
1357         alc_init_auto_hp(codec);
1358         alc_init_auto_mic(codec);
1359         return 1;
1360 }
1361
1362 static void alc_ssid_check(struct hda_codec *codec,
1363                            hda_nid_t porta, hda_nid_t porte,
1364                            hda_nid_t portd, hda_nid_t porti)
1365 {
1366         if (!alc_subsystem_id(codec, porta, porte, portd, porti)) {
1367                 struct alc_spec *spec = codec->spec;
1368                 snd_printd("realtek: "
1369                            "Enable default setup for auto mode as fallback\n");
1370                 spec->init_amp = ALC_INIT_DEFAULT;
1371                 alc_init_auto_hp(codec);
1372                 alc_init_auto_mic(codec);
1373         }
1374 }
1375
1376 /*
1377  * Fix-up pin default configurations and add default verbs
1378  */
1379
1380 struct alc_pincfg {
1381         hda_nid_t nid;
1382         u32 val;
1383 };
1384
1385 struct alc_fixup {
1386         const struct alc_pincfg *pins;
1387         const struct hda_verb *verbs;
1388 };
1389
1390 static void alc_pick_fixup(struct hda_codec *codec,
1391                            const struct snd_pci_quirk *quirk,
1392                            const struct alc_fixup *fix)
1393 {
1394         const struct alc_pincfg *cfg;
1395
1396         quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1397         if (!quirk)
1398                 return;
1399
1400         fix += quirk->value;
1401         cfg = fix->pins;
1402         if (cfg) {
1403                 for (; cfg->nid; cfg++)
1404                         snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1405         }
1406         if (fix->verbs)
1407                 add_verb(codec->spec, fix->verbs);
1408 }
1409
1410 static int alc_read_coef_idx(struct hda_codec *codec,
1411                         unsigned int coef_idx)
1412 {
1413         unsigned int val;
1414         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1415                                 coef_idx);
1416         val = snd_hda_codec_read(codec, 0x20, 0,
1417                                 AC_VERB_GET_PROC_COEF, 0);
1418         return val;
1419 }
1420
1421 /*
1422  * ALC888
1423  */
1424
1425 /*
1426  * 2ch mode
1427  */
1428 static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1429 /* Mic-in jack as mic in */
1430         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1431         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1432 /* Line-in jack as Line in */
1433         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1434         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1435 /* Line-Out as Front */
1436         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1437         { } /* end */
1438 };
1439
1440 /*
1441  * 4ch mode
1442  */
1443 static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1444 /* Mic-in jack as mic in */
1445         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1446         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1447 /* Line-in jack as Surround */
1448         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1449         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1450 /* Line-Out as Front */
1451         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1452         { } /* end */
1453 };
1454
1455 /*
1456  * 6ch mode
1457  */
1458 static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1459 /* Mic-in jack as CLFE */
1460         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1461         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1462 /* Line-in jack as Surround */
1463         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1464         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1465 /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1466         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1467         { } /* end */
1468 };
1469
1470 /*
1471  * 8ch mode
1472  */
1473 static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1474 /* Mic-in jack as CLFE */
1475         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1476         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1477 /* Line-in jack as Surround */
1478         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1479         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1480 /* Line-Out as Side */
1481         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1482         { } /* end */
1483 };
1484
1485 static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1486         { 2, alc888_4ST_ch2_intel_init },
1487         { 4, alc888_4ST_ch4_intel_init },
1488         { 6, alc888_4ST_ch6_intel_init },
1489         { 8, alc888_4ST_ch8_intel_init },
1490 };
1491
1492 /*
1493  * ALC888 Fujitsu Siemens Amillo xa3530
1494  */
1495
1496 static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1497 /* Front Mic: set to PIN_IN (empty by default) */
1498         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1499 /* Connect Internal HP to Front */
1500         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1501         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1502         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1503 /* Connect Bass HP to Front */
1504         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1505         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1506         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1507 /* Connect Line-Out side jack (SPDIF) to Side */
1508         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1509         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1510         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1511 /* Connect Mic jack to CLFE */
1512         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1513         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1514         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1515 /* Connect Line-in jack to Surround */
1516         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1517         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1518         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1519 /* Connect HP out jack to Front */
1520         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1521         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1522         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1523 /* Enable unsolicited event for HP jack and Line-out jack */
1524         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1525         {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1526         {}
1527 };
1528
1529 static void alc_automute_amp(struct hda_codec *codec)
1530 {
1531         struct alc_spec *spec = codec->spec;
1532         unsigned int mute;
1533         hda_nid_t nid;
1534         int i;
1535
1536         spec->jack_present = 0;
1537         for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1538                 nid = spec->autocfg.hp_pins[i];
1539                 if (!nid)
1540                         break;
1541                 if (snd_hda_jack_detect(codec, nid)) {
1542                         spec->jack_present = 1;
1543                         break;
1544                 }
1545         }
1546
1547         mute = spec->jack_present ? HDA_AMP_MUTE : 0;
1548         /* Toggle internal speakers muting */
1549         for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1550                 nid = spec->autocfg.speaker_pins[i];
1551                 if (!nid)
1552                         break;
1553                 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1554                                          HDA_AMP_MUTE, mute);
1555         }
1556 }
1557
1558 static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1559                                          unsigned int res)
1560 {
1561         if (codec->vendor_id == 0x10ec0880)
1562                 res >>= 28;
1563         else
1564                 res >>= 26;
1565         if (res == ALC880_HP_EVENT)
1566                 alc_automute_amp(codec);
1567 }
1568
1569 static void alc889_automute_setup(struct hda_codec *codec)
1570 {
1571         struct alc_spec *spec = codec->spec;
1572
1573         spec->autocfg.hp_pins[0] = 0x15;
1574         spec->autocfg.speaker_pins[0] = 0x14;
1575         spec->autocfg.speaker_pins[1] = 0x16;
1576         spec->autocfg.speaker_pins[2] = 0x17;
1577         spec->autocfg.speaker_pins[3] = 0x19;
1578         spec->autocfg.speaker_pins[4] = 0x1a;
1579 }
1580
1581 static void alc889_intel_init_hook(struct hda_codec *codec)
1582 {
1583         alc889_coef_init(codec);
1584         alc_automute_amp(codec);
1585 }
1586
1587 static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
1588 {
1589         struct alc_spec *spec = codec->spec;
1590
1591         spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1592         spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1593         spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1594         spec->autocfg.speaker_pins[1] = 0x15; /* bass */
1595 }
1596
1597 /*
1598  * ALC888 Acer Aspire 4930G model
1599  */
1600
1601 static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1602 /* Front Mic: set to PIN_IN (empty by default) */
1603         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1604 /* Unselect Front Mic by default in input mixer 3 */
1605         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1606 /* Enable unsolicited event for HP jack */
1607         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1608 /* Connect Internal HP to front */
1609         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1610         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1611         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1612 /* Connect HP out to front */
1613         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1614         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1615         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1616         { }
1617 };
1618
1619 /*
1620  * ALC888 Acer Aspire 6530G model
1621  */
1622
1623 static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1624 /* Bias voltage on for external mic port */
1625         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
1626 /* Front Mic: set to PIN_IN (empty by default) */
1627         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1628 /* Unselect Front Mic by default in input mixer 3 */
1629         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1630 /* Enable unsolicited event for HP jack */
1631         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1632 /* Enable speaker output */
1633         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1634         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1635 /* Enable headphone output */
1636         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1637         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1638         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1639         { }
1640 };
1641
1642 /*
1643  * ALC889 Acer Aspire 8930G model
1644  */
1645
1646 static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
1647 /* Front Mic: set to PIN_IN (empty by default) */
1648         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1649 /* Unselect Front Mic by default in input mixer 3 */
1650         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1651 /* Enable unsolicited event for HP jack */
1652         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1653 /* Connect Internal Front to Front */
1654         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1655         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1656         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1657 /* Connect Internal Rear to Rear */
1658         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1659         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1660         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1661 /* Connect Internal CLFE to CLFE */
1662         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1663         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1664         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1665 /* Connect HP out to Front */
1666         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1667         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1668         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1669 /* Enable all DACs */
1670 /*  DAC DISABLE/MUTE 1? */
1671 /*  setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1672         {0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1673         {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1674 /*  DAC DISABLE/MUTE 2? */
1675 /*  some bit here disables the other DACs. Init=0x4900 */
1676         {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1677         {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1678 /* DMIC fix
1679  * This laptop has a stereo digital microphone. The mics are only 1cm apart
1680  * which makes the stereo useless. However, either the mic or the ALC889
1681  * makes the signal become a difference/sum signal instead of standard
1682  * stereo, which is annoying. So instead we flip this bit which makes the
1683  * codec replicate the sum signal to both channels, turning it into a
1684  * normal mono mic.
1685  */
1686 /*  DMIC_CONTROL? Init value = 0x0001 */
1687         {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1688         {0x20, AC_VERB_SET_PROC_COEF, 0x0003},
1689         { }
1690 };
1691
1692 static struct hda_input_mux alc888_2_capture_sources[2] = {
1693         /* Front mic only available on one ADC */
1694         {
1695                 .num_items = 4,
1696                 .items = {
1697                         { "Mic", 0x0 },
1698                         { "Line", 0x2 },
1699                         { "CD", 0x4 },
1700                         { "Front Mic", 0xb },
1701                 },
1702         },
1703         {
1704                 .num_items = 3,
1705                 .items = {
1706                         { "Mic", 0x0 },
1707                         { "Line", 0x2 },
1708                         { "CD", 0x4 },
1709                 },
1710         }
1711 };
1712
1713 static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
1714         /* Interal mic only available on one ADC */
1715         {
1716                 .num_items = 5,
1717                 .items = {
1718                         { "Ext Mic", 0x0 },
1719                         { "Line In", 0x2 },
1720                         { "CD", 0x4 },
1721                         { "Input Mix", 0xa },
1722                         { "Int Mic", 0xb },
1723                 },
1724         },
1725         {
1726                 .num_items = 4,
1727                 .items = {
1728                         { "Ext Mic", 0x0 },
1729                         { "Line In", 0x2 },
1730                         { "CD", 0x4 },
1731                         { "Input Mix", 0xa },
1732                 },
1733         }
1734 };
1735
1736 static struct hda_input_mux alc889_capture_sources[3] = {
1737         /* Digital mic only available on first "ADC" */
1738         {
1739                 .num_items = 5,
1740                 .items = {
1741                         { "Mic", 0x0 },
1742                         { "Line", 0x2 },
1743                         { "CD", 0x4 },
1744                         { "Front Mic", 0xb },
1745                         { "Input Mix", 0xa },
1746                 },
1747         },
1748         {
1749                 .num_items = 4,
1750                 .items = {
1751                         { "Mic", 0x0 },
1752                         { "Line", 0x2 },
1753                         { "CD", 0x4 },
1754                         { "Input Mix", 0xa },
1755                 },
1756         },
1757         {
1758                 .num_items = 4,
1759                 .items = {
1760                         { "Mic", 0x0 },
1761                         { "Line", 0x2 },
1762                         { "CD", 0x4 },
1763                         { "Input Mix", 0xa },
1764                 },
1765         }
1766 };
1767
1768 static struct snd_kcontrol_new alc888_base_mixer[] = {
1769         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1770         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1771         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1772         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1773         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1774                 HDA_OUTPUT),
1775         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1776         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1777         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1778         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1779         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1780         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1781         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1782         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1783         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1784         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1785         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1786         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1787         { } /* end */
1788 };
1789
1790 static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
1791         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1792         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1793         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1794         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1795         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1796                 HDA_OUTPUT),
1797         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1798         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1799         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1800         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1801         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1802         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1803         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1804         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1805         { } /* end */
1806 };
1807
1808
1809 static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
1810 {
1811         struct alc_spec *spec = codec->spec;
1812
1813         spec->autocfg.hp_pins[0] = 0x15;
1814         spec->autocfg.speaker_pins[0] = 0x14;
1815         spec->autocfg.speaker_pins[1] = 0x16;
1816         spec->autocfg.speaker_pins[2] = 0x17;
1817 }
1818
1819 static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
1820 {
1821         struct alc_spec *spec = codec->spec;
1822
1823         spec->autocfg.hp_pins[0] = 0x15;
1824         spec->autocfg.speaker_pins[0] = 0x14;
1825         spec->autocfg.speaker_pins[1] = 0x16;
1826         spec->autocfg.speaker_pins[2] = 0x17;
1827 }
1828
1829 static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
1830 {
1831         struct alc_spec *spec = codec->spec;
1832
1833         spec->autocfg.hp_pins[0] = 0x15;
1834         spec->autocfg.speaker_pins[0] = 0x14;
1835         spec->autocfg.speaker_pins[1] = 0x16;
1836         spec->autocfg.speaker_pins[2] = 0x1b;
1837 }
1838
1839 /*
1840  * ALC880 3-stack model
1841  *
1842  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
1843  * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
1844  *                 F-Mic = 0x1b, HP = 0x19
1845  */
1846
1847 static hda_nid_t alc880_dac_nids[4] = {
1848         /* front, rear, clfe, rear_surr */
1849         0x02, 0x05, 0x04, 0x03
1850 };
1851
1852 static hda_nid_t alc880_adc_nids[3] = {
1853         /* ADC0-2 */
1854         0x07, 0x08, 0x09,
1855 };
1856
1857 /* The datasheet says the node 0x07 is connected from inputs,
1858  * but it shows zero connection in the real implementation on some devices.
1859  * Note: this is a 915GAV bug, fixed on 915GLV
1860  */
1861 static hda_nid_t alc880_adc_nids_alt[2] = {
1862         /* ADC1-2 */
1863         0x08, 0x09,
1864 };
1865
1866 #define ALC880_DIGOUT_NID       0x06
1867 #define ALC880_DIGIN_NID        0x0a
1868
1869 static struct hda_input_mux alc880_capture_source = {
1870         .num_items = 4,
1871         .items = {
1872                 { "Mic", 0x0 },
1873                 { "Front Mic", 0x3 },
1874                 { "Line", 0x2 },
1875                 { "CD", 0x4 },
1876         },
1877 };
1878
1879 /* channel source setting (2/6 channel selection for 3-stack) */
1880 /* 2ch mode */
1881 static struct hda_verb alc880_threestack_ch2_init[] = {
1882         /* set line-in to input, mute it */
1883         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1884         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1885         /* set mic-in to input vref 80%, mute it */
1886         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1887         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1888         { } /* end */
1889 };
1890
1891 /* 6ch mode */
1892 static struct hda_verb alc880_threestack_ch6_init[] = {
1893         /* set line-in to output, unmute it */
1894         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1895         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1896         /* set mic-in to output, unmute it */
1897         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1898         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1899         { } /* end */
1900 };
1901
1902 static struct hda_channel_mode alc880_threestack_modes[2] = {
1903         { 2, alc880_threestack_ch2_init },
1904         { 6, alc880_threestack_ch6_init },
1905 };
1906
1907 static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
1908         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1909         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1910         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1911         HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
1912         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1913         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1914         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1915         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1916         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1917         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1918         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1919         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1920         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1921         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1922         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
1923         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
1924         HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
1925         {
1926                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1927                 .name = "Channel Mode",
1928                 .info = alc_ch_mode_info,
1929                 .get = alc_ch_mode_get,
1930                 .put = alc_ch_mode_put,
1931         },
1932         { } /* end */
1933 };
1934
1935 /* capture mixer elements */
1936 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
1937                             struct snd_ctl_elem_info *uinfo)
1938 {
1939         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1940         struct alc_spec *spec = codec->spec;
1941         int err;
1942
1943         mutex_lock(&codec->control_mutex);
1944         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1945                                                       HDA_INPUT);
1946         err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
1947         mutex_unlock(&codec->control_mutex);
1948         return err;
1949 }
1950
1951 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1952                            unsigned int size, unsigned int __user *tlv)
1953 {
1954         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1955         struct alc_spec *spec = codec->spec;
1956         int err;
1957
1958         mutex_lock(&codec->control_mutex);
1959         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1960                                                       HDA_INPUT);
1961         err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
1962         mutex_unlock(&codec->control_mutex);
1963         return err;
1964 }
1965
1966 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
1967                              struct snd_ctl_elem_value *ucontrol);
1968
1969 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
1970                                  struct snd_ctl_elem_value *ucontrol,
1971                                  getput_call_t func)
1972 {
1973         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1974         struct alc_spec *spec = codec->spec;
1975         unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1976         int err;
1977
1978         mutex_lock(&codec->control_mutex);
1979         kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
1980                                                       3, 0, HDA_INPUT);
1981         err = func(kcontrol, ucontrol);
1982         mutex_unlock(&codec->control_mutex);
1983         return err;
1984 }
1985
1986 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
1987                            struct snd_ctl_elem_value *ucontrol)
1988 {
1989         return alc_cap_getput_caller(kcontrol, ucontrol,
1990                                      snd_hda_mixer_amp_volume_get);
1991 }
1992
1993 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
1994                            struct snd_ctl_elem_value *ucontrol)
1995 {
1996         return alc_cap_getput_caller(kcontrol, ucontrol,
1997                                      snd_hda_mixer_amp_volume_put);
1998 }
1999
2000 /* capture mixer elements */
2001 #define alc_cap_sw_info         snd_ctl_boolean_stereo_info
2002
2003 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
2004                           struct snd_ctl_elem_value *ucontrol)
2005 {
2006         return alc_cap_getput_caller(kcontrol, ucontrol,
2007                                      snd_hda_mixer_amp_switch_get);
2008 }
2009
2010 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2011                           struct snd_ctl_elem_value *ucontrol)
2012 {
2013         return alc_cap_getput_caller(kcontrol, ucontrol,
2014                                      snd_hda_mixer_amp_switch_put);
2015 }
2016
2017 #define _DEFINE_CAPMIX(num) \
2018         { \
2019                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2020                 .name = "Capture Switch", \
2021                 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2022                 .count = num, \
2023                 .info = alc_cap_sw_info, \
2024                 .get = alc_cap_sw_get, \
2025                 .put = alc_cap_sw_put, \
2026         }, \
2027         { \
2028                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2029                 .name = "Capture Volume", \
2030                 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2031                            SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2032                            SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2033                 .count = num, \
2034                 .info = alc_cap_vol_info, \
2035                 .get = alc_cap_vol_get, \
2036                 .put = alc_cap_vol_put, \
2037                 .tlv = { .c = alc_cap_vol_tlv }, \
2038         }
2039
2040 #define _DEFINE_CAPSRC(num) \
2041         { \
2042                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2043                 /* .name = "Capture Source", */ \
2044                 .name = "Input Source", \
2045                 .count = num, \
2046                 .info = alc_mux_enum_info, \
2047                 .get = alc_mux_enum_get, \
2048                 .put = alc_mux_enum_put, \
2049         }
2050
2051 #define DEFINE_CAPMIX(num) \
2052 static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2053         _DEFINE_CAPMIX(num),                                  \
2054         _DEFINE_CAPSRC(num),                                  \
2055         { } /* end */                                         \
2056 }
2057
2058 #define DEFINE_CAPMIX_NOSRC(num) \
2059 static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2060         _DEFINE_CAPMIX(num),                                        \
2061         { } /* end */                                               \
2062 }
2063
2064 /* up to three ADCs */
2065 DEFINE_CAPMIX(1);
2066 DEFINE_CAPMIX(2);
2067 DEFINE_CAPMIX(3);
2068 DEFINE_CAPMIX_NOSRC(1);
2069 DEFINE_CAPMIX_NOSRC(2);
2070 DEFINE_CAPMIX_NOSRC(3);
2071
2072 /*
2073  * ALC880 5-stack model
2074  *
2075  * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2076  *      Side = 0x02 (0xd)
2077  * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2078  *                 Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2079  */
2080
2081 /* additional mixers to alc880_three_stack_mixer */
2082 static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2083         HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2084         HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2085         { } /* end */
2086 };
2087
2088 /* channel source setting (6/8 channel selection for 5-stack) */
2089 /* 6ch mode */
2090 static struct hda_verb alc880_fivestack_ch6_init[] = {
2091         /* set line-in to input, mute it */
2092         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2093         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2094         { } /* end */
2095 };
2096
2097 /* 8ch mode */
2098 static struct hda_verb alc880_fivestack_ch8_init[] = {
2099         /* set line-in to output, unmute it */
2100         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2101         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2102         { } /* end */
2103 };
2104
2105 static struct hda_channel_mode alc880_fivestack_modes[2] = {
2106         { 6, alc880_fivestack_ch6_init },
2107         { 8, alc880_fivestack_ch8_init },
2108 };
2109
2110
2111 /*
2112  * ALC880 6-stack model
2113  *
2114  * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2115  *      Side = 0x05 (0x0f)
2116  * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2117  *   Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2118  */
2119
2120 static hda_nid_t alc880_6st_dac_nids[4] = {
2121         /* front, rear, clfe, rear_surr */
2122         0x02, 0x03, 0x04, 0x05
2123 };
2124
2125 static struct hda_input_mux alc880_6stack_capture_source = {
2126         .num_items = 4,
2127         .items = {
2128                 { "Mic", 0x0 },
2129                 { "Front Mic", 0x1 },
2130                 { "Line", 0x2 },
2131                 { "CD", 0x4 },
2132         },
2133 };
2134
2135 /* fixed 8-channels */
2136 static struct hda_channel_mode alc880_sixstack_modes[1] = {
2137         { 8, NULL },
2138 };
2139
2140 static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2141         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2142         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2143         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2144         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2145         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2146         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2147         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2148         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2149         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2150         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2151         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2152         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2153         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2154         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2155         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2156         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2157         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2158         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2159         {
2160                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2161                 .name = "Channel Mode",
2162                 .info = alc_ch_mode_info,
2163                 .get = alc_ch_mode_get,
2164                 .put = alc_ch_mode_put,
2165         },
2166         { } /* end */
2167 };
2168
2169
2170 /*
2171  * ALC880 W810 model
2172  *
2173  * W810 has rear IO for:
2174  * Front (DAC 02)
2175  * Surround (DAC 03)
2176  * Center/LFE (DAC 04)
2177  * Digital out (06)
2178  *
2179  * The system also has a pair of internal speakers, and a headphone jack.
2180  * These are both connected to Line2 on the codec, hence to DAC 02.
2181  *
2182  * There is a variable resistor to control the speaker or headphone
2183  * volume. This is a hardware-only device without a software API.
2184  *
2185  * Plugging headphones in will disable the internal speakers. This is
2186  * implemented in hardware, not via the driver using jack sense. In
2187  * a similar fashion, plugging into the rear socket marked "front" will
2188  * disable both the speakers and headphones.
2189  *
2190  * For input, there's a microphone jack, and an "audio in" jack.
2191  * These may not do anything useful with this driver yet, because I
2192  * haven't setup any initialization verbs for these yet...
2193  */
2194
2195 static hda_nid_t alc880_w810_dac_nids[3] = {
2196         /* front, rear/surround, clfe */
2197         0x02, 0x03, 0x04
2198 };
2199
2200 /* fixed 6 channels */
2201 static struct hda_channel_mode alc880_w810_modes[1] = {
2202         { 6, NULL }
2203 };
2204
2205 /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2206 static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2207         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2208         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2209         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2210         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2211         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2212         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2213         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2214         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2215         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2216         { } /* end */
2217 };
2218
2219
2220 /*
2221  * Z710V model
2222  *
2223  * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
2224  * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2225  *                 Line = 0x1a
2226  */
2227
2228 static hda_nid_t alc880_z71v_dac_nids[1] = {
2229         0x02
2230 };
2231 #define ALC880_Z71V_HP_DAC      0x03
2232
2233 /* fixed 2 channels */
2234 static struct hda_channel_mode alc880_2_jack_modes[1] = {
2235         { 2, NULL }
2236 };
2237
2238 static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2239         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2240         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2241         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2242         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
2243         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2244         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2245         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2246         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2247         { } /* end */
2248 };
2249
2250
2251 /*
2252  * ALC880 F1734 model
2253  *
2254  * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2255  * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2256  */
2257
2258 static hda_nid_t alc880_f1734_dac_nids[1] = {
2259         0x03
2260 };
2261 #define ALC880_F1734_HP_DAC     0x02
2262
2263 static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2264         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2265         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2266         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2267         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2268         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2269         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2270         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2271         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2272         { } /* end */
2273 };
2274
2275 static struct hda_input_mux alc880_f1734_capture_source = {
2276         .num_items = 2,
2277         .items = {
2278                 { "Mic", 0x1 },
2279                 { "CD", 0x4 },
2280         },
2281 };
2282
2283
2284 /*
2285  * ALC880 ASUS model
2286  *
2287  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2288  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2289  *  Mic = 0x18, Line = 0x1a
2290  */
2291
2292 #define alc880_asus_dac_nids    alc880_w810_dac_nids    /* identical with w810 */
2293 #define alc880_asus_modes       alc880_threestack_modes /* 2/6 channel mode */
2294
2295 static struct snd_kcontrol_new alc880_asus_mixer[] = {
2296         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2297         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2298         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2299         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2300         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2301         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2302         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2303         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2304         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2305         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2306         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2307         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2308         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2309         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2310         {
2311                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2312                 .name = "Channel Mode",
2313                 .info = alc_ch_mode_info,
2314                 .get = alc_ch_mode_get,
2315                 .put = alc_ch_mode_put,
2316         },
2317         { } /* end */
2318 };
2319
2320 /*
2321  * ALC880 ASUS W1V model
2322  *
2323  * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2324  * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2325  *  Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2326  */
2327
2328 /* additional mixers to alc880_asus_mixer */
2329 static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2330         HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2331         HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2332         { } /* end */
2333 };
2334
2335 /* TCL S700 */
2336 static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2337         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2338         HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2339         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2340         HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2341         HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2342         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2343         HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2344         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2345         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
2346         { } /* end */
2347 };
2348
2349 /* Uniwill */
2350 static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2351         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2352         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2353         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2354         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2355         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2356         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2357         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2358         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2359         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2360         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2361         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2362         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2363         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2364         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2365         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2366         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2367         {
2368                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2369                 .name = "Channel Mode",
2370                 .info = alc_ch_mode_info,
2371                 .get = alc_ch_mode_get,
2372                 .put = alc_ch_mode_put,
2373         },
2374         { } /* end */
2375 };
2376
2377 static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2378         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2379         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2380         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2381         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2382         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2383         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2384         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2385         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2386         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2387         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2388         { } /* end */
2389 };
2390
2391 static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2392         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2393         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2394         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2395         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, 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         { } /* end */
2399 };
2400
2401 /*
2402  * virtual master controls
2403  */
2404
2405 /*
2406  * slave controls for virtual master
2407  */
2408 static const char *alc_slave_vols[] = {
2409         "Front Playback Volume",
2410         "Surround Playback Volume",
2411         "Center Playback Volume",
2412         "LFE Playback Volume",
2413         "Side Playback Volume",
2414         "Headphone Playback Volume",
2415         "Speaker Playback Volume",
2416         "Mono Playback Volume",
2417         "Line-Out Playback Volume",
2418         "PCM Playback Volume",
2419         NULL,
2420 };
2421
2422 static const char *alc_slave_sws[] = {
2423         "Front Playback Switch",
2424         "Surround Playback Switch",
2425         "Center Playback Switch",
2426         "LFE Playback Switch",
2427         "Side Playback Switch",
2428         "Headphone Playback Switch",
2429         "Speaker Playback Switch",
2430         "Mono Playback Switch",
2431         "IEC958 Playback Switch",
2432         "Line-Out Playback Switch",
2433         "PCM Playback Switch",
2434         NULL,
2435 };
2436
2437 /*
2438  * build control elements
2439  */
2440
2441 #define NID_MAPPING             (-1)
2442
2443 #define SUBDEV_SPEAKER_         (0 << 6)
2444 #define SUBDEV_HP_              (1 << 6)
2445 #define SUBDEV_LINE_            (2 << 6)
2446 #define SUBDEV_SPEAKER(x)       (SUBDEV_SPEAKER_ | ((x) & 0x3f))
2447 #define SUBDEV_HP(x)            (SUBDEV_HP_ | ((x) & 0x3f))
2448 #define SUBDEV_LINE(x)          (SUBDEV_LINE_ | ((x) & 0x3f))
2449
2450 static void alc_free_kctls(struct hda_codec *codec);
2451
2452 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2453 /* additional beep mixers; the actual parameters are overwritten at build */
2454 static struct snd_kcontrol_new alc_beep_mixer[] = {
2455         HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2456         HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
2457         { } /* end */
2458 };
2459 #endif
2460
2461 static int alc_build_controls(struct hda_codec *codec)
2462 {
2463         struct alc_spec *spec = codec->spec;
2464         struct snd_kcontrol *kctl;
2465         struct snd_kcontrol_new *knew;
2466         int i, j, err;
2467         unsigned int u;
2468         hda_nid_t nid;
2469
2470         for (i = 0; i < spec->num_mixers; i++) {
2471                 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2472                 if (err < 0)
2473                         return err;
2474         }
2475         if (spec->cap_mixer) {
2476                 err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2477                 if (err < 0)
2478                         return err;
2479         }
2480         if (spec->multiout.dig_out_nid) {
2481                 err = snd_hda_create_spdif_out_ctls(codec,
2482                                                     spec->multiout.dig_out_nid);
2483                 if (err < 0)
2484                         return err;
2485                 if (!spec->no_analog) {
2486                         err = snd_hda_create_spdif_share_sw(codec,
2487                                                             &spec->multiout);
2488                         if (err < 0)
2489                                 return err;
2490                         spec->multiout.share_spdif = 1;
2491                 }
2492         }
2493         if (spec->dig_in_nid) {
2494                 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2495                 if (err < 0)
2496                         return err;
2497         }
2498
2499 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2500         /* create beep controls if needed */
2501         if (spec->beep_amp) {
2502                 struct snd_kcontrol_new *knew;
2503                 for (knew = alc_beep_mixer; knew->name; knew++) {
2504                         struct snd_kcontrol *kctl;
2505                         kctl = snd_ctl_new1(knew, codec);
2506                         if (!kctl)
2507                                 return -ENOMEM;
2508                         kctl->private_value = spec->beep_amp;
2509                         err = snd_hda_ctl_add(codec, 0, kctl);
2510                         if (err < 0)
2511                                 return err;
2512                 }
2513         }
2514 #endif
2515
2516         /* if we have no master control, let's create it */
2517         if (!spec->no_analog &&
2518             !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
2519                 unsigned int vmaster_tlv[4];
2520                 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
2521                                         HDA_OUTPUT, vmaster_tlv);
2522                 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
2523                                           vmaster_tlv, alc_slave_vols);
2524                 if (err < 0)
2525                         return err;
2526         }
2527         if (!spec->no_analog &&
2528             !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2529                 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2530                                           NULL, alc_slave_sws);
2531                 if (err < 0)
2532                         return err;
2533         }
2534
2535         /* assign Capture Source enums to NID */
2536         kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
2537         if (!kctl)
2538                 kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
2539         for (i = 0; kctl && i < kctl->count; i++) {
2540                 hda_nid_t *nids = spec->capsrc_nids;
2541                 if (!nids)
2542                         nids = spec->adc_nids;
2543                 err = snd_hda_add_nid(codec, kctl, i, nids[i]);
2544                 if (err < 0)
2545                         return err;
2546         }
2547         if (spec->cap_mixer) {
2548                 const char *kname = kctl ? kctl->id.name : NULL;
2549                 for (knew = spec->cap_mixer; knew->name; knew++) {
2550                         if (kname && strcmp(knew->name, kname) == 0)
2551                                 continue;
2552                         kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2553                         for (i = 0; kctl && i < kctl->count; i++) {
2554                                 err = snd_hda_add_nid(codec, kctl, i,
2555                                                       spec->adc_nids[i]);
2556                                 if (err < 0)
2557                                         return err;
2558                         }
2559                 }
2560         }
2561
2562         /* other nid->control mapping */
2563         for (i = 0; i < spec->num_mixers; i++) {
2564                 for (knew = spec->mixers[i]; knew->name; knew++) {
2565                         if (knew->iface != NID_MAPPING)
2566                                 continue;
2567                         kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2568                         if (kctl == NULL)
2569                                 continue;
2570                         u = knew->subdevice;
2571                         for (j = 0; j < 4; j++, u >>= 8) {
2572                                 nid = u & 0x3f;
2573                                 if (nid == 0)
2574                                         continue;
2575                                 switch (u & 0xc0) {
2576                                 case SUBDEV_SPEAKER_:
2577                                         nid = spec->autocfg.speaker_pins[nid];
2578                                         break;
2579                                 case SUBDEV_LINE_:
2580                                         nid = spec->autocfg.line_out_pins[nid];
2581                                         break;
2582                                 case SUBDEV_HP_:
2583                                         nid = spec->autocfg.hp_pins[nid];
2584                                         break;
2585                                 default:
2586                                         continue;
2587                                 }
2588                                 err = snd_hda_add_nid(codec, kctl, 0, nid);
2589                                 if (err < 0)
2590                                         return err;
2591                         }
2592                         u = knew->private_value;
2593                         for (j = 0; j < 4; j++, u >>= 8) {
2594                                 nid = u & 0xff;
2595                                 if (nid == 0)
2596                                         continue;
2597                                 err = snd_hda_add_nid(codec, kctl, 0, nid);
2598                                 if (err < 0)
2599                                         return err;
2600                         }
2601                 }
2602         }
2603
2604         alc_free_kctls(codec); /* no longer needed */
2605
2606         return 0;
2607 }
2608
2609
2610 /*
2611  * initialize the codec volumes, etc
2612  */
2613
2614 /*
2615  * generic initialization of ADC, input mixers and output mixers
2616  */
2617 static struct hda_verb alc880_volume_init_verbs[] = {
2618         /*
2619          * Unmute ADC0-2 and set the default input to mic-in
2620          */
2621         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2622         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2623         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
2624         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2625         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
2626         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2627
2628         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2629          * mixer widget
2630          * Note: PASD motherboards uses the Line In 2 as the input for front
2631          * panel mic (mic 2)
2632          */
2633         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
2634         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2635         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2636         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2637         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2638         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2639         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2640         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2641
2642         /*
2643          * Set up output mixers (0x0c - 0x0f)
2644          */
2645         /* set vol=0 to output mixers */
2646         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2647         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2648         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2649         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2650         /* set up input amps for analog loopback */
2651         /* Amp Indices: DAC = 0, mixer = 1 */
2652         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2653         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2654         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2655         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2656         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2657         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2658         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2659         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2660
2661         { }
2662 };
2663
2664 /*
2665  * 3-stack pin configuration:
2666  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2667  */
2668 static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2669         /*
2670          * preset connection lists of input pins
2671          * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2672          */
2673         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2674         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2675         {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2676
2677         /*
2678          * Set pin mode and muting
2679          */
2680         /* set front pin widgets 0x14 for output */
2681         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2682         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2683         /* Mic1 (rear panel) pin widget for input and vref at 80% */
2684         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2685         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2686         /* Mic2 (as headphone out) for HP output */
2687         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2688         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2689         /* Line In pin widget for input */
2690         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2691         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2692         /* Line2 (as front mic) pin widget for input and vref at 80% */
2693         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2694         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2695         /* CD pin widget for input */
2696         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2697
2698         { }
2699 };
2700
2701 /*
2702  * 5-stack pin configuration:
2703  * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2704  * line-in/side = 0x1a, f-mic = 0x1b
2705  */
2706 static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2707         /*
2708          * preset connection lists of input pins
2709          * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2710          */
2711         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2712         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
2713
2714         /*
2715          * Set pin mode and muting
2716          */
2717         /* set pin widgets 0x14-0x17 for output */
2718         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2719         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2720         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2721         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2722         /* unmute pins for output (no gain on this amp) */
2723         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2724         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2725         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2726         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2727
2728         /* Mic1 (rear panel) pin widget for input and vref at 80% */
2729         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2730         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2731         /* Mic2 (as headphone out) for HP output */
2732         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2733         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2734         /* Line In pin widget for input */
2735         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2736         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2737         /* Line2 (as front mic) pin widget for input and vref at 80% */
2738         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2739         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2740         /* CD pin widget for input */
2741         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2742
2743         { }
2744 };
2745
2746 /*
2747  * W810 pin configuration:
2748  * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2749  */
2750 static struct hda_verb alc880_pin_w810_init_verbs[] = {
2751         /* hphone/speaker input selector: front DAC */
2752         {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
2753
2754         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2755         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2756         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2757         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2758         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2759         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2760
2761         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2762         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2763
2764         { }
2765 };
2766
2767 /*
2768  * Z71V pin configuration:
2769  * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2770  */
2771 static struct hda_verb alc880_pin_z71v_init_verbs[] = {
2772         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2773         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2774         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2775         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2776
2777         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2778         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2779         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2780         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2781
2782         { }
2783 };
2784
2785 /*
2786  * 6-stack pin configuration:
2787  * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2788  * f-mic = 0x19, line = 0x1a, HP = 0x1b
2789  */
2790 static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2791         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2792
2793         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2794         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2795         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2796         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2797         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2798         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2799         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2800         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2801
2802         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2803         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2804         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2805         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2806         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2807         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2808         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2809         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2810         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2811
2812         { }
2813 };
2814
2815 /*
2816  * Uniwill pin configuration:
2817  * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
2818  * line = 0x1a
2819  */
2820 static struct hda_verb alc880_uniwill_init_verbs[] = {
2821         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2822
2823         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2824         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2825         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2826         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2827         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2828         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2829         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2830         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2831         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2832         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2833         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2834         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2835         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2836         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2837
2838         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2839         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2840         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2841         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2842         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2843         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2844         /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
2845         /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
2846         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2847
2848         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2849         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
2850
2851         { }
2852 };
2853
2854 /*
2855 * Uniwill P53
2856 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
2857  */
2858 static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
2859         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2860
2861         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2862         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2863         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2864         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2865         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2866         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2867         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2868         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2869         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2870         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2871         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2872         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2873
2874         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2875         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2876         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2877         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2878         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2879         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2880
2881         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2882         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
2883
2884         { }
2885 };
2886
2887 static struct hda_verb alc880_beep_init_verbs[] = {
2888         { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
2889         { }
2890 };
2891
2892 /* auto-toggle front mic */
2893 static void alc880_uniwill_mic_automute(struct hda_codec *codec)
2894 {
2895         unsigned int present;
2896         unsigned char bits;
2897
2898         present = snd_hda_jack_detect(codec, 0x18);
2899         bits = present ? HDA_AMP_MUTE : 0;
2900         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
2901 }
2902
2903 static void alc880_uniwill_setup(struct hda_codec *codec)
2904 {
2905         struct alc_spec *spec = codec->spec;
2906
2907         spec->autocfg.hp_pins[0] = 0x14;
2908         spec->autocfg.speaker_pins[0] = 0x15;
2909         spec->autocfg.speaker_pins[0] = 0x16;
2910 }
2911
2912 static void alc880_uniwill_init_hook(struct hda_codec *codec)
2913 {
2914         alc_automute_amp(codec);
2915         alc880_uniwill_mic_automute(codec);
2916 }
2917
2918 static void alc880_uniwill_unsol_event(struct hda_codec *codec,
2919                                        unsigned int res)
2920 {
2921         /* Looks like the unsol event is incompatible with the standard
2922          * definition.  4bit tag is placed at 28 bit!
2923          */
2924         switch (res >> 28) {
2925         case ALC880_MIC_EVENT:
2926                 alc880_uniwill_mic_automute(codec);
2927                 break;
2928         default:
2929                 alc_automute_amp_unsol_event(codec, res);
2930                 break;
2931         }
2932 }
2933
2934 static void alc880_uniwill_p53_setup(struct hda_codec *codec)
2935 {
2936         struct alc_spec *spec = codec->spec;
2937
2938         spec->autocfg.hp_pins[0] = 0x14;
2939         spec->autocfg.speaker_pins[0] = 0x15;
2940 }
2941
2942 static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
2943 {
2944         unsigned int present;
2945
2946         present = snd_hda_codec_read(codec, 0x21, 0,
2947                                      AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
2948         present &= HDA_AMP_VOLMASK;
2949         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
2950                                  HDA_AMP_VOLMASK, present);
2951         snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
2952                                  HDA_AMP_VOLMASK, present);
2953 }
2954
2955 static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
2956                                            unsigned int res)
2957 {
2958         /* Looks like the unsol event is incompatible with the standard
2959          * definition.  4bit tag is placed at 28 bit!
2960          */
2961         if ((res >> 28) == ALC880_DCVOL_EVENT)
2962                 alc880_uniwill_p53_dcvol_automute(codec);
2963         else
2964                 alc_automute_amp_unsol_event(codec, res);
2965 }
2966
2967 /*
2968  * F1734 pin configuration:
2969  * HP = 0x14, speaker-out = 0x15, mic = 0x18
2970  */
2971 static struct hda_verb alc880_pin_f1734_init_verbs[] = {
2972         {0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
2973         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2974         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2975         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2976         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2977
2978         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2979         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2980         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2981         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2982
2983         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2984         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2985         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
2986         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2987         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2988         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2989         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2990         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2991         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2992
2993         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
2994         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
2995
2996         { }
2997 };
2998
2999 /*
3000  * ASUS pin configuration:
3001  * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
3002  */
3003 static struct hda_verb alc880_pin_asus_init_verbs[] = {
3004         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3005         {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3006         {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3007         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3008
3009         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3010         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3011         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3012         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3013         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3014         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3015         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3016         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3017
3018         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3019         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3020         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3021         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3022         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3023         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3024         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3025         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3026         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3027
3028         { }
3029 };
3030
3031 /* Enable GPIO mask and set output */
3032 #define alc880_gpio1_init_verbs alc_gpio1_init_verbs
3033 #define alc880_gpio2_init_verbs alc_gpio2_init_verbs
3034 #define alc880_gpio3_init_verbs alc_gpio3_init_verbs
3035
3036 /* Clevo m520g init */
3037 static struct hda_verb alc880_pin_clevo_init_verbs[] = {
3038         /* headphone output */
3039         {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3040         /* line-out */
3041         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3042         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3043         /* Line-in */
3044         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3045         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3046         /* CD */
3047         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3048         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3049         /* Mic1 (rear panel) */
3050         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3051         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3052         /* Mic2 (front panel) */
3053         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3054         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3055         /* headphone */
3056         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3057         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3058         /* change to EAPD mode */
3059         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3060         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3061
3062         { }
3063 };
3064
3065 static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
3066         /* change to EAPD mode */
3067         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3068         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3069
3070         /* Headphone output */
3071         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3072         /* Front output*/
3073         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3074         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
3075
3076         /* Line In pin widget for input */
3077         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3078         /* CD pin widget for input */
3079         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3080         /* Mic1 (rear panel) pin widget for input and vref at 80% */
3081         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3082
3083         /* change to EAPD mode */
3084         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3085         {0x20, AC_VERB_SET_PROC_COEF,  0x3070},
3086
3087         { }
3088 };
3089
3090 /*
3091  * LG m1 express dual
3092  *
3093  * Pin assignment:
3094  *   Rear Line-In/Out (blue): 0x14
3095  *   Build-in Mic-In: 0x15
3096  *   Speaker-out: 0x17
3097  *   HP-Out (green): 0x1b
3098  *   Mic-In/Out (red): 0x19
3099  *   SPDIF-Out: 0x1e
3100  */
3101
3102 /* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3103 static hda_nid_t alc880_lg_dac_nids[3] = {
3104         0x05, 0x02, 0x03
3105 };
3106
3107 /* seems analog CD is not working */
3108 static struct hda_input_mux alc880_lg_capture_source = {
3109         .num_items = 3,
3110         .items = {
3111                 { "Mic", 0x1 },
3112                 { "Line", 0x5 },
3113                 { "Internal Mic", 0x6 },
3114         },
3115 };
3116
3117 /* 2,4,6 channel modes */
3118 static struct hda_verb alc880_lg_ch2_init[] = {
3119         /* set line-in and mic-in to input */
3120         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3121         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3122         { }
3123 };
3124
3125 static struct hda_verb alc880_lg_ch4_init[] = {
3126         /* set line-in to out and mic-in to input */
3127         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3128         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3129         { }
3130 };
3131
3132 static struct hda_verb alc880_lg_ch6_init[] = {
3133         /* set line-in and mic-in to output */
3134         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3135         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3136         { }
3137 };
3138
3139 static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3140         { 2, alc880_lg_ch2_init },
3141         { 4, alc880_lg_ch4_init },
3142         { 6, alc880_lg_ch6_init },
3143 };
3144
3145 static struct snd_kcontrol_new alc880_lg_mixer[] = {
3146         HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3147         HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3148         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3149         HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3150         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3151         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3152         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3153         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3154         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3155         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3156         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3157         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3158         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3159         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3160         {
3161                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3162                 .name = "Channel Mode",
3163                 .info = alc_ch_mode_info,
3164                 .get = alc_ch_mode_get,
3165                 .put = alc_ch_mode_put,
3166         },
3167         { } /* end */
3168 };
3169
3170 static struct hda_verb alc880_lg_init_verbs[] = {
3171         /* set capture source to mic-in */
3172         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3173         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3174         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3175         /* mute all amp mixer inputs */
3176         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
3177         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3178         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3179         /* line-in to input */
3180         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3181         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3182         /* built-in mic */
3183         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3184         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3185         /* speaker-out */
3186         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3187         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3188         /* mic-in to input */
3189         {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3190         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3191         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3192         /* HP-out */
3193         {0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3194         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3195         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3196         /* jack sense */
3197         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3198         { }
3199 };
3200
3201 /* toggle speaker-output according to the hp-jack state */
3202 static void alc880_lg_setup(struct hda_codec *codec)
3203 {
3204         struct alc_spec *spec = codec->spec;
3205
3206         spec->autocfg.hp_pins[0] = 0x1b;
3207         spec->autocfg.speaker_pins[0] = 0x17;
3208 }
3209
3210 /*
3211  * LG LW20
3212  *
3213  * Pin assignment:
3214  *   Speaker-out: 0x14
3215  *   Mic-In: 0x18
3216  *   Built-in Mic-In: 0x19
3217  *   Line-In: 0x1b
3218  *   HP-Out: 0x1a
3219  *   SPDIF-Out: 0x1e
3220  */
3221
3222 static struct hda_input_mux alc880_lg_lw_capture_source = {
3223         .num_items = 3,
3224         .items = {
3225                 { "Mic", 0x0 },
3226                 { "Internal Mic", 0x1 },
3227                 { "Line In", 0x2 },
3228         },
3229 };
3230
3231 #define alc880_lg_lw_modes alc880_threestack_modes
3232
3233 static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3234         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3235         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3236         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3237         HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3238         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3239         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3240         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3241         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3242         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3243         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
3244         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3245         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3246         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3247         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
3248         {
3249                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3250                 .name = "Channel Mode",
3251                 .info = alc_ch_mode_info,
3252                 .get = alc_ch_mode_get,
3253                 .put = alc_ch_mode_put,
3254         },
3255         { } /* end */
3256 };
3257
3258 static struct hda_verb alc880_lg_lw_init_verbs[] = {
3259         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3260         {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3261         {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3262
3263         /* set capture source to mic-in */
3264         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3265         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3266         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3267         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3268         /* speaker-out */
3269         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3270         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3271         /* HP-out */
3272         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3273         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3274         /* mic-in to input */
3275         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3276         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3277         /* built-in mic */
3278         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3279         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3280         /* jack sense */
3281         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3282         { }
3283 };
3284
3285 /* toggle speaker-output according to the hp-jack state */
3286 static void alc880_lg_lw_setup(struct hda_codec *codec)
3287 {
3288         struct alc_spec *spec = codec->spec;
3289
3290         spec->autocfg.hp_pins[0] = 0x1b;
3291         spec->autocfg.speaker_pins[0] = 0x14;
3292 }
3293
3294 static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3295         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3296         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3297         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3298         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3299         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3300         HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3301         { } /* end */
3302 };
3303
3304 static struct hda_input_mux alc880_medion_rim_capture_source = {
3305         .num_items = 2,
3306         .items = {
3307                 { "Mic", 0x0 },
3308                 { "Internal Mic", 0x1 },
3309         },
3310 };
3311
3312 static struct hda_verb alc880_medion_rim_init_verbs[] = {
3313         {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3314
3315         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3316         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3317
3318         /* Mic1 (rear panel) pin widget for input and vref at 80% */
3319         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3320         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3321         /* Mic2 (as headphone out) for HP output */
3322         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3323         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3324         /* Internal Speaker */
3325         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3326         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3327
3328         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3329         {0x20, AC_VERB_SET_PROC_COEF,  0x3060},
3330
3331         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3332         { }
3333 };
3334
3335 /* toggle speaker-output according to the hp-jack state */
3336 static void alc880_medion_rim_automute(struct hda_codec *codec)
3337 {
3338         struct alc_spec *spec = codec->spec;
3339         alc_automute_amp(codec);
3340         /* toggle EAPD */
3341         if (spec->jack_present)
3342                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3343         else
3344                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3345 }
3346
3347 static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3348                                           unsigned int res)
3349 {
3350         /* Looks like the unsol event is incompatible with the standard
3351          * definition.  4bit tag is placed at 28 bit!
3352          */
3353         if ((res >> 28) == ALC880_HP_EVENT)
3354                 alc880_medion_rim_automute(codec);
3355 }
3356
3357 static void alc880_medion_rim_setup(struct hda_codec *codec)
3358 {
3359         struct alc_spec *spec = codec->spec;
3360
3361         spec->autocfg.hp_pins[0] = 0x14;
3362         spec->autocfg.speaker_pins[0] = 0x1b;
3363 }
3364
3365 #ifdef CONFIG_SND_HDA_POWER_SAVE
3366 static struct hda_amp_list alc880_loopbacks[] = {
3367         { 0x0b, HDA_INPUT, 0 },
3368         { 0x0b, HDA_INPUT, 1 },
3369         { 0x0b, HDA_INPUT, 2 },
3370         { 0x0b, HDA_INPUT, 3 },
3371         { 0x0b, HDA_INPUT, 4 },
3372         { } /* end */
3373 };
3374
3375 static struct hda_amp_list alc880_lg_loopbacks[] = {
3376         { 0x0b, HDA_INPUT, 1 },
3377         { 0x0b, HDA_INPUT, 6 },
3378         { 0x0b, HDA_INPUT, 7 },
3379         { } /* end */
3380 };
3381 #endif
3382
3383 /*
3384  * Common callbacks
3385  */
3386
3387 static int alc_init(struct hda_codec *codec)
3388 {
3389         struct alc_spec *spec = codec->spec;
3390         unsigned int i;
3391
3392         alc_fix_pll(codec);
3393         alc_auto_init_amp(codec, spec->init_amp);
3394
3395         for (i = 0; i < spec->num_init_verbs; i++)
3396                 snd_hda_sequence_write(codec, spec->init_verbs[i]);
3397
3398         if (spec->init_hook)
3399                 spec->init_hook(codec);
3400
3401         return 0;
3402 }
3403
3404 static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3405 {
3406         struct alc_spec *spec = codec->spec;
3407
3408         if (spec->unsol_event)
3409                 spec->unsol_event(codec, res);
3410 }
3411
3412 #ifdef CONFIG_SND_HDA_POWER_SAVE
3413 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3414 {
3415         struct alc_spec *spec = codec->spec;
3416         return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3417 }
3418 #endif
3419
3420 /*
3421  * Analog playback callbacks
3422  */
3423 static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3424                                     struct hda_codec *codec,
3425                                     struct snd_pcm_substream *substream)
3426 {
3427         struct alc_spec *spec = codec->spec;
3428         return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3429                                              hinfo);
3430 }
3431
3432 static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3433                                        struct hda_codec *codec,
3434                                        unsigned int stream_tag,
3435                                        unsigned int format,
3436                                        struct snd_pcm_substream *substream)
3437 {
3438         struct alc_spec *spec = codec->spec;
3439         return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3440                                                 stream_tag, format, substream);
3441 }
3442
3443 static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3444                                        struct hda_codec *codec,
3445                                        struct snd_pcm_substream *substream)
3446 {
3447         struct alc_spec *spec = codec->spec;
3448         return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3449 }
3450
3451 /*
3452  * Digital out
3453  */
3454 static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3455                                         struct hda_codec *codec,
3456                                         struct snd_pcm_substream *substream)
3457 {
3458         struct alc_spec *spec = codec->spec;
3459         return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3460 }
3461
3462 static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3463                                            struct hda_codec *codec,
3464                                            unsigned int stream_tag,
3465                                            unsigned int format,
3466                                            struct snd_pcm_substream *substream)
3467 {
3468         struct alc_spec *spec = codec->spec;
3469         return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3470                                              stream_tag, format, substream);
3471 }
3472
3473 static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3474                                            struct hda_codec *codec,
3475                                            struct snd_pcm_substream *substream)
3476 {
3477         struct alc_spec *spec = codec->spec;
3478         return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3479 }
3480
3481 static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3482                                          struct hda_codec *codec,
3483                                          struct snd_pcm_substream *substream)
3484 {
3485         struct alc_spec *spec = codec->spec;
3486         return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3487 }
3488
3489 /*
3490  * Analog capture
3491  */
3492 static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3493                                       struct hda_codec *codec,
3494                                       unsigned int stream_tag,
3495                                       unsigned int format,
3496                                       struct snd_pcm_substream *substream)
3497 {
3498         struct alc_spec *spec = codec->spec;
3499
3500         snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3501                                    stream_tag, 0, format);
3502         return 0;
3503 }
3504
3505 static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3506                                       struct hda_codec *codec,
3507                                       struct snd_pcm_substream *substream)
3508 {
3509         struct alc_spec *spec = codec->spec;
3510
3511         snd_hda_codec_cleanup_stream(codec,
3512                                      spec->adc_nids[substream->number + 1]);
3513         return 0;
3514 }
3515
3516
3517 /*
3518  */
3519 static struct hda_pcm_stream alc880_pcm_analog_playback = {
3520         .substreams = 1,
3521         .channels_min = 2,
3522         .channels_max = 8,
3523         /* NID is set in alc_build_pcms */
3524         .ops = {
3525                 .open = alc880_playback_pcm_open,
3526                 .prepare = alc880_playback_pcm_prepare,
3527                 .cleanup = alc880_playback_pcm_cleanup
3528         },
3529 };
3530
3531 static struct hda_pcm_stream alc880_pcm_analog_capture = {
3532         .substreams = 1,
3533         .channels_min = 2,
3534         .channels_max = 2,
3535         /* NID is set in alc_build_pcms */
3536 };
3537
3538 static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3539         .substreams = 1,
3540         .channels_min = 2,
3541         .channels_max = 2,
3542         /* NID is set in alc_build_pcms */
3543 };
3544
3545 static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3546         .substreams = 2, /* can be overridden */
3547         .channels_min = 2,
3548         .channels_max = 2,
3549         /* NID is set in alc_build_pcms */
3550         .ops = {
3551                 .prepare = alc880_alt_capture_pcm_prepare,
3552                 .cleanup = alc880_alt_capture_pcm_cleanup
3553         },
3554 };
3555
3556 static struct hda_pcm_stream alc880_pcm_digital_playback = {
3557         .substreams = 1,
3558         .channels_min = 2,
3559         .channels_max = 2,
3560         /* NID is set in alc_build_pcms */
3561         .ops = {
3562                 .open = alc880_dig_playback_pcm_open,
3563                 .close = alc880_dig_playback_pcm_close,
3564                 .prepare = alc880_dig_playback_pcm_prepare,
3565                 .cleanup = alc880_dig_playback_pcm_cleanup
3566         },
3567 };
3568
3569 static struct hda_pcm_stream alc880_pcm_digital_capture = {
3570         .substreams = 1,
3571         .channels_min = 2,
3572         .channels_max = 2,
3573         /* NID is set in alc_build_pcms */
3574 };
3575
3576 /* Used by alc_build_pcms to flag that a PCM has no playback stream */
3577 static struct hda_pcm_stream alc_pcm_null_stream = {
3578         .substreams = 0,
3579         .channels_min = 0,
3580         .channels_max = 0,
3581 };
3582
3583 static int alc_build_pcms(struct hda_codec *codec)
3584 {
3585         struct alc_spec *spec = codec->spec;
3586         struct hda_pcm *info = spec->pcm_rec;
3587         int i;
3588
3589         codec->num_pcms = 1;
3590         codec->pcm_info = info;
3591
3592         if (spec->no_analog)
3593                 goto skip_analog;
3594
3595         snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3596                  "%s Analog", codec->chip_name);
3597         info->name = spec->stream_name_analog;
3598
3599         if (spec->stream_analog_playback) {
3600                 if (snd_BUG_ON(!spec->multiout.dac_nids))
3601                         return -EINVAL;
3602                 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3603                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3604         }
3605         if (spec->stream_analog_capture) {
3606                 if (snd_BUG_ON(!spec->adc_nids))
3607                         return -EINVAL;
3608                 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3609                 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3610         }
3611
3612         if (spec->channel_mode) {
3613                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3614                 for (i = 0; i < spec->num_channel_mode; i++) {
3615                         if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3616                                 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3617                         }
3618                 }
3619         }
3620
3621  skip_analog:
3622         /* SPDIF for stream index #1 */
3623         if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3624                 snprintf(spec->stream_name_digital,
3625                          sizeof(spec->stream_name_digital),
3626                          "%s Digital", codec->chip_name);
3627                 codec->num_pcms = 2;
3628                 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3629                 info = spec->pcm_rec + 1;
3630                 info->name = spec->stream_name_digital;
3631                 if (spec->dig_out_type)
3632                         info->pcm_type = spec->dig_out_type;
3633                 else
3634                         info->pcm_type = HDA_PCM_TYPE_SPDIF;
3635                 if (spec->multiout.dig_out_nid &&
3636                     spec->stream_digital_playback) {
3637                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3638                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3639                 }
3640                 if (spec->dig_in_nid &&
3641                     spec->stream_digital_capture) {
3642                         info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3643                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3644                 }
3645                 /* FIXME: do we need this for all Realtek codec models? */
3646                 codec->spdif_status_reset = 1;
3647         }
3648
3649         if (spec->no_analog)
3650                 return 0;
3651
3652         /* If the use of more than one ADC is requested for the current
3653          * model, configure a second analog capture-only PCM.
3654          */
3655         /* Additional Analaog capture for index #2 */
3656         if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3657             (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
3658                 codec->num_pcms = 3;
3659                 info = spec->pcm_rec + 2;
3660                 info->name = spec->stream_name_analog;
3661                 if (spec->alt_dac_nid) {
3662                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3663                                 *spec->stream_analog_alt_playback;
3664                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3665                                 spec->alt_dac_nid;
3666                 } else {
3667                         info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3668                                 alc_pcm_null_stream;
3669                         info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3670                 }
3671                 if (spec->num_adc_nids > 1) {
3672                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3673                                 *spec->stream_analog_alt_capture;
3674                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3675                                 spec->adc_nids[1];
3676                         info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3677                                 spec->num_adc_nids - 1;
3678                 } else {
3679                         info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3680                                 alc_pcm_null_stream;
3681                         info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3682                 }
3683         }
3684
3685         return 0;
3686 }
3687
3688 static inline void alc_shutup(struct hda_codec *codec)
3689 {
3690         snd_hda_shutup_pins(codec);
3691 }
3692
3693 static void alc_free_kctls(struct hda_codec *codec)
3694 {
3695         struct alc_spec *spec = codec->spec;
3696
3697         if (spec->kctls.list) {
3698                 struct snd_kcontrol_new *kctl = spec->kctls.list;
3699                 int i;
3700                 for (i = 0; i < spec->kctls.used; i++)
3701                         kfree(kctl[i].name);
3702         }
3703         snd_array_free(&spec->kctls);
3704 }
3705
3706 static void alc_free(struct hda_codec *codec)
3707 {
3708         struct alc_spec *spec = codec->spec;
3709
3710         if (!spec)
3711                 return;
3712
3713         alc_shutup(codec);
3714         alc_free_kctls(codec);
3715         kfree(spec);
3716         snd_hda_detach_beep_device(codec);
3717 }
3718
3719 #ifdef CONFIG_SND_HDA_POWER_SAVE
3720 static void alc_power_eapd(struct hda_codec *codec)
3721 {
3722         /* We currently only handle front, HP */
3723         switch (codec->vendor_id) {
3724         case 0x10ec0260:
3725                 set_eapd(codec, 0x0f, 0);
3726                 set_eapd(codec, 0x10, 0);
3727                 break;
3728         case 0x10ec0262:
3729         case 0x10ec0267:
3730         case 0x10ec0268:
3731         case 0x10ec0269:
3732         case 0x10ec0270:
3733         case 0x10ec0272:
3734         case 0x10ec0660:
3735         case 0x10ec0662:
3736         case 0x10ec0663:
3737         case 0x10ec0862:
3738         case 0x10ec0889:
3739                 set_eapd(codec, 0x14, 0);
3740                 set_eapd(codec, 0x15, 0);
3741                 break;
3742         }
3743 }
3744
3745 static int alc_suspend(struct hda_codec *codec, pm_message_t state)
3746 {
3747         struct alc_spec *spec = codec->spec;
3748         alc_shutup(codec);
3749         if (spec && spec->power_hook)
3750                 spec->power_hook(codec);
3751         return 0;
3752 }
3753 #endif
3754
3755 #ifdef SND_HDA_NEEDS_RESUME
3756 static int alc_resume(struct hda_codec *codec)
3757 {
3758         codec->patch_ops.init(codec);
3759         snd_hda_codec_resume_amp(codec);
3760         snd_hda_codec_resume_cache(codec);
3761         return 0;
3762 }
3763 #endif
3764
3765 /*
3766  */
3767 static struct hda_codec_ops alc_patch_ops = {
3768         .build_controls = alc_build_controls,
3769         .build_pcms = alc_build_pcms,
3770         .init = alc_init,
3771         .free = alc_free,
3772         .unsol_event = alc_unsol_event,
3773 #ifdef SND_HDA_NEEDS_RESUME
3774         .resume = alc_resume,
3775 #endif
3776 #ifdef CONFIG_SND_HDA_POWER_SAVE
3777         .suspend = alc_suspend,
3778         .check_power_status = alc_check_power_status,
3779 #endif
3780         .reboot_notify = alc_shutup,
3781 };
3782
3783
3784 /*
3785  * Test configuration for debugging
3786  *
3787  * Almost all inputs/outputs are enabled.  I/O pins can be configured via
3788  * enum controls.
3789  */
3790 #ifdef CONFIG_SND_DEBUG
3791 static hda_nid_t alc880_test_dac_nids[4] = {
3792         0x02, 0x03, 0x04, 0x05
3793 };
3794
3795 static struct hda_input_mux alc880_test_capture_source = {
3796         .num_items = 7,
3797         .items = {
3798                 { "In-1", 0x0 },
3799                 { "In-2", 0x1 },
3800                 { "In-3", 0x2 },
3801                 { "In-4", 0x3 },
3802                 { "CD", 0x4 },
3803                 { "Front", 0x5 },
3804                 { "Surround", 0x6 },
3805         },
3806 };
3807
3808 static struct hda_channel_mode alc880_test_modes[4] = {
3809         { 2, NULL },
3810         { 4, NULL },
3811         { 6, NULL },
3812         { 8, NULL },
3813 };
3814
3815 static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
3816                                  struct snd_ctl_elem_info *uinfo)
3817 {
3818         static char *texts[] = {
3819                 "N/A", "Line Out", "HP Out",
3820                 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
3821         };
3822         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3823         uinfo->count = 1;
3824         uinfo->value.enumerated.items = 8;
3825         if (uinfo->value.enumerated.item >= 8)
3826                 uinfo->value.enumerated.item = 7;
3827         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3828         return 0;
3829 }
3830
3831 static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
3832                                 struct snd_ctl_elem_value *ucontrol)
3833 {
3834         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3835         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3836         unsigned int pin_ctl, item = 0;
3837
3838         pin_ctl = snd_hda_codec_read(codec, nid, 0,
3839                                      AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3840         if (pin_ctl & AC_PINCTL_OUT_EN) {
3841                 if (pin_ctl & AC_PINCTL_HP_EN)
3842                         item = 2;
3843                 else
3844                         item = 1;
3845         } else if (pin_ctl & AC_PINCTL_IN_EN) {
3846                 switch (pin_ctl & AC_PINCTL_VREFEN) {
3847                 case AC_PINCTL_VREF_HIZ: item = 3; break;
3848                 case AC_PINCTL_VREF_50:  item = 4; break;
3849                 case AC_PINCTL_VREF_GRD: item = 5; break;
3850                 case AC_PINCTL_VREF_80:  item = 6; break;
3851                 case AC_PINCTL_VREF_100: item = 7; break;
3852                 }
3853         }
3854         ucontrol->value.enumerated.item[0] = item;
3855         return 0;
3856 }
3857
3858 static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
3859                                 struct snd_ctl_elem_value *ucontrol)
3860 {
3861         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3862         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3863         static unsigned int ctls[] = {
3864                 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
3865                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
3866                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
3867                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
3868                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
3869                 AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
3870         };
3871         unsigned int old_ctl, new_ctl;
3872
3873         old_ctl = snd_hda_codec_read(codec, nid, 0,
3874                                      AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3875         new_ctl = ctls[ucontrol->value.enumerated.item[0]];
3876         if (old_ctl != new_ctl) {
3877                 int val;
3878                 snd_hda_codec_write_cache(codec, nid, 0,
3879                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
3880                                           new_ctl);
3881                 val = ucontrol->value.enumerated.item[0] >= 3 ?
3882                         HDA_AMP_MUTE : 0;
3883                 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3884                                          HDA_AMP_MUTE, val);
3885                 return 1;
3886         }
3887         return 0;
3888 }
3889
3890 static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
3891                                  struct snd_ctl_elem_info *uinfo)
3892 {
3893         static char *texts[] = {
3894                 "Front", "Surround", "CLFE", "Side"
3895         };
3896         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3897         uinfo->count = 1;
3898         uinfo->value.enumerated.items = 4;
3899         if (uinfo->value.enumerated.item >= 4)
3900                 uinfo->value.enumerated.item = 3;
3901         strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3902         return 0;
3903 }
3904
3905 static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
3906                                 struct snd_ctl_elem_value *ucontrol)
3907 {
3908         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3909         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3910         unsigned int sel;
3911
3912         sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
3913         ucontrol->value.enumerated.item[0] = sel & 3;
3914         return 0;
3915 }
3916
3917 static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
3918                                 struct snd_ctl_elem_value *ucontrol)
3919 {
3920         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3921         hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3922         unsigned int sel;
3923
3924         sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
3925         if (ucontrol->value.enumerated.item[0] != sel) {
3926                 sel = ucontrol->value.enumerated.item[0] & 3;
3927                 snd_hda_codec_write_cache(codec, nid, 0,
3928                                           AC_VERB_SET_CONNECT_SEL, sel);
3929                 return 1;
3930         }
3931         return 0;
3932 }
3933
3934 #define PIN_CTL_TEST(xname,nid) {                       \
3935                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,    \
3936                         .name = xname,                 \
3937                         .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
3938                         .info = alc_test_pin_ctl_info, \
3939                         .get = alc_test_pin_ctl_get,   \
3940                         .put = alc_test_pin_ctl_put,   \
3941                         .private_value = nid           \
3942                         }
3943
3944 #define PIN_SRC_TEST(xname,nid) {                       \
3945                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,    \
3946                         .name = xname,                 \
3947                         .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
3948                         .info = alc_test_pin_src_info, \
3949                         .get = alc_test_pin_src_get,   \
3950                         .put = alc_test_pin_src_put,   \
3951                         .private_value = nid           \
3952                         }
3953
3954 static struct snd_kcontrol_new alc880_test_mixer[] = {
3955         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3956         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
3957         HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
3958         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3959         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3960         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
3961         HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
3962         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
3963         PIN_CTL_TEST("Front Pin Mode", 0x14),
3964         PIN_CTL_TEST("Surround Pin Mode", 0x15),
3965         PIN_CTL_TEST("CLFE Pin Mode", 0x16),
3966         PIN_CTL_TEST("Side Pin Mode", 0x17),
3967         PIN_CTL_TEST("In-1 Pin Mode", 0x18),
3968         PIN_CTL_TEST("In-2 Pin Mode", 0x19),
3969         PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
3970         PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
3971         PIN_SRC_TEST("In-1 Pin Source", 0x18),
3972         PIN_SRC_TEST("In-2 Pin Source", 0x19),
3973         PIN_SRC_TEST("In-3 Pin Source", 0x1a),
3974         PIN_SRC_TEST("In-4 Pin Source", 0x1b),
3975         HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
3976         HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
3977         HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
3978         HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
3979         HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
3980         HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
3981         HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
3982         HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
3983         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
3984         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
3985         {
3986                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3987                 .name = "Channel Mode",
3988                 .info = alc_ch_mode_info,
3989                 .get = alc_ch_mode_get,
3990                 .put = alc_ch_mode_put,
3991         },
3992         { } /* end */
3993 };
3994
3995 static struct hda_verb alc880_test_init_verbs[] = {
3996         /* Unmute inputs of 0x0c - 0x0f */
3997         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3998         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3999         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4000         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4001         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4002         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4003         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4004         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4005         /* Vol output for 0x0c-0x0f */
4006         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4007         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4008         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4009         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4010         /* Set output pins 0x14-0x17 */
4011         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4012         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4013         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4014         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4015         /* Unmute output pins 0x14-0x17 */
4016         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4017         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4018         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4019         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4020         /* Set input pins 0x18-0x1c */
4021         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4022         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4023         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4024         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4025         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4026         /* Mute input pins 0x18-0x1b */
4027         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4028         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4029         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4030         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4031         /* ADC set up */
4032         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4033         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
4034         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4035         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
4036         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4037         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
4038         /* Analog input/passthru */
4039         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4040         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4041         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4042         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4043         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4044         { }
4045 };
4046 #endif
4047
4048 /*
4049  */
4050
4051 static const char *alc880_models[ALC880_MODEL_LAST] = {
4052         [ALC880_3ST]            = "3stack",
4053         [ALC880_TCL_S700]       = "tcl",
4054         [ALC880_3ST_DIG]        = "3stack-digout",
4055         [ALC880_CLEVO]          = "clevo",
4056         [ALC880_5ST]            = "5stack",
4057         [ALC880_5ST_DIG]        = "5stack-digout",
4058         [ALC880_W810]           = "w810",
4059         [ALC880_Z71V]           = "z71v",
4060         [ALC880_6ST]            = "6stack",
4061         [ALC880_6ST_DIG]        = "6stack-digout",
4062         [ALC880_ASUS]           = "asus",
4063         [ALC880_ASUS_W1V]       = "asus-w1v",
4064         [ALC880_ASUS_DIG]       = "asus-dig",
4065         [ALC880_ASUS_DIG2]      = "asus-dig2",
4066         [ALC880_UNIWILL_DIG]    = "uniwill",
4067         [ALC880_UNIWILL_P53]    = "uniwill-p53",
4068         [ALC880_FUJITSU]        = "fujitsu",
4069         [ALC880_F1734]          = "F1734",
4070         [ALC880_LG]             = "lg",
4071         [ALC880_LG_LW]          = "lg-lw",
4072         [ALC880_MEDION_RIM]     = "medion",
4073 #ifdef CONFIG_SND_DEBUG
4074         [ALC880_TEST]           = "test",
4075 #endif
4076         [ALC880_AUTO]           = "auto",
4077 };
4078
4079 static struct snd_pci_quirk alc880_cfg_tbl[] = {
4080         SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
4081         SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
4082         SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
4083         SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
4084         SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
4085         SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
4086         SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
4087         SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
4088         SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
4089         SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
4090         SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
4091         SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
4092         SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
4093         SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
4094         SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
4095         SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
4096         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
4097         SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
4098         /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
4099         SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
4100         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
4101         SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
4102         SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
4103         SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
4104         SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
4105         SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
4106         SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
4107         SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
4108         SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
4109         SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
4110         SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
4111         SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
4112         SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
4113         SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
4114         SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
4115         SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
4116         SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
4117         SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
4118         SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
4119         SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
4120         SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
4121         SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
4122         SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
4123         SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
4124         SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
4125         SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
4126         SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
4127         SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
4128         SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
4129         SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL),
4130         SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
4131         SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
4132         SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
4133         SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
4134         SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
4135         SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
4136         SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
4137         SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
4138         SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
4139         SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
4140         SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
4141         SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
4142         SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
4143         SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
4144         SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
4145         SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
4146         SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
4147         SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
4148         /* default Intel */
4149         SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
4150         SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
4151         SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
4152         {}
4153 };
4154
4155 /*
4156  * ALC880 codec presets
4157  */
4158 static struct alc_config_preset alc880_presets[] = {
4159         [ALC880_3ST] = {
4160                 .mixers = { alc880_three_stack_mixer },
4161                 .init_verbs = { alc880_volume_init_verbs,
4162                                 alc880_pin_3stack_init_verbs },
4163                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4164                 .dac_nids = alc880_dac_nids,
4165                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4166                 .channel_mode = alc880_threestack_modes,
4167                 .need_dac_fix = 1,
4168                 .input_mux = &alc880_capture_source,
4169         },
4170         [ALC880_3ST_DIG] = {
4171                 .mixers = { alc880_three_stack_mixer },
4172                 .init_verbs = { alc880_volume_init_verbs,
4173                                 alc880_pin_3stack_init_verbs },
4174                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4175                 .dac_nids = alc880_dac_nids,
4176                 .dig_out_nid = ALC880_DIGOUT_NID,
4177                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4178                 .channel_mode = alc880_threestack_modes,
4179                 .need_dac_fix = 1,
4180                 .input_mux = &alc880_capture_source,
4181         },
4182         [ALC880_TCL_S700] = {
4183                 .mixers = { alc880_tcl_s700_mixer },
4184                 .init_verbs = { alc880_volume_init_verbs,
4185                                 alc880_pin_tcl_S700_init_verbs,
4186                                 alc880_gpio2_init_verbs },
4187                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4188                 .dac_nids = alc880_dac_nids,
4189                 .adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4190                 .num_adc_nids = 1, /* single ADC */
4191                 .hp_nid = 0x03,
4192                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4193                 .channel_mode = alc880_2_jack_modes,
4194                 .input_mux = &alc880_capture_source,
4195         },
4196         [ALC880_5ST] = {
4197                 .mixers = { alc880_three_stack_mixer,
4198                             alc880_five_stack_mixer},
4199                 .init_verbs = { alc880_volume_init_verbs,
4200                                 alc880_pin_5stack_init_verbs },
4201                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4202                 .dac_nids = alc880_dac_nids,
4203                 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4204                 .channel_mode = alc880_fivestack_modes,
4205                 .input_mux = &alc880_capture_source,
4206         },
4207         [ALC880_5ST_DIG] = {
4208                 .mixers = { alc880_three_stack_mixer,
4209                             alc880_five_stack_mixer },
4210                 .init_verbs = { alc880_volume_init_verbs,
4211                                 alc880_pin_5stack_init_verbs },
4212                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4213                 .dac_nids = alc880_dac_nids,
4214                 .dig_out_nid = ALC880_DIGOUT_NID,
4215                 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4216                 .channel_mode = alc880_fivestack_modes,
4217                 .input_mux = &alc880_capture_source,
4218         },
4219         [ALC880_6ST] = {
4220                 .mixers = { alc880_six_stack_mixer },
4221                 .init_verbs = { alc880_volume_init_verbs,
4222                                 alc880_pin_6stack_init_verbs },
4223                 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4224                 .dac_nids = alc880_6st_dac_nids,
4225                 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4226                 .channel_mode = alc880_sixstack_modes,
4227                 .input_mux = &alc880_6stack_capture_source,
4228         },
4229         [ALC880_6ST_DIG] = {
4230                 .mixers = { alc880_six_stack_mixer },
4231                 .init_verbs = { alc880_volume_init_verbs,
4232                                 alc880_pin_6stack_init_verbs },
4233                 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4234                 .dac_nids = alc880_6st_dac_nids,
4235                 .dig_out_nid = ALC880_DIGOUT_NID,
4236                 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4237                 .channel_mode = alc880_sixstack_modes,
4238                 .input_mux = &alc880_6stack_capture_source,
4239         },
4240         [ALC880_W810] = {
4241                 .mixers = { alc880_w810_base_mixer },
4242                 .init_verbs = { alc880_volume_init_verbs,
4243                                 alc880_pin_w810_init_verbs,
4244                                 alc880_gpio2_init_verbs },
4245                 .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4246                 .dac_nids = alc880_w810_dac_nids,
4247                 .dig_out_nid = ALC880_DIGOUT_NID,
4248                 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4249                 .channel_mode = alc880_w810_modes,
4250                 .input_mux = &alc880_capture_source,
4251         },
4252         [ALC880_Z71V] = {
4253                 .mixers = { alc880_z71v_mixer },
4254                 .init_verbs = { alc880_volume_init_verbs,
4255                                 alc880_pin_z71v_init_verbs },
4256                 .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4257                 .dac_nids = alc880_z71v_dac_nids,
4258                 .dig_out_nid = ALC880_DIGOUT_NID,
4259                 .hp_nid = 0x03,
4260                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4261                 .channel_mode = alc880_2_jack_modes,
4262                 .input_mux = &alc880_capture_source,
4263         },
4264         [ALC880_F1734] = {
4265                 .mixers = { alc880_f1734_mixer },
4266                 .init_verbs = { alc880_volume_init_verbs,
4267                                 alc880_pin_f1734_init_verbs },
4268                 .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4269                 .dac_nids = alc880_f1734_dac_nids,
4270                 .hp_nid = 0x02,
4271                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4272                 .channel_mode = alc880_2_jack_modes,
4273                 .input_mux = &alc880_f1734_capture_source,
4274                 .unsol_event = alc880_uniwill_p53_unsol_event,
4275                 .setup = alc880_uniwill_p53_setup,
4276                 .init_hook = alc_automute_amp,
4277         },
4278         [ALC880_ASUS] = {
4279                 .mixers = { alc880_asus_mixer },
4280                 .init_verbs = { alc880_volume_init_verbs,
4281                                 alc880_pin_asus_init_verbs,
4282                                 alc880_gpio1_init_verbs },
4283                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4284                 .dac_nids = alc880_asus_dac_nids,
4285                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4286                 .channel_mode = alc880_asus_modes,
4287                 .need_dac_fix = 1,
4288                 .input_mux = &alc880_capture_source,
4289         },
4290         [ALC880_ASUS_DIG] = {
4291                 .mixers = { alc880_asus_mixer },
4292                 .init_verbs = { alc880_volume_init_verbs,
4293                                 alc880_pin_asus_init_verbs,
4294                                 alc880_gpio1_init_verbs },
4295                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4296                 .dac_nids = alc880_asus_dac_nids,
4297                 .dig_out_nid = ALC880_DIGOUT_NID,
4298                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4299                 .channel_mode = alc880_asus_modes,
4300                 .need_dac_fix = 1,
4301                 .input_mux = &alc880_capture_source,
4302         },
4303         [ALC880_ASUS_DIG2] = {
4304                 .mixers = { alc880_asus_mixer },
4305                 .init_verbs = { alc880_volume_init_verbs,
4306                                 alc880_pin_asus_init_verbs,
4307                                 alc880_gpio2_init_verbs }, /* use GPIO2 */
4308                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4309                 .dac_nids = alc880_asus_dac_nids,
4310                 .dig_out_nid = ALC880_DIGOUT_NID,
4311                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4312                 .channel_mode = alc880_asus_modes,
4313                 .need_dac_fix = 1,
4314                 .input_mux = &alc880_capture_source,
4315         },
4316         [ALC880_ASUS_W1V] = {
4317                 .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
4318                 .init_verbs = { alc880_volume_init_verbs,
4319                                 alc880_pin_asus_init_verbs,
4320                                 alc880_gpio1_init_verbs },
4321                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4322                 .dac_nids = alc880_asus_dac_nids,
4323                 .dig_out_nid = ALC880_DIGOUT_NID,
4324                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4325                 .channel_mode = alc880_asus_modes,
4326                 .need_dac_fix = 1,
4327                 .input_mux = &alc880_capture_source,
4328         },
4329         [ALC880_UNIWILL_DIG] = {
4330                 .mixers = { alc880_asus_mixer },
4331                 .init_verbs = { alc880_volume_init_verbs,
4332                                 alc880_pin_asus_init_verbs },
4333                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4334                 .dac_nids = alc880_asus_dac_nids,
4335                 .dig_out_nid = ALC880_DIGOUT_NID,
4336                 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4337                 .channel_mode = alc880_asus_modes,
4338                 .need_dac_fix = 1,
4339                 .input_mux = &alc880_capture_source,
4340         },
4341         [ALC880_UNIWILL] = {
4342                 .mixers = { alc880_uniwill_mixer },
4343                 .init_verbs = { alc880_volume_init_verbs,
4344                                 alc880_uniwill_init_verbs },
4345                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4346                 .dac_nids = alc880_asus_dac_nids,
4347                 .dig_out_nid = ALC880_DIGOUT_NID,
4348                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4349                 .channel_mode = alc880_threestack_modes,
4350                 .need_dac_fix = 1,
4351                 .input_mux = &alc880_capture_source,
4352                 .unsol_event = alc880_uniwill_unsol_event,
4353                 .setup = alc880_uniwill_setup,
4354                 .init_hook = alc880_uniwill_init_hook,
4355         },
4356         [ALC880_UNIWILL_P53] = {
4357                 .mixers = { alc880_uniwill_p53_mixer },
4358                 .init_verbs = { alc880_volume_init_verbs,
4359                                 alc880_uniwill_p53_init_verbs },
4360                 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4361                 .dac_nids = alc880_asus_dac_nids,
4362                 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4363                 .channel_mode = alc880_threestack_modes,
4364                 .input_mux = &alc880_capture_source,
4365                 .unsol_event = alc880_uniwill_p53_unsol_event,
4366                 .setup = alc880_uniwill_p53_setup,
4367                 .init_hook = alc_automute_amp,
4368         },
4369         [ALC880_FUJITSU] = {
4370                 .mixers = { alc880_fujitsu_mixer },
4371                 .init_verbs = { alc880_volume_init_verbs,
4372                                 alc880_uniwill_p53_init_verbs,
4373                                 alc880_beep_init_verbs },
4374                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4375                 .dac_nids = alc880_dac_nids,
4376                 .dig_out_nid = ALC880_DIGOUT_NID,
4377                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4378                 .channel_mode = alc880_2_jack_modes,
4379                 .input_mux = &alc880_capture_source,
4380                 .unsol_event = alc880_uniwill_p53_unsol_event,
4381                 .setup = alc880_uniwill_p53_setup,
4382                 .init_hook = alc_automute_amp,
4383         },
4384         [ALC880_CLEVO] = {
4385                 .mixers = { alc880_three_stack_mixer },
4386                 .init_verbs = { alc880_volume_init_verbs,
4387                                 alc880_pin_clevo_init_verbs },
4388                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4389                 .dac_nids = alc880_dac_nids,
4390                 .hp_nid = 0x03,
4391                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4392                 .channel_mode = alc880_threestack_modes,
4393                 .need_dac_fix = 1,
4394                 .input_mux = &alc880_capture_source,
4395         },
4396         [ALC880_LG] = {
4397                 .mixers = { alc880_lg_mixer },
4398                 .init_verbs = { alc880_volume_init_verbs,
4399                                 alc880_lg_init_verbs },
4400                 .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4401                 .dac_nids = alc880_lg_dac_nids,
4402                 .dig_out_nid = ALC880_DIGOUT_NID,
4403                 .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4404                 .channel_mode = alc880_lg_ch_modes,
4405                 .need_dac_fix = 1,
4406                 .input_mux = &alc880_lg_capture_source,
4407                 .unsol_event = alc_automute_amp_unsol_event,
4408                 .setup = alc880_lg_setup,
4409                 .init_hook = alc_automute_amp,
4410 #ifdef CONFIG_SND_HDA_POWER_SAVE
4411                 .loopbacks = alc880_lg_loopbacks,
4412 #endif
4413         },
4414         [ALC880_LG_LW] = {
4415                 .mixers = { alc880_lg_lw_mixer },
4416                 .init_verbs = { alc880_volume_init_verbs,
4417                                 alc880_lg_lw_init_verbs },
4418                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4419                 .dac_nids = alc880_dac_nids,
4420                 .dig_out_nid = ALC880_DIGOUT_NID,
4421                 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4422                 .channel_mode = alc880_lg_lw_modes,
4423                 .input_mux = &alc880_lg_lw_capture_source,
4424                 .unsol_event = alc_automute_amp_unsol_event,
4425                 .setup = alc880_lg_lw_setup,
4426                 .init_hook = alc_automute_amp,
4427         },
4428         [ALC880_MEDION_RIM] = {
4429                 .mixers = { alc880_medion_rim_mixer },
4430                 .init_verbs = { alc880_volume_init_verbs,
4431                                 alc880_medion_rim_init_verbs,
4432                                 alc_gpio2_init_verbs },
4433                 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4434                 .dac_nids = alc880_dac_nids,
4435                 .dig_out_nid = ALC880_DIGOUT_NID,
4436                 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4437                 .channel_mode = alc880_2_jack_modes,
4438                 .input_mux = &alc880_medion_rim_capture_source,
4439                 .unsol_event = alc880_medion_rim_unsol_event,
4440                 .setup = alc880_medion_rim_setup,
4441                 .init_hook = alc880_medion_rim_automute,
4442         },
4443 #ifdef CONFIG_SND_DEBUG
4444         [ALC880_TEST] = {
4445                 .mixers = { alc880_test_mixer },
4446                 .init_verbs = { alc880_test_init_verbs },
4447                 .num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4448                 .dac_nids = alc880_test_dac_nids,
4449                 .dig_out_nid = ALC880_DIGOUT_NID,
4450                 .num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4451                 .channel_mode = alc880_test_modes,
4452                 .input_mux = &alc880_test_capture_source,
4453         },
4454 #endif
4455 };
4456
4457 /*
4458  * Automatic parse of I/O pins from the BIOS configuration
4459  */
4460
4461 enum {
4462         ALC_CTL_WIDGET_VOL,
4463         ALC_CTL_WIDGET_MUTE,
4464         ALC_CTL_BIND_MUTE,
4465 };
4466 static struct snd_kcontrol_new alc880_control_templates[] = {
4467         HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4468         HDA_CODEC_MUTE(NULL, 0, 0, 0),
4469         HDA_BIND_MUTE(NULL, 0, 0, 0),
4470 };
4471
4472 /* add dynamic controls */
4473 static int add_control(struct alc_spec *spec, int type, const char *name,
4474                        unsigned long val)
4475 {
4476         struct snd_kcontrol_new *knew;
4477
4478         snd_array_init(&spec->kctls, sizeof(*knew), 32);
4479         knew = snd_array_new(&spec->kctls);
4480         if (!knew)
4481                 return -ENOMEM;
4482         *knew = alc880_control_templates[type];
4483         knew->name = kstrdup(name, GFP_KERNEL);
4484         if (!knew->name)
4485                 return -ENOMEM;
4486         if (get_amp_nid_(val))
4487                 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
4488         knew->private_value = val;
4489         return 0;
4490 }
4491
4492 static int add_control_with_pfx(struct alc_spec *spec, int type,
4493                                 const char *pfx, const char *dir,
4494                                 const char *sfx, unsigned long val)
4495 {
4496         char name[32];
4497         snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
4498         return add_control(spec, type, name, val);
4499 }
4500
4501 #define add_pb_vol_ctrl(spec, type, pfx, val) \
4502         add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val)
4503 #define add_pb_sw_ctrl(spec, type, pfx, val) \
4504         add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val)
4505
4506 #define alc880_is_fixed_pin(nid)        ((nid) >= 0x14 && (nid) <= 0x17)
4507 #define alc880_fixed_pin_idx(nid)       ((nid) - 0x14)
4508 #define alc880_is_multi_pin(nid)        ((nid) >= 0x18)
4509 #define alc880_multi_pin_idx(nid)       ((nid) - 0x18)
4510 #define alc880_idx_to_dac(nid)          ((nid) + 0x02)
4511 #define alc880_dac_to_idx(nid)          ((nid) - 0x02)
4512 #define alc880_idx_to_mixer(nid)        ((nid) + 0x0c)
4513 #define alc880_idx_to_selector(nid)     ((nid) + 0x10)
4514 #define ALC880_PIN_CD_NID               0x1c
4515
4516 /* fill in the dac_nids table from the parsed pin configuration */
4517 static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4518                                      const struct auto_pin_cfg *cfg)
4519 {
4520         hda_nid_t nid;
4521         int assigned[4];
4522         int i, j;
4523
4524         memset(assigned, 0, sizeof(assigned));
4525         spec->multiout.dac_nids = spec->private_dac_nids;
4526
4527         /* check the pins hardwired to audio widget */
4528         for (i = 0; i < cfg->line_outs; i++) {
4529                 nid = cfg->line_out_pins[i];
4530                 if (alc880_is_fixed_pin(nid)) {
4531                         int idx = alc880_fixed_pin_idx(nid);
4532                         spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
4533                         assigned[idx] = 1;
4534                 }
4535         }
4536         /* left pins can be connect to any audio widget */
4537         for (i = 0; i < cfg->line_outs; i++) {
4538                 nid = cfg->line_out_pins[i];
4539                 if (alc880_is_fixed_pin(nid))
4540                         continue;
4541                 /* search for an empty channel */
4542                 for (j = 0; j < cfg->line_outs; j++) {
4543                         if (!assigned[j]) {
4544                                 spec->multiout.dac_nids[i] =
4545                                         alc880_idx_to_dac(j);
4546                                 assigned[j] = 1;
4547                                 break;
4548                         }
4549                 }
4550         }
4551         spec->multiout.num_dacs = cfg->line_outs;
4552         return 0;
4553 }
4554
4555 /* add playback controls from the parsed DAC table */
4556 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4557                                              const struct auto_pin_cfg *cfg)
4558 {
4559         static const char *chname[4] = {
4560                 "Front", "Surround", NULL /*CLFE*/, "Side"
4561         };
4562         hda_nid_t nid;
4563         int i, err;
4564
4565         for (i = 0; i < cfg->line_outs; i++) {
4566                 if (!spec->multiout.dac_nids[i])
4567                         continue;
4568                 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4569                 if (i == 2) {
4570                         /* Center/LFE */
4571                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4572                                               "Center",
4573                                           HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4574                                                               HDA_OUTPUT));
4575                         if (err < 0)
4576                                 return err;
4577                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4578                                               "LFE",
4579                                           HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4580                                                               HDA_OUTPUT));
4581                         if (err < 0)
4582                                 return err;
4583                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4584                                              "Center",
4585                                           HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4586                                                               HDA_INPUT));
4587                         if (err < 0)
4588                                 return err;
4589                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4590                                              "LFE",
4591                                           HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4592                                                               HDA_INPUT));
4593                         if (err < 0)
4594                                 return err;
4595                 } else {
4596                         const char *pfx;
4597                         if (cfg->line_outs == 1 &&
4598                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4599                                 pfx = "Speaker";
4600                         else
4601                                 pfx = chname[i];
4602                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4603                                           HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4604                                                               HDA_OUTPUT));
4605                         if (err < 0)
4606                                 return err;
4607                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4608                                           HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4609                                                               HDA_INPUT));
4610                         if (err < 0)
4611                                 return err;
4612                 }
4613         }
4614         return 0;
4615 }
4616
4617 /* add playback controls for speaker and HP outputs */
4618 static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4619                                         const char *pfx)
4620 {
4621         hda_nid_t nid;
4622         int err;
4623
4624         if (!pin)
4625                 return 0;
4626
4627         if (alc880_is_fixed_pin(pin)) {
4628                 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
4629                 /* specify the DAC as the extra output */
4630                 if (!spec->multiout.hp_nid)
4631                         spec->multiout.hp_nid = nid;
4632                 else
4633                         spec->multiout.extra_out_nid[0] = nid;
4634                 /* control HP volume/switch on the output mixer amp */
4635                 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
4636                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4637                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4638                 if (err < 0)
4639                         return err;
4640                 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4641                                   HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4642                 if (err < 0)
4643                         return err;
4644         } else if (alc880_is_multi_pin(pin)) {
4645                 /* set manual connection */
4646                 /* we have only a switch on HP-out PIN */
4647                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
4648                                   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4649                 if (err < 0)
4650                         return err;
4651         }
4652         return 0;
4653 }
4654
4655 /* create input playback/capture controls for the given pin */
4656 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4657                             const char *ctlname,
4658                             int idx, hda_nid_t mix_nid)
4659 {
4660         int err;
4661
4662         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
4663                           HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4664         if (err < 0)
4665                 return err;
4666         err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
4667                           HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4668         if (err < 0)
4669                 return err;
4670         return 0;
4671 }
4672
4673 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4674 {
4675         unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4676         return (pincap & AC_PINCAP_IN) != 0;
4677 }
4678
4679 /* create playback/capture controls for input pins */
4680 static int alc_auto_create_input_ctls(struct hda_codec *codec,
4681                                       const struct auto_pin_cfg *cfg,
4682                                       hda_nid_t mixer,
4683                                       hda_nid_t cap1, hda_nid_t cap2)
4684 {
4685         struct alc_spec *spec = codec->spec;
4686         struct hda_input_mux *imux = &spec->private_imux[0];
4687         int i, err, idx;
4688
4689         for (i = 0; i < AUTO_PIN_LAST; i++) {
4690                 hda_nid_t pin;
4691
4692                 pin = cfg->input_pins[i];
4693                 if (!alc_is_input_pin(codec, pin))
4694                         continue;
4695
4696                 if (mixer) {
4697                         idx = get_connection_index(codec, mixer, pin);
4698                         if (idx >= 0) {
4699                                 err = new_analog_input(spec, pin,
4700                                                        auto_pin_cfg_labels[i],
4701                                                        idx, mixer);
4702                                 if (err < 0)
4703                                         return err;
4704                         }
4705                 }
4706
4707                 if (!cap1)
4708                         continue;
4709                 idx = get_connection_index(codec, cap1, pin);
4710                 if (idx < 0 && cap2)
4711                         idx = get_connection_index(codec, cap2, pin);
4712                 if (idx >= 0) {
4713                         imux->items[imux->num_items].label =
4714                                 auto_pin_cfg_labels[i];
4715                         imux->items[imux->num_items].index = idx;
4716                         imux->num_items++;
4717                 }
4718         }
4719         return 0;
4720 }
4721
4722 static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4723                                                 const struct auto_pin_cfg *cfg)
4724 {
4725         return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4726 }
4727
4728 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4729                                unsigned int pin_type)
4730 {
4731         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4732                             pin_type);
4733         /* unmute pin */
4734         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4735                             AMP_OUT_UNMUTE);
4736 }
4737
4738 static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4739                                               hda_nid_t nid, int pin_type,
4740                                               int dac_idx)
4741 {
4742         alc_set_pin_output(codec, nid, pin_type);
4743         /* need the manual connection? */
4744         if (alc880_is_multi_pin(nid)) {
4745                 struct alc_spec *spec = codec->spec;
4746                 int idx = alc880_multi_pin_idx(nid);
4747                 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4748                                     AC_VERB_SET_CONNECT_SEL,
4749                                     alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
4750         }
4751 }
4752
4753 static int get_pin_type(int line_out_type)
4754 {
4755         if (line_out_type == AUTO_PIN_HP_OUT)
4756                 return PIN_HP;
4757         else
4758                 return PIN_OUT;
4759 }
4760
4761 static void alc880_auto_init_multi_out(struct hda_codec *codec)
4762 {
4763         struct alc_spec *spec = codec->spec;
4764         int i;
4765
4766         for (i = 0; i < spec->autocfg.line_outs; i++) {
4767                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
4768                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
4769                 alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
4770         }
4771 }
4772
4773 static void alc880_auto_init_extra_out(struct hda_codec *codec)
4774 {
4775         struct alc_spec *spec = codec->spec;
4776         hda_nid_t pin;
4777
4778         pin = spec->autocfg.speaker_pins[0];
4779         if (pin) /* connect to front */
4780                 alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
4781         pin = spec->autocfg.hp_pins[0];
4782         if (pin) /* connect to front */
4783                 alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
4784 }
4785
4786 static void alc880_auto_init_analog_input(struct hda_codec *codec)
4787 {
4788         struct alc_spec *spec = codec->spec;
4789         int i;
4790
4791         for (i = 0; i < AUTO_PIN_LAST; i++) {
4792                 hda_nid_t nid = spec->autocfg.input_pins[i];
4793                 if (alc_is_input_pin(codec, nid)) {
4794                         alc_set_input_pin(codec, nid, i);
4795                         if (nid != ALC880_PIN_CD_NID &&
4796                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
4797                                 snd_hda_codec_write(codec, nid, 0,
4798                                                     AC_VERB_SET_AMP_GAIN_MUTE,
4799                                                     AMP_OUT_MUTE);
4800                 }
4801         }
4802 }
4803
4804 /* parse the BIOS configuration and set up the alc_spec */
4805 /* return 1 if successful, 0 if the proper config is not found,
4806  * or a negative error code
4807  */
4808 static int alc880_parse_auto_config(struct hda_codec *codec)
4809 {
4810         struct alc_spec *spec = codec->spec;
4811         int i, err;
4812         static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
4813
4814         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4815                                            alc880_ignore);
4816         if (err < 0)
4817                 return err;
4818         if (!spec->autocfg.line_outs)
4819                 return 0; /* can't find valid BIOS pin config */
4820
4821         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
4822         if (err < 0)
4823                 return err;
4824         err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
4825         if (err < 0)
4826                 return err;
4827         err = alc880_auto_create_extra_out(spec,
4828                                            spec->autocfg.speaker_pins[0],
4829                                            "Speaker");
4830         if (err < 0)
4831                 return err;
4832         err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
4833                                            "Headphone");
4834         if (err < 0)
4835                 return err;
4836         err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
4837         if (err < 0)
4838                 return err;
4839
4840         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4841
4842         /* check multiple SPDIF-out (for recent codecs) */
4843         for (i = 0; i < spec->autocfg.dig_outs; i++) {
4844                 hda_nid_t dig_nid;
4845                 err = snd_hda_get_connections(codec,
4846                                               spec->autocfg.dig_out_pins[i],
4847                                               &dig_nid, 1);
4848                 if (err < 0)
4849                         continue;
4850                 if (!i)
4851                         spec->multiout.dig_out_nid = dig_nid;
4852                 else {
4853                         spec->multiout.slave_dig_outs = spec->slave_dig_outs;
4854                         if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
4855                                 break;
4856                         spec->slave_dig_outs[i - 1] = dig_nid;
4857                 }
4858         }
4859         if (spec->autocfg.dig_in_pin)
4860                 spec->dig_in_nid = ALC880_DIGIN_NID;
4861
4862         if (spec->kctls.list)
4863                 add_mixer(spec, spec->kctls.list);
4864
4865         add_verb(spec, alc880_volume_init_verbs);
4866
4867         spec->num_mux_defs = 1;
4868         spec->input_mux = &spec->private_imux[0];
4869
4870         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4871
4872         return 1;
4873 }
4874
4875 /* additional initialization for auto-configuration model */
4876 static void alc880_auto_init(struct hda_codec *codec)
4877 {
4878         struct alc_spec *spec = codec->spec;
4879         alc880_auto_init_multi_out(codec);
4880         alc880_auto_init_extra_out(codec);
4881         alc880_auto_init_analog_input(codec);
4882         if (spec->unsol_event)
4883                 alc_inithook(codec);
4884 }
4885
4886 /* check the ADC/MUX contains all input pins; some ADC/MUX contains only
4887  * one of two digital mic pins, e.g. on ALC272
4888  */
4889 static void fixup_automic_adc(struct hda_codec *codec)
4890 {
4891         struct alc_spec *spec = codec->spec;
4892         int i;
4893
4894         for (i = 0; i < spec->num_adc_nids; i++) {
4895                 hda_nid_t cap = spec->capsrc_nids ?
4896                         spec->capsrc_nids[i] : spec->adc_nids[i];
4897                 int iidx, eidx;
4898
4899                 iidx = get_connection_index(codec, cap, spec->int_mic.pin);
4900                 if (iidx < 0)
4901                         continue;
4902                 eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
4903                 if (eidx < 0)
4904                         continue;
4905                 spec->int_mic.mux_idx = iidx;
4906                 spec->ext_mic.mux_idx = eidx;
4907                 if (spec->capsrc_nids)
4908                         spec->capsrc_nids += i;
4909                 spec->adc_nids += i;
4910                 spec->num_adc_nids = 1;
4911                 return;
4912         }
4913         snd_printd(KERN_INFO "hda_codec: %s: "
4914                    "No ADC/MUX containing both 0x%x and 0x%x pins\n",
4915                    codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
4916         spec->auto_mic = 0; /* disable auto-mic to be sure */
4917 }
4918
4919 /* choose the ADC/MUX containing the input pin and initialize the setup */
4920 static void fixup_single_adc(struct hda_codec *codec)
4921 {
4922         struct alc_spec *spec = codec->spec;
4923         hda_nid_t pin = 0;
4924         int i;
4925
4926         /* search for the input pin; there must be only one */
4927         for (i = 0; i < AUTO_PIN_LAST; i++) {
4928                 if (spec->autocfg.input_pins[i]) {
4929                         pin = spec->autocfg.input_pins[i];
4930                         break;
4931                 }
4932         }
4933         if (!pin)
4934                 return;
4935
4936         /* set the default connection to that pin */
4937         for (i = 0; i < spec->num_adc_nids; i++) {
4938                 hda_nid_t cap = spec->capsrc_nids ?
4939                         spec->capsrc_nids[i] : spec->adc_nids[i];
4940                 int idx;
4941
4942                 idx = get_connection_index(codec, cap, pin);
4943                 if (idx < 0)
4944                         continue;
4945                 /* use only this ADC */
4946                 if (spec->capsrc_nids)
4947                         spec->capsrc_nids += i;
4948                 spec->adc_nids += i;
4949                 spec->num_adc_nids = 1;
4950                 /* select or unmute this route */
4951                 if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
4952                         snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
4953                                                  HDA_AMP_MUTE, 0);
4954                 } else {
4955                         snd_hda_codec_write_cache(codec, cap, 0,
4956                                           AC_VERB_SET_CONNECT_SEL, idx);
4957                 }
4958                 return;
4959         }
4960 }
4961
4962 static void set_capture_mixer(struct hda_codec *codec)
4963 {
4964         struct alc_spec *spec = codec->spec;
4965         static struct snd_kcontrol_new *caps[2][3] = {
4966                 { alc_capture_mixer_nosrc1,
4967                   alc_capture_mixer_nosrc2,
4968                   alc_capture_mixer_nosrc3 },
4969                 { alc_capture_mixer1,
4970                   alc_capture_mixer2,
4971                   alc_capture_mixer3 },
4972         };
4973         if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
4974                 int mux = 0;
4975                 if (spec->auto_mic)
4976                         fixup_automic_adc(codec);
4977                 else if (spec->input_mux) {
4978                         if (spec->input_mux->num_items > 1)
4979                                 mux = 1;
4980                         else if (spec->input_mux->num_items == 1)
4981                                 fixup_single_adc(codec);
4982                 }
4983                 spec->cap_mixer = caps[mux][spec->num_adc_nids - 1];
4984         }
4985 }
4986
4987 #ifdef CONFIG_SND_HDA_INPUT_BEEP
4988 #define set_beep_amp(spec, nid, idx, dir) \
4989         ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
4990 #else
4991 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
4992 #endif
4993
4994 /*
4995  * OK, here we have finally the patch for ALC880
4996  */
4997
4998 static int patch_alc880(struct hda_codec *codec)
4999 {
5000         struct alc_spec *spec;
5001         int board_config;
5002         int err;
5003
5004         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5005         if (spec == NULL)
5006                 return -ENOMEM;
5007
5008         codec->spec = spec;
5009
5010         board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
5011                                                   alc880_models,
5012                                                   alc880_cfg_tbl);
5013         if (board_config < 0) {
5014                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5015                        codec->chip_name);
5016                 board_config = ALC880_AUTO;
5017         }
5018
5019         if (board_config == ALC880_AUTO) {
5020                 /* automatic parse from the BIOS config */
5021                 err = alc880_parse_auto_config(codec);
5022                 if (err < 0) {
5023                         alc_free(codec);
5024                         return err;
5025                 } else if (!err) {
5026                         printk(KERN_INFO
5027                                "hda_codec: Cannot set up configuration "
5028                                "from BIOS.  Using 3-stack mode...\n");
5029                         board_config = ALC880_3ST;
5030                 }
5031         }
5032
5033         err = snd_hda_attach_beep_device(codec, 0x1);
5034         if (err < 0) {
5035                 alc_free(codec);
5036                 return err;
5037         }
5038
5039         if (board_config != ALC880_AUTO)
5040                 setup_preset(codec, &alc880_presets[board_config]);
5041
5042         spec->stream_analog_playback = &alc880_pcm_analog_playback;
5043         spec->stream_analog_capture = &alc880_pcm_analog_capture;
5044         spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
5045
5046         spec->stream_digital_playback = &alc880_pcm_digital_playback;
5047         spec->stream_digital_capture = &alc880_pcm_digital_capture;
5048
5049         if (!spec->adc_nids && spec->input_mux) {
5050                 /* check whether NID 0x07 is valid */
5051                 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
5052                 /* get type */
5053                 wcap = get_wcaps_type(wcap);
5054                 if (wcap != AC_WID_AUD_IN) {
5055                         spec->adc_nids = alc880_adc_nids_alt;
5056                         spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
5057                 } else {
5058                         spec->adc_nids = alc880_adc_nids;
5059                         spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
5060                 }
5061         }
5062         set_capture_mixer(codec);
5063         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
5064
5065         spec->vmaster_nid = 0x0c;
5066
5067         codec->patch_ops = alc_patch_ops;
5068         if (board_config == ALC880_AUTO)
5069                 spec->init_hook = alc880_auto_init;
5070 #ifdef CONFIG_SND_HDA_POWER_SAVE
5071         if (!spec->loopback.amplist)
5072                 spec->loopback.amplist = alc880_loopbacks;
5073 #endif
5074
5075         return 0;
5076 }
5077
5078
5079 /*
5080  * ALC260 support
5081  */
5082
5083 static hda_nid_t alc260_dac_nids[1] = {
5084         /* front */
5085         0x02,
5086 };
5087
5088 static hda_nid_t alc260_adc_nids[1] = {
5089         /* ADC0 */
5090         0x04,
5091 };
5092
5093 static hda_nid_t alc260_adc_nids_alt[1] = {
5094         /* ADC1 */
5095         0x05,
5096 };
5097
5098 /* NIDs used when simultaneous access to both ADCs makes sense.  Note that
5099  * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
5100  */
5101 static hda_nid_t alc260_dual_adc_nids[2] = {
5102         /* ADC0, ADC1 */
5103         0x04, 0x05
5104 };
5105
5106 #define ALC260_DIGOUT_NID       0x03
5107 #define ALC260_DIGIN_NID        0x06
5108
5109 static struct hda_input_mux alc260_capture_source = {
5110         .num_items = 4,
5111         .items = {
5112                 { "Mic", 0x0 },
5113                 { "Front Mic", 0x1 },
5114                 { "Line", 0x2 },
5115                 { "CD", 0x4 },
5116         },
5117 };
5118
5119 /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
5120  * headphone jack and the internal CD lines since these are the only pins at
5121  * which audio can appear.  For flexibility, also allow the option of
5122  * recording the mixer output on the second ADC (ADC0 doesn't have a
5123  * connection to the mixer output).
5124  */
5125 static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5126         {
5127                 .num_items = 3,
5128                 .items = {
5129                         { "Mic/Line", 0x0 },
5130                         { "CD", 0x4 },
5131                         { "Headphone", 0x2 },
5132                 },
5133         },
5134         {
5135                 .num_items = 4,
5136                 .items = {
5137                         { "Mic/Line", 0x0 },
5138                         { "CD", 0x4 },
5139                         { "Headphone", 0x2 },
5140                         { "Mixer", 0x5 },
5141                 },
5142         },
5143
5144 };
5145
5146 /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5147  * the Fujitsu S702x, but jacks are marked differently.
5148  */
5149 static struct hda_input_mux alc260_acer_capture_sources[2] = {
5150         {
5151                 .num_items = 4,
5152                 .items = {
5153                         { "Mic", 0x0 },
5154                         { "Line", 0x2 },
5155                         { "CD", 0x4 },
5156                         { "Headphone", 0x5 },
5157                 },
5158         },
5159         {
5160                 .num_items = 5,
5161                 .items = {
5162                         { "Mic", 0x0 },
5163                         { "Line", 0x2 },
5164                         { "CD", 0x4 },
5165                         { "Headphone", 0x6 },
5166                         { "Mixer", 0x5 },
5167                 },
5168         },
5169 };
5170
5171 /* Maxdata Favorit 100XS */
5172 static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5173         {
5174                 .num_items = 2,
5175                 .items = {
5176                         { "Line/Mic", 0x0 },
5177                         { "CD", 0x4 },
5178                 },
5179         },
5180         {
5181                 .num_items = 3,
5182                 .items = {
5183                         { "Line/Mic", 0x0 },
5184                         { "CD", 0x4 },
5185                         { "Mixer", 0x5 },
5186                 },
5187         },
5188 };
5189
5190 /*
5191  * This is just place-holder, so there's something for alc_build_pcms to look
5192  * at when it calculates the maximum number of channels. ALC260 has no mixer
5193  * element which allows changing the channel mode, so the verb list is
5194  * never used.
5195  */
5196 static struct hda_channel_mode alc260_modes[1] = {
5197         { 2, NULL },
5198 };
5199
5200
5201 /* Mixer combinations
5202  *
5203  * basic: base_output + input + pc_beep + capture
5204  * HP: base_output + input + capture_alt
5205  * HP_3013: hp_3013 + input + capture
5206  * fujitsu: fujitsu + capture
5207  * acer: acer + capture
5208  */
5209
5210 static struct snd_kcontrol_new alc260_base_output_mixer[] = {
5211         HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5212         HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5213         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5214         HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5215         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5216         HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5217         { } /* end */
5218 };
5219
5220 static struct snd_kcontrol_new alc260_input_mixer[] = {
5221         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5222         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5223         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5224         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5225         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5226         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5227         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5228         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
5229         { } /* end */
5230 };
5231
5232 /* update HP, line and mono out pins according to the master switch */
5233 static void alc260_hp_master_update(struct hda_codec *codec,
5234                                     hda_nid_t hp, hda_nid_t line,
5235                                     hda_nid_t mono)
5236 {
5237         struct alc_spec *spec = codec->spec;
5238         unsigned int val = spec->master_sw ? PIN_HP : 0;
5239         /* change HP and line-out pins */
5240         snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5241                             val);
5242         snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5243                             val);
5244         /* mono (speaker) depending on the HP jack sense */
5245         val = (val && !spec->jack_present) ? PIN_OUT : 0;
5246         snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5247                             val);
5248 }
5249
5250 static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5251                                    struct snd_ctl_elem_value *ucontrol)
5252 {
5253         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5254         struct alc_spec *spec = codec->spec;
5255         *ucontrol->value.integer.value = spec->master_sw;
5256         return 0;
5257 }
5258
5259 static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5260                                    struct snd_ctl_elem_value *ucontrol)
5261 {
5262         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5263         struct alc_spec *spec = codec->spec;
5264         int val = !!*ucontrol->value.integer.value;
5265         hda_nid_t hp, line, mono;
5266
5267         if (val == spec->master_sw)
5268                 return 0;
5269         spec->master_sw = val;
5270         hp = (kcontrol->private_value >> 16) & 0xff;
5271         line = (kcontrol->private_value >> 8) & 0xff;
5272         mono = kcontrol->private_value & 0xff;
5273         alc260_hp_master_update(codec, hp, line, mono);
5274         return 1;
5275 }
5276
5277 static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5278         {
5279                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5280                 .name = "Master Playback Switch",
5281                 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5282                 .info = snd_ctl_boolean_mono_info,
5283                 .get = alc260_hp_master_sw_get,
5284                 .put = alc260_hp_master_sw_put,
5285                 .private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5286         },
5287         HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5288         HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5289         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5290         HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5291         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5292                               HDA_OUTPUT),
5293         HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5294         { } /* end */
5295 };
5296
5297 static struct hda_verb alc260_hp_unsol_verbs[] = {
5298         {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5299         {},
5300 };
5301
5302 static void alc260_hp_automute(struct hda_codec *codec)
5303 {
5304         struct alc_spec *spec = codec->spec;
5305
5306         spec->jack_present = snd_hda_jack_detect(codec, 0x10);
5307         alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5308 }
5309
5310 static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5311 {
5312         if ((res >> 26) == ALC880_HP_EVENT)
5313                 alc260_hp_automute(codec);
5314 }
5315
5316 static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5317         {
5318                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5319                 .name = "Master Playback Switch",
5320                 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5321                 .info = snd_ctl_boolean_mono_info,
5322                 .get = alc260_hp_master_sw_get,
5323                 .put = alc260_hp_master_sw_put,
5324                 .private_value = (0x15 << 16) | (0x10 << 8) | 0x11
5325         },
5326         HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5327         HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5328         HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5329         HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5330         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5331         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
5332         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5333         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
5334         { } /* end */
5335 };
5336
5337 static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5338         .ops = &snd_hda_bind_vol,
5339         .values = {
5340                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5341                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5342                 HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5343                 0
5344         },
5345 };
5346
5347 static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5348         .ops = &snd_hda_bind_sw,
5349         .values = {
5350                 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5351                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5352                 0
5353         },
5354 };
5355
5356 static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5357         HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5358         HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5359         HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5360         HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5361         { } /* end */
5362 };
5363
5364 static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5365         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5366         {},
5367 };
5368
5369 static void alc260_hp_3013_automute(struct hda_codec *codec)
5370 {
5371         struct alc_spec *spec = codec->spec;
5372
5373         spec->jack_present = snd_hda_jack_detect(codec, 0x15);
5374         alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
5375 }
5376
5377 static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5378                                        unsigned int res)
5379 {
5380         if ((res >> 26) == ALC880_HP_EVENT)
5381                 alc260_hp_3013_automute(codec);
5382 }
5383
5384 static void alc260_hp_3012_automute(struct hda_codec *codec)
5385 {
5386         unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
5387
5388         snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5389                             bits);
5390         snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5391                             bits);
5392         snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5393                             bits);
5394 }
5395
5396 static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5397                                        unsigned int res)
5398 {
5399         if ((res >> 26) == ALC880_HP_EVENT)
5400                 alc260_hp_3012_automute(codec);
5401 }
5402
5403 /* Fujitsu S702x series laptops.  ALC260 pin usage: Mic/Line jack = 0x12,
5404  * HP jack = 0x14, CD audio =  0x16, internal speaker = 0x10.
5405  */
5406 static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
5407         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5408         HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
5409         ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5410         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5411         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5412         HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5413         HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
5414         ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
5415         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5416         HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
5417         { } /* end */
5418 };
5419
5420 /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks.  Note that current
5421  * versions of the ALC260 don't act on requests to enable mic bias from NID
5422  * 0x0f (used to drive the headphone jack in these laptops).  The ALC260
5423  * datasheet doesn't mention this restriction.  At this stage it's not clear
5424  * whether this behaviour is intentional or is a hardware bug in chip
5425  * revisions available in early 2006.  Therefore for now allow the
5426  * "Headphone Jack Mode" control to span all choices, but if it turns out
5427  * that the lack of mic bias for this NID is intentional we could change the
5428  * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5429  *
5430  * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5431  * don't appear to make the mic bias available from the "line" jack, even
5432  * though the NID used for this jack (0x14) can supply it.  The theory is
5433  * that perhaps Acer have included blocking capacitors between the ALC260
5434  * and the output jack.  If this turns out to be the case for all such
5435  * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5436  * to ALC_PIN_DIR_INOUT_NOMICBIAS.
5437  *
5438  * The C20x Tablet series have a mono internal speaker which is controlled
5439  * via the chip's Mono sum widget and pin complex, so include the necessary
5440  * controls for such models.  On models without a "mono speaker" the control
5441  * won't do anything.
5442  */
5443 static struct snd_kcontrol_new alc260_acer_mixer[] = {
5444         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5445         HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5446         ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5447         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5448                               HDA_OUTPUT),
5449         HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
5450                            HDA_INPUT),
5451         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5452         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5453         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5454         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5455         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5456         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5457         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5458         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5459         { } /* end */
5460 };
5461
5462 /* Maxdata Favorit 100XS: one output and one input (0x12) jack
5463  */
5464 static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5465         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5466         HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5467         ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5468         HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5469         HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5470         ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5471         { } /* end */
5472 };
5473
5474 /* Packard bell V7900  ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5475  * Line In jack = 0x14, CD audio =  0x16, pc beep = 0x17.
5476  */
5477 static struct snd_kcontrol_new alc260_will_mixer[] = {
5478         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5479         HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5480         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5481         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5482         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5483         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5484         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5485         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5486         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5487         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5488         { } /* end */
5489 };
5490
5491 /* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5492  * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5493  */
5494 static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5495         HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5496         HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5497         HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5498         HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5499         ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5500         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5501         HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5502         HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5503         HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5504         ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5505         { } /* end */
5506 };
5507
5508 /*
5509  * initialization verbs
5510  */
5511 static struct hda_verb alc260_init_verbs[] = {
5512         /* Line In pin widget for input */
5513         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5514         /* CD pin widget for input */
5515         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5516         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5517         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5518         /* Mic2 (front panel) pin widget for input and vref at 80% */
5519         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5520         /* LINE-2 is used for line-out in rear */
5521         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5522         /* select line-out */
5523         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
5524         /* LINE-OUT pin */
5525         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5526         /* enable HP */
5527         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5528         /* enable Mono */
5529         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5530         /* mute capture amp left and right */
5531         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5532         /* set connection select to line in (default select for this ADC) */
5533         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5534         /* mute capture amp left and right */
5535         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5536         /* set connection select to line in (default select for this ADC) */
5537         {0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
5538         /* set vol=0 Line-Out mixer amp left and right */
5539         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5540         /* unmute pin widget amp left and right (no gain on this amp) */
5541         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5542         /* set vol=0 HP mixer amp left and right */
5543         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5544         /* unmute pin widget amp left and right (no gain on this amp) */
5545         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5546         /* set vol=0 Mono mixer amp left and right */
5547         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5548         /* unmute pin widget amp left and right (no gain on this amp) */
5549         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5550         /* unmute LINE-2 out pin */
5551         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5552         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5553          * Line In 2 = 0x03
5554          */
5555         /* mute analog inputs */
5556         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5557         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5558         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5559         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5560         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5561         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5562         /* mute Front out path */
5563         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5564         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5565         /* mute Headphone out path */
5566         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5567         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5568         /* mute Mono out path */
5569         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5570         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5571         { }
5572 };
5573
5574 #if 0 /* should be identical with alc260_init_verbs? */
5575 static struct hda_verb alc260_hp_init_verbs[] = {
5576         /* Headphone and output */
5577         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5578         /* mono output */
5579         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5580         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5581         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5582         /* Mic2 (front panel) pin widget for input and vref at 80% */
5583         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5584         /* Line In pin widget for input */
5585         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5586         /* Line-2 pin widget for output */
5587         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5588         /* CD pin widget for input */
5589         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5590         /* unmute amp left and right */
5591         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5592         /* set connection select to line in (default select for this ADC) */
5593         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5594         /* unmute Line-Out mixer amp left and right (volume = 0) */
5595         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5596         /* mute pin widget amp left and right (no gain on this amp) */
5597         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5598         /* unmute HP mixer amp left and right (volume = 0) */
5599         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5600         /* mute pin widget amp left and right (no gain on this amp) */
5601         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5602         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5603          * Line In 2 = 0x03
5604          */
5605         /* mute analog inputs */
5606         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5607         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5608         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5609         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5610         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5611         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5612         /* Unmute Front out path */
5613         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5614         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5615         /* Unmute Headphone out path */
5616         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5617         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5618         /* Unmute Mono out path */
5619         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5620         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5621         { }
5622 };
5623 #endif
5624
5625 static struct hda_verb alc260_hp_3013_init_verbs[] = {
5626         /* Line out and output */
5627         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5628         /* mono output */
5629         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5630         /* Mic1 (rear panel) pin widget for input and vref at 80% */
5631         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5632         /* Mic2 (front panel) pin widget for input and vref at 80% */
5633         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5634         /* Line In pin widget for input */
5635         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5636         /* Headphone pin widget for output */
5637         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5638         /* CD pin widget for input */
5639         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5640         /* unmute amp left and right */
5641         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5642         /* set connection select to line in (default select for this ADC) */
5643         {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5644         /* unmute Line-Out mixer amp left and right (volume = 0) */
5645         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5646         /* mute pin widget amp left and right (no gain on this amp) */
5647         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5648         /* unmute HP mixer amp left and right (volume = 0) */
5649         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5650         /* mute pin widget amp left and right (no gain on this amp) */
5651         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5652         /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5653          * Line In 2 = 0x03
5654          */
5655         /* mute analog inputs */
5656         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5657         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5658         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5659         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5660         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5661         /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5662         /* Unmute Front out path */
5663         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5664         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5665         /* Unmute Headphone out path */
5666         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5667         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5668         /* Unmute Mono out path */
5669         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5670         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5671         { }
5672 };
5673
5674 /* Initialisation sequence for ALC260 as configured in Fujitsu S702x
5675  * laptops.  ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
5676  * audio = 0x16, internal speaker = 0x10.
5677  */
5678 static struct hda_verb alc260_fujitsu_init_verbs[] = {
5679         /* Disable all GPIOs */
5680         {0x01, AC_VERB_SET_GPIO_MASK, 0},
5681         /* Internal speaker is connected to headphone pin */
5682         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5683         /* Headphone/Line-out jack connects to Line1 pin; make it an output */
5684         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5685         /* Mic/Line-in jack is connected to mic1 pin, so make it an input */
5686         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5687         /* Ensure all other unused pins are disabled and muted. */
5688         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5689         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5690         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5691         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5692         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5693         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5694         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5695         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5696
5697         /* Disable digital (SPDIF) pins */
5698         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5699         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5700
5701         /* Ensure Line1 pin widget takes its input from the OUT1 sum bus
5702          * when acting as an output.
5703          */
5704         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5705
5706         /* Start with output sum widgets muted and their output gains at min */
5707         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5708         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5709         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5710         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5711         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5712         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5713         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5714         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5715         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5716
5717         /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
5718         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5719         /* Unmute Line1 pin widget output buffer since it starts as an output.
5720          * If the pin mode is changed by the user the pin mode control will
5721          * take care of enabling the pin's input/output buffers as needed.
5722          * Therefore there's no need to enable the input buffer at this
5723          * stage.
5724          */
5725         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5726         /* Unmute input buffer of pin widget used for Line-in (no equiv
5727          * mixer ctrl)
5728          */
5729         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5730
5731         /* Mute capture amp left and right */
5732         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5733         /* Set ADC connection select to match default mixer setting - line
5734          * in (on mic1 pin)
5735          */
5736         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5737
5738         /* Do the same for the second ADC: mute capture input amp and
5739          * set ADC connection to line in (on mic1 pin)
5740          */
5741         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5742         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5743
5744         /* Mute all inputs to mixer widget (even unconnected ones) */
5745         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5746         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5747         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5748         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5749         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5750         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5751         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5752         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5753
5754         { }
5755 };
5756
5757 /* Initialisation sequence for ALC260 as configured in Acer TravelMate and
5758  * similar laptops (adapted from Fujitsu init verbs).
5759  */
5760 static struct hda_verb alc260_acer_init_verbs[] = {
5761         /* On TravelMate laptops, GPIO 0 enables the internal speaker and
5762          * the headphone jack.  Turn this on and rely on the standard mute
5763          * methods whenever the user wants to turn these outputs off.
5764          */
5765         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5766         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5767         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5768         /* Internal speaker/Headphone jack is connected to Line-out pin */
5769         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5770         /* Internal microphone/Mic jack is connected to Mic1 pin */
5771         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5772         /* Line In jack is connected to Line1 pin */
5773         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5774         /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
5775         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5776         /* Ensure all other unused pins are disabled and muted. */
5777         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5778         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5779         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5780         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5781         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5782         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5783         /* Disable digital (SPDIF) pins */
5784         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5785         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5786
5787         /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5788          * bus when acting as outputs.
5789          */
5790         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5791         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5792
5793         /* Start with output sum widgets muted and their output gains at min */
5794         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5795         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5796         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5797         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5798         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5799         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5800         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5801         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5802         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5803
5804         /* Unmute Line-out pin widget amp left and right
5805          * (no equiv mixer ctrl)
5806          */
5807         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5808         /* Unmute mono pin widget amp output (no equiv mixer ctrl) */
5809         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5810         /* Unmute Mic1 and Line1 pin widget input buffers since they start as
5811          * inputs. If the pin mode is changed by the user the pin mode control
5812          * will take care of enabling the pin's input/output buffers as needed.
5813          * Therefore there's no need to enable the input buffer at this
5814          * stage.
5815          */
5816         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5817         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5818
5819         /* Mute capture amp left and right */
5820         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5821         /* Set ADC connection select to match default mixer setting - mic
5822          * (on mic1 pin)
5823          */
5824         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5825
5826         /* Do similar with the second ADC: mute capture input amp and
5827          * set ADC connection to mic to match ALSA's default state.
5828          */
5829         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5830         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5831
5832         /* Mute all inputs to mixer widget (even unconnected ones) */
5833         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5834         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5835         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5836         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5837         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5838         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5839         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5840         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5841
5842         { }
5843 };
5844
5845 /* Initialisation sequence for Maxdata Favorit 100XS
5846  * (adapted from Acer init verbs).
5847  */
5848 static struct hda_verb alc260_favorit100_init_verbs[] = {
5849         /* GPIO 0 enables the output jack.
5850          * Turn this on and rely on the standard mute
5851          * methods whenever the user wants to turn these outputs off.
5852          */
5853         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5854         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5855         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5856         /* Line/Mic input jack is connected to Mic1 pin */
5857         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5858         /* Ensure all other unused pins are disabled and muted. */
5859         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5860         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5861         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5862         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5863         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5864         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5865         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5866         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5867         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5868         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5869         /* Disable digital (SPDIF) pins */
5870         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5871         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5872
5873         /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5874          * bus when acting as outputs.
5875          */
5876         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5877         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5878
5879         /* Start with output sum widgets muted and their output gains at min */
5880         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5881         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5882         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5883         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5884         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5885         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5886         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5887         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5888         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5889
5890         /* Unmute Line-out pin widget amp left and right
5891          * (no equiv mixer ctrl)
5892          */
5893         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5894         /* Unmute Mic1 and Line1 pin widget input buffers since they start as
5895          * inputs. If the pin mode is changed by the user the pin mode control
5896          * will take care of enabling the pin's input/output buffers as needed.
5897          * Therefore there's no need to enable the input buffer at this
5898          * stage.
5899          */
5900         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5901
5902         /* Mute capture amp left and right */
5903         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5904         /* Set ADC connection select to match default mixer setting - mic
5905          * (on mic1 pin)
5906          */
5907         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5908
5909         /* Do similar with the second ADC: mute capture input amp and
5910          * set ADC connection to mic to match ALSA's default state.
5911          */
5912         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5913         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5914
5915         /* Mute all inputs to mixer widget (even unconnected ones) */
5916         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5917         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5918         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5919         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5920         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5921         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5922         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5923         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5924
5925         { }
5926 };
5927
5928 static struct hda_verb alc260_will_verbs[] = {
5929         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5930         {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
5931         {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
5932         {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5933         {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5934         {0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
5935         {}
5936 };
5937
5938 static struct hda_verb alc260_replacer_672v_verbs[] = {
5939         {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5940         {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5941         {0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
5942
5943         {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5944         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5945         {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5946
5947         {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5948         {}
5949 };
5950
5951 /* toggle speaker-output according to the hp-jack state */
5952 static void alc260_replacer_672v_automute(struct hda_codec *codec)
5953 {
5954         unsigned int present;
5955
5956         /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
5957         present = snd_hda_jack_detect(codec, 0x0f);
5958         if (present) {
5959                 snd_hda_codec_write_cache(codec, 0x01, 0,
5960                                           AC_VERB_SET_GPIO_DATA, 1);
5961                 snd_hda_codec_write_cache(codec, 0x0f, 0,
5962                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
5963                                           PIN_HP);
5964         } else {
5965                 snd_hda_codec_write_cache(codec, 0x01, 0,
5966                                           AC_VERB_SET_GPIO_DATA, 0);
5967                 snd_hda_codec_write_cache(codec, 0x0f, 0,
5968                                           AC_VERB_SET_PIN_WIDGET_CONTROL,
5969                                           PIN_OUT);
5970         }
5971 }
5972
5973 static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
5974                                        unsigned int res)
5975 {
5976         if ((res >> 26) == ALC880_HP_EVENT)
5977                 alc260_replacer_672v_automute(codec);
5978 }
5979
5980 static struct hda_verb alc260_hp_dc7600_verbs[] = {
5981         {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
5982         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
5983         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5984         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5985         {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5986         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5987         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5988         {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5989         {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5990         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5991         {}
5992 };
5993
5994 /* Test configuration for debugging, modelled after the ALC880 test
5995  * configuration.
5996  */
5997 #ifdef CONFIG_SND_DEBUG
5998 static hda_nid_t alc260_test_dac_nids[1] = {
5999         0x02,
6000 };
6001 static hda_nid_t alc260_test_adc_nids[2] = {
6002         0x04, 0x05,
6003 };
6004 /* For testing the ALC260, each input MUX needs its own definition since
6005  * the signal assignments are different.  This assumes that the first ADC
6006  * is NID 0x04.
6007  */
6008 static struct hda_input_mux alc260_test_capture_sources[2] = {
6009         {
6010                 .num_items = 7,
6011                 .items = {
6012                         { "MIC1 pin", 0x0 },
6013                         { "MIC2 pin", 0x1 },
6014                         { "LINE1 pin", 0x2 },
6015                         { "LINE2 pin", 0x3 },
6016                         { "CD pin", 0x4 },
6017                         { "LINE-OUT pin", 0x5 },
6018                         { "HP-OUT pin", 0x6 },
6019                 },
6020         },
6021         {
6022                 .num_items = 8,
6023                 .items = {
6024                         { "MIC1 pin", 0x0 },
6025                         { "MIC2 pin", 0x1 },
6026                         { "LINE1 pin", 0x2 },
6027                         { "LINE2 pin", 0x3 },
6028                         { "CD pin", 0x4 },
6029                         { "Mixer", 0x5 },
6030                         { "LINE-OUT pin", 0x6 },
6031                         { "HP-OUT pin", 0x7 },
6032                 },
6033         },
6034 };
6035 static struct snd_kcontrol_new alc260_test_mixer[] = {
6036         /* Output driver widgets */
6037         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
6038         HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
6039         HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6040         HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
6041         HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6042         HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
6043
6044         /* Modes for retasking pin widgets
6045          * Note: the ALC260 doesn't seem to act on requests to enable mic
6046          * bias from NIDs 0x0f and 0x10.  The ALC260 datasheet doesn't
6047          * mention this restriction.  At this stage it's not clear whether
6048          * this behaviour is intentional or is a hardware bug in chip
6049          * revisions available at least up until early 2006.  Therefore for
6050          * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
6051          * choices, but if it turns out that the lack of mic bias for these
6052          * NIDs is intentional we could change their modes from
6053          * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
6054          */
6055         ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
6056         ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
6057         ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
6058         ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
6059         ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
6060         ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
6061
6062         /* Loopback mixer controls */
6063         HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
6064         HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
6065         HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
6066         HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
6067         HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
6068         HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
6069         HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
6070         HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
6071         HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6072         HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
6073         HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
6074         HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
6075         HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
6076         HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
6077
6078         /* Controls for GPIO pins, assuming they are configured as outputs */
6079         ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
6080         ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
6081         ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
6082         ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
6083
6084         /* Switches to allow the digital IO pins to be enabled.  The datasheet
6085          * is ambigious as to which NID is which; testing on laptops which
6086          * make this output available should provide clarification.
6087          */
6088         ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
6089         ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
6090
6091         /* A switch allowing EAPD to be enabled.  Some laptops seem to use
6092          * this output to turn on an external amplifier.
6093          */
6094         ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
6095         ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
6096
6097         { } /* end */
6098 };
6099 static struct hda_verb alc260_test_init_verbs[] = {
6100         /* Enable all GPIOs as outputs with an initial value of 0 */
6101         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
6102         {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6103         {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
6104
6105         /* Enable retasking pins as output, initially without power amp */
6106         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6107         {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6108         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6109         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6110         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6111         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6112
6113         /* Disable digital (SPDIF) pins initially, but users can enable
6114          * them via a mixer switch.  In the case of SPDIF-out, this initverb
6115          * payload also sets the generation to 0, output to be in "consumer"
6116          * PCM format, copyright asserted, no pre-emphasis and no validity
6117          * control.
6118          */
6119         {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6120         {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6121
6122         /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
6123          * OUT1 sum bus when acting as an output.
6124          */
6125         {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6126         {0x0c, AC_VERB_SET_CONNECT_SEL, 0},
6127         {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6128         {0x0e, AC_VERB_SET_CONNECT_SEL, 0},
6129
6130         /* Start with output sum widgets muted and their output gains at min */
6131         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6132         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6133         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6134         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6135         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6136         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6137         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6138         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6139         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6140
6141         /* Unmute retasking pin widget output buffers since the default
6142          * state appears to be output.  As the pin mode is changed by the
6143          * user the pin mode control will take care of enabling the pin's
6144          * input/output buffers as needed.
6145          */
6146         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6147         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6148         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6149         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6150         {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6151         {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6152         /* Also unmute the mono-out pin widget */
6153         {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6154
6155         /* Mute capture amp left and right */
6156         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6157         /* Set ADC connection select to match default mixer setting (mic1
6158          * pin)
6159          */
6160         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6161
6162         /* Do the same for the second ADC: mute capture input amp and
6163          * set ADC connection to mic1 pin
6164          */
6165         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6166         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6167
6168         /* Mute all inputs to mixer widget (even unconnected ones) */
6169         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6170         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6171         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6172         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6173         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6174         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6175         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6176         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6177
6178         { }
6179 };
6180 #endif
6181
6182 #define alc260_pcm_analog_playback      alc880_pcm_analog_alt_playback
6183 #define alc260_pcm_analog_capture       alc880_pcm_analog_capture
6184
6185 #define alc260_pcm_digital_playback     alc880_pcm_digital_playback
6186 #define alc260_pcm_digital_capture      alc880_pcm_digital_capture
6187
6188 /*
6189  * for BIOS auto-configuration
6190  */
6191
6192 static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
6193                                         const char *pfx, int *vol_bits)
6194 {
6195         hda_nid_t nid_vol;
6196         unsigned long vol_val, sw_val;
6197         int err;
6198
6199         if (nid >= 0x0f && nid < 0x11) {
6200                 nid_vol = nid - 0x7;
6201                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6202                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6203         } else if (nid == 0x11) {
6204                 nid_vol = nid - 0x7;
6205                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6206                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6207         } else if (nid >= 0x12 && nid <= 0x15) {
6208                 nid_vol = 0x08;
6209                 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6210                 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6211         } else
6212                 return 0; /* N/A */
6213
6214         if (!(*vol_bits & (1 << nid_vol))) {
6215                 /* first control for the volume widget */
6216                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
6217                 if (err < 0)
6218                         return err;
6219                 *vol_bits |= (1 << nid_vol);
6220         }
6221         err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
6222         if (err < 0)
6223                 return err;
6224         return 1;
6225 }
6226
6227 /* add playback controls from the parsed DAC table */
6228 static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6229                                              const struct auto_pin_cfg *cfg)
6230 {
6231         hda_nid_t nid;
6232         int err;
6233         int vols = 0;
6234
6235         spec->multiout.num_dacs = 1;
6236         spec->multiout.dac_nids = spec->private_dac_nids;
6237         spec->multiout.dac_nids[0] = 0x02;
6238
6239         nid = cfg->line_out_pins[0];
6240         if (nid) {
6241                 const char *pfx;
6242                 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6243                         pfx = "Master";
6244                 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6245                         pfx = "Speaker";
6246                 else
6247                         pfx = "Front";
6248                 err = alc260_add_playback_controls(spec, nid, pfx, &vols);
6249                 if (err < 0)
6250                         return err;
6251         }
6252
6253         nid = cfg->speaker_pins[0];
6254         if (nid) {
6255                 err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
6256                 if (err < 0)
6257                         return err;
6258         }
6259
6260         nid = cfg->hp_pins[0];
6261         if (nid) {
6262                 err = alc260_add_playback_controls(spec, nid, "Headphone",
6263                                                    &vols);
6264                 if (err < 0)
6265                         return err;
6266         }
6267         return 0;
6268 }
6269
6270 /* create playback/capture controls for input pins */
6271 static int alc260_auto_create_input_ctls(struct hda_codec *codec,
6272                                                 const struct auto_pin_cfg *cfg)
6273 {
6274         return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
6275 }
6276
6277 static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6278                                               hda_nid_t nid, int pin_type,
6279                                               int sel_idx)
6280 {
6281         alc_set_pin_output(codec, nid, pin_type);
6282         /* need the manual connection? */
6283         if (nid >= 0x12) {
6284                 int idx = nid - 0x12;
6285                 snd_hda_codec_write(codec, idx + 0x0b, 0,
6286                                     AC_VERB_SET_CONNECT_SEL, sel_idx);
6287         }
6288 }
6289
6290 static void alc260_auto_init_multi_out(struct hda_codec *codec)
6291 {
6292         struct alc_spec *spec = codec->spec;
6293         hda_nid_t nid;
6294
6295         nid = spec->autocfg.line_out_pins[0];
6296         if (nid) {
6297                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
6298                 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6299         }
6300
6301         nid = spec->autocfg.speaker_pins[0];
6302         if (nid)
6303                 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6304
6305         nid = spec->autocfg.hp_pins[0];
6306         if (nid)
6307                 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
6308 }
6309
6310 #define ALC260_PIN_CD_NID               0x16
6311 static void alc260_auto_init_analog_input(struct hda_codec *codec)
6312 {
6313         struct alc_spec *spec = codec->spec;
6314         int i;
6315
6316         for (i = 0; i < AUTO_PIN_LAST; i++) {
6317                 hda_nid_t nid = spec->autocfg.input_pins[i];
6318                 if (nid >= 0x12) {
6319                         alc_set_input_pin(codec, nid, i);
6320                         if (nid != ALC260_PIN_CD_NID &&
6321                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
6322                                 snd_hda_codec_write(codec, nid, 0,
6323                                                     AC_VERB_SET_AMP_GAIN_MUTE,
6324                                                     AMP_OUT_MUTE);
6325                 }
6326         }
6327 }
6328
6329 /*
6330  * generic initialization of ADC, input mixers and output mixers
6331  */
6332 static struct hda_verb alc260_volume_init_verbs[] = {
6333         /*
6334          * Unmute ADC0-1 and set the default input to mic-in
6335          */
6336         {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6337         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6338         {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6339         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6340
6341         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6342          * mixer widget
6343          * Note: PASD motherboards uses the Line In 2 as the input for
6344          * front panel mic (mic 2)
6345          */
6346         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
6347         /* mute analog inputs */
6348         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6349         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6350         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6351         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6352         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6353
6354         /*
6355          * Set up output mixers (0x08 - 0x0a)
6356          */
6357         /* set vol=0 to output mixers */
6358         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6359         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6360         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6361         /* set up input amps for analog loopback */
6362         /* Amp Indices: DAC = 0, mixer = 1 */
6363         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6364         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6365         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6366         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6367         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6368         {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6369
6370         { }
6371 };
6372
6373 static int alc260_parse_auto_config(struct hda_codec *codec)
6374 {
6375         struct alc_spec *spec = codec->spec;
6376         int err;
6377         static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6378
6379         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6380                                            alc260_ignore);
6381         if (err < 0)
6382                 return err;
6383         err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6384         if (err < 0)
6385                 return err;
6386         if (!spec->kctls.list)
6387                 return 0; /* can't find valid BIOS pin config */
6388         err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
6389         if (err < 0)
6390                 return err;
6391
6392         spec->multiout.max_channels = 2;
6393
6394         if (spec->autocfg.dig_outs)
6395                 spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
6396         if (spec->kctls.list)
6397                 add_mixer(spec, spec->kctls.list);
6398
6399         add_verb(spec, alc260_volume_init_verbs);
6400
6401         spec->num_mux_defs = 1;
6402         spec->input_mux = &spec->private_imux[0];
6403
6404         alc_ssid_check(codec, 0x10, 0x15, 0x0f, 0);
6405
6406         return 1;
6407 }
6408
6409 /* additional initialization for auto-configuration model */
6410 static void alc260_auto_init(struct hda_codec *codec)
6411 {
6412         struct alc_spec *spec = codec->spec;
6413         alc260_auto_init_multi_out(codec);
6414         alc260_auto_init_analog_input(codec);
6415         if (spec->unsol_event)
6416                 alc_inithook(codec);
6417 }
6418
6419 #ifdef CONFIG_SND_HDA_POWER_SAVE
6420 static struct hda_amp_list alc260_loopbacks[] = {
6421         { 0x07, HDA_INPUT, 0 },
6422         { 0x07, HDA_INPUT, 1 },
6423         { 0x07, HDA_INPUT, 2 },
6424         { 0x07, HDA_INPUT, 3 },
6425         { 0x07, HDA_INPUT, 4 },
6426         { } /* end */
6427 };
6428 #endif
6429
6430 /*
6431  * ALC260 configurations
6432  */
6433 static const char *alc260_models[ALC260_MODEL_LAST] = {
6434         [ALC260_BASIC]          = "basic",
6435         [ALC260_HP]             = "hp",
6436         [ALC260_HP_3013]        = "hp-3013",
6437         [ALC260_HP_DC7600]      = "hp-dc7600",
6438         [ALC260_FUJITSU_S702X]  = "fujitsu",
6439         [ALC260_ACER]           = "acer",
6440         [ALC260_WILL]           = "will",
6441         [ALC260_REPLACER_672V]  = "replacer",
6442         [ALC260_FAVORIT100]     = "favorit100",
6443 #ifdef CONFIG_SND_DEBUG
6444         [ALC260_TEST]           = "test",
6445 #endif
6446         [ALC260_AUTO]           = "auto",
6447 };
6448
6449 static struct snd_pci_quirk alc260_cfg_tbl[] = {
6450         SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
6451         SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
6452         SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
6453         SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
6454         SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
6455         SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
6456         SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
6457         SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
6458         SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
6459         SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6460         SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6461         SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6462         SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6463         SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6464         SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6465         SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6466         SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6467         SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
6468         SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
6469         SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
6470         {}
6471 };
6472
6473 static struct alc_config_preset alc260_presets[] = {
6474         [ALC260_BASIC] = {
6475                 .mixers = { alc260_base_output_mixer,
6476                             alc260_input_mixer },
6477                 .init_verbs = { alc260_init_verbs },
6478                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6479                 .dac_nids = alc260_dac_nids,
6480                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6481                 .adc_nids = alc260_dual_adc_nids,
6482                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6483                 .channel_mode = alc260_modes,
6484                 .input_mux = &alc260_capture_source,
6485         },
6486         [ALC260_HP] = {
6487                 .mixers = { alc260_hp_output_mixer,
6488                             alc260_input_mixer },
6489                 .init_verbs = { alc260_init_verbs,
6490                                 alc260_hp_unsol_verbs },
6491                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6492                 .dac_nids = alc260_dac_nids,
6493                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6494                 .adc_nids = alc260_adc_nids_alt,
6495                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6496                 .channel_mode = alc260_modes,
6497                 .input_mux = &alc260_capture_source,
6498                 .unsol_event = alc260_hp_unsol_event,
6499                 .init_hook = alc260_hp_automute,
6500         },
6501         [ALC260_HP_DC7600] = {
6502                 .mixers = { alc260_hp_dc7600_mixer,
6503                             alc260_input_mixer },
6504                 .init_verbs = { alc260_init_verbs,
6505                                 alc260_hp_dc7600_verbs },
6506                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6507                 .dac_nids = alc260_dac_nids,
6508                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6509                 .adc_nids = alc260_adc_nids_alt,
6510                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6511                 .channel_mode = alc260_modes,
6512                 .input_mux = &alc260_capture_source,
6513                 .unsol_event = alc260_hp_3012_unsol_event,
6514                 .init_hook = alc260_hp_3012_automute,
6515         },
6516         [ALC260_HP_3013] = {
6517                 .mixers = { alc260_hp_3013_mixer,
6518                             alc260_input_mixer },
6519                 .init_verbs = { alc260_hp_3013_init_verbs,
6520                                 alc260_hp_3013_unsol_verbs },
6521                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6522                 .dac_nids = alc260_dac_nids,
6523                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6524                 .adc_nids = alc260_adc_nids_alt,
6525                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6526                 .channel_mode = alc260_modes,
6527                 .input_mux = &alc260_capture_source,
6528                 .unsol_event = alc260_hp_3013_unsol_event,
6529                 .init_hook = alc260_hp_3013_automute,
6530         },
6531         [ALC260_FUJITSU_S702X] = {
6532                 .mixers = { alc260_fujitsu_mixer },
6533                 .init_verbs = { alc260_fujitsu_init_verbs },
6534                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6535                 .dac_nids = alc260_dac_nids,
6536                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6537                 .adc_nids = alc260_dual_adc_nids,
6538                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6539                 .channel_mode = alc260_modes,
6540                 .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6541                 .input_mux = alc260_fujitsu_capture_sources,
6542         },
6543         [ALC260_ACER] = {
6544                 .mixers = { alc260_acer_mixer },
6545                 .init_verbs = { alc260_acer_init_verbs },
6546                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6547                 .dac_nids = alc260_dac_nids,
6548                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6549                 .adc_nids = alc260_dual_adc_nids,
6550                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6551                 .channel_mode = alc260_modes,
6552                 .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6553                 .input_mux = alc260_acer_capture_sources,
6554         },
6555         [ALC260_FAVORIT100] = {
6556                 .mixers = { alc260_favorit100_mixer },
6557                 .init_verbs = { alc260_favorit100_init_verbs },
6558                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6559                 .dac_nids = alc260_dac_nids,
6560                 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6561                 .adc_nids = alc260_dual_adc_nids,
6562                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6563                 .channel_mode = alc260_modes,
6564                 .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6565                 .input_mux = alc260_favorit100_capture_sources,
6566         },
6567         [ALC260_WILL] = {
6568                 .mixers = { alc260_will_mixer },
6569                 .init_verbs = { alc260_init_verbs, alc260_will_verbs },
6570                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6571                 .dac_nids = alc260_dac_nids,
6572                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6573                 .adc_nids = alc260_adc_nids,
6574                 .dig_out_nid = ALC260_DIGOUT_NID,
6575                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6576                 .channel_mode = alc260_modes,
6577                 .input_mux = &alc260_capture_source,
6578         },
6579         [ALC260_REPLACER_672V] = {
6580                 .mixers = { alc260_replacer_672v_mixer },
6581                 .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6582                 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6583                 .dac_nids = alc260_dac_nids,
6584                 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6585                 .adc_nids = alc260_adc_nids,
6586                 .dig_out_nid = ALC260_DIGOUT_NID,
6587                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6588                 .channel_mode = alc260_modes,
6589                 .input_mux = &alc260_capture_source,
6590                 .unsol_event = alc260_replacer_672v_unsol_event,
6591                 .init_hook = alc260_replacer_672v_automute,
6592         },
6593 #ifdef CONFIG_SND_DEBUG
6594         [ALC260_TEST] = {
6595                 .mixers = { alc260_test_mixer },
6596                 .init_verbs = { alc260_test_init_verbs },
6597                 .num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6598                 .dac_nids = alc260_test_dac_nids,
6599                 .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6600                 .adc_nids = alc260_test_adc_nids,
6601                 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6602                 .channel_mode = alc260_modes,
6603                 .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6604                 .input_mux = alc260_test_capture_sources,
6605         },
6606 #endif
6607 };
6608
6609 static int patch_alc260(struct hda_codec *codec)
6610 {
6611         struct alc_spec *spec;
6612         int err, board_config;
6613
6614         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6615         if (spec == NULL)
6616                 return -ENOMEM;
6617
6618         codec->spec = spec;
6619
6620         board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
6621                                                   alc260_models,
6622                                                   alc260_cfg_tbl);
6623         if (board_config < 0) {
6624                 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6625                            codec->chip_name);
6626                 board_config = ALC260_AUTO;
6627         }
6628
6629         if (board_config == ALC260_AUTO) {
6630                 /* automatic parse from the BIOS config */
6631                 err = alc260_parse_auto_config(codec);
6632                 if (err < 0) {
6633                         alc_free(codec);
6634                         return err;
6635                 } else if (!err) {
6636                         printk(KERN_INFO
6637                                "hda_codec: Cannot set up configuration "
6638                                "from BIOS.  Using base mode...\n");
6639                         board_config = ALC260_BASIC;
6640                 }
6641         }
6642
6643         err = snd_hda_attach_beep_device(codec, 0x1);
6644         if (err < 0) {
6645                 alc_free(codec);
6646                 return err;
6647         }
6648
6649         if (board_config != ALC260_AUTO)
6650                 setup_preset(codec, &alc260_presets[board_config]);
6651
6652         spec->stream_analog_playback = &alc260_pcm_analog_playback;
6653         spec->stream_analog_capture = &alc260_pcm_analog_capture;
6654
6655         spec->stream_digital_playback = &alc260_pcm_digital_playback;
6656         spec->stream_digital_capture = &alc260_pcm_digital_capture;
6657
6658         if (!spec->adc_nids && spec->input_mux) {
6659                 /* check whether NID 0x04 is valid */
6660                 unsigned int wcap = get_wcaps(codec, 0x04);
6661                 wcap = get_wcaps_type(wcap);
6662                 /* get type */
6663                 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
6664                         spec->adc_nids = alc260_adc_nids_alt;
6665                         spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
6666                 } else {
6667                         spec->adc_nids = alc260_adc_nids;
6668                         spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
6669                 }
6670         }
6671         set_capture_mixer(codec);
6672         set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
6673
6674         spec->vmaster_nid = 0x08;
6675
6676         codec->patch_ops = alc_patch_ops;
6677         if (board_config == ALC260_AUTO)
6678                 spec->init_hook = alc260_auto_init;
6679 #ifdef CONFIG_SND_HDA_POWER_SAVE
6680         if (!spec->loopback.amplist)
6681                 spec->loopback.amplist = alc260_loopbacks;
6682 #endif
6683
6684         return 0;
6685 }
6686
6687
6688 /*
6689  * ALC882/883/885/888/889 support
6690  *
6691  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
6692  * configuration.  Each pin widget can choose any input DACs and a mixer.
6693  * Each ADC is connected from a mixer of all inputs.  This makes possible
6694  * 6-channel independent captures.
6695  *
6696  * In addition, an independent DAC for the multi-playback (not used in this
6697  * driver yet).
6698  */
6699 #define ALC882_DIGOUT_NID       0x06
6700 #define ALC882_DIGIN_NID        0x0a
6701 #define ALC883_DIGOUT_NID       ALC882_DIGOUT_NID
6702 #define ALC883_DIGIN_NID        ALC882_DIGIN_NID
6703 #define ALC1200_DIGOUT_NID      0x10
6704
6705
6706 static struct hda_channel_mode alc882_ch_modes[1] = {
6707         { 8, NULL }
6708 };
6709
6710 /* DACs */
6711 static hda_nid_t alc882_dac_nids[4] = {
6712         /* front, rear, clfe, rear_surr */
6713         0x02, 0x03, 0x04, 0x05
6714 };
6715 #define alc883_dac_nids         alc882_dac_nids
6716
6717 /* ADCs */
6718 #define alc882_adc_nids         alc880_adc_nids
6719 #define alc882_adc_nids_alt     alc880_adc_nids_alt
6720 #define alc883_adc_nids         alc882_adc_nids_alt
6721 static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
6722 static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
6723 #define alc889_adc_nids         alc880_adc_nids
6724
6725 static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
6726 static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
6727 #define alc883_capsrc_nids      alc882_capsrc_nids_alt
6728 static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
6729 #define alc889_capsrc_nids      alc882_capsrc_nids
6730
6731 /* input MUX */
6732 /* FIXME: should be a matrix-type input source selection */
6733
6734 static struct hda_input_mux alc882_capture_source = {
6735         .num_items = 4,
6736         .items = {
6737                 { "Mic", 0x0 },
6738                 { "Front Mic", 0x1 },
6739                 { "Line", 0x2 },
6740                 { "CD", 0x4 },
6741         },
6742 };
6743
6744 #define alc883_capture_source   alc882_capture_source
6745
6746 static struct hda_input_mux alc889_capture_source = {
6747         .num_items = 3,
6748         .items = {
6749                 { "Front Mic", 0x0 },
6750                 { "Mic", 0x3 },
6751                 { "Line", 0x2 },
6752         },
6753 };
6754
6755 static struct hda_input_mux mb5_capture_source = {
6756         .num_items = 3,
6757         .items = {
6758                 { "Mic", 0x1 },
6759                 { "Line", 0x2 },
6760                 { "CD", 0x4 },
6761         },
6762 };
6763
6764 static struct hda_input_mux macmini3_capture_source = {
6765         .num_items = 2,
6766         .items = {
6767                 { "Line", 0x2 },
6768                 { "CD", 0x4 },
6769         },
6770 };
6771
6772 static struct hda_input_mux alc883_3stack_6ch_intel = {
6773         .num_items = 4,
6774         .items = {
6775                 { "Mic", 0x1 },
6776                 { "Front Mic", 0x0 },
6777                 { "Line", 0x2 },
6778                 { "CD", 0x4 },
6779         },
6780 };
6781
6782 static struct hda_input_mux alc883_lenovo_101e_capture_source = {
6783         .num_items = 2,
6784         .items = {
6785                 { "Mic", 0x1 },
6786                 { "Line", 0x2 },
6787         },
6788 };
6789
6790 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
6791         .num_items = 4,
6792         .items = {
6793                 { "Mic", 0x0 },
6794                 { "iMic", 0x1 },
6795                 { "Line", 0x2 },
6796                 { "CD", 0x4 },
6797         },
6798 };
6799
6800 static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
6801         .num_items = 2,
6802         .items = {
6803                 { "Mic", 0x0 },
6804                 { "Int Mic", 0x1 },
6805         },
6806 };
6807
6808 static struct hda_input_mux alc883_lenovo_sky_capture_source = {
6809         .num_items = 3,
6810         .items = {
6811                 { "Mic", 0x0 },
6812                 { "Front Mic", 0x1 },
6813                 { "Line", 0x4 },
6814         },
6815 };
6816
6817 static struct hda_input_mux alc883_asus_eee1601_capture_source = {
6818         .num_items = 2,
6819         .items = {
6820                 { "Mic", 0x0 },
6821                 { "Line", 0x2 },
6822         },
6823 };
6824
6825 static struct hda_input_mux alc889A_mb31_capture_source = {
6826         .num_items = 2,
6827         .items = {
6828                 { "Mic", 0x0 },
6829                 /* Front Mic (0x01) unused */
6830                 { "Line", 0x2 },
6831                 /* Line 2 (0x03) unused */
6832                 /* CD (0x04) unused? */
6833         },
6834 };
6835
6836 /*
6837  * 2ch mode
6838  */
6839 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
6840         { 2, NULL }
6841 };
6842
6843 /*
6844  * 2ch mode
6845  */
6846 static struct hda_verb alc882_3ST_ch2_init[] = {
6847         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6848         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6849         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6850         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6851         { } /* end */
6852 };
6853
6854 /*
6855  * 4ch mode
6856  */
6857 static struct hda_verb alc882_3ST_ch4_init[] = {
6858         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6859         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6860         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6861         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6862         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6863         { } /* end */
6864 };
6865
6866 /*
6867  * 6ch mode
6868  */
6869 static struct hda_verb alc882_3ST_ch6_init[] = {
6870         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6871         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6872         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6873         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6874         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6875         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6876         { } /* end */
6877 };
6878
6879 static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
6880         { 2, alc882_3ST_ch2_init },
6881         { 4, alc882_3ST_ch4_init },
6882         { 6, alc882_3ST_ch6_init },
6883 };
6884
6885 #define alc883_3ST_6ch_modes    alc882_3ST_6ch_modes
6886
6887 /*
6888  * 2ch mode
6889  */
6890 static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
6891         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
6892         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6893         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6894         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6895         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6896         { } /* end */
6897 };
6898
6899 /*
6900  * 4ch mode
6901  */
6902 static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
6903         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6904         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6905         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6906         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6907         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6908         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6909         { } /* end */
6910 };
6911
6912 /*
6913  * 6ch mode
6914  */
6915 static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
6916         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6917         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6918         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6919         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6920         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6921         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6922         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6923         { } /* end */
6924 };
6925
6926 static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
6927         { 2, alc883_3ST_ch2_clevo_init },
6928         { 4, alc883_3ST_ch4_clevo_init },
6929         { 6, alc883_3ST_ch6_clevo_init },
6930 };
6931
6932
6933 /*
6934  * 6ch mode
6935  */
6936 static struct hda_verb alc882_sixstack_ch6_init[] = {
6937         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
6938         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6939         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6940         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6941         { } /* end */
6942 };
6943
6944 /*
6945  * 8ch mode
6946  */
6947 static struct hda_verb alc882_sixstack_ch8_init[] = {
6948         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6949         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6950         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6951         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6952         { } /* end */
6953 };
6954
6955 static struct hda_channel_mode alc882_sixstack_modes[2] = {
6956         { 6, alc882_sixstack_ch6_init },
6957         { 8, alc882_sixstack_ch8_init },
6958 };
6959
6960
6961 /* Macbook Air 2,1 */
6962
6963 static struct hda_channel_mode alc885_mba21_ch_modes[1] = {
6964       { 2, NULL },
6965 };
6966
6967 /*
6968  * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
6969  */
6970
6971 /*
6972  * 2ch mode
6973  */
6974 static struct hda_verb alc885_mbp_ch2_init[] = {
6975         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6976         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6977         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6978         { } /* end */
6979 };
6980
6981 /*
6982  * 4ch mode
6983  */
6984 static struct hda_verb alc885_mbp_ch4_init[] = {
6985         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6986         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6987         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6988         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6989         { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6990         { } /* end */
6991 };
6992
6993 static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
6994         { 2, alc885_mbp_ch2_init },
6995         { 4, alc885_mbp_ch4_init },
6996 };
6997
6998 /*
6999  * 2ch
7000  * Speakers/Woofer/HP = Front
7001  * LineIn = Input
7002  */
7003 static struct hda_verb alc885_mb5_ch2_init[] = {
7004         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7005         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7006         { } /* end */
7007 };
7008
7009 /*
7010  * 6ch mode
7011  * Speakers/HP = Front
7012  * Woofer = LFE
7013  * LineIn = Surround
7014  */
7015 static struct hda_verb alc885_mb5_ch6_init[] = {
7016         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7017         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7018         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7019         { } /* end */
7020 };
7021
7022 static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
7023         { 2, alc885_mb5_ch2_init },
7024         { 6, alc885_mb5_ch6_init },
7025 };
7026
7027 #define alc885_macmini3_6ch_modes       alc885_mb5_6ch_modes
7028
7029 /*
7030  * 2ch mode
7031  */
7032 static struct hda_verb alc883_4ST_ch2_init[] = {
7033         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7034         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7035         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7036         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7037         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7038         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7039         { } /* end */
7040 };
7041
7042 /*
7043  * 4ch mode
7044  */
7045 static struct hda_verb alc883_4ST_ch4_init[] = {
7046         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7047         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7048         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7049         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7050         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7051         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7052         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7053         { } /* end */
7054 };
7055
7056 /*
7057  * 6ch mode
7058  */
7059 static struct hda_verb alc883_4ST_ch6_init[] = {
7060         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7061         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7062         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7063         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7064         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7065         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7066         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7067         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7068         { } /* end */
7069 };
7070
7071 /*
7072  * 8ch mode
7073  */
7074 static struct hda_verb alc883_4ST_ch8_init[] = {
7075         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7076         { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7077         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7078         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7079         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7080         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7081         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7082         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7083         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7084         { } /* end */
7085 };
7086
7087 static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
7088         { 2, alc883_4ST_ch2_init },
7089         { 4, alc883_4ST_ch4_init },
7090         { 6, alc883_4ST_ch6_init },
7091         { 8, alc883_4ST_ch8_init },
7092 };
7093
7094
7095 /*
7096  * 2ch mode
7097  */
7098 static struct hda_verb alc883_3ST_ch2_intel_init[] = {
7099         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7100         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7101         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7102         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7103         { } /* end */
7104 };
7105
7106 /*
7107  * 4ch mode
7108  */
7109 static struct hda_verb alc883_3ST_ch4_intel_init[] = {
7110         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7111         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7112         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7113         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7114         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7115         { } /* end */
7116 };
7117
7118 /*
7119  * 6ch mode
7120  */
7121 static struct hda_verb alc883_3ST_ch6_intel_init[] = {
7122         { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7123         { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7124         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
7125         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7126         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7127         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7128         { } /* end */
7129 };
7130
7131 static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7132         { 2, alc883_3ST_ch2_intel_init },
7133         { 4, alc883_3ST_ch4_intel_init },
7134         { 6, alc883_3ST_ch6_intel_init },
7135 };
7136
7137 /*
7138  * 2ch mode
7139  */
7140 static struct hda_verb alc889_ch2_intel_init[] = {
7141         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7142         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
7143         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
7144         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
7145         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7146         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7147         { } /* end */
7148 };
7149
7150 /*
7151  * 6ch mode
7152  */
7153 static struct hda_verb alc889_ch6_intel_init[] = {
7154         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7155         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7156         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7157         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7158         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7159         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7160         { } /* end */
7161 };
7162
7163 /*
7164  * 8ch mode
7165  */
7166 static struct hda_verb alc889_ch8_intel_init[] = {
7167         { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7168         { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7169         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7170         { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7171         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
7172         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7173         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7174         { } /* end */
7175 };
7176
7177 static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7178         { 2, alc889_ch2_intel_init },
7179         { 6, alc889_ch6_intel_init },
7180         { 8, alc889_ch8_intel_init },
7181 };
7182
7183 /*
7184  * 6ch mode
7185  */
7186 static struct hda_verb alc883_sixstack_ch6_init[] = {
7187         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7188         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7189         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7190         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7191         { } /* end */
7192 };
7193
7194 /*
7195  * 8ch mode
7196  */
7197 static struct hda_verb alc883_sixstack_ch8_init[] = {
7198         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7199         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7200         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7201         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7202         { } /* end */
7203 };
7204
7205 static struct hda_channel_mode alc883_sixstack_modes[2] = {
7206         { 6, alc883_sixstack_ch6_init },
7207         { 8, alc883_sixstack_ch8_init },
7208 };
7209
7210
7211 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7212  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7213  */
7214 static struct snd_kcontrol_new alc882_base_mixer[] = {
7215         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7216         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7217         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7218         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7219         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7220         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7221         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7222         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7223         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7224         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7225         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7226         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7227         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7228         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7229         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7230         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7231         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7232         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7233         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7234         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7235         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7236         { } /* end */
7237 };
7238
7239 /* Macbook Air 2,1 same control for HP and internal Speaker */
7240
7241 static struct snd_kcontrol_new alc885_mba21_mixer[] = {
7242       HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7243       HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
7244      { }
7245 };
7246
7247
7248 static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7249         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7250         HDA_BIND_MUTE   ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7251         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7252         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7253         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7254         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7255         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7256         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7257         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7258         HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
7259         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7260         { } /* end */
7261 };
7262
7263 static struct snd_kcontrol_new alc885_mb5_mixer[] = {
7264         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7265         HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7266         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7267         HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7268         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7269         HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7270         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7271         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7272         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7273         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7274         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7275         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7276         HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7277         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7278         { } /* end */
7279 };
7280
7281 static struct snd_kcontrol_new alc885_macmini3_mixer[] = {
7282         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7283         HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7284         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7285         HDA_BIND_MUTE   ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7286         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7287         HDA_BIND_MUTE   ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7288         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7289         HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7290         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7291         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
7292         HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7293         { } /* end */
7294 };
7295
7296 static struct snd_kcontrol_new alc885_imac91_mixer[] = {
7297         HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7298         HDA_BIND_MUTE   ("Line-Out Playback Switch", 0x0c, 0x02, HDA_INPUT),
7299         HDA_CODEC_MUTE  ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT),
7300         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7301         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7302         HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7303         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7304         HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7305         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7306         { } /* end */
7307 };
7308
7309
7310 static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7311         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7312         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7313         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7314         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7315         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7316         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7317         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7318         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7319         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7320         { } /* end */
7321 };
7322
7323 static struct snd_kcontrol_new alc882_targa_mixer[] = {
7324         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7325         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7326         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7327         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7328         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7329         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7330         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7331         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7332         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7333         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7334         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7335         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7336         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7337         { } /* end */
7338 };
7339
7340 /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7341  *                 Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7342  */
7343 static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7344         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7345         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7346         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7347         HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7348         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7349         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7350         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7351         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7352         HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7353         HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7354         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7355         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7356         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7357         { } /* end */
7358 };
7359
7360 static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7361         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7362         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7363         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7364         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7365         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7366         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7367         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7368         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7369         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7370         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7371         { } /* end */
7372 };
7373
7374 static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7375         {
7376                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7377                 .name = "Channel Mode",
7378                 .info = alc_ch_mode_info,
7379                 .get = alc_ch_mode_get,
7380                 .put = alc_ch_mode_put,
7381         },
7382         { } /* end */
7383 };
7384
7385 static struct hda_verb alc882_base_init_verbs[] = {
7386         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7387         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7388         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7389         /* Rear mixer */
7390         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7391         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7392         /* CLFE mixer */
7393         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7394         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7395         /* Side mixer */
7396         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7397         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7398
7399         /* Front Pin: output 0 (0x0c) */
7400         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7401         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7402         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7403         /* Rear Pin: output 1 (0x0d) */
7404         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7405         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7406         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7407         /* CLFE Pin: output 2 (0x0e) */
7408         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7409         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7410         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7411         /* Side Pin: output 3 (0x0f) */
7412         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7413         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7414         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7415         /* Mic (rear) pin: input vref at 80% */
7416         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7417         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7418         /* Front Mic pin: input vref at 80% */
7419         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7420         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7421         /* Line In pin: input */
7422         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7423         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7424         /* Line-2 In: Headphone output (output 0 - 0x0c) */
7425         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7426         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7427         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
7428         /* CD pin widget for input */
7429         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7430
7431         /* FIXME: use matrix-type input source selection */
7432         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7433         /* Input mixer2 */
7434         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7435         /* Input mixer3 */
7436         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7437         /* ADC2: mute amp left and right */
7438         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7439         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7440         /* ADC3: mute amp left and right */
7441         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7442         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7443
7444         { }
7445 };
7446
7447 static struct hda_verb alc882_adc1_init_verbs[] = {
7448         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7449         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7450         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7451         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7452         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7453         /* ADC1: mute amp left and right */
7454         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7455         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7456         { }
7457 };
7458
7459 static struct hda_verb alc882_eapd_verbs[] = {
7460         /* change to EAPD mode */
7461         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7462         {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
7463         { }
7464 };
7465
7466 static struct hda_verb alc889_eapd_verbs[] = {
7467         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7468         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7469         { }
7470 };
7471
7472 static struct hda_verb alc_hp15_unsol_verbs[] = {
7473         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7474         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7475         {}
7476 };
7477
7478 static struct hda_verb alc885_init_verbs[] = {
7479         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7480         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7481         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7482         /* Rear mixer */
7483         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7484         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7485         /* CLFE mixer */
7486         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7487         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7488         /* Side mixer */
7489         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7490         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7491
7492         /* Front HP Pin: output 0 (0x0c) */
7493         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7494         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7495         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7496         /* Front Pin: output 0 (0x0c) */
7497         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7498         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7499         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7500         /* Rear Pin: output 1 (0x0d) */
7501         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7502         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7503         {0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7504         /* CLFE Pin: output 2 (0x0e) */
7505         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7506         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7507         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7508         /* Side Pin: output 3 (0x0f) */
7509         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7510         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7511         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7512         /* Mic (rear) pin: input vref at 80% */
7513         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7514         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7515         /* Front Mic pin: input vref at 80% */
7516         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7517         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7518         /* Line In pin: input */
7519         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7520         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7521
7522         /* Mixer elements: 0x18, , 0x1a, 0x1b */
7523         /* Input mixer1 */
7524         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7525         /* Input mixer2 */
7526         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7527         /* Input mixer3 */
7528         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7529         /* ADC2: mute amp left and right */
7530         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7531         /* ADC3: mute amp left and right */
7532         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7533
7534         { }
7535 };
7536
7537 static struct hda_verb alc885_init_input_verbs[] = {
7538         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7539         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7540         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7541         { }
7542 };
7543
7544
7545 /* Unmute Selector 24h and set the default input to front mic */
7546 static struct hda_verb alc889_init_input_verbs[] = {
7547         {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7548         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7549         { }
7550 };
7551
7552
7553 #define alc883_init_verbs       alc882_base_init_verbs
7554
7555 /* Mac Pro test */
7556 static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7557         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7558         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7559         HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7560         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7561         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
7562         /* FIXME: this looks suspicious...
7563         HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
7564         HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
7565         */
7566         { } /* end */
7567 };
7568
7569 static struct hda_verb alc882_macpro_init_verbs[] = {
7570         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7571         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7572         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7573         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7574         /* Front Pin: output 0 (0x0c) */
7575         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7576         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7577         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7578         /* Front Mic pin: input vref at 80% */
7579         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7580         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7581         /* Speaker:  output */
7582         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7583         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7584         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7585         /* Headphone output (output 0 - 0x0c) */
7586         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7587         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7588         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7589
7590         /* FIXME: use matrix-type input source selection */
7591         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7592         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7593         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7594         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7595         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7596         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7597         /* Input mixer2 */
7598         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7599         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7600         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7601         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7602         /* Input mixer3 */
7603         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7604         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7605         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7606         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7607         /* ADC1: mute amp left and right */
7608         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7609         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7610         /* ADC2: mute amp left and right */
7611         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7612         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7613         /* ADC3: mute amp left and right */
7614         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7615         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7616
7617         { }
7618 };
7619
7620 /* Macbook 5,1 */
7621 static struct hda_verb alc885_mb5_init_verbs[] = {
7622         /* DACs */
7623         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7624         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7625         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7626         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7627         /* Front mixer */
7628         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7629         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7630         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7631         /* Surround mixer */
7632         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7633         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7634         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7635         /* LFE mixer */
7636         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7637         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7638         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7639         /* HP mixer */
7640         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7641         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7642         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7643         /* Front Pin (0x0c) */
7644         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7645         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7646         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7647         /* LFE Pin (0x0e) */
7648         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7649         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7650         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7651         /* HP Pin (0x0f) */
7652         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7653         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7654         {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7655         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7656         /* Front Mic pin: input vref at 80% */
7657         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7658         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7659         /* Line In pin */
7660         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7661         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7662
7663         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7664         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7665         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7666         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7667         { }
7668 };
7669
7670 /* Macmini 3,1 */
7671 static struct hda_verb alc885_macmini3_init_verbs[] = {
7672         /* DACs */
7673         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7674         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7675         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7676         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7677         /* Front mixer */
7678         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7679         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7680         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7681         /* Surround mixer */
7682         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7683         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7684         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7685         /* LFE mixer */
7686         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7687         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7688         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7689         /* HP mixer */
7690         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7691         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7692         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7693         /* Front Pin (0x0c) */
7694         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7695         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7696         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7697         /* LFE Pin (0x0e) */
7698         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7699         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7700         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7701         /* HP Pin (0x0f) */
7702         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7703         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7704         {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7705         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7706         /* Line In pin */
7707         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7708         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7709
7710         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7711         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7712         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7713         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7714         { }
7715 };
7716
7717
7718 static struct hda_verb alc885_mba21_init_verbs[] = {
7719         /*Internal and HP Speaker Mixer*/
7720         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7721         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7722         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7723         /*Internal Speaker Pin (0x0c)*/
7724         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
7725         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7726         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7727         /* HP Pin: output 0 (0x0e) */
7728         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7729         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7730         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7731         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
7732         /* Line in (is hp when jack connected)*/
7733         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
7734         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7735
7736         { }
7737  };
7738
7739
7740 /* Macbook Pro rev3 */
7741 static struct hda_verb alc885_mbp3_init_verbs[] = {
7742         /* Front mixer: unmute input/output amp left and right (volume = 0) */
7743         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7744         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7745         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7746         /* Rear mixer */
7747         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7748         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7749         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7750         /* HP mixer */
7751         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7752         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7753         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7754         /* Front Pin: output 0 (0x0c) */
7755         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7756         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7757         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7758         /* HP Pin: output 0 (0x0e) */
7759         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7760         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7761         {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
7762         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7763         /* Mic (rear) pin: input vref at 80% */
7764         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7765         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7766         /* Front Mic pin: input vref at 80% */
7767         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7768         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7769         /* Line In pin: use output 1 when in LineOut mode */
7770         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7771         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7772         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7773
7774         /* FIXME: use matrix-type input source selection */
7775         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7776         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7777         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7778         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7779         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7780         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7781         /* Input mixer2 */
7782         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7783         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7784         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7785         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7786         /* Input mixer3 */
7787         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7788         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7789         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7790         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7791         /* ADC1: mute amp left and right */
7792         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7793         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7794         /* ADC2: mute amp left and right */
7795         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7796         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7797         /* ADC3: mute amp left and right */
7798         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7799         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7800
7801         { }
7802 };
7803
7804 /* iMac 9,1 */
7805 static struct hda_verb alc885_imac91_init_verbs[] = {
7806         /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
7807         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7808         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7809         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7810         /* Rear mixer */
7811         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7812         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7813         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7814         /* HP Pin: output 0 (0x0c) */
7815         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7816         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7817         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7818         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7819         /* Internal Speakers: output 0 (0x0d) */
7820         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7821         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7822         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7823         /* Mic (rear) pin: input vref at 80% */
7824         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7825         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7826         /* Front Mic pin: input vref at 80% */
7827         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7828         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7829         /* Line In pin: use output 1 when in LineOut mode */
7830         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7831         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7832         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7833
7834         /* FIXME: use matrix-type input source selection */
7835         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7836         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7837         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7838         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7839         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7840         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7841         /* Input mixer2 */
7842         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7843         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7844         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7845         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7846         /* Input mixer3 */
7847         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7848         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7849         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7850         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7851         /* ADC1: mute amp left and right */
7852         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7853         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7854         /* ADC2: mute amp left and right */
7855         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7856         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7857         /* ADC3: mute amp left and right */
7858         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7859         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7860
7861         { }
7862 };
7863
7864 /* iMac 24 mixer. */
7865 static struct snd_kcontrol_new alc885_imac24_mixer[] = {
7866         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7867         HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
7868         { } /* end */
7869 };
7870
7871 /* iMac 24 init verbs. */
7872 static struct hda_verb alc885_imac24_init_verbs[] = {
7873         /* Internal speakers: output 0 (0x0c) */
7874         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7875         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7876         {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7877         /* Internal speakers: output 0 (0x0c) */
7878         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7879         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7880         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
7881         /* Headphone: output 0 (0x0c) */
7882         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7883         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7884         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7885         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7886         /* Front Mic: input vref at 80% */
7887         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7888         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7889         { }
7890 };
7891
7892 /* Toggle speaker-output according to the hp-jack state */
7893 static void alc885_imac24_setup(struct hda_codec *codec)
7894 {
7895         struct alc_spec *spec = codec->spec;
7896
7897         spec->autocfg.hp_pins[0] = 0x14;
7898         spec->autocfg.speaker_pins[0] = 0x18;
7899         spec->autocfg.speaker_pins[1] = 0x1a;
7900 }
7901
7902 #define alc885_mb5_setup        alc885_imac24_setup
7903 #define alc885_macmini3_setup   alc885_imac24_setup
7904
7905 /* Macbook Air 2,1 */
7906 static void alc885_mba21_setup(struct hda_codec *codec)
7907 {
7908        struct alc_spec *spec = codec->spec;
7909
7910        spec->autocfg.hp_pins[0] = 0x14;
7911        spec->autocfg.speaker_pins[0] = 0x18;
7912 }
7913
7914
7915
7916 static void alc885_mbp3_setup(struct hda_codec *codec)
7917 {
7918         struct alc_spec *spec = codec->spec;
7919
7920         spec->autocfg.hp_pins[0] = 0x15;
7921         spec->autocfg.speaker_pins[0] = 0x14;
7922 }
7923
7924 static void alc885_imac91_setup(struct hda_codec *codec)
7925 {
7926         struct alc_spec *spec = codec->spec;
7927
7928         spec->autocfg.hp_pins[0] = 0x14;
7929         spec->autocfg.speaker_pins[0] = 0x15;
7930         spec->autocfg.speaker_pins[1] = 0x1a;
7931 }
7932
7933 static struct hda_verb alc882_targa_verbs[] = {
7934         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7935         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7936
7937         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7938         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7939
7940         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7941         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7942         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7943
7944         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7945         { } /* end */
7946 };
7947
7948 /* toggle speaker-output according to the hp-jack state */
7949 static void alc882_targa_automute(struct hda_codec *codec)
7950 {
7951         struct alc_spec *spec = codec->spec;
7952         alc_automute_amp(codec);
7953         snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
7954                                   spec->jack_present ? 1 : 3);
7955 }
7956
7957 static void alc882_targa_setup(struct hda_codec *codec)
7958 {
7959         struct alc_spec *spec = codec->spec;
7960
7961         spec->autocfg.hp_pins[0] = 0x14;
7962         spec->autocfg.speaker_pins[0] = 0x1b;
7963 }
7964
7965 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
7966 {
7967         if ((res >> 26) == ALC880_HP_EVENT)
7968                 alc882_targa_automute(codec);
7969 }
7970
7971 static struct hda_verb alc882_asus_a7j_verbs[] = {
7972         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7973         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7974
7975         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7976         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7977         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7978
7979         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7980         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7981         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7982
7983         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7984         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7985         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7986         { } /* end */
7987 };
7988
7989 static struct hda_verb alc882_asus_a7m_verbs[] = {
7990         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7991         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7992
7993         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7994         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7995         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7996
7997         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7998         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7999         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8000
8001         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8002         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8003         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8004         { } /* end */
8005 };
8006
8007 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
8008 {
8009         unsigned int gpiostate, gpiomask, gpiodir;
8010
8011         gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
8012                                        AC_VERB_GET_GPIO_DATA, 0);
8013
8014         if (!muted)
8015                 gpiostate |= (1 << pin);
8016         else
8017                 gpiostate &= ~(1 << pin);
8018
8019         gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
8020                                       AC_VERB_GET_GPIO_MASK, 0);
8021         gpiomask |= (1 << pin);
8022
8023         gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
8024                                      AC_VERB_GET_GPIO_DIRECTION, 0);
8025         gpiodir |= (1 << pin);
8026
8027
8028         snd_hda_codec_write(codec, codec->afg, 0,
8029                             AC_VERB_SET_GPIO_MASK, gpiomask);
8030         snd_hda_codec_write(codec, codec->afg, 0,
8031                             AC_VERB_SET_GPIO_DIRECTION, gpiodir);
8032
8033         msleep(1);
8034
8035         snd_hda_codec_write(codec, codec->afg, 0,
8036                             AC_VERB_SET_GPIO_DATA, gpiostate);
8037 }
8038
8039 /* set up GPIO at initialization */
8040 static void alc885_macpro_init_hook(struct hda_codec *codec)
8041 {
8042         alc882_gpio_mute(codec, 0, 0);
8043         alc882_gpio_mute(codec, 1, 0);
8044 }
8045
8046 /* set up GPIO and update auto-muting at initialization */
8047 static void alc885_imac24_init_hook(struct hda_codec *codec)
8048 {
8049         alc885_macpro_init_hook(codec);
8050         alc_automute_amp(codec);
8051 }
8052
8053 /*
8054  * generic initialization of ADC, input mixers and output mixers
8055  */
8056 static struct hda_verb alc883_auto_init_verbs[] = {
8057         /*
8058          * Unmute ADC0-2 and set the default input to mic-in
8059          */
8060         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8061         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8062         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8063         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8064
8065         /*
8066          * Set up output mixers (0x0c - 0x0f)
8067          */
8068         /* set vol=0 to output mixers */
8069         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8070         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8071         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8072         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8073         /* set up input amps for analog loopback */
8074         /* Amp Indices: DAC = 0, mixer = 1 */
8075         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8076         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8077         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8078         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8079         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8080         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8081         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8082         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8083         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8084         {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8085
8086         /* FIXME: use matrix-type input source selection */
8087         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8088         /* Input mixer2 */
8089         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8090         /* Input mixer3 */
8091         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8092         { }
8093 };
8094
8095 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
8096 static struct hda_verb alc889A_mb31_ch2_init[] = {
8097         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8098         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8099         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8100         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8101         { } /* end */
8102 };
8103
8104 /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
8105 static struct hda_verb alc889A_mb31_ch4_init[] = {
8106         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},             /* HP as front */
8107         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8108         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8109         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8110         { } /* end */
8111 };
8112
8113 /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
8114 static struct hda_verb alc889A_mb31_ch5_init[] = {
8115         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as rear */
8116         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8117         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},    /* Line as input */
8118         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Line off */
8119         { } /* end */
8120 };
8121
8122 /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
8123 static struct hda_verb alc889A_mb31_ch6_init[] = {
8124         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},             /* HP as front */
8125         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},   /* Subwoofer off */
8126         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},   /* Line as output */
8127         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8128         { } /* end */
8129 };
8130
8131 static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
8132         { 2, alc889A_mb31_ch2_init },
8133         { 4, alc889A_mb31_ch4_init },
8134         { 5, alc889A_mb31_ch5_init },
8135         { 6, alc889A_mb31_ch6_init },
8136 };
8137
8138 static struct hda_verb alc883_medion_eapd_verbs[] = {
8139         /* eanable EAPD on medion laptop */
8140         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8141         {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
8142         { }
8143 };
8144
8145 #define alc883_base_mixer       alc882_base_mixer
8146
8147 static struct snd_kcontrol_new alc883_mitac_mixer[] = {
8148         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8149         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8150         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8151         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8152         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8153         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8154         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8155         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8156         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8157         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8158         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8159         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8160         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8161         { } /* end */
8162 };
8163
8164 static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
8165         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8166         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8167         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8168         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8169         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8170         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8171         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8172         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8173         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8174         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8175         { } /* end */
8176 };
8177
8178 static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8179         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8180         HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8181         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8182         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8183         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8184         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8185         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8186         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8187         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8188         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8189         { } /* end */
8190 };
8191
8192 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8193         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8194         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8195         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8196         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8197         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8198         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8199         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8200         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8201         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8202         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8203         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8204         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8205         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8206         { } /* end */
8207 };
8208
8209 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8210         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8211         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8212         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8213         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8214         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8215         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8216         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8217         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8218         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8219         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8220         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8221         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8222         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8223         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8224         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8225         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8226         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8227         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8228         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8229         { } /* end */
8230 };
8231
8232 static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8233         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8234         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8235         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8236         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8237         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8238                               HDA_OUTPUT),
8239         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8240         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8241         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8242         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8243         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8244         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8245         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8246         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8247         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8248         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8249         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8250         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8251         HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8252         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8253         { } /* end */
8254 };
8255
8256 static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8257         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8258         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8259         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8260         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8261         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8262                               HDA_OUTPUT),
8263         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8264         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8265         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8266         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8267         HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
8268         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8269         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8270         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8271         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
8272         HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
8273         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
8274         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8275         HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8276         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8277         { } /* end */
8278 };
8279
8280 static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
8281         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8282         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8283         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8284         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8285         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8286         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8287         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8288         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8289         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8290         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8291         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8292         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8293         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8294         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8295         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8296         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8297         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8298         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8299         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8300         { } /* end */
8301 };
8302
8303 static struct snd_kcontrol_new alc883_targa_mixer[] = {
8304         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8305         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8306         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8307         HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8308         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8309         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8310         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8311         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8312         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8313         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8314         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8315         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8316         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8317         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8318         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8319         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8320         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8321         { } /* end */
8322 };
8323
8324 static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
8325         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8326         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8327         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8328         HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8329         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8330         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8331         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8332         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8333         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8334         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8335         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8336         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8337         { } /* end */
8338 };
8339
8340 static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
8341         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8342         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8343         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8344         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8345         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8346         { } /* end */
8347 };
8348
8349 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
8350         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8351         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8352         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8353         HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8354         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8355         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8356         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8357         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8358         { } /* end */
8359 };
8360
8361 static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
8362         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8363         HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
8364         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8365         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8366         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8367         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8368         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8369         HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8370         HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8371         { } /* end */
8372 };
8373
8374 static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8375         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8376         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8377         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8378         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8379         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8380         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8381         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8382         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8383         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8384         { } /* end */
8385 };
8386
8387 static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
8388         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8389         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8390         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8391         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8392         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8393         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8394         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8395         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8396         { } /* end */
8397 };
8398
8399 static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8400         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8401         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8402         HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8403         HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, HDA_INPUT),
8404         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8405         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8406         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8407         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8408         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8409         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8410         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8411         { } /* end */
8412 };
8413
8414 static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8415         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8416         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8417         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8418         HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8419         HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8420                                                 0x0d, 1, 0x0, HDA_OUTPUT),
8421         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8422         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8423         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8424         HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8425         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8426         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8427         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8428         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8429         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8430         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8431         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8432         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8433         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8434         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8435         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8436         { } /* end */
8437 };
8438
8439 static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8440         /* Output mixers */
8441         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8442         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8443         HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8444         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8445         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8446                 HDA_OUTPUT),
8447         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8448         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8449         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8450         /* Output switches */
8451         HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8452         HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8453         HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8454         /* Boost mixers */
8455         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8456         HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8457         /* Input mixers */
8458         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8459         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8460         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8461         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8462         { } /* end */
8463 };
8464
8465 static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8466         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8467         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8468         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8469         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8470         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8471         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8472         { } /* end */
8473 };
8474
8475 static struct hda_bind_ctls alc883_bind_cap_vol = {
8476         .ops = &snd_hda_bind_vol,
8477         .values = {
8478                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8479                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8480                 0
8481         },
8482 };
8483
8484 static struct hda_bind_ctls alc883_bind_cap_switch = {
8485         .ops = &snd_hda_bind_sw,
8486         .values = {
8487                 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8488                 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8489                 0
8490         },
8491 };
8492
8493 static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8494         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8495         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8496         HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8497         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8498         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8499         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8500         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8501         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8502         { } /* end */
8503 };
8504
8505 static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8506         HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8507         HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8508         {
8509                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8510                 /* .name = "Capture Source", */
8511                 .name = "Input Source",
8512                 .count = 1,
8513                 .info = alc_mux_enum_info,
8514                 .get = alc_mux_enum_get,
8515                 .put = alc_mux_enum_put,
8516         },
8517         { } /* end */
8518 };
8519
8520 static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8521         {
8522                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8523                 .name = "Channel Mode",
8524                 .info = alc_ch_mode_info,
8525                 .get = alc_ch_mode_get,
8526                 .put = alc_ch_mode_put,
8527         },
8528         { } /* end */
8529 };
8530
8531 /* toggle speaker-output according to the hp-jack state */
8532 static void alc883_mitac_setup(struct hda_codec *codec)
8533 {
8534         struct alc_spec *spec = codec->spec;
8535
8536         spec->autocfg.hp_pins[0] = 0x15;
8537         spec->autocfg.speaker_pins[0] = 0x14;
8538         spec->autocfg.speaker_pins[1] = 0x17;
8539 }
8540
8541 /* auto-toggle front mic */
8542 /*
8543 static void alc883_mitac_mic_automute(struct hda_codec *codec)
8544 {
8545         unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0;
8546
8547         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8548 }
8549 */
8550
8551 static struct hda_verb alc883_mitac_verbs[] = {
8552         /* HP */
8553         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8554         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8555         /* Subwoofer */
8556         {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8557         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8558
8559         /* enable unsolicited event */
8560         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8561         /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8562
8563         { } /* end */
8564 };
8565
8566 static struct hda_verb alc883_clevo_m540r_verbs[] = {
8567         /* HP */
8568         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8569         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8570         /* Int speaker */
8571         /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8572
8573         /* enable unsolicited event */
8574         /*
8575         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8576         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8577         */
8578
8579         { } /* end */
8580 };
8581
8582 static struct hda_verb alc883_clevo_m720_verbs[] = {
8583         /* HP */
8584         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8585         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8586         /* Int speaker */
8587         {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
8588         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8589
8590         /* enable unsolicited event */
8591         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8592         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8593
8594         { } /* end */
8595 };
8596
8597 static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
8598         /* HP */
8599         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8600         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8601         /* Subwoofer */
8602         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8603         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8604
8605         /* enable unsolicited event */
8606         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8607
8608         { } /* end */
8609 };
8610
8611 static struct hda_verb alc883_targa_verbs[] = {
8612         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8613         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8614
8615         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8616         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8617
8618 /* Connect Line-Out side jack (SPDIF) to Side */
8619         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8620         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8621         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8622 /* Connect Mic jack to CLFE */
8623         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8624         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8625         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
8626 /* Connect Line-in jack to Surround */
8627         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8628         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8629         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8630 /* Connect HP out jack to Front */
8631         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8632         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8633         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8634
8635         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8636
8637         { } /* end */
8638 };
8639
8640 static struct hda_verb alc883_lenovo_101e_verbs[] = {
8641         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8642         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
8643         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
8644         { } /* end */
8645 };
8646
8647 static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
8648         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8649         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8650         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8651         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8652         { } /* end */
8653 };
8654
8655 static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
8656         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8657         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8658         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8659         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
8660         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT    | AC_USRSP_EN},
8661         { } /* end */
8662 };
8663
8664 static struct hda_verb alc883_haier_w66_verbs[] = {
8665         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8666         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8667
8668         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8669
8670         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8671         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8672         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8673         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8674         { } /* end */
8675 };
8676
8677 static struct hda_verb alc888_lenovo_sky_verbs[] = {
8678         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8679         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8680         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8681         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8682         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8683         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8684         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8685         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8686         { } /* end */
8687 };
8688
8689 static struct hda_verb alc888_6st_dell_verbs[] = {
8690         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8691         { }
8692 };
8693
8694 static struct hda_verb alc883_vaiott_verbs[] = {
8695         /* HP */
8696         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8697         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8698
8699         /* enable unsolicited event */
8700         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8701
8702         { } /* end */
8703 };
8704
8705 static void alc888_3st_hp_setup(struct hda_codec *codec)
8706 {
8707         struct alc_spec *spec = codec->spec;
8708
8709         spec->autocfg.hp_pins[0] = 0x1b;
8710         spec->autocfg.speaker_pins[0] = 0x14;
8711         spec->autocfg.speaker_pins[1] = 0x16;
8712         spec->autocfg.speaker_pins[2] = 0x18;
8713 }
8714
8715 static struct hda_verb alc888_3st_hp_verbs[] = {
8716         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Front: output 0 (0x0c) */
8717         {0x16, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Rear : output 1 (0x0d) */
8718         {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},  /* CLFE : output 2 (0x0e) */
8719         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8720         { } /* end */
8721 };
8722
8723 /*
8724  * 2ch mode
8725  */
8726 static struct hda_verb alc888_3st_hp_2ch_init[] = {
8727         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8728         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8729         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
8730         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8731         { } /* end */
8732 };
8733
8734 /*
8735  * 4ch mode
8736  */
8737 static struct hda_verb alc888_3st_hp_4ch_init[] = {
8738         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8739         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8740         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8741         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8742         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8743         { } /* end */
8744 };
8745
8746 /*
8747  * 6ch mode
8748  */
8749 static struct hda_verb alc888_3st_hp_6ch_init[] = {
8750         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8751         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8752         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
8753         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8754         { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8755         { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8756         { } /* end */
8757 };
8758
8759 static struct hda_channel_mode alc888_3st_hp_modes[3] = {
8760         { 2, alc888_3st_hp_2ch_init },
8761         { 4, alc888_3st_hp_4ch_init },
8762         { 6, alc888_3st_hp_6ch_init },
8763 };
8764
8765 /* toggle front-jack and RCA according to the hp-jack state */
8766 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
8767 {
8768         unsigned int present = snd_hda_jack_detect(codec, 0x1b);
8769
8770         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8771                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8772         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8773                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8774 }
8775
8776 /* toggle RCA according to the front-jack state */
8777 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
8778 {
8779         unsigned int present = snd_hda_jack_detect(codec, 0x14);
8780
8781         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8782                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8783 }
8784
8785 static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
8786                                              unsigned int res)
8787 {
8788         if ((res >> 26) == ALC880_HP_EVENT)
8789                 alc888_lenovo_ms7195_front_automute(codec);
8790         if ((res >> 26) == ALC880_FRONT_EVENT)
8791                 alc888_lenovo_ms7195_rca_automute(codec);
8792 }
8793
8794 static struct hda_verb alc883_medion_md2_verbs[] = {
8795         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8796         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8797
8798         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8799
8800         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8801         { } /* end */
8802 };
8803
8804 /* toggle speaker-output according to the hp-jack state */
8805 static void alc883_medion_md2_setup(struct hda_codec *codec)
8806 {
8807         struct alc_spec *spec = codec->spec;
8808
8809         spec->autocfg.hp_pins[0] = 0x14;
8810         spec->autocfg.speaker_pins[0] = 0x15;
8811 }
8812
8813 /* toggle speaker-output according to the hp-jack state */
8814 #define alc883_targa_init_hook          alc882_targa_init_hook
8815 #define alc883_targa_unsol_event        alc882_targa_unsol_event
8816
8817 static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
8818 {
8819         unsigned int present;
8820
8821         present = snd_hda_jack_detect(codec, 0x18);
8822         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
8823                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8824 }
8825
8826 static void alc883_clevo_m720_setup(struct hda_codec *codec)
8827 {
8828         struct alc_spec *spec = codec->spec;
8829
8830         spec->autocfg.hp_pins[0] = 0x15;
8831         spec->autocfg.speaker_pins[0] = 0x14;
8832 }
8833
8834 static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
8835 {
8836         alc_automute_amp(codec);
8837         alc883_clevo_m720_mic_automute(codec);
8838 }
8839
8840 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
8841                                            unsigned int res)
8842 {
8843         switch (res >> 26) {
8844         case ALC880_MIC_EVENT:
8845                 alc883_clevo_m720_mic_automute(codec);
8846                 break;
8847         default:
8848                 alc_automute_amp_unsol_event(codec, res);
8849                 break;
8850         }
8851 }
8852
8853 /* toggle speaker-output according to the hp-jack state */
8854 static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
8855 {
8856         struct alc_spec *spec = codec->spec;
8857
8858         spec->autocfg.hp_pins[0] = 0x14;
8859         spec->autocfg.speaker_pins[0] = 0x15;
8860 }
8861
8862 static void alc883_haier_w66_setup(struct hda_codec *codec)
8863 {
8864         struct alc_spec *spec = codec->spec;
8865
8866         spec->autocfg.hp_pins[0] = 0x1b;
8867         spec->autocfg.speaker_pins[0] = 0x14;
8868 }
8869
8870 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
8871 {
8872         int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
8873
8874         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8875                                  HDA_AMP_MUTE, bits);
8876 }
8877
8878 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
8879 {
8880         int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
8881
8882         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8883                                  HDA_AMP_MUTE, bits);
8884         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8885                                  HDA_AMP_MUTE, bits);
8886 }
8887
8888 static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
8889                                            unsigned int res)
8890 {
8891         if ((res >> 26) == ALC880_HP_EVENT)
8892                 alc883_lenovo_101e_all_automute(codec);
8893         if ((res >> 26) == ALC880_FRONT_EVENT)
8894                 alc883_lenovo_101e_ispeaker_automute(codec);
8895 }
8896
8897 /* toggle speaker-output according to the hp-jack state */
8898 static void alc883_acer_aspire_setup(struct hda_codec *codec)
8899 {
8900         struct alc_spec *spec = codec->spec;
8901
8902         spec->autocfg.hp_pins[0] = 0x14;
8903         spec->autocfg.speaker_pins[0] = 0x15;
8904         spec->autocfg.speaker_pins[1] = 0x16;
8905 }
8906
8907 static struct hda_verb alc883_acer_eapd_verbs[] = {
8908         /* HP Pin: output 0 (0x0c) */
8909         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8910         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8911         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8912         /* Front Pin: output 0 (0x0c) */
8913         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8914         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8915         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8916         {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
8917         /* eanable EAPD on medion laptop */
8918         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8919         {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
8920         /* enable unsolicited event */
8921         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8922         { }
8923 };
8924
8925 static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
8926         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8927         {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8928         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8929         { } /* end */
8930 };
8931
8932 static void alc888_6st_dell_setup(struct hda_codec *codec)
8933 {
8934         struct alc_spec *spec = codec->spec;
8935
8936         spec->autocfg.hp_pins[0] = 0x1b;
8937         spec->autocfg.speaker_pins[0] = 0x14;
8938         spec->autocfg.speaker_pins[1] = 0x15;
8939         spec->autocfg.speaker_pins[2] = 0x16;
8940         spec->autocfg.speaker_pins[3] = 0x17;
8941 }
8942
8943 static void alc888_lenovo_sky_setup(struct hda_codec *codec)
8944 {
8945         struct alc_spec *spec = codec->spec;
8946
8947         spec->autocfg.hp_pins[0] = 0x1b;
8948         spec->autocfg.speaker_pins[0] = 0x14;
8949         spec->autocfg.speaker_pins[1] = 0x15;
8950         spec->autocfg.speaker_pins[2] = 0x16;
8951         spec->autocfg.speaker_pins[3] = 0x17;
8952         spec->autocfg.speaker_pins[4] = 0x1a;
8953 }
8954
8955 static void alc883_vaiott_setup(struct hda_codec *codec)
8956 {
8957         struct alc_spec *spec = codec->spec;
8958
8959         spec->autocfg.hp_pins[0] = 0x15;
8960         spec->autocfg.speaker_pins[0] = 0x14;
8961         spec->autocfg.speaker_pins[1] = 0x17;
8962 }
8963
8964 static struct hda_verb alc888_asus_m90v_verbs[] = {
8965         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8966         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8967         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8968         /* enable unsolicited event */
8969         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8970         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8971         { } /* end */
8972 };
8973
8974 static void alc883_mode2_setup(struct hda_codec *codec)
8975 {
8976         struct alc_spec *spec = codec->spec;
8977
8978         spec->autocfg.hp_pins[0] = 0x1b;
8979         spec->autocfg.speaker_pins[0] = 0x14;
8980         spec->autocfg.speaker_pins[1] = 0x15;
8981         spec->autocfg.speaker_pins[2] = 0x16;
8982         spec->ext_mic.pin = 0x18;
8983         spec->int_mic.pin = 0x19;
8984         spec->ext_mic.mux_idx = 0;
8985         spec->int_mic.mux_idx = 1;
8986         spec->auto_mic = 1;
8987 }
8988
8989 static struct hda_verb alc888_asus_eee1601_verbs[] = {
8990         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8991         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8992         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8993         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8994         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8995         {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
8996         {0x20, AC_VERB_SET_PROC_COEF,  0x0838},
8997         /* enable unsolicited event */
8998         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8999         { } /* end */
9000 };
9001
9002 static void alc883_eee1601_inithook(struct hda_codec *codec)
9003 {
9004         struct alc_spec *spec = codec->spec;
9005
9006         spec->autocfg.hp_pins[0] = 0x14;
9007         spec->autocfg.speaker_pins[0] = 0x1b;
9008         alc_automute_pin(codec);
9009 }
9010
9011 static struct hda_verb alc889A_mb31_verbs[] = {
9012         /* Init rear pin (used as headphone output) */
9013         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},    /* Apple Headphones */
9014         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},           /* Connect to front */
9015         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9016         /* Init line pin (used as output in 4ch and 6ch mode) */
9017         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},           /* Connect to CLFE */
9018         /* Init line 2 pin (used as headphone out by default) */
9019         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},  /* Use as input */
9020         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
9021         { } /* end */
9022 };
9023
9024 /* Mute speakers according to the headphone jack state */
9025 static void alc889A_mb31_automute(struct hda_codec *codec)
9026 {
9027         unsigned int present;
9028
9029         /* Mute only in 2ch or 4ch mode */
9030         if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
9031             == 0x00) {
9032                 present = snd_hda_jack_detect(codec, 0x15);
9033                 snd_hda_codec_amp_stereo(codec, 0x14,  HDA_OUTPUT, 0,
9034                         HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9035                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
9036                         HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9037         }
9038 }
9039
9040 static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
9041 {
9042         if ((res >> 26) == ALC880_HP_EVENT)
9043                 alc889A_mb31_automute(codec);
9044 }
9045
9046
9047 #ifdef CONFIG_SND_HDA_POWER_SAVE
9048 #define alc882_loopbacks        alc880_loopbacks
9049 #endif
9050
9051 /* pcm configuration: identical with ALC880 */
9052 #define alc882_pcm_analog_playback      alc880_pcm_analog_playback
9053 #define alc882_pcm_analog_capture       alc880_pcm_analog_capture
9054 #define alc882_pcm_digital_playback     alc880_pcm_digital_playback
9055 #define alc882_pcm_digital_capture      alc880_pcm_digital_capture
9056
9057 static hda_nid_t alc883_slave_dig_outs[] = {
9058         ALC1200_DIGOUT_NID, 0,
9059 };
9060
9061 static hda_nid_t alc1200_slave_dig_outs[] = {
9062         ALC883_DIGOUT_NID, 0,
9063 };
9064
9065 /*
9066  * configuration and preset
9067  */
9068 static const char *alc882_models[ALC882_MODEL_LAST] = {
9069         [ALC882_3ST_DIG]        = "3stack-dig",
9070         [ALC882_6ST_DIG]        = "6stack-dig",
9071         [ALC882_ARIMA]          = "arima",
9072         [ALC882_W2JC]           = "w2jc",
9073         [ALC882_TARGA]          = "targa",
9074         [ALC882_ASUS_A7J]       = "asus-a7j",
9075         [ALC882_ASUS_A7M]       = "asus-a7m",
9076         [ALC885_MACPRO]         = "macpro",
9077         [ALC885_MB5]            = "mb5",
9078         [ALC885_MACMINI3]       = "macmini3",
9079         [ALC885_MBA21]          = "mba21",
9080         [ALC885_MBP3]           = "mbp3",
9081         [ALC885_IMAC24]         = "imac24",
9082         [ALC885_IMAC91]         = "imac91",
9083         [ALC883_3ST_2ch_DIG]    = "3stack-2ch-dig",
9084         [ALC883_3ST_6ch_DIG]    = "3stack-6ch-dig",
9085         [ALC883_3ST_6ch]        = "3stack-6ch",
9086         [ALC883_6ST_DIG]        = "alc883-6stack-dig",
9087         [ALC883_TARGA_DIG]      = "targa-dig",
9088         [ALC883_TARGA_2ch_DIG]  = "targa-2ch-dig",
9089         [ALC883_TARGA_8ch_DIG]  = "targa-8ch-dig",
9090         [ALC883_ACER]           = "acer",
9091         [ALC883_ACER_ASPIRE]    = "acer-aspire",
9092         [ALC888_ACER_ASPIRE_4930G]      = "acer-aspire-4930g",
9093         [ALC888_ACER_ASPIRE_6530G]      = "acer-aspire-6530g",
9094         [ALC888_ACER_ASPIRE_8930G]      = "acer-aspire-8930g",
9095         [ALC888_ACER_ASPIRE_7730G]      = "acer-aspire-7730g",
9096         [ALC883_MEDION]         = "medion",
9097         [ALC883_MEDION_MD2]     = "medion-md2",
9098         [ALC883_LAPTOP_EAPD]    = "laptop-eapd",
9099         [ALC883_LENOVO_101E_2ch] = "lenovo-101e",
9100         [ALC883_LENOVO_NB0763]  = "lenovo-nb0763",
9101         [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
9102         [ALC888_LENOVO_SKY] = "lenovo-sky",
9103         [ALC883_HAIER_W66]      = "haier-w66",
9104         [ALC888_3ST_HP]         = "3stack-hp",
9105         [ALC888_6ST_DELL]       = "6stack-dell",
9106         [ALC883_MITAC]          = "mitac",
9107         [ALC883_CLEVO_M540R]    = "clevo-m540r",
9108         [ALC883_CLEVO_M720]     = "clevo-m720",
9109         [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
9110         [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
9111         [ALC883_3ST_6ch_INTEL]  = "3stack-6ch-intel",
9112         [ALC889A_INTEL]         = "intel-alc889a",
9113         [ALC889_INTEL]          = "intel-x58",
9114         [ALC1200_ASUS_P5Q]      = "asus-p5q",
9115         [ALC889A_MB31]          = "mb31",
9116         [ALC883_SONY_VAIO_TT]   = "sony-vaio-tt",
9117         [ALC882_AUTO]           = "auto",
9118 };
9119
9120 static struct snd_pci_quirk alc882_cfg_tbl[] = {
9121         SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
9122
9123         SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
9124         SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
9125         SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
9126         SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
9127         SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
9128         SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
9129         SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
9130                 ALC888_ACER_ASPIRE_4930G),
9131         SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
9132                 ALC888_ACER_ASPIRE_4930G),
9133         SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
9134                 ALC888_ACER_ASPIRE_8930G),
9135         SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
9136                 ALC888_ACER_ASPIRE_8930G),
9137         SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
9138         SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
9139         SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
9140                 ALC888_ACER_ASPIRE_6530G),
9141         SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
9142                 ALC888_ACER_ASPIRE_6530G),
9143         SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
9144                 ALC888_ACER_ASPIRE_7730G),
9145         /* default Acer -- disabled as it causes more problems.
9146          *    model=auto should work fine now
9147          */
9148         /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
9149
9150         SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
9151
9152         SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
9153         SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
9154         SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
9155         SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
9156         SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
9157         SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
9158
9159         SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
9160         SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
9161         SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
9162         SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
9163         SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
9164         SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
9165         SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
9166         SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
9167         SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
9168         SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
9169         SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
9170
9171         SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
9172         SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
9173         SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
9174         SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
9175         SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
9176         SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
9177         SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
9178         SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
9179         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
9180
9181         SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
9182         SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
9183         SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
9184         SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */
9185         SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
9186         SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
9187         SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
9188         SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
9189         SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
9190         SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
9191         SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
9192         SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
9193         SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
9194         SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
9195         SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
9196         SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
9197         SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
9198         SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
9199         SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG),
9200         SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
9201         SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
9202         SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
9203         SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
9204         SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
9205         SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
9206         SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
9207         SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
9208         SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
9209         SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG),
9210         SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
9211         SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
9212
9213         SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
9214         SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
9215         SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
9216         SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
9217         SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
9218         SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
9219         /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
9220         SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
9221         SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
9222                       ALC883_FUJITSU_PI2515),
9223         SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
9224                 ALC888_FUJITSU_XA3530),
9225         SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
9226         SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9227         SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9228         SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9229         SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
9230         SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
9231         SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
9232         SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
9233         SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
9234
9235         SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
9236         SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
9237         SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
9238         SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
9239         SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
9240         SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
9241         SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG),
9242
9243         {}
9244 };
9245
9246 /* codec SSID table for Intel Mac */
9247 static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9248         SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9249         SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9250         SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
9251         SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
9252         SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
9253         SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
9254         SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
9255         SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
9256         SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
9257         SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
9258         SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
9259         SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
9260         /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
9261          * so apparently no perfect solution yet
9262          */
9263         SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
9264         SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
9265         SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
9266         {} /* terminator */
9267 };
9268
9269 static struct alc_config_preset alc882_presets[] = {
9270         [ALC882_3ST_DIG] = {
9271                 .mixers = { alc882_base_mixer },
9272                 .init_verbs = { alc882_base_init_verbs,
9273                                 alc882_adc1_init_verbs },
9274                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9275                 .dac_nids = alc882_dac_nids,
9276                 .dig_out_nid = ALC882_DIGOUT_NID,
9277                 .dig_in_nid = ALC882_DIGIN_NID,
9278                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9279                 .channel_mode = alc882_ch_modes,
9280                 .need_dac_fix = 1,
9281                 .input_mux = &alc882_capture_source,
9282         },
9283         [ALC882_6ST_DIG] = {
9284                 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
9285                 .init_verbs = { alc882_base_init_verbs,
9286                                 alc882_adc1_init_verbs },
9287                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9288                 .dac_nids = alc882_dac_nids,
9289                 .dig_out_nid = ALC882_DIGOUT_NID,
9290                 .dig_in_nid = ALC882_DIGIN_NID,
9291                 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9292                 .channel_mode = alc882_sixstack_modes,
9293                 .input_mux = &alc882_capture_source,
9294         },
9295         [ALC882_ARIMA] = {
9296                 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
9297                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9298                                 alc882_eapd_verbs },
9299                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9300                 .dac_nids = alc882_dac_nids,
9301                 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9302                 .channel_mode = alc882_sixstack_modes,
9303                 .input_mux = &alc882_capture_source,
9304         },
9305         [ALC882_W2JC] = {
9306                 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
9307                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9308                                 alc882_eapd_verbs, alc880_gpio1_init_verbs },
9309                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9310                 .dac_nids = alc882_dac_nids,
9311                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9312                 .channel_mode = alc880_threestack_modes,
9313                 .need_dac_fix = 1,
9314                 .input_mux = &alc882_capture_source,
9315                 .dig_out_nid = ALC882_DIGOUT_NID,
9316         },
9317            [ALC885_MBA21] = {
9318                         .mixers = { alc885_mba21_mixer },
9319                         .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
9320                         .num_dacs = 2,
9321                         .dac_nids = alc882_dac_nids,
9322                         .channel_mode = alc885_mba21_ch_modes,
9323                         .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9324                         .input_mux = &alc882_capture_source,
9325                         .unsol_event = alc_automute_amp_unsol_event,
9326                         .setup = alc885_mba21_setup,
9327                         .init_hook = alc_automute_amp,
9328        },
9329         [ALC885_MBP3] = {
9330                 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
9331                 .init_verbs = { alc885_mbp3_init_verbs,
9332                                 alc880_gpio1_init_verbs },
9333                 .num_dacs = 2,
9334                 .dac_nids = alc882_dac_nids,
9335                 .hp_nid = 0x04,
9336                 .channel_mode = alc885_mbp_4ch_modes,
9337                 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9338                 .input_mux = &alc882_capture_source,
9339                 .dig_out_nid = ALC882_DIGOUT_NID,
9340                 .dig_in_nid = ALC882_DIGIN_NID,
9341                 .unsol_event = alc_automute_amp_unsol_event,
9342                 .setup = alc885_mbp3_setup,
9343                 .init_hook = alc_automute_amp,
9344         },
9345         [ALC885_MB5] = {
9346                 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
9347                 .init_verbs = { alc885_mb5_init_verbs,
9348                                 alc880_gpio1_init_verbs },
9349                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9350                 .dac_nids = alc882_dac_nids,
9351                 .channel_mode = alc885_mb5_6ch_modes,
9352                 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
9353                 .input_mux = &mb5_capture_source,
9354                 .dig_out_nid = ALC882_DIGOUT_NID,
9355                 .dig_in_nid = ALC882_DIGIN_NID,
9356                 .unsol_event = alc_automute_amp_unsol_event,
9357                 .setup = alc885_mb5_setup,
9358                 .init_hook = alc_automute_amp,
9359         },
9360         [ALC885_MACMINI3] = {
9361                 .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
9362                 .init_verbs = { alc885_macmini3_init_verbs,
9363                                 alc880_gpio1_init_verbs },
9364                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9365                 .dac_nids = alc882_dac_nids,
9366                 .channel_mode = alc885_macmini3_6ch_modes,
9367                 .num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
9368                 .input_mux = &macmini3_capture_source,
9369                 .dig_out_nid = ALC882_DIGOUT_NID,
9370                 .dig_in_nid = ALC882_DIGIN_NID,
9371                 .unsol_event = alc_automute_amp_unsol_event,
9372                 .setup = alc885_macmini3_setup,
9373                 .init_hook = alc_automute_amp,
9374         },
9375         [ALC885_MACPRO] = {
9376                 .mixers = { alc882_macpro_mixer },
9377                 .init_verbs = { alc882_macpro_init_verbs },
9378                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9379                 .dac_nids = alc882_dac_nids,
9380                 .dig_out_nid = ALC882_DIGOUT_NID,
9381                 .dig_in_nid = ALC882_DIGIN_NID,
9382                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9383                 .channel_mode = alc882_ch_modes,
9384                 .input_mux = &alc882_capture_source,
9385                 .init_hook = alc885_macpro_init_hook,
9386         },
9387         [ALC885_IMAC24] = {
9388                 .mixers = { alc885_imac24_mixer },
9389                 .init_verbs = { alc885_imac24_init_verbs },
9390                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9391                 .dac_nids = alc882_dac_nids,
9392                 .dig_out_nid = ALC882_DIGOUT_NID,
9393                 .dig_in_nid = ALC882_DIGIN_NID,
9394                 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9395                 .channel_mode = alc882_ch_modes,
9396                 .input_mux = &alc882_capture_source,
9397                 .unsol_event = alc_automute_amp_unsol_event,
9398                 .setup = alc885_imac24_setup,
9399                 .init_hook = alc885_imac24_init_hook,
9400         },
9401         [ALC885_IMAC91] = {
9402                 .mixers = { alc885_imac91_mixer, alc882_chmode_mixer },
9403                 .init_verbs = { alc885_imac91_init_verbs,
9404                                 alc880_gpio1_init_verbs },
9405                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9406                 .dac_nids = alc882_dac_nids,
9407                 .channel_mode = alc885_mbp_4ch_modes,
9408                 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9409                 .input_mux = &alc882_capture_source,
9410                 .dig_out_nid = ALC882_DIGOUT_NID,
9411                 .dig_in_nid = ALC882_DIGIN_NID,
9412                 .unsol_event = alc_automute_amp_unsol_event,
9413                 .setup = alc885_imac91_setup,
9414                 .init_hook = alc_automute_amp,
9415         },
9416         [ALC882_TARGA] = {
9417                 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
9418                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9419                                 alc880_gpio3_init_verbs, alc882_targa_verbs},
9420                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9421                 .dac_nids = alc882_dac_nids,
9422                 .dig_out_nid = ALC882_DIGOUT_NID,
9423                 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9424                 .adc_nids = alc882_adc_nids,
9425                 .capsrc_nids = alc882_capsrc_nids,
9426                 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9427                 .channel_mode = alc882_3ST_6ch_modes,
9428                 .need_dac_fix = 1,
9429                 .input_mux = &alc882_capture_source,
9430                 .unsol_event = alc882_targa_unsol_event,
9431                 .setup = alc882_targa_setup,
9432                 .init_hook = alc882_targa_automute,
9433         },
9434         [ALC882_ASUS_A7J] = {
9435                 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
9436                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9437                                 alc882_asus_a7j_verbs},
9438                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9439                 .dac_nids = alc882_dac_nids,
9440                 .dig_out_nid = ALC882_DIGOUT_NID,
9441                 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9442                 .adc_nids = alc882_adc_nids,
9443                 .capsrc_nids = alc882_capsrc_nids,
9444                 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9445                 .channel_mode = alc882_3ST_6ch_modes,
9446                 .need_dac_fix = 1,
9447                 .input_mux = &alc882_capture_source,
9448         },
9449         [ALC882_ASUS_A7M] = {
9450                 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
9451                 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9452                                 alc882_eapd_verbs, alc880_gpio1_init_verbs,
9453                                 alc882_asus_a7m_verbs },
9454                 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9455                 .dac_nids = alc882_dac_nids,
9456                 .dig_out_nid = ALC882_DIGOUT_NID,
9457                 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9458                 .channel_mode = alc880_threestack_modes,
9459                 .need_dac_fix = 1,
9460                 .input_mux = &alc882_capture_source,
9461         },
9462         [ALC883_3ST_2ch_DIG] = {
9463                 .mixers = { alc883_3ST_2ch_mixer },
9464                 .init_verbs = { alc883_init_verbs },
9465                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9466                 .dac_nids = alc883_dac_nids,
9467                 .dig_out_nid = ALC883_DIGOUT_NID,
9468                 .dig_in_nid = ALC883_DIGIN_NID,
9469                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9470                 .channel_mode = alc883_3ST_2ch_modes,
9471                 .input_mux = &alc883_capture_source,
9472         },
9473         [ALC883_3ST_6ch_DIG] = {
9474                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9475                 .init_verbs = { alc883_init_verbs },
9476                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9477                 .dac_nids = alc883_dac_nids,
9478                 .dig_out_nid = ALC883_DIGOUT_NID,
9479                 .dig_in_nid = ALC883_DIGIN_NID,
9480                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9481                 .channel_mode = alc883_3ST_6ch_modes,
9482                 .need_dac_fix = 1,
9483                 .input_mux = &alc883_capture_source,
9484         },
9485         [ALC883_3ST_6ch] = {
9486                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9487                 .init_verbs = { alc883_init_verbs },
9488                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9489                 .dac_nids = alc883_dac_nids,
9490                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9491                 .channel_mode = alc883_3ST_6ch_modes,
9492                 .need_dac_fix = 1,
9493                 .input_mux = &alc883_capture_source,
9494         },
9495         [ALC883_3ST_6ch_INTEL] = {
9496                 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9497                 .init_verbs = { alc883_init_verbs },
9498                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9499                 .dac_nids = alc883_dac_nids,
9500                 .dig_out_nid = ALC883_DIGOUT_NID,
9501                 .dig_in_nid = ALC883_DIGIN_NID,
9502                 .slave_dig_outs = alc883_slave_dig_outs,
9503                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9504                 .channel_mode = alc883_3ST_6ch_intel_modes,
9505                 .need_dac_fix = 1,
9506                 .input_mux = &alc883_3stack_6ch_intel,
9507         },
9508         [ALC889A_INTEL] = {
9509                 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9510                 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9511                                 alc_hp15_unsol_verbs },
9512                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9513                 .dac_nids = alc883_dac_nids,
9514                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9515                 .adc_nids = alc889_adc_nids,
9516                 .dig_out_nid = ALC883_DIGOUT_NID,
9517                 .dig_in_nid = ALC883_DIGIN_NID,
9518                 .slave_dig_outs = alc883_slave_dig_outs,
9519                 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9520                 .channel_mode = alc889_8ch_intel_modes,
9521                 .capsrc_nids = alc889_capsrc_nids,
9522                 .input_mux = &alc889_capture_source,
9523                 .setup = alc889_automute_setup,
9524                 .init_hook = alc_automute_amp,
9525                 .unsol_event = alc_automute_amp_unsol_event,
9526                 .need_dac_fix = 1,
9527         },
9528         [ALC889_INTEL] = {
9529                 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9530                 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
9531                                 alc889_eapd_verbs, alc_hp15_unsol_verbs},
9532                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9533                 .dac_nids = alc883_dac_nids,
9534                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9535                 .adc_nids = alc889_adc_nids,
9536                 .dig_out_nid = ALC883_DIGOUT_NID,
9537                 .dig_in_nid = ALC883_DIGIN_NID,
9538                 .slave_dig_outs = alc883_slave_dig_outs,
9539                 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9540                 .channel_mode = alc889_8ch_intel_modes,
9541                 .capsrc_nids = alc889_capsrc_nids,
9542                 .input_mux = &alc889_capture_source,
9543                 .setup = alc889_automute_setup,
9544                 .init_hook = alc889_intel_init_hook,
9545                 .unsol_event = alc_automute_amp_unsol_event,
9546                 .need_dac_fix = 1,
9547         },
9548         [ALC883_6ST_DIG] = {
9549                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9550                 .init_verbs = { alc883_init_verbs },
9551                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9552                 .dac_nids = alc883_dac_nids,
9553                 .dig_out_nid = ALC883_DIGOUT_NID,
9554                 .dig_in_nid = ALC883_DIGIN_NID,
9555                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9556                 .channel_mode = alc883_sixstack_modes,
9557                 .input_mux = &alc883_capture_source,
9558         },
9559         [ALC883_TARGA_DIG] = {
9560                 .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
9561                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9562                                 alc883_targa_verbs},
9563                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9564                 .dac_nids = alc883_dac_nids,
9565                 .dig_out_nid = ALC883_DIGOUT_NID,
9566                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9567                 .channel_mode = alc883_3ST_6ch_modes,
9568                 .need_dac_fix = 1,
9569                 .input_mux = &alc883_capture_source,
9570                 .unsol_event = alc883_targa_unsol_event,
9571                 .setup = alc882_targa_setup,
9572                 .init_hook = alc882_targa_automute,
9573         },
9574         [ALC883_TARGA_2ch_DIG] = {
9575                 .mixers = { alc883_targa_2ch_mixer},
9576                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9577                                 alc883_targa_verbs},
9578                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9579                 .dac_nids = alc883_dac_nids,
9580                 .adc_nids = alc883_adc_nids_alt,
9581                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9582                 .capsrc_nids = alc883_capsrc_nids,
9583                 .dig_out_nid = ALC883_DIGOUT_NID,
9584                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9585                 .channel_mode = alc883_3ST_2ch_modes,
9586                 .input_mux = &alc883_capture_source,
9587                 .unsol_event = alc883_targa_unsol_event,
9588                 .setup = alc882_targa_setup,
9589                 .init_hook = alc882_targa_automute,
9590         },
9591         [ALC883_TARGA_8ch_DIG] = {
9592                 .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
9593                             alc883_chmode_mixer },
9594                 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9595                                 alc883_targa_verbs },
9596                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9597                 .dac_nids = alc883_dac_nids,
9598                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9599                 .adc_nids = alc883_adc_nids_rev,
9600                 .capsrc_nids = alc883_capsrc_nids_rev,
9601                 .dig_out_nid = ALC883_DIGOUT_NID,
9602                 .dig_in_nid = ALC883_DIGIN_NID,
9603                 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
9604                 .channel_mode = alc883_4ST_8ch_modes,
9605                 .need_dac_fix = 1,
9606                 .input_mux = &alc883_capture_source,
9607                 .unsol_event = alc883_targa_unsol_event,
9608                 .setup = alc882_targa_setup,
9609                 .init_hook = alc882_targa_automute,
9610         },
9611         [ALC883_ACER] = {
9612                 .mixers = { alc883_base_mixer },
9613                 /* On TravelMate laptops, GPIO 0 enables the internal speaker
9614                  * and the headphone jack.  Turn this on and rely on the
9615                  * standard mute methods whenever the user wants to turn
9616                  * these outputs off.
9617                  */
9618                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
9619                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9620                 .dac_nids = alc883_dac_nids,
9621                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9622                 .channel_mode = alc883_3ST_2ch_modes,
9623                 .input_mux = &alc883_capture_source,
9624         },
9625         [ALC883_ACER_ASPIRE] = {
9626                 .mixers = { alc883_acer_aspire_mixer },
9627                 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
9628                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9629                 .dac_nids = alc883_dac_nids,
9630                 .dig_out_nid = ALC883_DIGOUT_NID,
9631                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9632                 .channel_mode = alc883_3ST_2ch_modes,
9633                 .input_mux = &alc883_capture_source,
9634                 .unsol_event = alc_automute_amp_unsol_event,
9635                 .setup = alc883_acer_aspire_setup,
9636                 .init_hook = alc_automute_amp,
9637         },
9638         [ALC888_ACER_ASPIRE_4930G] = {
9639                 .mixers = { alc888_base_mixer,
9640                                 alc883_chmode_mixer },
9641                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9642                                 alc888_acer_aspire_4930g_verbs },
9643                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9644                 .dac_nids = alc883_dac_nids,
9645                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9646                 .adc_nids = alc883_adc_nids_rev,
9647                 .capsrc_nids = alc883_capsrc_nids_rev,
9648                 .dig_out_nid = ALC883_DIGOUT_NID,
9649                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9650                 .channel_mode = alc883_3ST_6ch_modes,
9651                 .need_dac_fix = 1,
9652                 .const_channel_count = 6,
9653                 .num_mux_defs =
9654                         ARRAY_SIZE(alc888_2_capture_sources),
9655                 .input_mux = alc888_2_capture_sources,
9656                 .unsol_event = alc_automute_amp_unsol_event,
9657                 .setup = alc888_acer_aspire_4930g_setup,
9658                 .init_hook = alc_automute_amp,
9659         },
9660         [ALC888_ACER_ASPIRE_6530G] = {
9661                 .mixers = { alc888_acer_aspire_6530_mixer },
9662                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9663                                 alc888_acer_aspire_6530g_verbs },
9664                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9665                 .dac_nids = alc883_dac_nids,
9666                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9667                 .adc_nids = alc883_adc_nids_rev,
9668                 .capsrc_nids = alc883_capsrc_nids_rev,
9669                 .dig_out_nid = ALC883_DIGOUT_NID,
9670                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9671                 .channel_mode = alc883_3ST_2ch_modes,
9672                 .num_mux_defs =
9673                         ARRAY_SIZE(alc888_2_capture_sources),
9674                 .input_mux = alc888_acer_aspire_6530_sources,
9675                 .unsol_event = alc_automute_amp_unsol_event,
9676                 .setup = alc888_acer_aspire_6530g_setup,
9677                 .init_hook = alc_automute_amp,
9678         },
9679         [ALC888_ACER_ASPIRE_8930G] = {
9680                 .mixers = { alc889_acer_aspire_8930g_mixer,
9681                                 alc883_chmode_mixer },
9682                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9683                                 alc889_acer_aspire_8930g_verbs,
9684                                 alc889_eapd_verbs},
9685                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9686                 .dac_nids = alc883_dac_nids,
9687                 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9688                 .adc_nids = alc889_adc_nids,
9689                 .capsrc_nids = alc889_capsrc_nids,
9690                 .dig_out_nid = ALC883_DIGOUT_NID,
9691                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9692                 .channel_mode = alc883_3ST_6ch_modes,
9693                 .need_dac_fix = 1,
9694                 .const_channel_count = 6,
9695                 .num_mux_defs =
9696                         ARRAY_SIZE(alc889_capture_sources),
9697                 .input_mux = alc889_capture_sources,
9698                 .unsol_event = alc_automute_amp_unsol_event,
9699                 .setup = alc889_acer_aspire_8930g_setup,
9700                 .init_hook = alc_automute_amp,
9701 #ifdef CONFIG_SND_HDA_POWER_SAVE
9702                 .power_hook = alc_power_eapd,
9703 #endif
9704         },
9705         [ALC888_ACER_ASPIRE_7730G] = {
9706                 .mixers = { alc883_3ST_6ch_mixer,
9707                                 alc883_chmode_mixer },
9708                 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9709                                 alc888_acer_aspire_7730G_verbs },
9710                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9711                 .dac_nids = alc883_dac_nids,
9712                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9713                 .adc_nids = alc883_adc_nids_rev,
9714                 .capsrc_nids = alc883_capsrc_nids_rev,
9715                 .dig_out_nid = ALC883_DIGOUT_NID,
9716                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9717                 .channel_mode = alc883_3ST_6ch_modes,
9718                 .need_dac_fix = 1,
9719                 .const_channel_count = 6,
9720                 .input_mux = &alc883_capture_source,
9721                 .unsol_event = alc_automute_amp_unsol_event,
9722                 .setup = alc888_acer_aspire_6530g_setup,
9723                 .init_hook = alc_automute_amp,
9724         },
9725         [ALC883_MEDION] = {
9726                 .mixers = { alc883_fivestack_mixer,
9727                             alc883_chmode_mixer },
9728                 .init_verbs = { alc883_init_verbs,
9729                                 alc883_medion_eapd_verbs },
9730                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9731                 .dac_nids = alc883_dac_nids,
9732                 .adc_nids = alc883_adc_nids_alt,
9733                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9734                 .capsrc_nids = alc883_capsrc_nids,
9735                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9736                 .channel_mode = alc883_sixstack_modes,
9737                 .input_mux = &alc883_capture_source,
9738         },
9739         [ALC883_MEDION_MD2] = {
9740                 .mixers = { alc883_medion_md2_mixer},
9741                 .init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
9742                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9743                 .dac_nids = alc883_dac_nids,
9744                 .dig_out_nid = ALC883_DIGOUT_NID,
9745                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9746                 .channel_mode = alc883_3ST_2ch_modes,
9747                 .input_mux = &alc883_capture_source,
9748                 .unsol_event = alc_automute_amp_unsol_event,
9749                 .setup = alc883_medion_md2_setup,
9750                 .init_hook = alc_automute_amp,
9751         },
9752         [ALC883_LAPTOP_EAPD] = {
9753                 .mixers = { alc883_base_mixer },
9754                 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
9755                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9756                 .dac_nids = alc883_dac_nids,
9757                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9758                 .channel_mode = alc883_3ST_2ch_modes,
9759                 .input_mux = &alc883_capture_source,
9760         },
9761         [ALC883_CLEVO_M540R] = {
9762                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9763                 .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
9764                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9765                 .dac_nids = alc883_dac_nids,
9766                 .dig_out_nid = ALC883_DIGOUT_NID,
9767                 .dig_in_nid = ALC883_DIGIN_NID,
9768                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
9769                 .channel_mode = alc883_3ST_6ch_clevo_modes,
9770                 .need_dac_fix = 1,
9771                 .input_mux = &alc883_capture_source,
9772                 /* This machine has the hardware HP auto-muting, thus
9773                  * we need no software mute via unsol event
9774                  */
9775         },
9776         [ALC883_CLEVO_M720] = {
9777                 .mixers = { alc883_clevo_m720_mixer },
9778                 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
9779                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9780                 .dac_nids = alc883_dac_nids,
9781                 .dig_out_nid = ALC883_DIGOUT_NID,
9782                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9783                 .channel_mode = alc883_3ST_2ch_modes,
9784                 .input_mux = &alc883_capture_source,
9785                 .unsol_event = alc883_clevo_m720_unsol_event,
9786                 .setup = alc883_clevo_m720_setup,
9787                 .init_hook = alc883_clevo_m720_init_hook,
9788         },
9789         [ALC883_LENOVO_101E_2ch] = {
9790                 .mixers = { alc883_lenovo_101e_2ch_mixer},
9791                 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
9792                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9793                 .dac_nids = alc883_dac_nids,
9794                 .adc_nids = alc883_adc_nids_alt,
9795                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9796                 .capsrc_nids = alc883_capsrc_nids,
9797                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9798                 .channel_mode = alc883_3ST_2ch_modes,
9799                 .input_mux = &alc883_lenovo_101e_capture_source,
9800                 .unsol_event = alc883_lenovo_101e_unsol_event,
9801                 .init_hook = alc883_lenovo_101e_all_automute,
9802         },
9803         [ALC883_LENOVO_NB0763] = {
9804                 .mixers = { alc883_lenovo_nb0763_mixer },
9805                 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
9806                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9807                 .dac_nids = alc883_dac_nids,
9808                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9809                 .channel_mode = alc883_3ST_2ch_modes,
9810                 .need_dac_fix = 1,
9811                 .input_mux = &alc883_lenovo_nb0763_capture_source,
9812                 .unsol_event = alc_automute_amp_unsol_event,
9813                 .setup = alc883_medion_md2_setup,
9814                 .init_hook = alc_automute_amp,
9815         },
9816         [ALC888_LENOVO_MS7195_DIG] = {
9817                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9818                 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
9819                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9820                 .dac_nids = alc883_dac_nids,
9821                 .dig_out_nid = ALC883_DIGOUT_NID,
9822                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9823                 .channel_mode = alc883_3ST_6ch_modes,
9824                 .need_dac_fix = 1,
9825                 .input_mux = &alc883_capture_source,
9826                 .unsol_event = alc883_lenovo_ms7195_unsol_event,
9827                 .init_hook = alc888_lenovo_ms7195_front_automute,
9828         },
9829         [ALC883_HAIER_W66] = {
9830                 .mixers = { alc883_targa_2ch_mixer},
9831                 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
9832                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9833                 .dac_nids = alc883_dac_nids,
9834                 .dig_out_nid = ALC883_DIGOUT_NID,
9835                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9836                 .channel_mode = alc883_3ST_2ch_modes,
9837                 .input_mux = &alc883_capture_source,
9838                 .unsol_event = alc_automute_amp_unsol_event,
9839                 .setup = alc883_haier_w66_setup,
9840                 .init_hook = alc_automute_amp,
9841         },
9842         [ALC888_3ST_HP] = {
9843                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9844                 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
9845                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9846                 .dac_nids = alc883_dac_nids,
9847                 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
9848                 .channel_mode = alc888_3st_hp_modes,
9849                 .need_dac_fix = 1,
9850                 .input_mux = &alc883_capture_source,
9851                 .unsol_event = alc_automute_amp_unsol_event,
9852                 .setup = alc888_3st_hp_setup,
9853                 .init_hook = alc_automute_amp,
9854         },
9855         [ALC888_6ST_DELL] = {
9856                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9857                 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
9858                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9859                 .dac_nids = alc883_dac_nids,
9860                 .dig_out_nid = ALC883_DIGOUT_NID,
9861                 .dig_in_nid = ALC883_DIGIN_NID,
9862                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9863                 .channel_mode = alc883_sixstack_modes,
9864                 .input_mux = &alc883_capture_source,
9865                 .unsol_event = alc_automute_amp_unsol_event,
9866                 .setup = alc888_6st_dell_setup,
9867                 .init_hook = alc_automute_amp,
9868         },
9869         [ALC883_MITAC] = {
9870                 .mixers = { alc883_mitac_mixer },
9871                 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
9872                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9873                 .dac_nids = alc883_dac_nids,
9874                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9875                 .channel_mode = alc883_3ST_2ch_modes,
9876                 .input_mux = &alc883_capture_source,
9877                 .unsol_event = alc_automute_amp_unsol_event,
9878                 .setup = alc883_mitac_setup,
9879                 .init_hook = alc_automute_amp,
9880         },
9881         [ALC883_FUJITSU_PI2515] = {
9882                 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
9883                 .init_verbs = { alc883_init_verbs,
9884                                 alc883_2ch_fujitsu_pi2515_verbs},
9885                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9886                 .dac_nids = alc883_dac_nids,
9887                 .dig_out_nid = ALC883_DIGOUT_NID,
9888                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9889                 .channel_mode = alc883_3ST_2ch_modes,
9890                 .input_mux = &alc883_fujitsu_pi2515_capture_source,
9891                 .unsol_event = alc_automute_amp_unsol_event,
9892                 .setup = alc883_2ch_fujitsu_pi2515_setup,
9893                 .init_hook = alc_automute_amp,
9894         },
9895         [ALC888_FUJITSU_XA3530] = {
9896                 .mixers = { alc888_base_mixer, alc883_chmode_mixer },
9897                 .init_verbs = { alc883_init_verbs,
9898                         alc888_fujitsu_xa3530_verbs },
9899                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9900                 .dac_nids = alc883_dac_nids,
9901                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9902                 .adc_nids = alc883_adc_nids_rev,
9903                 .capsrc_nids = alc883_capsrc_nids_rev,
9904                 .dig_out_nid = ALC883_DIGOUT_NID,
9905                 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
9906                 .channel_mode = alc888_4ST_8ch_intel_modes,
9907                 .num_mux_defs =
9908                         ARRAY_SIZE(alc888_2_capture_sources),
9909                 .input_mux = alc888_2_capture_sources,
9910                 .unsol_event = alc_automute_amp_unsol_event,
9911                 .setup = alc888_fujitsu_xa3530_setup,
9912                 .init_hook = alc_automute_amp,
9913         },
9914         [ALC888_LENOVO_SKY] = {
9915                 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
9916                 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
9917                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9918                 .dac_nids = alc883_dac_nids,
9919                 .dig_out_nid = ALC883_DIGOUT_NID,
9920                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9921                 .channel_mode = alc883_sixstack_modes,
9922                 .need_dac_fix = 1,
9923                 .input_mux = &alc883_lenovo_sky_capture_source,
9924                 .unsol_event = alc_automute_amp_unsol_event,
9925                 .setup = alc888_lenovo_sky_setup,
9926                 .init_hook = alc_automute_amp,
9927         },
9928         [ALC888_ASUS_M90V] = {
9929                 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9930                 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
9931                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9932                 .dac_nids = alc883_dac_nids,
9933                 .dig_out_nid = ALC883_DIGOUT_NID,
9934                 .dig_in_nid = ALC883_DIGIN_NID,
9935                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9936                 .channel_mode = alc883_3ST_6ch_modes,
9937                 .need_dac_fix = 1,
9938                 .input_mux = &alc883_fujitsu_pi2515_capture_source,
9939                 .unsol_event = alc_sku_unsol_event,
9940                 .setup = alc883_mode2_setup,
9941                 .init_hook = alc_inithook,
9942         },
9943         [ALC888_ASUS_EEE1601] = {
9944                 .mixers = { alc883_asus_eee1601_mixer },
9945                 .cap_mixer = alc883_asus_eee1601_cap_mixer,
9946                 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
9947                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9948                 .dac_nids = alc883_dac_nids,
9949                 .dig_out_nid = ALC883_DIGOUT_NID,
9950                 .dig_in_nid = ALC883_DIGIN_NID,
9951                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9952                 .channel_mode = alc883_3ST_2ch_modes,
9953                 .need_dac_fix = 1,
9954                 .input_mux = &alc883_asus_eee1601_capture_source,
9955                 .unsol_event = alc_sku_unsol_event,
9956                 .init_hook = alc883_eee1601_inithook,
9957         },
9958         [ALC1200_ASUS_P5Q] = {
9959                 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9960                 .init_verbs = { alc883_init_verbs },
9961                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9962                 .dac_nids = alc883_dac_nids,
9963                 .dig_out_nid = ALC1200_DIGOUT_NID,
9964                 .dig_in_nid = ALC883_DIGIN_NID,
9965                 .slave_dig_outs = alc1200_slave_dig_outs,
9966                 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9967                 .channel_mode = alc883_sixstack_modes,
9968                 .input_mux = &alc883_capture_source,
9969         },
9970         [ALC889A_MB31] = {
9971                 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
9972                 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
9973                         alc880_gpio1_init_verbs },
9974                 .adc_nids = alc883_adc_nids,
9975                 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
9976                 .capsrc_nids = alc883_capsrc_nids,
9977                 .dac_nids = alc883_dac_nids,
9978                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9979                 .channel_mode = alc889A_mb31_6ch_modes,
9980                 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
9981                 .input_mux = &alc889A_mb31_capture_source,
9982                 .dig_out_nid = ALC883_DIGOUT_NID,
9983                 .unsol_event = alc889A_mb31_unsol_event,
9984                 .init_hook = alc889A_mb31_automute,
9985         },
9986         [ALC883_SONY_VAIO_TT] = {
9987                 .mixers = { alc883_vaiott_mixer },
9988                 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
9989                 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9990                 .dac_nids = alc883_dac_nids,
9991                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9992                 .channel_mode = alc883_3ST_2ch_modes,
9993                 .input_mux = &alc883_capture_source,
9994                 .unsol_event = alc_automute_amp_unsol_event,
9995                 .setup = alc883_vaiott_setup,
9996                 .init_hook = alc_automute_amp,
9997         },
9998 };
9999
10000
10001 /*
10002  * Pin config fixes
10003  */
10004 enum {
10005         PINFIX_ABIT_AW9D_MAX
10006 };
10007
10008 static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
10009         { 0x15, 0x01080104 }, /* side */
10010         { 0x16, 0x01011012 }, /* rear */
10011         { 0x17, 0x01016011 }, /* clfe */
10012         { }
10013 };
10014
10015 static const struct alc_fixup alc882_fixups[] = {
10016         [PINFIX_ABIT_AW9D_MAX] = {
10017                 .pins = alc882_abit_aw9d_pinfix
10018         },
10019 };
10020
10021 static struct snd_pci_quirk alc882_fixup_tbl[] = {
10022         SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
10023         {}
10024 };
10025
10026 /*
10027  * BIOS auto configuration
10028  */
10029 static int alc882_auto_create_input_ctls(struct hda_codec *codec,
10030                                                 const struct auto_pin_cfg *cfg)
10031 {
10032         return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
10033 }
10034
10035 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
10036                                               hda_nid_t nid, int pin_type,
10037                                               int dac_idx)
10038 {
10039         /* set as output */
10040         struct alc_spec *spec = codec->spec;
10041         int idx;
10042
10043         alc_set_pin_output(codec, nid, pin_type);
10044         if (spec->multiout.dac_nids[dac_idx] == 0x25)
10045                 idx = 4;
10046         else {
10047                 if (spec->multiout.num_dacs >= dac_idx)
10048                         return;
10049                 idx = spec->multiout.dac_nids[dac_idx] - 2;
10050         }
10051         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
10052
10053 }
10054
10055 static void alc882_auto_init_multi_out(struct hda_codec *codec)
10056 {
10057         struct alc_spec *spec = codec->spec;
10058         int i;
10059
10060         for (i = 0; i <= HDA_SIDE; i++) {
10061                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
10062                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
10063                 if (nid)
10064                         alc882_auto_set_output_and_unmute(codec, nid, pin_type,
10065                                                           i);
10066         }
10067 }
10068
10069 static void alc882_auto_init_hp_out(struct hda_codec *codec)
10070 {
10071         struct alc_spec *spec = codec->spec;
10072         hda_nid_t pin;
10073
10074         pin = spec->autocfg.hp_pins[0];
10075         if (pin) /* connect to front */
10076                 /* use dac 0 */
10077                 alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
10078         pin = spec->autocfg.speaker_pins[0];
10079         if (pin)
10080                 alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
10081 }
10082
10083 static void alc882_auto_init_analog_input(struct hda_codec *codec)
10084 {
10085         struct alc_spec *spec = codec->spec;
10086         int i;
10087
10088         for (i = 0; i < AUTO_PIN_LAST; i++) {
10089                 hda_nid_t nid = spec->autocfg.input_pins[i];
10090                 if (!nid)
10091                         continue;
10092                 alc_set_input_pin(codec, nid, i);
10093                 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
10094                         snd_hda_codec_write(codec, nid, 0,
10095                                             AC_VERB_SET_AMP_GAIN_MUTE,
10096                                             AMP_OUT_MUTE);
10097         }
10098 }
10099
10100 static void alc882_auto_init_input_src(struct hda_codec *codec)
10101 {
10102         struct alc_spec *spec = codec->spec;
10103         int c;
10104
10105         for (c = 0; c < spec->num_adc_nids; c++) {
10106                 hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
10107                 hda_nid_t nid = spec->capsrc_nids[c];
10108                 unsigned int mux_idx;
10109                 const struct hda_input_mux *imux;
10110                 int conns, mute, idx, item;
10111
10112                 conns = snd_hda_get_connections(codec, nid, conn_list,
10113                                                 ARRAY_SIZE(conn_list));
10114                 if (conns < 0)
10115                         continue;
10116                 mux_idx = c >= spec->num_mux_defs ? 0 : c;
10117                 imux = &spec->input_mux[mux_idx];
10118                 if (!imux->num_items && mux_idx > 0)
10119                         imux = &spec->input_mux[0];
10120                 for (idx = 0; idx < conns; idx++) {
10121                         /* if the current connection is the selected one,
10122                          * unmute it as default - otherwise mute it
10123                          */
10124                         mute = AMP_IN_MUTE(idx);
10125                         for (item = 0; item < imux->num_items; item++) {
10126                                 if (imux->items[item].index == idx) {
10127                                         if (spec->cur_mux[c] == item)
10128                                                 mute = AMP_IN_UNMUTE(idx);
10129                                         break;
10130                                 }
10131                         }
10132                         /* check if we have a selector or mixer
10133                          * we could check for the widget type instead, but
10134                          * just check for Amp-In presence (in case of mixer
10135                          * without amp-in there is something wrong, this
10136                          * function shouldn't be used or capsrc nid is wrong)
10137                          */
10138                         if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
10139                                 snd_hda_codec_write(codec, nid, 0,
10140                                                     AC_VERB_SET_AMP_GAIN_MUTE,
10141                                                     mute);
10142                         else if (mute != AMP_IN_MUTE(idx))
10143                                 snd_hda_codec_write(codec, nid, 0,
10144                                                     AC_VERB_SET_CONNECT_SEL,
10145                                                     idx);
10146                 }
10147         }
10148 }
10149
10150 /* add mic boosts if needed */
10151 static int alc_auto_add_mic_boost(struct hda_codec *codec)
10152 {
10153         struct alc_spec *spec = codec->spec;
10154         int err;
10155         hda_nid_t nid;
10156
10157         nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
10158         if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10159                 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10160                                   "Mic Boost",
10161                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10162                 if (err < 0)
10163                         return err;
10164         }
10165         nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
10166         if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10167                 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10168                                   "Front Mic Boost",
10169                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10170                 if (err < 0)
10171                         return err;
10172         }
10173         return 0;
10174 }
10175
10176 /* almost identical with ALC880 parser... */
10177 static int alc882_parse_auto_config(struct hda_codec *codec)
10178 {
10179         struct alc_spec *spec = codec->spec;
10180         static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
10181         int i, err;
10182
10183         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
10184                                            alc882_ignore);
10185         if (err < 0)
10186                 return err;
10187         if (!spec->autocfg.line_outs)
10188                 return 0; /* can't find valid BIOS pin config */
10189
10190         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
10191         if (err < 0)
10192                 return err;
10193         err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
10194         if (err < 0)
10195                 return err;
10196         err = alc880_auto_create_extra_out(spec,
10197                                            spec->autocfg.speaker_pins[0],
10198                                            "Speaker");
10199         if (err < 0)
10200                 return err;
10201         err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
10202                                            "Headphone");
10203         if (err < 0)
10204                 return err;
10205         err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
10206         if (err < 0)
10207                 return err;
10208
10209         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
10210
10211         /* check multiple SPDIF-out (for recent codecs) */
10212         for (i = 0; i < spec->autocfg.dig_outs; i++) {
10213                 hda_nid_t dig_nid;
10214                 err = snd_hda_get_connections(codec,
10215                                               spec->autocfg.dig_out_pins[i],
10216                                               &dig_nid, 1);
10217                 if (err < 0)
10218                         continue;
10219                 if (!i)
10220                         spec->multiout.dig_out_nid = dig_nid;
10221                 else {
10222                         spec->multiout.slave_dig_outs = spec->slave_dig_outs;
10223                         if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
10224                                 break;
10225                         spec->slave_dig_outs[i - 1] = dig_nid;
10226                 }
10227         }
10228         if (spec->autocfg.dig_in_pin)
10229                 spec->dig_in_nid = ALC880_DIGIN_NID;
10230
10231         if (spec->kctls.list)
10232                 add_mixer(spec, spec->kctls.list);
10233
10234         add_verb(spec, alc883_auto_init_verbs);
10235         /* if ADC 0x07 is available, initialize it, too */
10236         if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
10237                 add_verb(spec, alc882_adc1_init_verbs);
10238
10239         spec->num_mux_defs = 1;
10240         spec->input_mux = &spec->private_imux[0];
10241
10242         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
10243
10244         err = alc_auto_add_mic_boost(codec);
10245         if (err < 0)
10246                 return err;
10247
10248         return 1; /* config found */
10249 }
10250
10251 /* additional initialization for auto-configuration model */
10252 static void alc882_auto_init(struct hda_codec *codec)
10253 {
10254         struct alc_spec *spec = codec->spec;
10255         alc882_auto_init_multi_out(codec);
10256         alc882_auto_init_hp_out(codec);
10257         alc882_auto_init_analog_input(codec);
10258         alc882_auto_init_input_src(codec);
10259         if (spec->unsol_event)
10260                 alc_inithook(codec);
10261 }
10262
10263 static int patch_alc882(struct hda_codec *codec)
10264 {
10265         struct alc_spec *spec;
10266         int err, board_config;
10267
10268         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
10269         if (spec == NULL)
10270                 return -ENOMEM;
10271
10272         codec->spec = spec;
10273
10274         switch (codec->vendor_id) {
10275         case 0x10ec0882:
10276         case 0x10ec0885:
10277                 break;
10278         default:
10279                 /* ALC883 and variants */
10280                 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
10281                 break;
10282         }
10283
10284         board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
10285                                                   alc882_models,
10286                                                   alc882_cfg_tbl);
10287
10288         if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
10289                 board_config = snd_hda_check_board_codec_sid_config(codec,
10290                         ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
10291
10292         if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
10293                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
10294                        codec->chip_name);
10295                 board_config = ALC882_AUTO;
10296         }
10297
10298         alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups);
10299
10300         if (board_config == ALC882_AUTO) {
10301                 /* automatic parse from the BIOS config */
10302                 err = alc882_parse_auto_config(codec);
10303                 if (err < 0) {
10304                         alc_free(codec);
10305                         return err;
10306                 } else if (!err) {
10307                         printk(KERN_INFO
10308                                "hda_codec: Cannot set up configuration "
10309                                "from BIOS.  Using base mode...\n");
10310                         board_config = ALC882_3ST_DIG;
10311                 }
10312         }
10313
10314         err = snd_hda_attach_beep_device(codec, 0x1);
10315         if (err < 0) {
10316                 alc_free(codec);
10317                 return err;
10318         }
10319
10320         if (board_config != ALC882_AUTO)
10321                 setup_preset(codec, &alc882_presets[board_config]);
10322
10323         spec->stream_analog_playback = &alc882_pcm_analog_playback;
10324         spec->stream_analog_capture = &alc882_pcm_analog_capture;
10325         /* FIXME: setup DAC5 */
10326         /*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
10327         spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
10328
10329         spec->stream_digital_playback = &alc882_pcm_digital_playback;
10330         spec->stream_digital_capture = &alc882_pcm_digital_capture;
10331
10332         if (codec->vendor_id == 0x10ec0888)
10333                 spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */
10334
10335         if (!spec->adc_nids && spec->input_mux) {
10336                 int i, j;
10337                 spec->num_adc_nids = 0;
10338                 for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
10339                         const struct hda_input_mux *imux = spec->input_mux;
10340                         hda_nid_t cap;
10341                         hda_nid_t items[16];
10342                         hda_nid_t nid = alc882_adc_nids[i];
10343                         unsigned int wcap = get_wcaps(codec, nid);
10344                         /* get type */
10345                         wcap = get_wcaps_type(wcap);
10346                         if (wcap != AC_WID_AUD_IN)
10347                                 continue;
10348                         spec->private_adc_nids[spec->num_adc_nids] = nid;
10349                         err = snd_hda_get_connections(codec, nid, &cap, 1);
10350                         if (err < 0)
10351                                 continue;
10352                         err = snd_hda_get_connections(codec, cap, items,
10353                                                       ARRAY_SIZE(items));
10354                         if (err < 0)
10355                                 continue;
10356                         for (j = 0; j < imux->num_items; j++)
10357                                 if (imux->items[j].index >= err)
10358                                         break;
10359                         if (j < imux->num_items)
10360                                 continue;
10361                         spec->private_capsrc_nids[spec->num_adc_nids] = cap;
10362                         spec->num_adc_nids++;
10363                 }
10364                 spec->adc_nids = spec->private_adc_nids;
10365                 spec->capsrc_nids = spec->private_capsrc_nids;
10366         }
10367
10368         set_capture_mixer(codec);
10369         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10370
10371         spec->vmaster_nid = 0x0c;
10372
10373         codec->patch_ops = alc_patch_ops;
10374         if (board_config == ALC882_AUTO)
10375                 spec->init_hook = alc882_auto_init;
10376 #ifdef CONFIG_SND_HDA_POWER_SAVE
10377         if (!spec->loopback.amplist)
10378                 spec->loopback.amplist = alc882_loopbacks;
10379 #endif
10380
10381         return 0;
10382 }
10383
10384
10385 /*
10386  * ALC262 support
10387  */
10388
10389 #define ALC262_DIGOUT_NID       ALC880_DIGOUT_NID
10390 #define ALC262_DIGIN_NID        ALC880_DIGIN_NID
10391
10392 #define alc262_dac_nids         alc260_dac_nids
10393 #define alc262_adc_nids         alc882_adc_nids
10394 #define alc262_adc_nids_alt     alc882_adc_nids_alt
10395 #define alc262_capsrc_nids      alc882_capsrc_nids
10396 #define alc262_capsrc_nids_alt  alc882_capsrc_nids_alt
10397
10398 #define alc262_modes            alc260_modes
10399 #define alc262_capture_source   alc882_capture_source
10400
10401 static hda_nid_t alc262_dmic_adc_nids[1] = {
10402         /* ADC0 */
10403         0x09
10404 };
10405
10406 static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
10407
10408 static struct snd_kcontrol_new alc262_base_mixer[] = {
10409         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10410         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10411         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10412         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10413         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10414         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10415         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10416         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10417         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10418         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10419         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10420         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10421         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
10422         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10423         HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
10424         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
10425         { } /* end */
10426 };
10427
10428 /* update HP, line and mono-out pins according to the master switch */
10429 static void alc262_hp_master_update(struct hda_codec *codec)
10430 {
10431         struct alc_spec *spec = codec->spec;
10432         int val = spec->master_sw;
10433
10434         /* HP & line-out */
10435         snd_hda_codec_write_cache(codec, 0x1b, 0,
10436                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10437                                   val ? PIN_HP : 0);
10438         snd_hda_codec_write_cache(codec, 0x15, 0,
10439                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10440                                   val ? PIN_HP : 0);
10441         /* mono (speaker) depending on the HP jack sense */
10442         val = val && !spec->jack_present;
10443         snd_hda_codec_write_cache(codec, 0x16, 0,
10444                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
10445                                   val ? PIN_OUT : 0);
10446 }
10447
10448 static void alc262_hp_bpc_automute(struct hda_codec *codec)
10449 {
10450         struct alc_spec *spec = codec->spec;
10451
10452         spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
10453         alc262_hp_master_update(codec);
10454 }
10455
10456 static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10457 {
10458         if ((res >> 26) != ALC880_HP_EVENT)
10459                 return;
10460         alc262_hp_bpc_automute(codec);
10461 }
10462
10463 static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10464 {
10465         struct alc_spec *spec = codec->spec;
10466
10467         spec->jack_present = snd_hda_jack_detect(codec, 0x15);
10468         alc262_hp_master_update(codec);
10469 }
10470
10471 static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10472                                            unsigned int res)
10473 {
10474         if ((res >> 26) != ALC880_HP_EVENT)
10475                 return;
10476         alc262_hp_wildwest_automute(codec);
10477 }
10478
10479 #define alc262_hp_master_sw_get         alc260_hp_master_sw_get
10480
10481 static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10482                                    struct snd_ctl_elem_value *ucontrol)
10483 {
10484         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10485         struct alc_spec *spec = codec->spec;
10486         int val = !!*ucontrol->value.integer.value;
10487
10488         if (val == spec->master_sw)
10489                 return 0;
10490         spec->master_sw = val;
10491         alc262_hp_master_update(codec);
10492         return 1;
10493 }
10494
10495 #define ALC262_HP_MASTER_SWITCH                                 \
10496         {                                                       \
10497                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,            \
10498                 .name = "Master Playback Switch",               \
10499                 .info = snd_ctl_boolean_mono_info,              \
10500                 .get = alc262_hp_master_sw_get,                 \
10501                 .put = alc262_hp_master_sw_put,                 \
10502         }, \
10503         {                                                       \
10504                 .iface = NID_MAPPING,                           \
10505                 .name = "Master Playback Switch",               \
10506                 .private_value = 0x15 | (0x16 << 8) | (0x1b << 16),     \
10507         }
10508
10509
10510 static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
10511         ALC262_HP_MASTER_SWITCH,
10512         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10513         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10514         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10515         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10516                               HDA_OUTPUT),
10517         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10518                             HDA_OUTPUT),
10519         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10520         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10521         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10522         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10523         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10524         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10525         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10526         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10527         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10528         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10529         HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10530         HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10531         { } /* end */
10532 };
10533
10534 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
10535         ALC262_HP_MASTER_SWITCH,
10536         HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10537         HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10538         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10539         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10540         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10541                               HDA_OUTPUT),
10542         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10543                             HDA_OUTPUT),
10544         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10545         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
10546         HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
10547         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10548         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10549         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10550         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10551         { } /* end */
10552 };
10553
10554 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
10555         HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10556         HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10557         HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
10558         { } /* end */
10559 };
10560
10561 /* mute/unmute internal speaker according to the hp jack and mute state */
10562 static void alc262_hp_t5735_setup(struct hda_codec *codec)
10563 {
10564         struct alc_spec *spec = codec->spec;
10565
10566         spec->autocfg.hp_pins[0] = 0x15;
10567         spec->autocfg.speaker_pins[0] = 0x14;
10568 }
10569
10570 static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
10571         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10572         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10573         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10574         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10575         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10576         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10577         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10578         { } /* end */
10579 };
10580
10581 static struct hda_verb alc262_hp_t5735_verbs[] = {
10582         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10583         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10584
10585         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
10586         { }
10587 };
10588
10589 static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
10590         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10591         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10592         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
10593         HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
10594         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10595         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10596         { } /* end */
10597 };
10598
10599 static struct hda_verb alc262_hp_rp5700_verbs[] = {
10600         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10601         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10602         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10603         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10604         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10605         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10606         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10607         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10608         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10609         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10610         {}
10611 };
10612
10613 static struct hda_input_mux alc262_hp_rp5700_capture_source = {
10614         .num_items = 1,
10615         .items = {
10616                 { "Line", 0x1 },
10617         },
10618 };
10619
10620 /* bind hp and internal speaker mute (with plug check) as master switch */
10621 static void alc262_hippo_master_update(struct hda_codec *codec)
10622 {
10623         struct alc_spec *spec = codec->spec;
10624         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10625         hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
10626         hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
10627         unsigned int mute;
10628
10629         /* HP */
10630         mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
10631         snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
10632                                  HDA_AMP_MUTE, mute);
10633         /* mute internal speaker per jack sense */
10634         if (spec->jack_present)
10635                 mute = HDA_AMP_MUTE;
10636         if (line_nid)
10637                 snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
10638                                          HDA_AMP_MUTE, mute);
10639         if (speaker_nid && speaker_nid != line_nid)
10640                 snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
10641                                          HDA_AMP_MUTE, mute);
10642 }
10643
10644 #define alc262_hippo_master_sw_get      alc262_hp_master_sw_get
10645
10646 static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
10647                                       struct snd_ctl_elem_value *ucontrol)
10648 {
10649         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10650         struct alc_spec *spec = codec->spec;
10651         int val = !!*ucontrol->value.integer.value;
10652
10653         if (val == spec->master_sw)
10654                 return 0;
10655         spec->master_sw = val;
10656         alc262_hippo_master_update(codec);
10657         return 1;
10658 }
10659
10660 #define ALC262_HIPPO_MASTER_SWITCH                              \
10661         {                                                       \
10662                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,            \
10663                 .name = "Master Playback Switch",               \
10664                 .info = snd_ctl_boolean_mono_info,              \
10665                 .get = alc262_hippo_master_sw_get,              \
10666                 .put = alc262_hippo_master_sw_put,              \
10667         },                                                      \
10668         {                                                       \
10669                 .iface = NID_MAPPING,                           \
10670                 .name = "Master Playback Switch",               \
10671                 .subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
10672                              (SUBDEV_SPEAKER(0) << 16), \
10673         }
10674
10675 static struct snd_kcontrol_new alc262_hippo_mixer[] = {
10676         ALC262_HIPPO_MASTER_SWITCH,
10677         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10678         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10679         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10680         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10681         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10682         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10683         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10684         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10685         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10686         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10687         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10688         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10689         { } /* end */
10690 };
10691
10692 static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
10693         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10694         ALC262_HIPPO_MASTER_SWITCH,
10695         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10696         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10697         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10698         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10699         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10700         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10701         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10702         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10703         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10704         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10705         { } /* end */
10706 };
10707
10708 /* mute/unmute internal speaker according to the hp jack and mute state */
10709 static void alc262_hippo_automute(struct hda_codec *codec)
10710 {
10711         struct alc_spec *spec = codec->spec;
10712         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10713
10714         spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
10715         alc262_hippo_master_update(codec);
10716 }
10717
10718 static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
10719 {
10720         if ((res >> 26) != ALC880_HP_EVENT)
10721                 return;
10722         alc262_hippo_automute(codec);
10723 }
10724
10725 static void alc262_hippo_setup(struct hda_codec *codec)
10726 {
10727         struct alc_spec *spec = codec->spec;
10728
10729         spec->autocfg.hp_pins[0] = 0x15;
10730         spec->autocfg.speaker_pins[0] = 0x14;
10731 }
10732
10733 static void alc262_hippo1_setup(struct hda_codec *codec)
10734 {
10735         struct alc_spec *spec = codec->spec;
10736
10737         spec->autocfg.hp_pins[0] = 0x1b;
10738         spec->autocfg.speaker_pins[0] = 0x14;
10739 }
10740
10741
10742 static struct snd_kcontrol_new alc262_sony_mixer[] = {
10743         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10744         ALC262_HIPPO_MASTER_SWITCH,
10745         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10746         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10747         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10748         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10749         { } /* end */
10750 };
10751
10752 static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
10753         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10754         ALC262_HIPPO_MASTER_SWITCH,
10755         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10756         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10757         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10758         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10759         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10760         { } /* end */
10761 };
10762
10763 static struct snd_kcontrol_new alc262_tyan_mixer[] = {
10764         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10765         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
10766         HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
10767         HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
10768         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10769         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10770         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10771         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10772         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10773         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10774         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10775         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10776         { } /* end */
10777 };
10778
10779 static struct hda_verb alc262_tyan_verbs[] = {
10780         /* Headphone automute */
10781         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10782         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10783         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10784
10785         /* P11 AUX_IN, white 4-pin connector */
10786         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10787         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
10788         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
10789         {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
10790
10791         {}
10792 };
10793
10794 /* unsolicited event for HP jack sensing */
10795 static void alc262_tyan_setup(struct hda_codec *codec)
10796 {
10797         struct alc_spec *spec = codec->spec;
10798
10799         spec->autocfg.hp_pins[0] = 0x1b;
10800         spec->autocfg.speaker_pins[0] = 0x15;
10801 }
10802
10803
10804 #define alc262_capture_mixer            alc882_capture_mixer
10805 #define alc262_capture_alt_mixer        alc882_capture_alt_mixer
10806
10807 /*
10808  * generic initialization of ADC, input mixers and output mixers
10809  */
10810 static struct hda_verb alc262_init_verbs[] = {
10811         /*
10812          * Unmute ADC0-2 and set the default input to mic-in
10813          */
10814         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
10815         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10816         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
10817         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10818         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
10819         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10820
10821         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
10822          * mixer widget
10823          * Note: PASD motherboards uses the Line In 2 as the input for
10824          * front panel mic (mic 2)
10825          */
10826         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
10827         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10828         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10829         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
10830         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
10831         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
10832
10833         /*
10834          * Set up output mixers (0x0c - 0x0e)
10835          */
10836         /* set vol=0 to output mixers */
10837         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10838         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10839         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10840         /* set up input amps for analog loopback */
10841         /* Amp Indices: DAC = 0, mixer = 1 */
10842         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10843         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10844         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10845         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10846         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10847         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10848
10849         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10850         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10851         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10852         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10853         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10854         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10855
10856         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10857         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10858         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10859         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10860         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10861
10862         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
10863         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
10864
10865         /* FIXME: use matrix-type input source selection */
10866         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
10867         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
10868         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10869         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10870         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10871         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10872         /* Input mixer2 */
10873         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10874         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10875         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10876         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10877         /* Input mixer3 */
10878         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10879         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10880         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10881         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10882
10883         { }
10884 };
10885
10886 static struct hda_verb alc262_eapd_verbs[] = {
10887         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
10888         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
10889         { }
10890 };
10891
10892 static struct hda_verb alc262_hippo1_unsol_verbs[] = {
10893         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10894         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10895         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10896
10897         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10898         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10899         {}
10900 };
10901
10902 static struct hda_verb alc262_sony_unsol_verbs[] = {
10903         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10904         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10905         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},   // Front Mic
10906
10907         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10908         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10909         {}
10910 };
10911
10912 static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
10913         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10914         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10915         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10916         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10917         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10918         { } /* end */
10919 };
10920
10921 static struct hda_verb alc262_toshiba_s06_verbs[] = {
10922         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10923         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10924         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10925         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10926         {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
10927         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10928         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
10929         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10930         {}
10931 };
10932
10933 static void alc262_toshiba_s06_setup(struct hda_codec *codec)
10934 {
10935         struct alc_spec *spec = codec->spec;
10936
10937         spec->autocfg.hp_pins[0] = 0x15;
10938         spec->autocfg.speaker_pins[0] = 0x14;
10939         spec->ext_mic.pin = 0x18;
10940         spec->ext_mic.mux_idx = 0;
10941         spec->int_mic.pin = 0x12;
10942         spec->int_mic.mux_idx = 9;
10943         spec->auto_mic = 1;
10944 }
10945
10946 /*
10947  * nec model
10948  *  0x15 = headphone
10949  *  0x16 = internal speaker
10950  *  0x18 = external mic
10951  */
10952
10953 static struct snd_kcontrol_new alc262_nec_mixer[] = {
10954         HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
10955         HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
10956
10957         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10958         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10959         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10960
10961         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10962         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10963         { } /* end */
10964 };
10965
10966 static struct hda_verb alc262_nec_verbs[] = {
10967         /* Unmute Speaker */
10968         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10969
10970         /* Headphone */
10971         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10972         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10973
10974         /* External mic to headphone */
10975         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10976         /* External mic to speaker */
10977         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10978         {}
10979 };
10980
10981 /*
10982  * fujitsu model
10983  *  0x14 = headphone/spdif-out, 0x15 = internal speaker,
10984  *  0x1b = port replicator headphone out
10985  */
10986
10987 #define ALC_HP_EVENT    0x37
10988
10989 static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
10990         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10991         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10992         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10993         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10994         {}
10995 };
10996
10997 static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
10998         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10999         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11000         {}
11001 };
11002
11003 static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
11004         /* Front Mic pin: input vref at 50% */
11005         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
11006         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11007         {}
11008 };
11009
11010 static struct hda_input_mux alc262_fujitsu_capture_source = {
11011         .num_items = 3,
11012         .items = {
11013                 { "Mic", 0x0 },
11014                 { "Int Mic", 0x1 },
11015                 { "CD", 0x4 },
11016         },
11017 };
11018
11019 static struct hda_input_mux alc262_HP_capture_source = {
11020         .num_items = 5,
11021         .items = {
11022                 { "Mic", 0x0 },
11023                 { "Front Mic", 0x1 },
11024                 { "Line", 0x2 },
11025                 { "CD", 0x4 },
11026                 { "AUX IN", 0x6 },
11027         },
11028 };
11029
11030 static struct hda_input_mux alc262_HP_D7000_capture_source = {
11031         .num_items = 4,
11032         .items = {
11033                 { "Mic", 0x0 },
11034                 { "Front Mic", 0x2 },
11035                 { "Line", 0x1 },
11036                 { "CD", 0x4 },
11037         },
11038 };
11039
11040 /* mute/unmute internal speaker according to the hp jacks and mute state */
11041 static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
11042 {
11043         struct alc_spec *spec = codec->spec;
11044         unsigned int mute;
11045
11046         if (force || !spec->sense_updated) {
11047                 spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
11048                                      snd_hda_jack_detect(codec, 0x1b);
11049                 spec->sense_updated = 1;
11050         }
11051         /* unmute internal speaker only if both HPs are unplugged and
11052          * master switch is on
11053          */
11054         if (spec->jack_present)
11055                 mute = HDA_AMP_MUTE;
11056         else
11057                 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
11058         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11059                                  HDA_AMP_MUTE, mute);
11060 }
11061
11062 /* unsolicited event for HP jack sensing */
11063 static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
11064                                        unsigned int res)
11065 {
11066         if ((res >> 26) != ALC_HP_EVENT)
11067                 return;
11068         alc262_fujitsu_automute(codec, 1);
11069 }
11070
11071 static void alc262_fujitsu_init_hook(struct hda_codec *codec)
11072 {
11073         alc262_fujitsu_automute(codec, 1);
11074 }
11075
11076 /* bind volumes of both NID 0x0c and 0x0d */
11077 static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
11078         .ops = &snd_hda_bind_vol,
11079         .values = {
11080                 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
11081                 HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
11082                 0
11083         },
11084 };
11085
11086 /* mute/unmute internal speaker according to the hp jack and mute state */
11087 static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
11088 {
11089         struct alc_spec *spec = codec->spec;
11090         unsigned int mute;
11091
11092         if (force || !spec->sense_updated) {
11093                 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
11094                 spec->sense_updated = 1;
11095         }
11096         if (spec->jack_present) {
11097                 /* mute internal speaker */
11098                 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11099                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
11100                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11101                                          HDA_AMP_MUTE, HDA_AMP_MUTE);
11102         } else {
11103                 /* unmute internal speaker if necessary */
11104                 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
11105                 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11106                                          HDA_AMP_MUTE, mute);
11107                 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11108                                          HDA_AMP_MUTE, mute);
11109         }
11110 }
11111
11112 /* unsolicited event for HP jack sensing */
11113 static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
11114                                        unsigned int res)
11115 {
11116         if ((res >> 26) != ALC_HP_EVENT)
11117                 return;
11118         alc262_lenovo_3000_automute(codec, 1);
11119 }
11120
11121 static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
11122                                   int dir, int idx, long *valp)
11123 {
11124         int i, change = 0;
11125
11126         for (i = 0; i < 2; i++, valp++)
11127                 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
11128                                                    HDA_AMP_MUTE,
11129                                                    *valp ? 0 : HDA_AMP_MUTE);
11130         return change;
11131 }
11132
11133 /* bind hp and internal speaker mute (with plug check) */
11134 static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
11135                                          struct snd_ctl_elem_value *ucontrol)
11136 {
11137         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11138         long *valp = ucontrol->value.integer.value;
11139         int change;
11140
11141         change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11142         change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11143         if (change)
11144                 alc262_fujitsu_automute(codec, 0);
11145         return change;
11146 }
11147
11148 static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
11149         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11150         {
11151                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11152                 .name = "Master Playback Switch",
11153                 .subdevice = HDA_SUBDEV_AMP_FLAG,
11154                 .info = snd_hda_mixer_amp_switch_info,
11155                 .get = snd_hda_mixer_amp_switch_get,
11156                 .put = alc262_fujitsu_master_sw_put,
11157                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11158         },
11159         {
11160                 .iface = NID_MAPPING,
11161                 .name = "Master Playback Switch",
11162                 .private_value = 0x1b,
11163         },
11164         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11165         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11166         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11167         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11168         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11169         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11170         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11171         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11172         { } /* end */
11173 };
11174
11175 /* bind hp and internal speaker mute (with plug check) */
11176 static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
11177                                          struct snd_ctl_elem_value *ucontrol)
11178 {
11179         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11180         long *valp = ucontrol->value.integer.value;
11181         int change;
11182
11183         change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11184         if (change)
11185                 alc262_lenovo_3000_automute(codec, 0);
11186         return change;
11187 }
11188
11189 static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
11190         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11191         {
11192                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11193                 .name = "Master Playback Switch",
11194                 .subdevice = HDA_SUBDEV_AMP_FLAG,
11195                 .info = snd_hda_mixer_amp_switch_info,
11196                 .get = snd_hda_mixer_amp_switch_get,
11197                 .put = alc262_lenovo_3000_master_sw_put,
11198                 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
11199         },
11200         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11201         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11202         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11203         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11204         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11205         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11206         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11207         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11208         { } /* end */
11209 };
11210
11211 static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11212         HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11213         ALC262_HIPPO_MASTER_SWITCH,
11214         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11215         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11216         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11217         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11218         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11219         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11220         { } /* end */
11221 };
11222
11223 /* additional init verbs for Benq laptops */
11224 static struct hda_verb alc262_EAPD_verbs[] = {
11225         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11226         {0x20, AC_VERB_SET_PROC_COEF,  0x3070},
11227         {}
11228 };
11229
11230 static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11231         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11232         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11233
11234         {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11235         {0x20, AC_VERB_SET_PROC_COEF,  0x3050},
11236         {}
11237 };
11238
11239 /* Samsung Q1 Ultra Vista model setup */
11240 static struct snd_kcontrol_new alc262_ultra_mixer[] = {
11241         HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11242         HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11243         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11244         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11245         HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
11246         HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
11247         { } /* end */
11248 };
11249
11250 static struct hda_verb alc262_ultra_verbs[] = {
11251         /* output mixer */
11252         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11253         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11254         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11255         /* speaker */
11256         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11257         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11258         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11259         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11260         /* HP */
11261         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11262         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11263         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11264         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11265         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11266         /* internal mic */
11267         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11268         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11269         /* ADC, choose mic */
11270         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11271         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11272         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11273         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11274         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11275         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11276         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11277         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11278         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11279         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
11280         {}
11281 };
11282
11283 /* mute/unmute internal speaker according to the hp jack and mute state */
11284 static void alc262_ultra_automute(struct hda_codec *codec)
11285 {
11286         struct alc_spec *spec = codec->spec;
11287         unsigned int mute;
11288
11289         mute = 0;
11290         /* auto-mute only when HP is used as HP */
11291         if (!spec->cur_mux[0]) {
11292                 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
11293                 if (spec->jack_present)
11294                         mute = HDA_AMP_MUTE;
11295         }
11296         /* mute/unmute internal speaker */
11297         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11298                                  HDA_AMP_MUTE, mute);
11299         /* mute/unmute HP */
11300         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11301                                  HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
11302 }
11303
11304 /* unsolicited event for HP jack sensing */
11305 static void alc262_ultra_unsol_event(struct hda_codec *codec,
11306                                        unsigned int res)
11307 {
11308         if ((res >> 26) != ALC880_HP_EVENT)
11309                 return;
11310         alc262_ultra_automute(codec);
11311 }
11312
11313 static struct hda_input_mux alc262_ultra_capture_source = {
11314         .num_items = 2,
11315         .items = {
11316                 { "Mic", 0x1 },
11317                 { "Headphone", 0x7 },
11318         },
11319 };
11320
11321 static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
11322                                      struct snd_ctl_elem_value *ucontrol)
11323 {
11324         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11325         struct alc_spec *spec = codec->spec;
11326         int ret;
11327
11328         ret = alc_mux_enum_put(kcontrol, ucontrol);
11329         if (!ret)
11330                 return 0;
11331         /* reprogram the HP pin as mic or HP according to the input source */
11332         snd_hda_codec_write_cache(codec, 0x15, 0,
11333                                   AC_VERB_SET_PIN_WIDGET_CONTROL,
11334                                   spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
11335         alc262_ultra_automute(codec); /* mute/unmute HP */
11336         return ret;
11337 }
11338
11339 static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
11340         HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
11341         HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
11342         {
11343                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11344                 .name = "Capture Source",
11345                 .info = alc_mux_enum_info,
11346                 .get = alc_mux_enum_get,
11347                 .put = alc262_ultra_mux_enum_put,
11348         },
11349         {
11350                 .iface = NID_MAPPING,
11351                 .name = "Capture Source",
11352                 .private_value = 0x15,
11353         },
11354         { } /* end */
11355 };
11356
11357 /* We use two mixers depending on the output pin; 0x16 is a mono output
11358  * and thus it's bound with a different mixer.
11359  * This function returns which mixer amp should be used.
11360  */
11361 static int alc262_check_volbit(hda_nid_t nid)
11362 {
11363         if (!nid)
11364                 return 0;
11365         else if (nid == 0x16)
11366                 return 2;
11367         else
11368                 return 1;
11369 }
11370
11371 static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
11372                                   const char *pfx, int *vbits)
11373 {
11374         unsigned long val;
11375         int vbit;
11376
11377         vbit = alc262_check_volbit(nid);
11378         if (!vbit)
11379                 return 0;
11380         if (*vbits & vbit) /* a volume control for this mixer already there */
11381                 return 0;
11382         *vbits |= vbit;
11383         if (vbit == 2)
11384                 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
11385         else
11386                 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
11387         return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val);
11388 }
11389
11390 static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
11391                                  const char *pfx)
11392 {
11393         unsigned long val;
11394
11395         if (!nid)
11396                 return 0;
11397         if (nid == 0x16)
11398                 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
11399         else
11400                 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
11401         return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val);
11402 }
11403
11404 /* add playback controls from the parsed DAC table */
11405 static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
11406                                              const struct auto_pin_cfg *cfg)
11407 {
11408         const char *pfx;
11409         int vbits;
11410         int err;
11411
11412         spec->multiout.num_dacs = 1;    /* only use one dac */
11413         spec->multiout.dac_nids = spec->private_dac_nids;
11414         spec->multiout.dac_nids[0] = 2;
11415
11416         if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
11417                 pfx = "Master";
11418         else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11419                 pfx = "Speaker";
11420         else
11421                 pfx = "Front";
11422         err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
11423         if (err < 0)
11424                 return err;
11425         err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
11426         if (err < 0)
11427                 return err;
11428         err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
11429         if (err < 0)
11430                 return err;
11431
11432         vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
11433                 alc262_check_volbit(cfg->speaker_pins[0]) |
11434                 alc262_check_volbit(cfg->hp_pins[0]);
11435         if (vbits == 1 || vbits == 2)
11436                 pfx = "Master"; /* only one mixer is used */
11437         else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11438                 pfx = "Speaker";
11439         else
11440                 pfx = "Front";
11441         vbits = 0;
11442         err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
11443         if (err < 0)
11444                 return err;
11445         err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
11446                                      &vbits);
11447         if (err < 0)
11448                 return err;
11449         err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
11450                                      &vbits);
11451         if (err < 0)
11452                 return err;
11453         return 0;
11454 }
11455
11456 #define alc262_auto_create_input_ctls \
11457         alc882_auto_create_input_ctls
11458
11459 /*
11460  * generic initialization of ADC, input mixers and output mixers
11461  */
11462 static struct hda_verb alc262_volume_init_verbs[] = {
11463         /*
11464          * Unmute ADC0-2 and set the default input to mic-in
11465          */
11466         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11467         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11468         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11469         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11470         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11471         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11472
11473         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11474          * mixer widget
11475          * Note: PASD motherboards uses the Line In 2 as the input for
11476          * front panel mic (mic 2)
11477          */
11478         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11479         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11480         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11481         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11482         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11483         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11484
11485         /*
11486          * Set up output mixers (0x0c - 0x0f)
11487          */
11488         /* set vol=0 to output mixers */
11489         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11490         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11491         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11492
11493         /* set up input amps for analog loopback */
11494         /* Amp Indices: DAC = 0, mixer = 1 */
11495         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11496         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11497         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11498         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11499         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11500         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11501
11502         /* FIXME: use matrix-type input source selection */
11503         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11504         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11505         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11506         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11507         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11508         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11509         /* Input mixer2 */
11510         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11511         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11512         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11513         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11514         /* Input mixer3 */
11515         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11516         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11517         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11518         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11519
11520         { }
11521 };
11522
11523 static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11524         /*
11525          * Unmute ADC0-2 and set the default input to mic-in
11526          */
11527         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11528         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11529         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11530         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11531         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11532         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11533
11534         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11535          * mixer widget
11536          * Note: PASD motherboards uses the Line In 2 as the input for
11537          * front panel mic (mic 2)
11538          */
11539         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11540         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11541         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11542         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11543         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11544         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11545         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11546         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11547
11548         /*
11549          * Set up output mixers (0x0c - 0x0e)
11550          */
11551         /* set vol=0 to output mixers */
11552         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11553         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11554         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11555
11556         /* set up input amps for analog loopback */
11557         /* Amp Indices: DAC = 0, mixer = 1 */
11558         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11559         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11560         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11561         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11562         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11563         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11564
11565         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11566         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11567         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11568
11569         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11570         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11571
11572         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11573         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11574
11575         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11576         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11577         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11578         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11579         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11580
11581         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11582         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11583         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11584         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11585         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11586         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11587
11588
11589         /* FIXME: use matrix-type input source selection */
11590         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
11591         /* Input mixer1: only unmute Mic */
11592         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11593         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11594         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11595         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11596         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11597         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11598         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11599         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11600         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11601         /* Input mixer2 */
11602         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11603         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11604         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11605         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11606         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11607         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11608         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11609         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11610         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11611         /* Input mixer3 */
11612         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11613         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11614         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11615         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11616         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11617         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11618         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11619         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11620         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11621
11622         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11623
11624         { }
11625 };
11626
11627 static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
11628         /*
11629          * Unmute ADC0-2 and set the default input to mic-in
11630          */
11631         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11632         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11633         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11634         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11635         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11636         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11637
11638         /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11639          * mixer widget
11640          * Note: PASD motherboards uses the Line In 2 as the input for front
11641          * panel mic (mic 2)
11642          */
11643         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11644         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11645         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11646         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11647         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11648         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11649         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11650         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11651         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11652         /*
11653          * Set up output mixers (0x0c - 0x0e)
11654          */
11655         /* set vol=0 to output mixers */
11656         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11657         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11658         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11659
11660         /* set up input amps for analog loopback */
11661         /* Amp Indices: DAC = 0, mixer = 1 */
11662         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11663         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11664         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11665         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11666         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11667         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11668
11669
11670         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },        /* HP */
11671         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Mono */
11672         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* rear MIC */
11673         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },        /* Line in */
11674         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* Front MIC */
11675         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Line out */
11676         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },        /* CD in */
11677
11678         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11679         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11680
11681         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11682         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11683
11684         /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
11685         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11686         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11687         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
11688         {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11689         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11690
11691         /* FIXME: use matrix-type input source selection */
11692         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11693         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11694         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
11695         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
11696         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
11697         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
11698         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
11699         /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))},  */
11700         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
11701         /* Input mixer2 */
11702         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11703         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11704         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11705         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11706         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11707         /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11708         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11709         /* Input mixer3 */
11710         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11711         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11712         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11713         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11714         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11715         /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11716         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11717
11718         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11719
11720         { }
11721 };
11722
11723 static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
11724
11725         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },       /* Front Speaker */
11726         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11727         {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
11728
11729         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* MIC jack */
11730         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },    /* Front MIC */
11731         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11732         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11733
11734         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },        /* HP  jack */
11735         {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11736         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11737         {}
11738 };
11739
11740
11741 #ifdef CONFIG_SND_HDA_POWER_SAVE
11742 #define alc262_loopbacks        alc880_loopbacks
11743 #endif
11744
11745 /* pcm configuration: identical with ALC880 */
11746 #define alc262_pcm_analog_playback      alc880_pcm_analog_playback
11747 #define alc262_pcm_analog_capture       alc880_pcm_analog_capture
11748 #define alc262_pcm_digital_playback     alc880_pcm_digital_playback
11749 #define alc262_pcm_digital_capture      alc880_pcm_digital_capture
11750
11751 /*
11752  * BIOS auto configuration
11753  */
11754 static int alc262_parse_auto_config(struct hda_codec *codec)
11755 {
11756         struct alc_spec *spec = codec->spec;
11757         int err;
11758         static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
11759
11760         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
11761                                            alc262_ignore);
11762         if (err < 0)
11763                 return err;
11764         if (!spec->autocfg.line_outs) {
11765                 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
11766                         spec->multiout.max_channels = 2;
11767                         spec->no_analog = 1;
11768                         goto dig_only;
11769                 }
11770                 return 0; /* can't find valid BIOS pin config */
11771         }
11772         err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
11773         if (err < 0)
11774                 return err;
11775         err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
11776         if (err < 0)
11777                 return err;
11778
11779         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
11780
11781  dig_only:
11782         if (spec->autocfg.dig_outs) {
11783                 spec->multiout.dig_out_nid = ALC262_DIGOUT_NID;
11784                 spec->dig_out_type = spec->autocfg.dig_out_type[0];
11785         }
11786         if (spec->autocfg.dig_in_pin)
11787                 spec->dig_in_nid = ALC262_DIGIN_NID;
11788
11789         if (spec->kctls.list)
11790                 add_mixer(spec, spec->kctls.list);
11791
11792         add_verb(spec, alc262_volume_init_verbs);
11793         spec->num_mux_defs = 1;
11794         spec->input_mux = &spec->private_imux[0];
11795
11796         err = alc_auto_add_mic_boost(codec);
11797         if (err < 0)
11798                 return err;
11799
11800         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
11801
11802         return 1;
11803 }
11804
11805 #define alc262_auto_init_multi_out      alc882_auto_init_multi_out
11806 #define alc262_auto_init_hp_out         alc882_auto_init_hp_out
11807 #define alc262_auto_init_analog_input   alc882_auto_init_analog_input
11808 #define alc262_auto_init_input_src      alc882_auto_init_input_src
11809
11810
11811 /* init callback for auto-configuration model -- overriding the default init */
11812 static void alc262_auto_init(struct hda_codec *codec)
11813 {
11814         struct alc_spec *spec = codec->spec;
11815         alc262_auto_init_multi_out(codec);
11816         alc262_auto_init_hp_out(codec);
11817         alc262_auto_init_analog_input(codec);
11818         alc262_auto_init_input_src(codec);
11819         if (spec->unsol_event)
11820                 alc_inithook(codec);
11821 }
11822
11823 /*
11824  * configuration and preset
11825  */
11826 static const char *alc262_models[ALC262_MODEL_LAST] = {
11827         [ALC262_BASIC]          = "basic",
11828         [ALC262_HIPPO]          = "hippo",
11829         [ALC262_HIPPO_1]        = "hippo_1",
11830         [ALC262_FUJITSU]        = "fujitsu",
11831         [ALC262_HP_BPC]         = "hp-bpc",
11832         [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
11833         [ALC262_HP_TC_T5735]    = "hp-tc-t5735",
11834         [ALC262_HP_RP5700]      = "hp-rp5700",
11835         [ALC262_BENQ_ED8]       = "benq",
11836         [ALC262_BENQ_T31]       = "benq-t31",
11837         [ALC262_SONY_ASSAMD]    = "sony-assamd",
11838         [ALC262_TOSHIBA_S06]    = "toshiba-s06",
11839         [ALC262_TOSHIBA_RX1]    = "toshiba-rx1",
11840         [ALC262_ULTRA]          = "ultra",
11841         [ALC262_LENOVO_3000]    = "lenovo-3000",
11842         [ALC262_NEC]            = "nec",
11843         [ALC262_TYAN]           = "tyan",
11844         [ALC262_AUTO]           = "auto",
11845 };
11846
11847 static struct snd_pci_quirk alc262_cfg_tbl[] = {
11848         SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
11849         SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
11850         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
11851                            ALC262_HP_BPC),
11852         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
11853                            ALC262_HP_BPC),
11854         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
11855                            ALC262_HP_BPC),
11856         SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
11857         SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
11858         SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
11859         SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
11860         SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
11861         SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
11862         SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
11863         SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
11864         SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
11865         SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
11866         SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
11867         SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
11868                       ALC262_HP_TC_T5735),
11869         SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
11870         SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11871         SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
11872         SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11873         SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
11874         SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
11875         SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
11876         SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
11877 #if 0 /* disable the quirk since model=auto works better in recent versions */
11878         SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
11879                            ALC262_SONY_ASSAMD),
11880 #endif
11881         SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
11882                       ALC262_TOSHIBA_RX1),
11883         SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
11884         SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
11885         SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
11886         SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
11887         SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
11888                            ALC262_ULTRA),
11889         SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
11890         SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
11891         SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
11892         SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
11893         SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
11894         {}
11895 };
11896
11897 static struct alc_config_preset alc262_presets[] = {
11898         [ALC262_BASIC] = {
11899                 .mixers = { alc262_base_mixer },
11900                 .init_verbs = { alc262_init_verbs },
11901                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11902                 .dac_nids = alc262_dac_nids,
11903                 .hp_nid = 0x03,
11904                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11905                 .channel_mode = alc262_modes,
11906                 .input_mux = &alc262_capture_source,
11907         },
11908         [ALC262_HIPPO] = {
11909                 .mixers = { alc262_hippo_mixer },
11910                 .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
11911                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11912                 .dac_nids = alc262_dac_nids,
11913                 .hp_nid = 0x03,
11914                 .dig_out_nid = ALC262_DIGOUT_NID,
11915                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11916                 .channel_mode = alc262_modes,
11917                 .input_mux = &alc262_capture_source,
11918                 .unsol_event = alc262_hippo_unsol_event,
11919                 .setup = alc262_hippo_setup,
11920                 .init_hook = alc262_hippo_automute,
11921         },
11922         [ALC262_HIPPO_1] = {
11923                 .mixers = { alc262_hippo1_mixer },
11924                 .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
11925                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11926                 .dac_nids = alc262_dac_nids,
11927                 .hp_nid = 0x02,
11928                 .dig_out_nid = ALC262_DIGOUT_NID,
11929                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11930                 .channel_mode = alc262_modes,
11931                 .input_mux = &alc262_capture_source,
11932                 .unsol_event = alc262_hippo_unsol_event,
11933                 .setup = alc262_hippo1_setup,
11934                 .init_hook = alc262_hippo_automute,
11935         },
11936         [ALC262_FUJITSU] = {
11937                 .mixers = { alc262_fujitsu_mixer },
11938                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
11939                                 alc262_fujitsu_unsol_verbs },
11940                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11941                 .dac_nids = alc262_dac_nids,
11942                 .hp_nid = 0x03,
11943                 .dig_out_nid = ALC262_DIGOUT_NID,
11944                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11945                 .channel_mode = alc262_modes,
11946                 .input_mux = &alc262_fujitsu_capture_source,
11947                 .unsol_event = alc262_fujitsu_unsol_event,
11948                 .init_hook = alc262_fujitsu_init_hook,
11949         },
11950         [ALC262_HP_BPC] = {
11951                 .mixers = { alc262_HP_BPC_mixer },
11952                 .init_verbs = { alc262_HP_BPC_init_verbs },
11953                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11954                 .dac_nids = alc262_dac_nids,
11955                 .hp_nid = 0x03,
11956                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11957                 .channel_mode = alc262_modes,
11958                 .input_mux = &alc262_HP_capture_source,
11959                 .unsol_event = alc262_hp_bpc_unsol_event,
11960                 .init_hook = alc262_hp_bpc_automute,
11961         },
11962         [ALC262_HP_BPC_D7000_WF] = {
11963                 .mixers = { alc262_HP_BPC_WildWest_mixer },
11964                 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
11965                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11966                 .dac_nids = alc262_dac_nids,
11967                 .hp_nid = 0x03,
11968                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11969                 .channel_mode = alc262_modes,
11970                 .input_mux = &alc262_HP_D7000_capture_source,
11971                 .unsol_event = alc262_hp_wildwest_unsol_event,
11972                 .init_hook = alc262_hp_wildwest_automute,
11973         },
11974         [ALC262_HP_BPC_D7000_WL] = {
11975                 .mixers = { alc262_HP_BPC_WildWest_mixer,
11976                             alc262_HP_BPC_WildWest_option_mixer },
11977                 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
11978                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11979                 .dac_nids = alc262_dac_nids,
11980                 .hp_nid = 0x03,
11981                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11982                 .channel_mode = alc262_modes,
11983                 .input_mux = &alc262_HP_D7000_capture_source,
11984                 .unsol_event = alc262_hp_wildwest_unsol_event,
11985                 .init_hook = alc262_hp_wildwest_automute,
11986         },
11987         [ALC262_HP_TC_T5735] = {
11988                 .mixers = { alc262_hp_t5735_mixer },
11989                 .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
11990                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11991                 .dac_nids = alc262_dac_nids,
11992                 .hp_nid = 0x03,
11993                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11994                 .channel_mode = alc262_modes,
11995                 .input_mux = &alc262_capture_source,
11996                 .unsol_event = alc_sku_unsol_event,
11997                 .setup = alc262_hp_t5735_setup,
11998                 .init_hook = alc_inithook,
11999         },
12000         [ALC262_HP_RP5700] = {
12001                 .mixers = { alc262_hp_rp5700_mixer },
12002                 .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
12003                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12004                 .dac_nids = alc262_dac_nids,
12005                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12006                 .channel_mode = alc262_modes,
12007                 .input_mux = &alc262_hp_rp5700_capture_source,
12008         },
12009         [ALC262_BENQ_ED8] = {
12010                 .mixers = { alc262_base_mixer },
12011                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
12012                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12013                 .dac_nids = alc262_dac_nids,
12014                 .hp_nid = 0x03,
12015                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12016                 .channel_mode = alc262_modes,
12017                 .input_mux = &alc262_capture_source,
12018         },
12019         [ALC262_SONY_ASSAMD] = {
12020                 .mixers = { alc262_sony_mixer },
12021                 .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
12022                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12023                 .dac_nids = alc262_dac_nids,
12024                 .hp_nid = 0x02,
12025                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12026                 .channel_mode = alc262_modes,
12027                 .input_mux = &alc262_capture_source,
12028                 .unsol_event = alc262_hippo_unsol_event,
12029                 .setup = alc262_hippo_setup,
12030                 .init_hook = alc262_hippo_automute,
12031         },
12032         [ALC262_BENQ_T31] = {
12033                 .mixers = { alc262_benq_t31_mixer },
12034                 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
12035                                 alc_hp15_unsol_verbs },
12036                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12037                 .dac_nids = alc262_dac_nids,
12038                 .hp_nid = 0x03,
12039                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12040                 .channel_mode = alc262_modes,
12041                 .input_mux = &alc262_capture_source,
12042                 .unsol_event = alc262_hippo_unsol_event,
12043                 .setup = alc262_hippo_setup,
12044                 .init_hook = alc262_hippo_automute,
12045         },
12046         [ALC262_ULTRA] = {
12047                 .mixers = { alc262_ultra_mixer },
12048                 .cap_mixer = alc262_ultra_capture_mixer,
12049                 .init_verbs = { alc262_ultra_verbs },
12050                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12051                 .dac_nids = alc262_dac_nids,
12052                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12053                 .channel_mode = alc262_modes,
12054                 .input_mux = &alc262_ultra_capture_source,
12055                 .adc_nids = alc262_adc_nids, /* ADC0 */
12056                 .capsrc_nids = alc262_capsrc_nids,
12057                 .num_adc_nids = 1, /* single ADC */
12058                 .unsol_event = alc262_ultra_unsol_event,
12059                 .init_hook = alc262_ultra_automute,
12060         },
12061         [ALC262_LENOVO_3000] = {
12062                 .mixers = { alc262_lenovo_3000_mixer },
12063                 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12064                                 alc262_lenovo_3000_unsol_verbs,
12065                                 alc262_lenovo_3000_init_verbs },
12066                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12067                 .dac_nids = alc262_dac_nids,
12068                 .hp_nid = 0x03,
12069                 .dig_out_nid = ALC262_DIGOUT_NID,
12070                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12071                 .channel_mode = alc262_modes,
12072                 .input_mux = &alc262_fujitsu_capture_source,
12073                 .unsol_event = alc262_lenovo_3000_unsol_event,
12074         },
12075         [ALC262_NEC] = {
12076                 .mixers = { alc262_nec_mixer },
12077                 .init_verbs = { alc262_nec_verbs },
12078                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12079                 .dac_nids = alc262_dac_nids,
12080                 .hp_nid = 0x03,
12081                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12082                 .channel_mode = alc262_modes,
12083                 .input_mux = &alc262_capture_source,
12084         },
12085         [ALC262_TOSHIBA_S06] = {
12086                 .mixers = { alc262_toshiba_s06_mixer },
12087                 .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
12088                                                         alc262_eapd_verbs },
12089                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12090                 .capsrc_nids = alc262_dmic_capsrc_nids,
12091                 .dac_nids = alc262_dac_nids,
12092                 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
12093                 .num_adc_nids = 1, /* single ADC */
12094                 .dig_out_nid = ALC262_DIGOUT_NID,
12095                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12096                 .channel_mode = alc262_modes,
12097                 .unsol_event = alc_sku_unsol_event,
12098                 .setup = alc262_toshiba_s06_setup,
12099                 .init_hook = alc_inithook,
12100         },
12101         [ALC262_TOSHIBA_RX1] = {
12102                 .mixers = { alc262_toshiba_rx1_mixer },
12103                 .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
12104                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12105                 .dac_nids = alc262_dac_nids,
12106                 .hp_nid = 0x03,
12107                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12108                 .channel_mode = alc262_modes,
12109                 .input_mux = &alc262_capture_source,
12110                 .unsol_event = alc262_hippo_unsol_event,
12111                 .setup = alc262_hippo_setup,
12112                 .init_hook = alc262_hippo_automute,
12113         },
12114         [ALC262_TYAN] = {
12115                 .mixers = { alc262_tyan_mixer },
12116                 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
12117                 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12118                 .dac_nids = alc262_dac_nids,
12119                 .hp_nid = 0x02,
12120                 .dig_out_nid = ALC262_DIGOUT_NID,
12121                 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12122                 .channel_mode = alc262_modes,
12123                 .input_mux = &alc262_capture_source,
12124                 .unsol_event = alc_automute_amp_unsol_event,
12125                 .setup = alc262_tyan_setup,
12126                 .init_hook = alc_automute_amp,
12127         },
12128 };
12129
12130 static int patch_alc262(struct hda_codec *codec)
12131 {
12132         struct alc_spec *spec;
12133         int board_config;
12134         int err;
12135
12136         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
12137         if (spec == NULL)
12138                 return -ENOMEM;
12139
12140         codec->spec = spec;
12141 #if 0
12142         /* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
12143          * under-run
12144          */
12145         {
12146         int tmp;
12147         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12148         tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
12149         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12150         snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
12151         }
12152 #endif
12153
12154         alc_fix_pll_init(codec, 0x20, 0x0a, 10);
12155
12156         board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
12157                                                   alc262_models,
12158                                                   alc262_cfg_tbl);
12159
12160         if (board_config < 0) {
12161                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12162                        codec->chip_name);
12163                 board_config = ALC262_AUTO;
12164         }
12165
12166         if (board_config == ALC262_AUTO) {
12167                 /* automatic parse from the BIOS config */
12168                 err = alc262_parse_auto_config(codec);
12169                 if (err < 0) {
12170                         alc_free(codec);
12171                         return err;
12172                 } else if (!err) {
12173                         printk(KERN_INFO
12174                                "hda_codec: Cannot set up configuration "
12175                                "from BIOS.  Using base mode...\n");
12176                         board_config = ALC262_BASIC;
12177                 }
12178         }
12179
12180         if (!spec->no_analog) {
12181                 err = snd_hda_attach_beep_device(codec, 0x1);
12182                 if (err < 0) {
12183                         alc_free(codec);
12184                         return err;
12185                 }
12186         }
12187
12188         if (board_config != ALC262_AUTO)
12189                 setup_preset(codec, &alc262_presets[board_config]);
12190
12191         spec->stream_analog_playback = &alc262_pcm_analog_playback;
12192         spec->stream_analog_capture = &alc262_pcm_analog_capture;
12193
12194         spec->stream_digital_playback = &alc262_pcm_digital_playback;
12195         spec->stream_digital_capture = &alc262_pcm_digital_capture;
12196
12197         if (!spec->adc_nids && spec->input_mux) {
12198                 int i;
12199                 /* check whether the digital-mic has to be supported */
12200                 for (i = 0; i < spec->input_mux->num_items; i++) {
12201                         if (spec->input_mux->items[i].index >= 9)
12202                                 break;
12203                 }
12204                 if (i < spec->input_mux->num_items) {
12205                         /* use only ADC0 */
12206                         spec->adc_nids = alc262_dmic_adc_nids;
12207                         spec->num_adc_nids = 1;
12208                         spec->capsrc_nids = alc262_dmic_capsrc_nids;
12209                 } else {
12210                         /* all analog inputs */
12211                         /* check whether NID 0x07 is valid */
12212                         unsigned int wcap = get_wcaps(codec, 0x07);
12213
12214                         /* get type */
12215                         wcap = get_wcaps_type(wcap);
12216                         if (wcap != AC_WID_AUD_IN) {
12217                                 spec->adc_nids = alc262_adc_nids_alt;
12218                                 spec->num_adc_nids =
12219                                         ARRAY_SIZE(alc262_adc_nids_alt);
12220                                 spec->capsrc_nids = alc262_capsrc_nids_alt;
12221                         } else {
12222                                 spec->adc_nids = alc262_adc_nids;
12223                                 spec->num_adc_nids =
12224                                         ARRAY_SIZE(alc262_adc_nids);
12225                                 spec->capsrc_nids = alc262_capsrc_nids;
12226                         }
12227                 }
12228         }
12229         if (!spec->cap_mixer && !spec->no_analog)
12230                 set_capture_mixer(codec);
12231         if (!spec->no_analog)
12232                 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12233
12234         spec->vmaster_nid = 0x0c;
12235
12236         codec->patch_ops = alc_patch_ops;
12237         if (board_config == ALC262_AUTO)
12238                 spec->init_hook = alc262_auto_init;
12239 #ifdef CONFIG_SND_HDA_POWER_SAVE
12240         if (!spec->loopback.amplist)
12241                 spec->loopback.amplist = alc262_loopbacks;
12242 #endif
12243
12244         return 0;
12245 }
12246
12247 /*
12248  *  ALC268 channel source setting (2 channel)
12249  */
12250 #define ALC268_DIGOUT_NID       ALC880_DIGOUT_NID
12251 #define alc268_modes            alc260_modes
12252
12253 static hda_nid_t alc268_dac_nids[2] = {
12254         /* front, hp */
12255         0x02, 0x03
12256 };
12257
12258 static hda_nid_t alc268_adc_nids[2] = {
12259         /* ADC0-1 */
12260         0x08, 0x07
12261 };
12262
12263 static hda_nid_t alc268_adc_nids_alt[1] = {
12264         /* ADC0 */
12265         0x08
12266 };
12267
12268 static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
12269
12270 static struct snd_kcontrol_new alc268_base_mixer[] = {
12271         /* output mixer control */
12272         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12273         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12274         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12275         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12276         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12277         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12278         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12279         { }
12280 };
12281
12282 static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
12283         /* output mixer control */
12284         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12285         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12286         ALC262_HIPPO_MASTER_SWITCH,
12287         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12288         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12289         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12290         { }
12291 };
12292
12293 /* bind Beep switches of both NID 0x0f and 0x10 */
12294 static struct hda_bind_ctls alc268_bind_beep_sw = {
12295         .ops = &snd_hda_bind_sw,
12296         .values = {
12297                 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
12298                 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
12299                 0
12300         },
12301 };
12302
12303 static struct snd_kcontrol_new alc268_beep_mixer[] = {
12304         HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
12305         HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
12306         { }
12307 };
12308
12309 static struct hda_verb alc268_eapd_verbs[] = {
12310         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
12311         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
12312         { }
12313 };
12314
12315 /* Toshiba specific */
12316 static struct hda_verb alc268_toshiba_verbs[] = {
12317         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12318         { } /* end */
12319 };
12320
12321 /* Acer specific */
12322 /* bind volumes of both NID 0x02 and 0x03 */
12323 static struct hda_bind_ctls alc268_acer_bind_master_vol = {
12324         .ops = &snd_hda_bind_vol,
12325         .values = {
12326                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
12327                 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
12328                 0
12329         },
12330 };
12331
12332 /* mute/unmute internal speaker according to the hp jack and mute state */
12333 static void alc268_acer_automute(struct hda_codec *codec, int force)
12334 {
12335         struct alc_spec *spec = codec->spec;
12336         unsigned int mute;
12337
12338         if (force || !spec->sense_updated) {
12339                 spec->jack_present = snd_hda_jack_detect(codec, 0x14);
12340                 spec->sense_updated = 1;
12341         }
12342         if (spec->jack_present)
12343                 mute = HDA_AMP_MUTE; /* mute internal speaker */
12344         else /* unmute internal speaker if necessary */
12345                 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
12346         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
12347                                  HDA_AMP_MUTE, mute);
12348 }
12349
12350
12351 /* bind hp and internal speaker mute (with plug check) */
12352 static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
12353                                      struct snd_ctl_elem_value *ucontrol)
12354 {
12355         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
12356         long *valp = ucontrol->value.integer.value;
12357         int change;
12358
12359         change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
12360         if (change)
12361                 alc268_acer_automute(codec, 0);
12362         return change;
12363 }
12364
12365 static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
12366         /* output mixer control */
12367         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12368         {
12369                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12370                 .name = "Master Playback Switch",
12371                 .subdevice = HDA_SUBDEV_AMP_FLAG,
12372                 .info = snd_hda_mixer_amp_switch_info,
12373                 .get = snd_hda_mixer_amp_switch_get,
12374                 .put = alc268_acer_master_sw_put,
12375                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12376         },
12377         HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
12378         { }
12379 };
12380
12381 static struct snd_kcontrol_new alc268_acer_mixer[] = {
12382         /* output mixer control */
12383         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12384         {
12385                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12386                 .name = "Master Playback Switch",
12387                 .subdevice = HDA_SUBDEV_AMP_FLAG,
12388                 .info = snd_hda_mixer_amp_switch_info,
12389                 .get = snd_hda_mixer_amp_switch_get,
12390                 .put = alc268_acer_master_sw_put,
12391                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12392         },
12393         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12394         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12395         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12396         { }
12397 };
12398
12399 static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
12400         /* output mixer control */
12401         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12402         {
12403                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12404                 .name = "Master Playback Switch",
12405                 .subdevice = HDA_SUBDEV_AMP_FLAG,
12406                 .info = snd_hda_mixer_amp_switch_info,
12407                 .get = snd_hda_mixer_amp_switch_get,
12408                 .put = alc268_acer_master_sw_put,
12409                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12410         },
12411         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12412         HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12413         { }
12414 };
12415
12416 static struct hda_verb alc268_acer_aspire_one_verbs[] = {
12417         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12418         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12419         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12420         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12421         {0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
12422         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
12423         { }
12424 };
12425
12426 static struct hda_verb alc268_acer_verbs[] = {
12427         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
12428         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12429         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12430         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
12431         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12432         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12433         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12434         { }
12435 };
12436
12437 /* unsolicited event for HP jack sensing */
12438 #define alc268_toshiba_unsol_event      alc262_hippo_unsol_event
12439 #define alc268_toshiba_setup            alc262_hippo_setup
12440 #define alc268_toshiba_automute         alc262_hippo_automute
12441
12442 static void alc268_acer_unsol_event(struct hda_codec *codec,
12443                                        unsigned int res)
12444 {
12445         if ((res >> 26) != ALC880_HP_EVENT)
12446                 return;
12447         alc268_acer_automute(codec, 1);
12448 }
12449
12450 static void alc268_acer_init_hook(struct hda_codec *codec)
12451 {
12452         alc268_acer_automute(codec, 1);
12453 }
12454
12455 /* toggle speaker-output according to the hp-jack state */
12456 static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
12457 {
12458         unsigned int present;
12459         unsigned char bits;
12460
12461         present = snd_hda_jack_detect(codec, 0x15);
12462         bits = present ? AMP_IN_MUTE(0) : 0;
12463         snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
12464                                 AMP_IN_MUTE(0), bits);
12465         snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
12466                                 AMP_IN_MUTE(0), bits);
12467 }
12468
12469 static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
12470                                     unsigned int res)
12471 {
12472         switch (res >> 26) {
12473         case ALC880_HP_EVENT:
12474                 alc268_aspire_one_speaker_automute(codec);
12475                 break;
12476         case ALC880_MIC_EVENT:
12477                 alc_mic_automute(codec);
12478                 break;
12479         }
12480 }
12481
12482 static void alc268_acer_lc_setup(struct hda_codec *codec)
12483 {
12484         struct alc_spec *spec = codec->spec;
12485         spec->ext_mic.pin = 0x18;
12486         spec->ext_mic.mux_idx = 0;
12487         spec->int_mic.pin = 0x12;
12488         spec->int_mic.mux_idx = 6;
12489         spec->auto_mic = 1;
12490 }
12491
12492 static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12493 {
12494         alc268_aspire_one_speaker_automute(codec);
12495         alc_mic_automute(codec);
12496 }
12497
12498 static struct snd_kcontrol_new alc268_dell_mixer[] = {
12499         /* output mixer control */
12500         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12501         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12502         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12503         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12504         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12505         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12506         { }
12507 };
12508
12509 static struct hda_verb alc268_dell_verbs[] = {
12510         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12511         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12512         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12513         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12514         { }
12515 };
12516
12517 /* mute/unmute internal speaker according to the hp jack and mute state */
12518 static void alc268_dell_setup(struct hda_codec *codec)
12519 {
12520         struct alc_spec *spec = codec->spec;
12521
12522         spec->autocfg.hp_pins[0] = 0x15;
12523         spec->autocfg.speaker_pins[0] = 0x14;
12524         spec->ext_mic.pin = 0x18;
12525         spec->ext_mic.mux_idx = 0;
12526         spec->int_mic.pin = 0x19;
12527         spec->int_mic.mux_idx = 1;
12528         spec->auto_mic = 1;
12529 }
12530
12531 static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12532         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12533         HDA_CODEC_MUTE("Speaker 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 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12537         HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12538         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12539         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12540         { }
12541 };
12542
12543 static struct hda_verb alc267_quanta_il1_verbs[] = {
12544         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12545         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12546         { }
12547 };
12548
12549 static void alc267_quanta_il1_setup(struct hda_codec *codec)
12550 {
12551         struct alc_spec *spec = codec->spec;
12552         spec->autocfg.hp_pins[0] = 0x15;
12553         spec->autocfg.speaker_pins[0] = 0x14;
12554         spec->ext_mic.pin = 0x18;
12555         spec->ext_mic.mux_idx = 0;
12556         spec->int_mic.pin = 0x19;
12557         spec->int_mic.mux_idx = 1;
12558         spec->auto_mic = 1;
12559 }
12560
12561 /*
12562  * generic initialization of ADC, input mixers and output mixers
12563  */
12564 static struct hda_verb alc268_base_init_verbs[] = {
12565         /* Unmute DAC0-1 and set vol = 0 */
12566         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12567         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12568
12569         /*
12570          * Set up output mixers (0x0c - 0x0e)
12571          */
12572         /* set vol=0 to output mixers */
12573         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12574         {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
12575
12576         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12577         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12578
12579         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12580         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
12581         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12582         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12583         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12584         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12585         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12586         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12587
12588         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12589         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12590         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12591         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12592         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12593
12594         /* set PCBEEP vol = 0, mute connections */
12595         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12596         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12597         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12598
12599         /* Unmute Selector 23h,24h and set the default input to mic-in */
12600
12601         {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
12602         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12603         {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
12604         {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12605
12606         { }
12607 };
12608
12609 /*
12610  * generic initialization of ADC, input mixers and output mixers
12611  */
12612 static struct hda_verb alc268_volume_init_verbs[] = {
12613         /* set output DAC */
12614         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12615         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12616
12617         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12618         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12619         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12620         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12621         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12622
12623         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12624         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12625         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12626
12627         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12628         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12629
12630         /* set PCBEEP vol = 0, mute connections */
12631         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12632         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12633         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12634
12635         { }
12636 };
12637
12638 static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
12639         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12640         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12641         { } /* end */
12642 };
12643
12644 static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
12645         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12646         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12647         _DEFINE_CAPSRC(1),
12648         { } /* end */
12649 };
12650
12651 static struct snd_kcontrol_new alc268_capture_mixer[] = {
12652         HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12653         HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12654         HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
12655         HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
12656         _DEFINE_CAPSRC(2),
12657         { } /* end */
12658 };
12659
12660 static struct hda_input_mux alc268_capture_source = {
12661         .num_items = 4,
12662         .items = {
12663                 { "Mic", 0x0 },
12664                 { "Front Mic", 0x1 },
12665                 { "Line", 0x2 },
12666                 { "CD", 0x3 },
12667         },
12668 };
12669
12670 static struct hda_input_mux alc268_acer_capture_source = {
12671         .num_items = 3,
12672         .items = {
12673                 { "Mic", 0x0 },
12674                 { "Internal Mic", 0x1 },
12675                 { "Line", 0x2 },
12676         },
12677 };
12678
12679 static struct hda_input_mux alc268_acer_dmic_capture_source = {
12680         .num_items = 3,
12681         .items = {
12682                 { "Mic", 0x0 },
12683                 { "Internal Mic", 0x6 },
12684                 { "Line", 0x2 },
12685         },
12686 };
12687
12688 #ifdef CONFIG_SND_DEBUG
12689 static struct snd_kcontrol_new alc268_test_mixer[] = {
12690         /* Volume widgets */
12691         HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12692         HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12693         HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
12694         HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
12695         HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
12696         HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
12697         HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
12698         HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
12699         HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
12700         HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
12701         HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
12702         HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
12703         HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
12704         /* The below appears problematic on some hardwares */
12705         /*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
12706         HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12707         HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
12708         HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
12709         HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
12710
12711         /* Modes for retasking pin widgets */
12712         ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
12713         ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
12714         ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
12715         ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
12716
12717         /* Controls for GPIO pins, assuming they are configured as outputs */
12718         ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
12719         ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
12720         ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
12721         ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
12722
12723         /* Switches to allow the digital SPDIF output pin to be enabled.
12724          * The ALC268 does not have an SPDIF input.
12725          */
12726         ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
12727
12728         /* A switch allowing EAPD to be enabled.  Some laptops seem to use
12729          * this output to turn on an external amplifier.
12730          */
12731         ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
12732         ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
12733
12734         { } /* end */
12735 };
12736 #endif
12737
12738 /* create input playback/capture controls for the given pin */
12739 static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
12740                                     const char *ctlname, int idx)
12741 {
12742         hda_nid_t dac;
12743         int err;
12744
12745         switch (nid) {
12746         case 0x14:
12747         case 0x16:
12748                 dac = 0x02;
12749                 break;
12750         case 0x15:
12751                 dac = 0x03;
12752                 break;
12753         default:
12754                 return 0;
12755         }
12756         if (spec->multiout.dac_nids[0] != dac &&
12757             spec->multiout.dac_nids[1] != dac) {
12758                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
12759                                   HDA_COMPOSE_AMP_VAL(dac, 3, idx,
12760                                                       HDA_OUTPUT));
12761                 if (err < 0)
12762                         return err;
12763                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
12764         }
12765
12766         if (nid != 0x16)
12767                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
12768                           HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
12769         else /* mono */
12770                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
12771                           HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
12772         if (err < 0)
12773                 return err;
12774         return 0;
12775 }
12776
12777 /* add playback controls from the parsed DAC table */
12778 static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
12779                                              const struct auto_pin_cfg *cfg)
12780 {
12781         hda_nid_t nid;
12782         int err;
12783
12784         spec->multiout.dac_nids = spec->private_dac_nids;
12785
12786         nid = cfg->line_out_pins[0];
12787         if (nid) {
12788                 const char *name;
12789                 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
12790                         name = "Speaker";
12791                 else
12792                         name = "Front";
12793                 err = alc268_new_analog_output(spec, nid, name, 0);
12794                 if (err < 0)
12795                         return err;
12796         }
12797
12798         nid = cfg->speaker_pins[0];
12799         if (nid == 0x1d) {
12800                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
12801                                   HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
12802                 if (err < 0)
12803                         return err;
12804         } else {
12805                 err = alc268_new_analog_output(spec, nid, "Speaker", 0);
12806                 if (err < 0)
12807                         return err;
12808         }
12809         nid = cfg->hp_pins[0];
12810         if (nid) {
12811                 err = alc268_new_analog_output(spec, nid, "Headphone", 0);
12812                 if (err < 0)
12813                         return err;
12814         }
12815
12816         nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
12817         if (nid == 0x16) {
12818                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
12819                                   HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
12820                 if (err < 0)
12821                         return err;
12822         }
12823         return 0;
12824 }
12825
12826 /* create playback/capture controls for input pins */
12827 static int alc268_auto_create_input_ctls(struct hda_codec *codec,
12828                                                 const struct auto_pin_cfg *cfg)
12829 {
12830         return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
12831 }
12832
12833 static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
12834                                               hda_nid_t nid, int pin_type)
12835 {
12836         int idx;
12837
12838         alc_set_pin_output(codec, nid, pin_type);
12839         if (nid == 0x14 || nid == 0x16)
12840                 idx = 0;
12841         else
12842                 idx = 1;
12843         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
12844 }
12845
12846 static void alc268_auto_init_multi_out(struct hda_codec *codec)
12847 {
12848         struct alc_spec *spec = codec->spec;
12849         hda_nid_t nid = spec->autocfg.line_out_pins[0];
12850         if (nid) {
12851                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
12852                 alc268_auto_set_output_and_unmute(codec, nid, pin_type);
12853         }
12854 }
12855
12856 static void alc268_auto_init_hp_out(struct hda_codec *codec)
12857 {
12858         struct alc_spec *spec = codec->spec;
12859         hda_nid_t pin;
12860
12861         pin = spec->autocfg.hp_pins[0];
12862         if (pin)
12863                 alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
12864         pin = spec->autocfg.speaker_pins[0];
12865         if (pin)
12866                 alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
12867 }
12868
12869 static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
12870 {
12871         struct alc_spec *spec = codec->spec;
12872         hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
12873         hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
12874         hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
12875         unsigned int    dac_vol1, dac_vol2;
12876
12877         if (line_nid == 0x1d || speaker_nid == 0x1d) {
12878                 snd_hda_codec_write(codec, speaker_nid, 0,
12879                                     AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
12880                 /* mute mixer inputs from 0x1d */
12881                 snd_hda_codec_write(codec, 0x0f, 0,
12882                                     AC_VERB_SET_AMP_GAIN_MUTE,
12883                                     AMP_IN_UNMUTE(1));
12884                 snd_hda_codec_write(codec, 0x10, 0,
12885                                     AC_VERB_SET_AMP_GAIN_MUTE,
12886                                     AMP_IN_UNMUTE(1));
12887         } else {
12888                 /* unmute mixer inputs from 0x1d */
12889                 snd_hda_codec_write(codec, 0x0f, 0,
12890                                     AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12891                 snd_hda_codec_write(codec, 0x10, 0,
12892                                     AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12893         }
12894
12895         dac_vol1 = dac_vol2 = 0xb000 | 0x40;    /* set max volume  */
12896         if (line_nid == 0x14)
12897                 dac_vol2 = AMP_OUT_ZERO;
12898         else if (line_nid == 0x15)
12899                 dac_vol1 = AMP_OUT_ZERO;
12900         if (hp_nid == 0x14)
12901                 dac_vol2 = AMP_OUT_ZERO;
12902         else if (hp_nid == 0x15)
12903                 dac_vol1 = AMP_OUT_ZERO;
12904         if (line_nid != 0x16 || hp_nid != 0x16 ||
12905             spec->autocfg.line_out_pins[1] != 0x16 ||
12906             spec->autocfg.line_out_pins[2] != 0x16)
12907                 dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
12908
12909         snd_hda_codec_write(codec, 0x02, 0,
12910                             AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
12911         snd_hda_codec_write(codec, 0x03, 0,
12912                             AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
12913 }
12914
12915 /* pcm configuration: identical with ALC880 */
12916 #define alc268_pcm_analog_playback      alc880_pcm_analog_playback
12917 #define alc268_pcm_analog_capture       alc880_pcm_analog_capture
12918 #define alc268_pcm_analog_alt_capture   alc880_pcm_analog_alt_capture
12919 #define alc268_pcm_digital_playback     alc880_pcm_digital_playback
12920
12921 /*
12922  * BIOS auto configuration
12923  */
12924 static int alc268_parse_auto_config(struct hda_codec *codec)
12925 {
12926         struct alc_spec *spec = codec->spec;
12927         int err;
12928         static hda_nid_t alc268_ignore[] = { 0 };
12929
12930         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12931                                            alc268_ignore);
12932         if (err < 0)
12933                 return err;
12934         if (!spec->autocfg.line_outs) {
12935                 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
12936                         spec->multiout.max_channels = 2;
12937                         spec->no_analog = 1;
12938                         goto dig_only;
12939                 }
12940                 return 0; /* can't find valid BIOS pin config */
12941         }
12942         err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
12943         if (err < 0)
12944                 return err;
12945         err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
12946         if (err < 0)
12947                 return err;
12948
12949         spec->multiout.max_channels = 2;
12950
12951  dig_only:
12952         /* digital only support output */
12953         if (spec->autocfg.dig_outs) {
12954                 spec->multiout.dig_out_nid = ALC268_DIGOUT_NID;
12955                 spec->dig_out_type = spec->autocfg.dig_out_type[0];
12956         }
12957         if (spec->kctls.list)
12958                 add_mixer(spec, spec->kctls.list);
12959
12960         if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
12961                 add_mixer(spec, alc268_beep_mixer);
12962
12963         add_verb(spec, alc268_volume_init_verbs);
12964         spec->num_mux_defs = 2;
12965         spec->input_mux = &spec->private_imux[0];
12966
12967         err = alc_auto_add_mic_boost(codec);
12968         if (err < 0)
12969                 return err;
12970
12971         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
12972
12973         return 1;
12974 }
12975
12976 #define alc268_auto_init_analog_input   alc882_auto_init_analog_input
12977
12978 /* init callback for auto-configuration model -- overriding the default init */
12979 static void alc268_auto_init(struct hda_codec *codec)
12980 {
12981         struct alc_spec *spec = codec->spec;
12982         alc268_auto_init_multi_out(codec);
12983         alc268_auto_init_hp_out(codec);
12984         alc268_auto_init_mono_speaker_out(codec);
12985         alc268_auto_init_analog_input(codec);
12986         if (spec->unsol_event)
12987                 alc_inithook(codec);
12988 }
12989
12990 /*
12991  * configuration and preset
12992  */
12993 static const char *alc268_models[ALC268_MODEL_LAST] = {
12994         [ALC267_QUANTA_IL1]     = "quanta-il1",
12995         [ALC268_3ST]            = "3stack",
12996         [ALC268_TOSHIBA]        = "toshiba",
12997         [ALC268_ACER]           = "acer",
12998         [ALC268_ACER_DMIC]      = "acer-dmic",
12999         [ALC268_ACER_ASPIRE_ONE]        = "acer-aspire",
13000         [ALC268_DELL]           = "dell",
13001         [ALC268_ZEPTO]          = "zepto",
13002 #ifdef CONFIG_SND_DEBUG
13003         [ALC268_TEST]           = "test",
13004 #endif
13005         [ALC268_AUTO]           = "auto",
13006 };
13007
13008 static struct snd_pci_quirk alc268_cfg_tbl[] = {
13009         SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
13010         SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
13011         SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
13012         SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
13013         SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
13014         SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
13015                                                 ALC268_ACER_ASPIRE_ONE),
13016         SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
13017         SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
13018                         "Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
13019         /* almost compatible with toshiba but with optional digital outs;
13020          * auto-probing seems working fine
13021          */
13022         SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
13023                            ALC268_AUTO),
13024         SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
13025         SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
13026         SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
13027         SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
13028         SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
13029         SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
13030         {}
13031 };
13032
13033 /* Toshiba laptops have no unique PCI SSID but only codec SSID */
13034 static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
13035         SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
13036         SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
13037         SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
13038                            ALC268_TOSHIBA),
13039         {}
13040 };
13041
13042 static struct alc_config_preset alc268_presets[] = {
13043         [ALC267_QUANTA_IL1] = {
13044                 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
13045                             alc268_capture_nosrc_mixer },
13046                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13047                                 alc267_quanta_il1_verbs },
13048                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13049                 .dac_nids = alc268_dac_nids,
13050                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13051                 .adc_nids = alc268_adc_nids_alt,
13052                 .hp_nid = 0x03,
13053                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13054                 .channel_mode = alc268_modes,
13055                 .unsol_event = alc_sku_unsol_event,
13056                 .setup = alc267_quanta_il1_setup,
13057                 .init_hook = alc_inithook,
13058         },
13059         [ALC268_3ST] = {
13060                 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13061                             alc268_beep_mixer },
13062                 .init_verbs = { alc268_base_init_verbs },
13063                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13064                 .dac_nids = alc268_dac_nids,
13065                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13066                 .adc_nids = alc268_adc_nids_alt,
13067                 .capsrc_nids = alc268_capsrc_nids,
13068                 .hp_nid = 0x03,
13069                 .dig_out_nid = ALC268_DIGOUT_NID,
13070                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13071                 .channel_mode = alc268_modes,
13072                 .input_mux = &alc268_capture_source,
13073         },
13074         [ALC268_TOSHIBA] = {
13075                 .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
13076                             alc268_beep_mixer },
13077                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13078                                 alc268_toshiba_verbs },
13079                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13080                 .dac_nids = alc268_dac_nids,
13081                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13082                 .adc_nids = alc268_adc_nids_alt,
13083                 .capsrc_nids = alc268_capsrc_nids,
13084                 .hp_nid = 0x03,
13085                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13086                 .channel_mode = alc268_modes,
13087                 .input_mux = &alc268_capture_source,
13088                 .unsol_event = alc268_toshiba_unsol_event,
13089                 .setup = alc268_toshiba_setup,
13090                 .init_hook = alc268_toshiba_automute,
13091         },
13092         [ALC268_ACER] = {
13093                 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
13094                             alc268_beep_mixer },
13095                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13096                                 alc268_acer_verbs },
13097                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13098                 .dac_nids = alc268_dac_nids,
13099                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13100                 .adc_nids = alc268_adc_nids_alt,
13101                 .capsrc_nids = alc268_capsrc_nids,
13102                 .hp_nid = 0x02,
13103                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13104                 .channel_mode = alc268_modes,
13105                 .input_mux = &alc268_acer_capture_source,
13106                 .unsol_event = alc268_acer_unsol_event,
13107                 .init_hook = alc268_acer_init_hook,
13108         },
13109         [ALC268_ACER_DMIC] = {
13110                 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
13111                             alc268_beep_mixer },
13112                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13113                                 alc268_acer_verbs },
13114                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13115                 .dac_nids = alc268_dac_nids,
13116                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13117                 .adc_nids = alc268_adc_nids_alt,
13118                 .capsrc_nids = alc268_capsrc_nids,
13119                 .hp_nid = 0x02,
13120                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13121                 .channel_mode = alc268_modes,
13122                 .input_mux = &alc268_acer_dmic_capture_source,
13123                 .unsol_event = alc268_acer_unsol_event,
13124                 .init_hook = alc268_acer_init_hook,
13125         },
13126         [ALC268_ACER_ASPIRE_ONE] = {
13127                 .mixers = { alc268_acer_aspire_one_mixer,
13128                             alc268_beep_mixer,
13129                             alc268_capture_nosrc_mixer },
13130                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13131                                 alc268_acer_aspire_one_verbs },
13132                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13133                 .dac_nids = alc268_dac_nids,
13134                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13135                 .adc_nids = alc268_adc_nids_alt,
13136                 .capsrc_nids = alc268_capsrc_nids,
13137                 .hp_nid = 0x03,
13138                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13139                 .channel_mode = alc268_modes,
13140                 .unsol_event = alc268_acer_lc_unsol_event,
13141                 .setup = alc268_acer_lc_setup,
13142                 .init_hook = alc268_acer_lc_init_hook,
13143         },
13144         [ALC268_DELL] = {
13145                 .mixers = { alc268_dell_mixer, alc268_beep_mixer,
13146                             alc268_capture_nosrc_mixer },
13147                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13148                                 alc268_dell_verbs },
13149                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13150                 .dac_nids = alc268_dac_nids,
13151                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13152                 .adc_nids = alc268_adc_nids_alt,
13153                 .capsrc_nids = alc268_capsrc_nids,
13154                 .hp_nid = 0x02,
13155                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13156                 .channel_mode = alc268_modes,
13157                 .unsol_event = alc_sku_unsol_event,
13158                 .setup = alc268_dell_setup,
13159                 .init_hook = alc_inithook,
13160         },
13161         [ALC268_ZEPTO] = {
13162                 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13163                             alc268_beep_mixer },
13164                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13165                                 alc268_toshiba_verbs },
13166                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13167                 .dac_nids = alc268_dac_nids,
13168                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13169                 .adc_nids = alc268_adc_nids_alt,
13170                 .capsrc_nids = alc268_capsrc_nids,
13171                 .hp_nid = 0x03,
13172                 .dig_out_nid = ALC268_DIGOUT_NID,
13173                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13174                 .channel_mode = alc268_modes,
13175                 .input_mux = &alc268_capture_source,
13176                 .setup = alc268_toshiba_setup,
13177                 .init_hook = alc268_toshiba_automute,
13178         },
13179 #ifdef CONFIG_SND_DEBUG
13180         [ALC268_TEST] = {
13181                 .mixers = { alc268_test_mixer, alc268_capture_mixer },
13182                 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13183                                 alc268_volume_init_verbs },
13184                 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13185                 .dac_nids = alc268_dac_nids,
13186                 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13187                 .adc_nids = alc268_adc_nids_alt,
13188                 .capsrc_nids = alc268_capsrc_nids,
13189                 .hp_nid = 0x03,
13190                 .dig_out_nid = ALC268_DIGOUT_NID,
13191                 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13192                 .channel_mode = alc268_modes,
13193                 .input_mux = &alc268_capture_source,
13194         },
13195 #endif
13196 };
13197
13198 static int patch_alc268(struct hda_codec *codec)
13199 {
13200         struct alc_spec *spec;
13201         int board_config;
13202         int i, has_beep, err;
13203
13204         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13205         if (spec == NULL)
13206                 return -ENOMEM;
13207
13208         codec->spec = spec;
13209
13210         board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
13211                                                   alc268_models,
13212                                                   alc268_cfg_tbl);
13213
13214         if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
13215                 board_config = snd_hda_check_board_codec_sid_config(codec,
13216                         ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
13217
13218         if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
13219                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13220                        codec->chip_name);
13221                 board_config = ALC268_AUTO;
13222         }
13223
13224         if (board_config == ALC268_AUTO) {
13225                 /* automatic parse from the BIOS config */
13226                 err = alc268_parse_auto_config(codec);
13227                 if (err < 0) {
13228                         alc_free(codec);
13229                         return err;
13230                 } else if (!err) {
13231                         printk(KERN_INFO
13232                                "hda_codec: Cannot set up configuration "
13233                                "from BIOS.  Using base mode...\n");
13234                         board_config = ALC268_3ST;
13235                 }
13236         }
13237
13238         if (board_config != ALC268_AUTO)
13239                 setup_preset(codec, &alc268_presets[board_config]);
13240
13241         spec->stream_analog_playback = &alc268_pcm_analog_playback;
13242         spec->stream_analog_capture = &alc268_pcm_analog_capture;
13243         spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
13244
13245         spec->stream_digital_playback = &alc268_pcm_digital_playback;
13246
13247         has_beep = 0;
13248         for (i = 0; i < spec->num_mixers; i++) {
13249                 if (spec->mixers[i] == alc268_beep_mixer) {
13250                         has_beep = 1;
13251                         break;
13252                 }
13253         }
13254
13255         if (has_beep) {
13256                 err = snd_hda_attach_beep_device(codec, 0x1);
13257                 if (err < 0) {
13258                         alc_free(codec);
13259                         return err;
13260                 }
13261                 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
13262                         /* override the amp caps for beep generator */
13263                         snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
13264                                           (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
13265                                           (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
13266                                           (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
13267                                           (0 << AC_AMPCAP_MUTE_SHIFT));
13268         }
13269
13270         if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
13271                 /* check whether NID 0x07 is valid */
13272                 unsigned int wcap = get_wcaps(codec, 0x07);
13273                 int i;
13274
13275                 spec->capsrc_nids = alc268_capsrc_nids;
13276                 /* get type */
13277                 wcap = get_wcaps_type(wcap);
13278                 if (spec->auto_mic ||
13279                     wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
13280                         spec->adc_nids = alc268_adc_nids_alt;
13281                         spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
13282                         if (spec->auto_mic)
13283                                 fixup_automic_adc(codec);
13284                         if (spec->auto_mic || spec->input_mux->num_items == 1)
13285                                 add_mixer(spec, alc268_capture_nosrc_mixer);
13286                         else
13287                                 add_mixer(spec, alc268_capture_alt_mixer);
13288                 } else {
13289                         spec->adc_nids = alc268_adc_nids;
13290                         spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
13291                         add_mixer(spec, alc268_capture_mixer);
13292                 }
13293                 /* set default input source */
13294                 for (i = 0; i < spec->num_adc_nids; i++)
13295                         snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
13296                                 0, AC_VERB_SET_CONNECT_SEL,
13297                                 i < spec->num_mux_defs ?
13298                                 spec->input_mux[i].items[0].index :
13299                                 spec->input_mux->items[0].index);
13300         }
13301
13302         spec->vmaster_nid = 0x02;
13303
13304         codec->patch_ops = alc_patch_ops;
13305         if (board_config == ALC268_AUTO)
13306                 spec->init_hook = alc268_auto_init;
13307
13308         return 0;
13309 }
13310
13311 /*
13312  *  ALC269 channel source setting (2 channel)
13313  */
13314 #define ALC269_DIGOUT_NID       ALC880_DIGOUT_NID
13315
13316 #define alc269_dac_nids         alc260_dac_nids
13317
13318 static hda_nid_t alc269_adc_nids[1] = {
13319         /* ADC1 */
13320         0x08,
13321 };
13322
13323 static hda_nid_t alc269_capsrc_nids[1] = {
13324         0x23,
13325 };
13326
13327 static hda_nid_t alc269vb_adc_nids[1] = {
13328         /* ADC1 */
13329         0x09,
13330 };
13331
13332 static hda_nid_t alc269vb_capsrc_nids[1] = {
13333         0x22,
13334 };
13335
13336 /* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24),
13337  *       not a mux!
13338  */
13339
13340 #define alc269_modes            alc260_modes
13341 #define alc269_capture_source   alc880_lg_lw_capture_source
13342
13343 static struct snd_kcontrol_new alc269_base_mixer[] = {
13344         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13345         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13346         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
13347         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
13348         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13349         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13350         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13351         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13352         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13353         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
13354         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13355         HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
13356         { } /* end */
13357 };
13358
13359 static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
13360         /* output mixer control */
13361         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13362         {
13363                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13364                 .name = "Master Playback Switch",
13365                 .subdevice = HDA_SUBDEV_AMP_FLAG,
13366                 .info = snd_hda_mixer_amp_switch_info,
13367                 .get = snd_hda_mixer_amp_switch_get,
13368                 .put = alc268_acer_master_sw_put,
13369                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13370         },
13371         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13372         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13373         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13374         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13375         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13376         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13377         { }
13378 };
13379
13380 static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
13381         /* output mixer control */
13382         HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13383         {
13384                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13385                 .name = "Master Playback Switch",
13386                 .subdevice = HDA_SUBDEV_AMP_FLAG,
13387                 .info = snd_hda_mixer_amp_switch_info,
13388                 .get = snd_hda_mixer_amp_switch_get,
13389                 .put = alc268_acer_master_sw_put,
13390                 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13391         },
13392         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13393         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13394         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13395         HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13396         HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13397         HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13398         HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
13399         HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
13400         HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
13401         { }
13402 };
13403
13404 static struct snd_kcontrol_new alc269_laptop_mixer[] = {
13405         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13406         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13407         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13408         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13409         { } /* end */
13410 };
13411
13412 static struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
13413         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13414         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13415         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
13416         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13417         { } /* end */
13418 };
13419
13420 /* capture mixer elements */
13421 static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
13422         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13423         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13424         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13425         HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13426         { } /* end */
13427 };
13428
13429 static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
13430         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13431         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13432         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13433         { } /* end */
13434 };
13435
13436 static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
13437         HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13438         HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13439         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13440         HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13441         { } /* end */
13442 };
13443
13444 static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
13445         HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13446         HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13447         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13448         { } /* end */
13449 };
13450
13451 /* FSC amilo */
13452 #define alc269_fujitsu_mixer    alc269_laptop_mixer
13453
13454 static struct hda_verb alc269_quanta_fl1_verbs[] = {
13455         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13456         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13457         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13458         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13459         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13460         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13461         { }
13462 };
13463
13464 static struct hda_verb alc269_lifebook_verbs[] = {
13465         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13466         {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
13467         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13468         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13469         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13470         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13471         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13472         {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13473         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13474         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13475         { }
13476 };
13477
13478 /* toggle speaker-output according to the hp-jack state */
13479 static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
13480 {
13481         unsigned int present;
13482         unsigned char bits;
13483
13484         present = snd_hda_jack_detect(codec, 0x15);
13485         bits = present ? AMP_IN_MUTE(0) : 0;
13486         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13487                         AMP_IN_MUTE(0), bits);
13488         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13489                         AMP_IN_MUTE(0), bits);
13490
13491         snd_hda_codec_write(codec, 0x20, 0,
13492                         AC_VERB_SET_COEF_INDEX, 0x0c);
13493         snd_hda_codec_write(codec, 0x20, 0,
13494                         AC_VERB_SET_PROC_COEF, 0x680);
13495
13496         snd_hda_codec_write(codec, 0x20, 0,
13497                         AC_VERB_SET_COEF_INDEX, 0x0c);
13498         snd_hda_codec_write(codec, 0x20, 0,
13499                         AC_VERB_SET_PROC_COEF, 0x480);
13500 }
13501
13502 /* toggle speaker-output according to the hp-jacks state */
13503 static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
13504 {
13505         unsigned int present;
13506         unsigned char bits;
13507
13508         /* Check laptop headphone socket */
13509         present = snd_hda_jack_detect(codec, 0x15);
13510
13511         /* Check port replicator headphone socket */
13512         present |= snd_hda_jack_detect(codec, 0x1a);
13513
13514         bits = present ? AMP_IN_MUTE(0) : 0;
13515         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13516                         AMP_IN_MUTE(0), bits);
13517         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13518                         AMP_IN_MUTE(0), bits);
13519
13520         snd_hda_codec_write(codec, 0x20, 0,
13521                         AC_VERB_SET_COEF_INDEX, 0x0c);
13522         snd_hda_codec_write(codec, 0x20, 0,
13523                         AC_VERB_SET_PROC_COEF, 0x680);
13524
13525         snd_hda_codec_write(codec, 0x20, 0,
13526                         AC_VERB_SET_COEF_INDEX, 0x0c);
13527         snd_hda_codec_write(codec, 0x20, 0,
13528                         AC_VERB_SET_PROC_COEF, 0x480);
13529 }
13530
13531 static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13532 {
13533         unsigned int present_laptop;
13534         unsigned int present_dock;
13535
13536         present_laptop  = snd_hda_jack_detect(codec, 0x18);
13537         present_dock    = snd_hda_jack_detect(codec, 0x1b);
13538
13539         /* Laptop mic port overrides dock mic port, design decision */
13540         if (present_dock)
13541                 snd_hda_codec_write(codec, 0x23, 0,
13542                                 AC_VERB_SET_CONNECT_SEL, 0x3);
13543         if (present_laptop)
13544                 snd_hda_codec_write(codec, 0x23, 0,
13545                                 AC_VERB_SET_CONNECT_SEL, 0x0);
13546         if (!present_dock && !present_laptop)
13547                 snd_hda_codec_write(codec, 0x23, 0,
13548                                 AC_VERB_SET_CONNECT_SEL, 0x1);
13549 }
13550
13551 static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
13552                                     unsigned int res)
13553 {
13554         switch (res >> 26) {
13555         case ALC880_HP_EVENT:
13556                 alc269_quanta_fl1_speaker_automute(codec);
13557                 break;
13558         case ALC880_MIC_EVENT:
13559                 alc_mic_automute(codec);
13560                 break;
13561         }
13562 }
13563
13564 static void alc269_lifebook_unsol_event(struct hda_codec *codec,
13565                                         unsigned int res)
13566 {
13567         if ((res >> 26) == ALC880_HP_EVENT)
13568                 alc269_lifebook_speaker_automute(codec);
13569         if ((res >> 26) == ALC880_MIC_EVENT)
13570                 alc269_lifebook_mic_autoswitch(codec);
13571 }
13572
13573 static void alc269_quanta_fl1_setup(struct hda_codec *codec)
13574 {
13575         struct alc_spec *spec = codec->spec;
13576         spec->autocfg.hp_pins[0] = 0x15;
13577         spec->autocfg.speaker_pins[0] = 0x14;
13578         spec->ext_mic.pin = 0x18;
13579         spec->ext_mic.mux_idx = 0;
13580         spec->int_mic.pin = 0x19;
13581         spec->int_mic.mux_idx = 1;
13582         spec->auto_mic = 1;
13583 }
13584
13585 static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
13586 {
13587         alc269_quanta_fl1_speaker_automute(codec);
13588         alc_mic_automute(codec);
13589 }
13590
13591 static void alc269_lifebook_init_hook(struct hda_codec *codec)
13592 {
13593         alc269_lifebook_speaker_automute(codec);
13594         alc269_lifebook_mic_autoswitch(codec);
13595 }
13596
13597 static struct hda_verb alc269_laptop_dmic_init_verbs[] = {
13598         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13599         {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
13600         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13601         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13602         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13603         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13604         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13605         {}
13606 };
13607
13608 static struct hda_verb alc269_laptop_amic_init_verbs[] = {
13609         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13610         {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
13611         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13612         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
13613         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13614         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13615         {}
13616 };
13617
13618 static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
13619         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13620         {0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
13621         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13622         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13623         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13624         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13625         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13626         {}
13627 };
13628
13629 static struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
13630         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
13631         {0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
13632         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13633         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13634         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13635         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13636         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13637         {}
13638 };
13639
13640 /* toggle speaker-output according to the hp-jack state */
13641 static void alc269_speaker_automute(struct hda_codec *codec)
13642 {
13643         struct alc_spec *spec = codec->spec;
13644         unsigned int nid = spec->autocfg.hp_pins[0];
13645         unsigned int present;
13646         unsigned char bits;
13647
13648         present = snd_hda_jack_detect(codec, nid);
13649         bits = present ? AMP_IN_MUTE(0) : 0;
13650         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13651                                 AMP_IN_MUTE(0), bits);
13652         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13653                                 AMP_IN_MUTE(0), bits);
13654 }
13655
13656 /* unsolicited event for HP jack sensing */
13657 static void alc269_laptop_unsol_event(struct hda_codec *codec,
13658                                      unsigned int res)
13659 {
13660         switch (res >> 26) {
13661         case ALC880_HP_EVENT:
13662                 alc269_speaker_automute(codec);
13663                 break;
13664         case ALC880_MIC_EVENT:
13665                 alc_mic_automute(codec);
13666                 break;
13667         }
13668 }
13669
13670 static void alc269_laptop_dmic_setup(struct hda_codec *codec)
13671 {
13672         struct alc_spec *spec = codec->spec;
13673         spec->autocfg.hp_pins[0] = 0x15;
13674         spec->autocfg.speaker_pins[0] = 0x14;
13675         spec->ext_mic.pin = 0x18;
13676         spec->ext_mic.mux_idx = 0;
13677         spec->int_mic.pin = 0x12;
13678         spec->int_mic.mux_idx = 5;
13679         spec->auto_mic = 1;
13680 }
13681
13682 static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
13683 {
13684         struct alc_spec *spec = codec->spec;
13685         spec->autocfg.hp_pins[0] = 0x15;
13686         spec->autocfg.speaker_pins[0] = 0x14;
13687         spec->ext_mic.pin = 0x18;
13688         spec->ext_mic.mux_idx = 0;
13689         spec->int_mic.pin = 0x12;
13690         spec->int_mic.mux_idx = 6;
13691         spec->auto_mic = 1;
13692 }
13693
13694 static void alc269_laptop_amic_setup(struct hda_codec *codec)
13695 {
13696         struct alc_spec *spec = codec->spec;
13697         spec->autocfg.hp_pins[0] = 0x15;
13698         spec->autocfg.speaker_pins[0] = 0x14;
13699         spec->ext_mic.pin = 0x18;
13700         spec->ext_mic.mux_idx = 0;
13701         spec->int_mic.pin = 0x19;
13702         spec->int_mic.mux_idx = 1;
13703         spec->auto_mic = 1;
13704 }
13705
13706 static void alc269_laptop_inithook(struct hda_codec *codec)
13707 {
13708         alc269_speaker_automute(codec);
13709         alc_mic_automute(codec);
13710 }
13711
13712 /*
13713  * generic initialization of ADC, input mixers and output mixers
13714  */
13715 static struct hda_verb alc269_init_verbs[] = {
13716         /*
13717          * Unmute ADC0 and set the default input to mic-in
13718          */
13719         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13720
13721         /*
13722          * Set up output mixers (0x02 - 0x03)
13723          */
13724         /* set vol=0 to output mixers */
13725         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13726         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13727
13728         /* set up input amps for analog loopback */
13729         /* Amp Indices: DAC = 0, mixer = 1 */
13730         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13731         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13732         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13733         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13734         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13735         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13736
13737         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13738         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13739         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13740         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13741         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13742         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13743         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13744
13745         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13746         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13747
13748         /* FIXME: use Mux-type input source selection */
13749         /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
13750         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
13751         {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
13752
13753         /* set EAPD */
13754         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
13755         { }
13756 };
13757
13758 static struct hda_verb alc269vb_init_verbs[] = {
13759         /*
13760          * Unmute ADC0 and set the default input to mic-in
13761          */
13762         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13763
13764         /*
13765          * Set up output mixers (0x02 - 0x03)
13766          */
13767         /* set vol=0 to output mixers */
13768         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13769         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13770
13771         /* set up input amps for analog loopback */
13772         /* Amp Indices: DAC = 0, mixer = 1 */
13773         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13774         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13775         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13776         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13777         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13778         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13779
13780         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13781         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13782         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13783         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13784         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13785         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13786         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13787
13788         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13789         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13790
13791         /* FIXME: use Mux-type input source selection */
13792         /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
13793         /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
13794         {0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
13795
13796         /* set EAPD */
13797         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
13798         { }
13799 };
13800
13801 #define alc269_auto_create_multi_out_ctls \
13802         alc268_auto_create_multi_out_ctls
13803 #define alc269_auto_create_input_ctls \
13804         alc268_auto_create_input_ctls
13805
13806 #ifdef CONFIG_SND_HDA_POWER_SAVE
13807 #define alc269_loopbacks        alc880_loopbacks
13808 #endif
13809
13810 /* pcm configuration: identical with ALC880 */
13811 #define alc269_pcm_analog_playback      alc880_pcm_analog_playback
13812 #define alc269_pcm_analog_capture       alc880_pcm_analog_capture
13813 #define alc269_pcm_digital_playback     alc880_pcm_digital_playback
13814 #define alc269_pcm_digital_capture      alc880_pcm_digital_capture
13815
13816 static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
13817         .substreams = 1,
13818         .channels_min = 2,
13819         .channels_max = 8,
13820         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13821         /* NID is set in alc_build_pcms */
13822         .ops = {
13823                 .open = alc880_playback_pcm_open,
13824                 .prepare = alc880_playback_pcm_prepare,
13825                 .cleanup = alc880_playback_pcm_cleanup
13826         },
13827 };
13828
13829 static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
13830         .substreams = 1,
13831         .channels_min = 2,
13832         .channels_max = 2,
13833         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13834         /* NID is set in alc_build_pcms */
13835 };
13836
13837 /*
13838  * BIOS auto configuration
13839  */
13840 static int alc269_parse_auto_config(struct hda_codec *codec)
13841 {
13842         struct alc_spec *spec = codec->spec;
13843         int err;
13844         static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
13845         hda_nid_t real_capsrc_nids;
13846
13847         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13848                                            alc269_ignore);
13849         if (err < 0)
13850                 return err;
13851
13852         err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
13853         if (err < 0)
13854                 return err;
13855         err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
13856         if (err < 0)
13857                 return err;
13858
13859         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
13860
13861         if (spec->autocfg.dig_outs)
13862                 spec->multiout.dig_out_nid = ALC269_DIGOUT_NID;
13863
13864         if (spec->kctls.list)
13865                 add_mixer(spec, spec->kctls.list);
13866
13867         if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010) {
13868                 add_verb(spec, alc269vb_init_verbs);
13869                 real_capsrc_nids = alc269vb_capsrc_nids[0];
13870                 alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21);
13871         } else {
13872                 add_verb(spec, alc269_init_verbs);
13873                 real_capsrc_nids = alc269_capsrc_nids[0];
13874                 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
13875         }
13876
13877         spec->num_mux_defs = 1;
13878         spec->input_mux = &spec->private_imux[0];
13879         /* set default input source */
13880         snd_hda_codec_write_cache(codec, real_capsrc_nids,
13881                                   0, AC_VERB_SET_CONNECT_SEL,
13882                                   spec->input_mux->items[0].index);
13883
13884         err = alc_auto_add_mic_boost(codec);
13885         if (err < 0)
13886                 return err;
13887
13888         if (!spec->cap_mixer && !spec->no_analog)
13889                 set_capture_mixer(codec);
13890
13891         return 1;
13892 }
13893
13894 #define alc269_auto_init_multi_out      alc268_auto_init_multi_out
13895 #define alc269_auto_init_hp_out         alc268_auto_init_hp_out
13896 #define alc269_auto_init_analog_input   alc882_auto_init_analog_input
13897
13898
13899 /* init callback for auto-configuration model -- overriding the default init */
13900 static void alc269_auto_init(struct hda_codec *codec)
13901 {
13902         struct alc_spec *spec = codec->spec;
13903         alc269_auto_init_multi_out(codec);
13904         alc269_auto_init_hp_out(codec);
13905         alc269_auto_init_analog_input(codec);
13906         if (spec->unsol_event)
13907                 alc_inithook(codec);
13908 }
13909
13910 /*
13911  * configuration and preset
13912  */
13913 static const char *alc269_models[ALC269_MODEL_LAST] = {
13914         [ALC269_BASIC]                  = "basic",
13915         [ALC269_QUANTA_FL1]             = "quanta",
13916         [ALC269_AMIC]                   = "laptop-amic",
13917         [ALC269_DMIC]                   = "laptop-dmic",
13918         [ALC269_FUJITSU]                = "fujitsu",
13919         [ALC269_LIFEBOOK]               = "lifebook",
13920         [ALC269_AUTO]                   = "auto",
13921 };
13922
13923 static struct snd_pci_quirk alc269_cfg_tbl[] = {
13924         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
13925         SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
13926                       ALC269_AMIC),
13927         SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
13928         SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
13929         SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
13930         SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
13931         SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
13932         SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
13933         SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
13934         SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
13935         SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
13936         SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC),
13937         SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
13938         SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
13939         SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
13940         SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
13941         SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
13942         SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
13943         SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
13944         SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
13945         SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
13946         SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
13947         SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
13948         SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
13949         SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
13950         SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
13951         SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
13952         SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
13953         SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
13954         SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
13955         SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
13956         SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
13957         SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
13958         SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
13959         SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
13960         SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
13961         SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
13962         SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
13963         SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
13964                       ALC269_DMIC),
13965         SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
13966                       ALC269_DMIC),
13967         SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
13968         SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
13969         SND_PCI_QUIRK(0x104d, 0x9071, "SONY XTB", ALC269_DMIC),
13970         SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
13971         SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
13972         SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
13973         SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC),
13974         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC),
13975         SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC),
13976         SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC),
13977         {}
13978 };
13979
13980 static struct alc_config_preset alc269_presets[] = {
13981         [ALC269_BASIC] = {
13982                 .mixers = { alc269_base_mixer },
13983                 .init_verbs = { alc269_init_verbs },
13984                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13985                 .dac_nids = alc269_dac_nids,
13986                 .hp_nid = 0x03,
13987                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13988                 .channel_mode = alc269_modes,
13989                 .input_mux = &alc269_capture_source,
13990         },
13991         [ALC269_QUANTA_FL1] = {
13992                 .mixers = { alc269_quanta_fl1_mixer },
13993                 .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
13994                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13995                 .dac_nids = alc269_dac_nids,
13996                 .hp_nid = 0x03,
13997                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13998                 .channel_mode = alc269_modes,
13999                 .input_mux = &alc269_capture_source,
14000                 .unsol_event = alc269_quanta_fl1_unsol_event,
14001                 .setup = alc269_quanta_fl1_setup,
14002                 .init_hook = alc269_quanta_fl1_init_hook,
14003         },
14004         [ALC269_AMIC] = {
14005                 .mixers = { alc269_laptop_mixer },
14006                 .cap_mixer = alc269_laptop_analog_capture_mixer,
14007                 .init_verbs = { alc269_init_verbs,
14008                                 alc269_laptop_amic_init_verbs },
14009                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14010                 .dac_nids = alc269_dac_nids,
14011                 .hp_nid = 0x03,
14012                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14013                 .channel_mode = alc269_modes,
14014                 .unsol_event = alc269_laptop_unsol_event,
14015                 .setup = alc269_laptop_amic_setup,
14016                 .init_hook = alc269_laptop_inithook,
14017         },
14018         [ALC269_DMIC] = {
14019                 .mixers = { alc269_laptop_mixer },
14020                 .cap_mixer = alc269_laptop_digital_capture_mixer,
14021                 .init_verbs = { alc269_init_verbs,
14022                                 alc269_laptop_dmic_init_verbs },
14023                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14024                 .dac_nids = alc269_dac_nids,
14025                 .hp_nid = 0x03,
14026                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14027                 .channel_mode = alc269_modes,
14028                 .unsol_event = alc269_laptop_unsol_event,
14029                 .setup = alc269_laptop_dmic_setup,
14030                 .init_hook = alc269_laptop_inithook,
14031         },
14032         [ALC269VB_AMIC] = {
14033                 .mixers = { alc269vb_laptop_mixer },
14034                 .cap_mixer = alc269vb_laptop_analog_capture_mixer,
14035                 .init_verbs = { alc269vb_init_verbs,
14036                                 alc269vb_laptop_amic_init_verbs },
14037                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14038                 .dac_nids = alc269_dac_nids,
14039                 .hp_nid = 0x03,
14040                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14041                 .channel_mode = alc269_modes,
14042                 .unsol_event = alc269_laptop_unsol_event,
14043                 .setup = alc269_laptop_amic_setup,
14044                 .init_hook = alc269_laptop_inithook,
14045         },
14046         [ALC269VB_DMIC] = {
14047                 .mixers = { alc269vb_laptop_mixer },
14048                 .cap_mixer = alc269vb_laptop_digital_capture_mixer,
14049                 .init_verbs = { alc269vb_init_verbs,
14050                                 alc269vb_laptop_dmic_init_verbs },
14051                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14052                 .dac_nids = alc269_dac_nids,
14053                 .hp_nid = 0x03,
14054                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14055                 .channel_mode = alc269_modes,
14056                 .unsol_event = alc269_laptop_unsol_event,
14057                 .setup = alc269vb_laptop_dmic_setup,
14058                 .init_hook = alc269_laptop_inithook,
14059         },
14060         [ALC269_FUJITSU] = {
14061                 .mixers = { alc269_fujitsu_mixer },
14062                 .cap_mixer = alc269_laptop_digital_capture_mixer,
14063                 .init_verbs = { alc269_init_verbs,
14064                                 alc269_laptop_dmic_init_verbs },
14065                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14066                 .dac_nids = alc269_dac_nids,
14067                 .hp_nid = 0x03,
14068                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14069                 .channel_mode = alc269_modes,
14070                 .unsol_event = alc269_laptop_unsol_event,
14071                 .setup = alc269_laptop_dmic_setup,
14072                 .init_hook = alc269_laptop_inithook,
14073         },
14074         [ALC269_LIFEBOOK] = {
14075                 .mixers = { alc269_lifebook_mixer },
14076                 .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
14077                 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14078                 .dac_nids = alc269_dac_nids,
14079                 .hp_nid = 0x03,
14080                 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14081                 .channel_mode = alc269_modes,
14082                 .input_mux = &alc269_capture_source,
14083                 .unsol_event = alc269_lifebook_unsol_event,
14084                 .init_hook = alc269_lifebook_init_hook,
14085         },
14086 };
14087
14088 static int patch_alc269(struct hda_codec *codec)
14089 {
14090         struct alc_spec *spec;
14091         int board_config;
14092         int err;
14093         int is_alc269vb = 0;
14094
14095         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14096         if (spec == NULL)
14097                 return -ENOMEM;
14098
14099         codec->spec = spec;
14100
14101         alc_fix_pll_init(codec, 0x20, 0x04, 15);
14102
14103         if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){
14104                 kfree(codec->chip_name);
14105                 codec->chip_name = kstrdup("ALC259", GFP_KERNEL);
14106                 if (!codec->chip_name) {
14107                         alc_free(codec);
14108                         return -ENOMEM;
14109                 }
14110                 is_alc269vb = 1;
14111         }
14112
14113         board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
14114                                                   alc269_models,
14115                                                   alc269_cfg_tbl);
14116
14117         if (board_config < 0) {
14118                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14119                        codec->chip_name);
14120                 board_config = ALC269_AUTO;
14121         }
14122
14123         if (board_config == ALC269_AUTO) {
14124                 /* automatic parse from the BIOS config */
14125                 err = alc269_parse_auto_config(codec);
14126                 if (err < 0) {
14127                         alc_free(codec);
14128                         return err;
14129                 } else if (!err) {
14130                         printk(KERN_INFO
14131                                "hda_codec: Cannot set up configuration "
14132                                "from BIOS.  Using base mode...\n");
14133                         board_config = ALC269_BASIC;
14134                 }
14135         }
14136
14137         err = snd_hda_attach_beep_device(codec, 0x1);
14138         if (err < 0) {
14139                 alc_free(codec);
14140                 return err;
14141         }
14142
14143         if (board_config != ALC269_AUTO)
14144                 setup_preset(codec, &alc269_presets[board_config]);
14145
14146         if (board_config == ALC269_QUANTA_FL1) {
14147                 /* Due to a hardware problem on Lenovo Ideadpad, we need to
14148                  * fix the sample rate of analog I/O to 44.1kHz
14149                  */
14150                 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
14151                 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
14152         } else {
14153                 spec->stream_analog_playback = &alc269_pcm_analog_playback;
14154                 spec->stream_analog_capture = &alc269_pcm_analog_capture;
14155         }
14156         spec->stream_digital_playback = &alc269_pcm_digital_playback;
14157         spec->stream_digital_capture = &alc269_pcm_digital_capture;
14158
14159         if (!is_alc269vb) {
14160                 spec->adc_nids = alc269_adc_nids;
14161                 spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
14162                 spec->capsrc_nids = alc269_capsrc_nids;
14163         } else {
14164                 spec->adc_nids = alc269vb_adc_nids;
14165                 spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids);
14166                 spec->capsrc_nids = alc269vb_capsrc_nids;
14167         }
14168
14169         if (!spec->cap_mixer)
14170                 set_capture_mixer(codec);
14171         set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
14172
14173         spec->vmaster_nid = 0x02;
14174
14175         codec->patch_ops = alc_patch_ops;
14176         if (board_config == ALC269_AUTO)
14177                 spec->init_hook = alc269_auto_init;
14178 #ifdef CONFIG_SND_HDA_POWER_SAVE
14179         if (!spec->loopback.amplist)
14180                 spec->loopback.amplist = alc269_loopbacks;
14181 #endif
14182
14183         return 0;
14184 }
14185
14186 /*
14187  *  ALC861 channel source setting (2/6 channel selection for 3-stack)
14188  */
14189
14190 /*
14191  * set the path ways for 2 channel output
14192  * need to set the codec line out and mic 1 pin widgets to inputs
14193  */
14194 static struct hda_verb alc861_threestack_ch2_init[] = {
14195         /* set pin widget 1Ah (line in) for input */
14196         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14197         /* set pin widget 18h (mic1/2) for input, for mic also enable
14198          * the vref
14199          */
14200         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14201
14202         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14203 #if 0
14204         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14205         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14206 #endif
14207         { } /* end */
14208 };
14209 /*
14210  * 6ch mode
14211  * need to set the codec line out and mic 1 pin widgets to outputs
14212  */
14213 static struct hda_verb alc861_threestack_ch6_init[] = {
14214         /* set pin widget 1Ah (line in) for output (Back Surround)*/
14215         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14216         /* set pin widget 18h (mic1) for output (CLFE)*/
14217         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14218
14219         { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14220         { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14221
14222         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14223 #if 0
14224         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14225         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14226 #endif
14227         { } /* end */
14228 };
14229
14230 static struct hda_channel_mode alc861_threestack_modes[2] = {
14231         { 2, alc861_threestack_ch2_init },
14232         { 6, alc861_threestack_ch6_init },
14233 };
14234 /* Set mic1 as input and unmute the mixer */
14235 static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
14236         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14237         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14238         { } /* end */
14239 };
14240 /* Set mic1 as output and mute mixer */
14241 static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
14242         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14243         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14244         { } /* end */
14245 };
14246
14247 static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
14248         { 2, alc861_uniwill_m31_ch2_init },
14249         { 4, alc861_uniwill_m31_ch4_init },
14250 };
14251
14252 /* Set mic1 and line-in as input and unmute the mixer */
14253 static struct hda_verb alc861_asus_ch2_init[] = {
14254         /* set pin widget 1Ah (line in) for input */
14255         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14256         /* set pin widget 18h (mic1/2) for input, for mic also enable
14257          * the vref
14258          */
14259         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14260
14261         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14262 #if 0
14263         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14264         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14265 #endif
14266         { } /* end */
14267 };
14268 /* Set mic1 nad line-in as output and mute mixer */
14269 static struct hda_verb alc861_asus_ch6_init[] = {
14270         /* set pin widget 1Ah (line in) for output (Back Surround)*/
14271         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14272         /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14273         /* set pin widget 18h (mic1) for output (CLFE)*/
14274         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14275         /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14276         { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14277         { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14278
14279         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14280 #if 0
14281         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14282         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14283 #endif
14284         { } /* end */
14285 };
14286
14287 static struct hda_channel_mode alc861_asus_modes[2] = {
14288         { 2, alc861_asus_ch2_init },
14289         { 6, alc861_asus_ch6_init },
14290 };
14291
14292 /* patch-ALC861 */
14293
14294 static struct snd_kcontrol_new alc861_base_mixer[] = {
14295         /* output mixer control */
14296         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14297         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14298         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14299         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14300         HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14301
14302         /*Input mixer control */
14303         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14304            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14305         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14306         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14307         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14308         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14309         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14310         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14311         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14312         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14313
14314         { } /* end */
14315 };
14316
14317 static struct snd_kcontrol_new alc861_3ST_mixer[] = {
14318         /* output mixer control */
14319         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14320         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14321         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14322         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14323         /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14324
14325         /* Input mixer control */
14326         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14327            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14328         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14329         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14330         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14331         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14332         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14333         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14334         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14335         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14336
14337         {
14338                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14339                 .name = "Channel Mode",
14340                 .info = alc_ch_mode_info,
14341                 .get = alc_ch_mode_get,
14342                 .put = alc_ch_mode_put,
14343                 .private_value = ARRAY_SIZE(alc861_threestack_modes),
14344         },
14345         { } /* end */
14346 };
14347
14348 static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
14349         /* output mixer control */
14350         HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14351         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14352         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14353
14354         { } /* end */
14355 };
14356
14357 static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
14358         /* output mixer control */
14359         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14360         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14361         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14362         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14363         /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14364
14365         /* Input mixer control */
14366         /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14367            HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14368         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14369         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14370         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14371         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14372         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14373         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14374         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14375         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14376
14377         {
14378                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14379                 .name = "Channel Mode",
14380                 .info = alc_ch_mode_info,
14381                 .get = alc_ch_mode_get,
14382                 .put = alc_ch_mode_put,
14383                 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
14384         },
14385         { } /* end */
14386 };
14387
14388 static struct snd_kcontrol_new alc861_asus_mixer[] = {
14389         /* output mixer control */
14390         HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14391         HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14392         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14393         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14394         HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14395
14396         /* Input mixer control */
14397         HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14398         HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
14399         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14400         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14401         HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14402         HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14403         HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14404         HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14405         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14406         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
14407
14408         {
14409                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14410                 .name = "Channel Mode",
14411                 .info = alc_ch_mode_info,
14412                 .get = alc_ch_mode_get,
14413                 .put = alc_ch_mode_put,
14414                 .private_value = ARRAY_SIZE(alc861_asus_modes),
14415         },
14416         { }
14417 };
14418
14419 /* additional mixer */
14420 static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
14421         HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14422         HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14423         { }
14424 };
14425
14426 /*
14427  * generic initialization of ADC, input mixers and output mixers
14428  */
14429 static struct hda_verb alc861_base_init_verbs[] = {
14430         /*
14431          * Unmute ADC0 and set the default input to mic-in
14432          */
14433         /* port-A for surround (rear panel) */
14434         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14435         { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
14436         /* port-B for mic-in (rear panel) with vref */
14437         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14438         /* port-C for line-in (rear panel) */
14439         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14440         /* port-D for Front */
14441         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14442         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14443         /* port-E for HP out (front panel) */
14444         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14445         /* route front PCM to HP */
14446         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14447         /* port-F for mic-in (front panel) with vref */
14448         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14449         /* port-G for CLFE (rear panel) */
14450         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14451         { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14452         /* port-H for side (rear panel) */
14453         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14454         { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
14455         /* CD-in */
14456         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14457         /* route front mic to ADC1*/
14458         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14459         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14460
14461         /* Unmute DAC0~3 & spdif out*/
14462         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14463         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14464         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14465         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14466         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14467
14468         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14469         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14470         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14471         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14472         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14473
14474         /* Unmute Stereo Mixer 15 */
14475         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14476         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14477         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14478         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14479
14480         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14481         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14482         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14483         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14484         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14485         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14486         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14487         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14488         /* hp used DAC 3 (Front) */
14489         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14490         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14491
14492         { }
14493 };
14494
14495 static struct hda_verb alc861_threestack_init_verbs[] = {
14496         /*
14497          * Unmute ADC0 and set the default input to mic-in
14498          */
14499         /* port-A for surround (rear panel) */
14500         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14501         /* port-B for mic-in (rear panel) with vref */
14502         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14503         /* port-C for line-in (rear panel) */
14504         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14505         /* port-D for Front */
14506         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14507         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14508         /* port-E for HP out (front panel) */
14509         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14510         /* route front PCM to HP */
14511         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14512         /* port-F for mic-in (front panel) with vref */
14513         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14514         /* port-G for CLFE (rear panel) */
14515         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14516         /* port-H for side (rear panel) */
14517         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14518         /* CD-in */
14519         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14520         /* route front mic to ADC1*/
14521         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14522         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14523         /* Unmute DAC0~3 & spdif out*/
14524         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14525         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14526         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14527         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14528         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14529
14530         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14531         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14532         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14533         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14534         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14535
14536         /* Unmute Stereo Mixer 15 */
14537         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14538         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14539         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14540         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14541
14542         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14543         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14544         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14545         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14546         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14547         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14548         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14549         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14550         /* hp used DAC 3 (Front) */
14551         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14552         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14553         { }
14554 };
14555
14556 static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
14557         /*
14558          * Unmute ADC0 and set the default input to mic-in
14559          */
14560         /* port-A for surround (rear panel) */
14561         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14562         /* port-B for mic-in (rear panel) with vref */
14563         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14564         /* port-C for line-in (rear panel) */
14565         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14566         /* port-D for Front */
14567         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14568         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14569         /* port-E for HP out (front panel) */
14570         /* this has to be set to VREF80 */
14571         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14572         /* route front PCM to HP */
14573         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14574         /* port-F for mic-in (front panel) with vref */
14575         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14576         /* port-G for CLFE (rear panel) */
14577         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14578         /* port-H for side (rear panel) */
14579         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14580         /* CD-in */
14581         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14582         /* route front mic to ADC1*/
14583         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14584         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14585         /* Unmute DAC0~3 & spdif out*/
14586         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14587         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14588         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14589         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14590         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14591
14592         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14593         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14594         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14595         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14596         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14597
14598         /* Unmute Stereo Mixer 15 */
14599         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14600         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14601         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14602         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14603
14604         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14605         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14606         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14607         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14608         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14609         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14610         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14611         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14612         /* hp used DAC 3 (Front) */
14613         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14614         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14615         { }
14616 };
14617
14618 static struct hda_verb alc861_asus_init_verbs[] = {
14619         /*
14620          * Unmute ADC0 and set the default input to mic-in
14621          */
14622         /* port-A for surround (rear panel)
14623          * according to codec#0 this is the HP jack
14624          */
14625         { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
14626         /* route front PCM to HP */
14627         { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
14628         /* port-B for mic-in (rear panel) with vref */
14629         { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14630         /* port-C for line-in (rear panel) */
14631         { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14632         /* port-D for Front */
14633         { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14634         { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14635         /* port-E for HP out (front panel) */
14636         /* this has to be set to VREF80 */
14637         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14638         /* route front PCM to HP */
14639         { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14640         /* port-F for mic-in (front panel) with vref */
14641         { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14642         /* port-G for CLFE (rear panel) */
14643         { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14644         /* port-H for side (rear panel) */
14645         { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14646         /* CD-in */
14647         { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14648         /* route front mic to ADC1*/
14649         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14650         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14651         /* Unmute DAC0~3 & spdif out*/
14652         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14653         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14654         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14655         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14656         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14657         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14658         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14659         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14660         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14661         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14662
14663         /* Unmute Stereo Mixer 15 */
14664         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14665         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14666         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14667         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14668
14669         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14670         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14671         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14672         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14673         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14674         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14675         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14676         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14677         /* hp used DAC 3 (Front) */
14678         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14679         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14680         { }
14681 };
14682
14683 /* additional init verbs for ASUS laptops */
14684 static struct hda_verb alc861_asus_laptop_init_verbs[] = {
14685         { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
14686         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
14687         { }
14688 };
14689
14690 /*
14691  * generic initialization of ADC, input mixers and output mixers
14692  */
14693 static struct hda_verb alc861_auto_init_verbs[] = {
14694         /*
14695          * Unmute ADC0 and set the default input to mic-in
14696          */
14697         /* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
14698         {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14699
14700         /* Unmute DAC0~3 & spdif out*/
14701         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14702         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14703         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14704         {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14705         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14706
14707         /* Unmute Mixer 14 (mic) 1c (Line in)*/
14708         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14709         {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14710         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14711         {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14712
14713         /* Unmute Stereo Mixer 15 */
14714         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14715         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14716         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14717         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
14718
14719         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14720         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14721         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14722         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14723         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14724         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14725         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14726         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14727
14728         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14729         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14730         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14731         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14732         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14733         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14734         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14735         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14736
14737         {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},  /* set Mic 1 */
14738
14739         { }
14740 };
14741
14742 static struct hda_verb alc861_toshiba_init_verbs[] = {
14743         {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14744
14745         { }
14746 };
14747
14748 /* toggle speaker-output according to the hp-jack state */
14749 static void alc861_toshiba_automute(struct hda_codec *codec)
14750 {
14751         unsigned int present = snd_hda_jack_detect(codec, 0x0f);
14752
14753         snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
14754                                  HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
14755         snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
14756                                  HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
14757 }
14758
14759 static void alc861_toshiba_unsol_event(struct hda_codec *codec,
14760                                        unsigned int res)
14761 {
14762         if ((res >> 26) == ALC880_HP_EVENT)
14763                 alc861_toshiba_automute(codec);
14764 }
14765
14766 /* pcm configuration: identical with ALC880 */
14767 #define alc861_pcm_analog_playback      alc880_pcm_analog_playback
14768 #define alc861_pcm_analog_capture       alc880_pcm_analog_capture
14769 #define alc861_pcm_digital_playback     alc880_pcm_digital_playback
14770 #define alc861_pcm_digital_capture      alc880_pcm_digital_capture
14771
14772
14773 #define ALC861_DIGOUT_NID       0x07
14774
14775 static struct hda_channel_mode alc861_8ch_modes[1] = {
14776         { 8, NULL }
14777 };
14778
14779 static hda_nid_t alc861_dac_nids[4] = {
14780         /* front, surround, clfe, side */
14781         0x03, 0x06, 0x05, 0x04
14782 };
14783
14784 static hda_nid_t alc660_dac_nids[3] = {
14785         /* front, clfe, surround */
14786         0x03, 0x05, 0x06
14787 };
14788
14789 static hda_nid_t alc861_adc_nids[1] = {
14790         /* ADC0-2 */
14791         0x08,
14792 };
14793
14794 static struct hda_input_mux alc861_capture_source = {
14795         .num_items = 5,
14796         .items = {
14797                 { "Mic", 0x0 },
14798                 { "Front Mic", 0x3 },
14799                 { "Line", 0x1 },
14800                 { "CD", 0x4 },
14801                 { "Mixer", 0x5 },
14802         },
14803 };
14804
14805 static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
14806 {
14807         struct alc_spec *spec = codec->spec;
14808         hda_nid_t mix, srcs[5];
14809         int i, j, num;
14810
14811         if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
14812                 return 0;
14813         num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14814         if (num < 0)
14815                 return 0;
14816         for (i = 0; i < num; i++) {
14817                 unsigned int type;
14818                 type = get_wcaps_type(get_wcaps(codec, srcs[i]));
14819                 if (type != AC_WID_AUD_OUT)
14820                         continue;
14821                 for (j = 0; j < spec->multiout.num_dacs; j++)
14822                         if (spec->multiout.dac_nids[j] == srcs[i])
14823                                 break;
14824                 if (j >= spec->multiout.num_dacs)
14825                         return srcs[i];
14826         }
14827         return 0;
14828 }
14829
14830 /* fill in the dac_nids table from the parsed pin configuration */
14831 static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
14832                                      const struct auto_pin_cfg *cfg)
14833 {
14834         struct alc_spec *spec = codec->spec;
14835         int i;
14836         hda_nid_t nid, dac;
14837
14838         spec->multiout.dac_nids = spec->private_dac_nids;
14839         for (i = 0; i < cfg->line_outs; i++) {
14840                 nid = cfg->line_out_pins[i];
14841                 dac = alc861_look_for_dac(codec, nid);
14842                 if (!dac)
14843                         continue;
14844                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
14845         }
14846         return 0;
14847 }
14848
14849 static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
14850                                 hda_nid_t nid, unsigned int chs)
14851 {
14852         return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx,
14853                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
14854 }
14855
14856 /* add playback controls from the parsed DAC table */
14857 static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
14858                                              const struct auto_pin_cfg *cfg)
14859 {
14860         struct alc_spec *spec = codec->spec;
14861         static const char *chname[4] = {
14862                 "Front", "Surround", NULL /*CLFE*/, "Side"
14863         };
14864         hda_nid_t nid;
14865         int i, err;
14866
14867         if (cfg->line_outs == 1) {
14868                 const char *pfx = NULL;
14869                 if (!cfg->hp_outs)
14870                         pfx = "Master";
14871                 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
14872                         pfx = "Speaker";
14873                 if (pfx) {
14874                         nid = spec->multiout.dac_nids[0];
14875                         return alc861_create_out_sw(codec, pfx, nid, 3);
14876                 }
14877         }
14878
14879         for (i = 0; i < cfg->line_outs; i++) {
14880                 nid = spec->multiout.dac_nids[i];
14881                 if (!nid)
14882                         continue;
14883                 if (i == 2) {
14884                         /* Center/LFE */
14885                         err = alc861_create_out_sw(codec, "Center", nid, 1);
14886                         if (err < 0)
14887                                 return err;
14888                         err = alc861_create_out_sw(codec, "LFE", nid, 2);
14889                         if (err < 0)
14890                                 return err;
14891                 } else {
14892                         err = alc861_create_out_sw(codec, chname[i], nid, 3);
14893                         if (err < 0)
14894                                 return err;
14895                 }
14896         }
14897         return 0;
14898 }
14899
14900 static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
14901 {
14902         struct alc_spec *spec = codec->spec;
14903         int err;
14904         hda_nid_t nid;
14905
14906         if (!pin)
14907                 return 0;
14908
14909         if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
14910                 nid = alc861_look_for_dac(codec, pin);
14911                 if (nid) {
14912                         err = alc861_create_out_sw(codec, "Headphone", nid, 3);
14913                         if (err < 0)
14914                                 return err;
14915                         spec->multiout.hp_nid = nid;
14916                 }
14917         }
14918         return 0;
14919 }
14920
14921 /* create playback/capture controls for input pins */
14922 static int alc861_auto_create_input_ctls(struct hda_codec *codec,
14923                                                 const struct auto_pin_cfg *cfg)
14924 {
14925         return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
14926 }
14927
14928 static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
14929                                               hda_nid_t nid,
14930                                               int pin_type, hda_nid_t dac)
14931 {
14932         hda_nid_t mix, srcs[5];
14933         int i, num;
14934
14935         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
14936                             pin_type);
14937         snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
14938                             AMP_OUT_UNMUTE);
14939         if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
14940                 return;
14941         num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14942         if (num < 0)
14943                 return;
14944         for (i = 0; i < num; i++) {
14945                 unsigned int mute;
14946                 if (srcs[i] == dac || srcs[i] == 0x15)
14947                         mute = AMP_IN_UNMUTE(i);
14948                 else
14949                         mute = AMP_IN_MUTE(i);
14950                 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
14951                                     mute);
14952         }
14953 }
14954
14955 static void alc861_auto_init_multi_out(struct hda_codec *codec)
14956 {
14957         struct alc_spec *spec = codec->spec;
14958         int i;
14959
14960         for (i = 0; i < spec->autocfg.line_outs; i++) {
14961                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
14962                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
14963                 if (nid)
14964                         alc861_auto_set_output_and_unmute(codec, nid, pin_type,
14965                                                           spec->multiout.dac_nids[i]);
14966         }
14967 }
14968
14969 static void alc861_auto_init_hp_out(struct hda_codec *codec)
14970 {
14971         struct alc_spec *spec = codec->spec;
14972
14973         if (spec->autocfg.hp_outs)
14974                 alc861_auto_set_output_and_unmute(codec,
14975                                                   spec->autocfg.hp_pins[0],
14976                                                   PIN_HP,
14977                                                   spec->multiout.hp_nid);
14978         if (spec->autocfg.speaker_outs)
14979                 alc861_auto_set_output_and_unmute(codec,
14980                                                   spec->autocfg.speaker_pins[0],
14981                                                   PIN_OUT,
14982                                                   spec->multiout.dac_nids[0]);
14983 }
14984
14985 static void alc861_auto_init_analog_input(struct hda_codec *codec)
14986 {
14987         struct alc_spec *spec = codec->spec;
14988         int i;
14989
14990         for (i = 0; i < AUTO_PIN_LAST; i++) {
14991                 hda_nid_t nid = spec->autocfg.input_pins[i];
14992                 if (nid >= 0x0c && nid <= 0x11)
14993                         alc_set_input_pin(codec, nid, i);
14994         }
14995 }
14996
14997 /* parse the BIOS configuration and set up the alc_spec */
14998 /* return 1 if successful, 0 if the proper config is not found,
14999  * or a negative error code
15000  */
15001 static int alc861_parse_auto_config(struct hda_codec *codec)
15002 {
15003         struct alc_spec *spec = codec->spec;
15004         int err;
15005         static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
15006
15007         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15008                                            alc861_ignore);
15009         if (err < 0)
15010                 return err;
15011         if (!spec->autocfg.line_outs)
15012                 return 0; /* can't find valid BIOS pin config */
15013
15014         err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
15015         if (err < 0)
15016                 return err;
15017         err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
15018         if (err < 0)
15019                 return err;
15020         err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
15021         if (err < 0)
15022                 return err;
15023         err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
15024         if (err < 0)
15025                 return err;
15026
15027         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15028
15029         if (spec->autocfg.dig_outs)
15030                 spec->multiout.dig_out_nid = ALC861_DIGOUT_NID;
15031
15032         if (spec->kctls.list)
15033                 add_mixer(spec, spec->kctls.list);
15034
15035         add_verb(spec, alc861_auto_init_verbs);
15036
15037         spec->num_mux_defs = 1;
15038         spec->input_mux = &spec->private_imux[0];
15039
15040         spec->adc_nids = alc861_adc_nids;
15041         spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
15042         set_capture_mixer(codec);
15043
15044         alc_ssid_check(codec, 0x0e, 0x0f, 0x0b, 0);
15045
15046         return 1;
15047 }
15048
15049 /* additional initialization for auto-configuration model */
15050 static void alc861_auto_init(struct hda_codec *codec)
15051 {
15052         struct alc_spec *spec = codec->spec;
15053         alc861_auto_init_multi_out(codec);
15054         alc861_auto_init_hp_out(codec);
15055         alc861_auto_init_analog_input(codec);
15056         if (spec->unsol_event)
15057                 alc_inithook(codec);
15058 }
15059
15060 #ifdef CONFIG_SND_HDA_POWER_SAVE
15061 static struct hda_amp_list alc861_loopbacks[] = {
15062         { 0x15, HDA_INPUT, 0 },
15063         { 0x15, HDA_INPUT, 1 },
15064         { 0x15, HDA_INPUT, 2 },
15065         { 0x15, HDA_INPUT, 3 },
15066         { } /* end */
15067 };
15068 #endif
15069
15070
15071 /*
15072  * configuration and preset
15073  */
15074 static const char *alc861_models[ALC861_MODEL_LAST] = {
15075         [ALC861_3ST]            = "3stack",
15076         [ALC660_3ST]            = "3stack-660",
15077         [ALC861_3ST_DIG]        = "3stack-dig",
15078         [ALC861_6ST_DIG]        = "6stack-dig",
15079         [ALC861_UNIWILL_M31]    = "uniwill-m31",
15080         [ALC861_TOSHIBA]        = "toshiba",
15081         [ALC861_ASUS]           = "asus",
15082         [ALC861_ASUS_LAPTOP]    = "asus-laptop",
15083         [ALC861_AUTO]           = "auto",
15084 };
15085
15086 static struct snd_pci_quirk alc861_cfg_tbl[] = {
15087         SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
15088         SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15089         SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15090         SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
15091         SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
15092         SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
15093         SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
15094         /* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
15095          *        Any other models that need this preset?
15096          */
15097         /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
15098         SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
15099         SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
15100         SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
15101         SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
15102         SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
15103         /* FIXME: the below seems conflict */
15104         /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
15105         SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
15106         SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
15107         {}
15108 };
15109
15110 static struct alc_config_preset alc861_presets[] = {
15111         [ALC861_3ST] = {
15112                 .mixers = { alc861_3ST_mixer },
15113                 .init_verbs = { alc861_threestack_init_verbs },
15114                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15115                 .dac_nids = alc861_dac_nids,
15116                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15117                 .channel_mode = alc861_threestack_modes,
15118                 .need_dac_fix = 1,
15119                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15120                 .adc_nids = alc861_adc_nids,
15121                 .input_mux = &alc861_capture_source,
15122         },
15123         [ALC861_3ST_DIG] = {
15124                 .mixers = { alc861_base_mixer },
15125                 .init_verbs = { alc861_threestack_init_verbs },
15126                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15127                 .dac_nids = alc861_dac_nids,
15128                 .dig_out_nid = ALC861_DIGOUT_NID,
15129                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15130                 .channel_mode = alc861_threestack_modes,
15131                 .need_dac_fix = 1,
15132                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15133                 .adc_nids = alc861_adc_nids,
15134                 .input_mux = &alc861_capture_source,
15135         },
15136         [ALC861_6ST_DIG] = {
15137                 .mixers = { alc861_base_mixer },
15138                 .init_verbs = { alc861_base_init_verbs },
15139                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15140                 .dac_nids = alc861_dac_nids,
15141                 .dig_out_nid = ALC861_DIGOUT_NID,
15142                 .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
15143                 .channel_mode = alc861_8ch_modes,
15144                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15145                 .adc_nids = alc861_adc_nids,
15146                 .input_mux = &alc861_capture_source,
15147         },
15148         [ALC660_3ST] = {
15149                 .mixers = { alc861_3ST_mixer },
15150                 .init_verbs = { alc861_threestack_init_verbs },
15151                 .num_dacs = ARRAY_SIZE(alc660_dac_nids),
15152                 .dac_nids = alc660_dac_nids,
15153                 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15154                 .channel_mode = alc861_threestack_modes,
15155                 .need_dac_fix = 1,
15156                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15157                 .adc_nids = alc861_adc_nids,
15158                 .input_mux = &alc861_capture_source,
15159         },
15160         [ALC861_UNIWILL_M31] = {
15161                 .mixers = { alc861_uniwill_m31_mixer },
15162                 .init_verbs = { alc861_uniwill_m31_init_verbs },
15163                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15164                 .dac_nids = alc861_dac_nids,
15165                 .dig_out_nid = ALC861_DIGOUT_NID,
15166                 .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
15167                 .channel_mode = alc861_uniwill_m31_modes,
15168                 .need_dac_fix = 1,
15169                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15170                 .adc_nids = alc861_adc_nids,
15171                 .input_mux = &alc861_capture_source,
15172         },
15173         [ALC861_TOSHIBA] = {
15174                 .mixers = { alc861_toshiba_mixer },
15175                 .init_verbs = { alc861_base_init_verbs,
15176                                 alc861_toshiba_init_verbs },
15177                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15178                 .dac_nids = alc861_dac_nids,
15179                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15180                 .channel_mode = alc883_3ST_2ch_modes,
15181                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15182                 .adc_nids = alc861_adc_nids,
15183                 .input_mux = &alc861_capture_source,
15184                 .unsol_event = alc861_toshiba_unsol_event,
15185                 .init_hook = alc861_toshiba_automute,
15186         },
15187         [ALC861_ASUS] = {
15188                 .mixers = { alc861_asus_mixer },
15189                 .init_verbs = { alc861_asus_init_verbs },
15190                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15191                 .dac_nids = alc861_dac_nids,
15192                 .dig_out_nid = ALC861_DIGOUT_NID,
15193                 .num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
15194                 .channel_mode = alc861_asus_modes,
15195                 .need_dac_fix = 1,
15196                 .hp_nid = 0x06,
15197                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15198                 .adc_nids = alc861_adc_nids,
15199                 .input_mux = &alc861_capture_source,
15200         },
15201         [ALC861_ASUS_LAPTOP] = {
15202                 .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
15203                 .init_verbs = { alc861_asus_init_verbs,
15204                                 alc861_asus_laptop_init_verbs },
15205                 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15206                 .dac_nids = alc861_dac_nids,
15207                 .dig_out_nid = ALC861_DIGOUT_NID,
15208                 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15209                 .channel_mode = alc883_3ST_2ch_modes,
15210                 .need_dac_fix = 1,
15211                 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15212                 .adc_nids = alc861_adc_nids,
15213                 .input_mux = &alc861_capture_source,
15214         },
15215 };
15216
15217 /* Pin config fixes */
15218 enum {
15219         PINFIX_FSC_AMILO_PI1505,
15220 };
15221
15222 static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = {
15223         { 0x0b, 0x0221101f }, /* HP */
15224         { 0x0f, 0x90170310 }, /* speaker */
15225         { }
15226 };
15227
15228 static const struct alc_fixup alc861_fixups[] = {
15229         [PINFIX_FSC_AMILO_PI1505] = {
15230                 .pins = alc861_fsc_amilo_pi1505_pinfix
15231         },
15232 };
15233
15234 static struct snd_pci_quirk alc861_fixup_tbl[] = {
15235         SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
15236         {}
15237 };
15238
15239 static int patch_alc861(struct hda_codec *codec)
15240 {
15241         struct alc_spec *spec;
15242         int board_config;
15243         int err;
15244
15245         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
15246         if (spec == NULL)
15247                 return -ENOMEM;
15248
15249         codec->spec = spec;
15250
15251         board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
15252                                                   alc861_models,
15253                                                   alc861_cfg_tbl);
15254
15255         if (board_config < 0) {
15256                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15257                        codec->chip_name);
15258                 board_config = ALC861_AUTO;
15259         }
15260
15261         alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups);
15262
15263         if (board_config == ALC861_AUTO) {
15264                 /* automatic parse from the BIOS config */
15265                 err = alc861_parse_auto_config(codec);
15266                 if (err < 0) {
15267                         alc_free(codec);
15268                         return err;
15269                 } else if (!err) {
15270                         printk(KERN_INFO
15271                                "hda_codec: Cannot set up configuration "
15272                                "from BIOS.  Using base mode...\n");
15273                    board_config = ALC861_3ST_DIG;
15274                 }
15275         }
15276
15277         err = snd_hda_attach_beep_device(codec, 0x23);
15278         if (err < 0) {
15279                 alc_free(codec);
15280                 return err;
15281         }
15282
15283         if (board_config != ALC861_AUTO)
15284                 setup_preset(codec, &alc861_presets[board_config]);
15285
15286         spec->stream_analog_playback = &alc861_pcm_analog_playback;
15287         spec->stream_analog_capture = &alc861_pcm_analog_capture;
15288
15289         spec->stream_digital_playback = &alc861_pcm_digital_playback;
15290         spec->stream_digital_capture = &alc861_pcm_digital_capture;
15291
15292         if (!spec->cap_mixer)
15293                 set_capture_mixer(codec);
15294         set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
15295
15296         spec->vmaster_nid = 0x03;
15297
15298         codec->patch_ops = alc_patch_ops;
15299         if (board_config == ALC861_AUTO) {
15300                 spec->init_hook = alc861_auto_init;
15301 #ifdef CONFIG_SND_HDA_POWER_SAVE
15302                 spec->power_hook = alc_power_eapd;
15303 #endif
15304         }
15305 #ifdef CONFIG_SND_HDA_POWER_SAVE
15306         if (!spec->loopback.amplist)
15307                 spec->loopback.amplist = alc861_loopbacks;
15308 #endif
15309
15310         return 0;
15311 }
15312
15313 /*
15314  * ALC861-VD support
15315  *
15316  * Based on ALC882
15317  *
15318  * In addition, an independent DAC
15319  */
15320 #define ALC861VD_DIGOUT_NID     0x06
15321
15322 static hda_nid_t alc861vd_dac_nids[4] = {
15323         /* front, surr, clfe, side surr */
15324         0x02, 0x03, 0x04, 0x05
15325 };
15326
15327 /* dac_nids for ALC660vd are in a different order - according to
15328  * Realtek's driver.
15329  * This should probably result in a different mixer for 6stack models
15330  * of ALC660vd codecs, but for now there is only 3stack mixer
15331  * - and it is the same as in 861vd.
15332  * adc_nids in ALC660vd are (is) the same as in 861vd
15333  */
15334 static hda_nid_t alc660vd_dac_nids[3] = {
15335         /* front, rear, clfe, rear_surr */
15336         0x02, 0x04, 0x03
15337 };
15338
15339 static hda_nid_t alc861vd_adc_nids[1] = {
15340         /* ADC0 */
15341         0x09,
15342 };
15343
15344 static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
15345
15346 /* input MUX */
15347 /* FIXME: should be a matrix-type input source selection */
15348 static struct hda_input_mux alc861vd_capture_source = {
15349         .num_items = 4,
15350         .items = {
15351                 { "Mic", 0x0 },
15352                 { "Front Mic", 0x1 },
15353                 { "Line", 0x2 },
15354                 { "CD", 0x4 },
15355         },
15356 };
15357
15358 static struct hda_input_mux alc861vd_dallas_capture_source = {
15359         .num_items = 2,
15360         .items = {
15361                 { "Ext Mic", 0x0 },
15362                 { "Int Mic", 0x1 },
15363         },
15364 };
15365
15366 static struct hda_input_mux alc861vd_hp_capture_source = {
15367         .num_items = 2,
15368         .items = {
15369                 { "Front Mic", 0x0 },
15370                 { "ATAPI Mic", 0x1 },
15371         },
15372 };
15373
15374 /*
15375  * 2ch mode
15376  */
15377 static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
15378         { 2, NULL }
15379 };
15380
15381 /*
15382  * 6ch mode
15383  */
15384 static struct hda_verb alc861vd_6stack_ch6_init[] = {
15385         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15386         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15387         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15388         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15389         { } /* end */
15390 };
15391
15392 /*
15393  * 8ch mode
15394  */
15395 static struct hda_verb alc861vd_6stack_ch8_init[] = {
15396         { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15397         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15398         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15399         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15400         { } /* end */
15401 };
15402
15403 static struct hda_channel_mode alc861vd_6stack_modes[2] = {
15404         { 6, alc861vd_6stack_ch6_init },
15405         { 8, alc861vd_6stack_ch8_init },
15406 };
15407
15408 static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
15409         {
15410                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15411                 .name = "Channel Mode",
15412                 .info = alc_ch_mode_info,
15413                 .get = alc_ch_mode_get,
15414                 .put = alc_ch_mode_put,
15415         },
15416         { } /* end */
15417 };
15418
15419 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
15420  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
15421  */
15422 static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
15423         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15424         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15425
15426         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15427         HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
15428
15429         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
15430                                 HDA_OUTPUT),
15431         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
15432                                 HDA_OUTPUT),
15433         HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
15434         HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
15435
15436         HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
15437         HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
15438
15439         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15440
15441         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15442         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15443         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15444
15445         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15446         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15447         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15448
15449         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15450         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15451
15452         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15453         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15454
15455         { } /* end */
15456 };
15457
15458 static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
15459         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15460         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15461
15462         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15463
15464         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15465         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15466         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15467
15468         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15469         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15470         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15471
15472         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15473         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15474
15475         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15476         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15477
15478         { } /* end */
15479 };
15480
15481 static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
15482         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15483         /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
15484         HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
15485
15486         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15487
15488         HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15489         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15490         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15491
15492         HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15493         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15494         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15495
15496         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15497         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15498
15499         { } /* end */
15500 };
15501
15502 /* Pin assignment: Speaker=0x14, HP = 0x15,
15503  *                 Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
15504  */
15505 static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
15506         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15507         HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
15508         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15509         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15510         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
15511         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15512         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15513         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
15514         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15515         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15516         { } /* end */
15517 };
15518
15519 /* Pin assignment: Speaker=0x14, Line-out = 0x15,
15520  *                 Front Mic=0x18, ATAPI Mic = 0x19,
15521  */
15522 static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
15523         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15524         HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15525         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15526         HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15527         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15528         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15529         HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15530         HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15531
15532         { } /* end */
15533 };
15534
15535 /*
15536  * generic initialization of ADC, input mixers and output mixers
15537  */
15538 static struct hda_verb alc861vd_volume_init_verbs[] = {
15539         /*
15540          * Unmute ADC0 and set the default input to mic-in
15541          */
15542         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15543         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15544
15545         /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
15546          * the analog-loopback mixer widget
15547          */
15548         /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
15549         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15550         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15551         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15552         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15553         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15554
15555         /* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
15556         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15557         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15558         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15559         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
15560
15561         /*
15562          * Set up output mixers (0x02 - 0x05)
15563          */
15564         /* set vol=0 to output mixers */
15565         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15566         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15567         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15568         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15569
15570         /* set up input amps for analog loopback */
15571         /* Amp Indices: DAC = 0, mixer = 1 */
15572         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15573         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15574         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15575         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15576         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15577         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15578         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15579         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15580
15581         { }
15582 };
15583
15584 /*
15585  * 3-stack pin configuration:
15586  * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
15587  */
15588 static struct hda_verb alc861vd_3stack_init_verbs[] = {
15589         /*
15590          * Set pin mode and muting
15591          */
15592         /* set front pin widgets 0x14 for output */
15593         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15594         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15595         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15596
15597         /* Mic (rear) pin: input vref at 80% */
15598         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15599         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15600         /* Front Mic pin: input vref at 80% */
15601         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15602         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15603         /* Line In pin: input */
15604         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15605         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15606         /* Line-2 In: Headphone output (output 0 - 0x0c) */
15607         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15608         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15609         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15610         /* CD pin widget for input */
15611         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15612
15613         { }
15614 };
15615
15616 /*
15617  * 6-stack pin configuration:
15618  */
15619 static struct hda_verb alc861vd_6stack_init_verbs[] = {
15620         /*
15621          * Set pin mode and muting
15622          */
15623         /* set front pin widgets 0x14 for output */
15624         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15625         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15626         {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15627
15628         /* Rear Pin: output 1 (0x0d) */
15629         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15630         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15631         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
15632         /* CLFE Pin: output 2 (0x0e) */
15633         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15634         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15635         {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
15636         /* Side Pin: output 3 (0x0f) */
15637         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15638         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15639         {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
15640
15641         /* Mic (rear) pin: input vref at 80% */
15642         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15643         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15644         /* Front Mic pin: input vref at 80% */
15645         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15646         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15647         /* Line In pin: input */
15648         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15649         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15650         /* Line-2 In: Headphone output (output 0 - 0x0c) */
15651         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15652         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15653         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15654         /* CD pin widget for input */
15655         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15656
15657         { }
15658 };
15659
15660 static struct hda_verb alc861vd_eapd_verbs[] = {
15661         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15662         { }
15663 };
15664
15665 static struct hda_verb alc660vd_eapd_verbs[] = {
15666         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15667         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
15668         { }
15669 };
15670
15671 static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
15672         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15673         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15674         {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
15675         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15676         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
15677         {}
15678 };
15679
15680 static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
15681 {
15682         unsigned int present;
15683         unsigned char bits;
15684
15685         present = snd_hda_jack_detect(codec, 0x18);
15686         bits = present ? HDA_AMP_MUTE : 0;
15687
15688         snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
15689                                  HDA_AMP_MUTE, bits);
15690 }
15691
15692 static void alc861vd_lenovo_setup(struct hda_codec *codec)
15693 {
15694         struct alc_spec *spec = codec->spec;
15695         spec->autocfg.hp_pins[0] = 0x1b;
15696         spec->autocfg.speaker_pins[0] = 0x14;
15697 }
15698
15699 static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
15700 {
15701         alc_automute_amp(codec);
15702         alc861vd_lenovo_mic_automute(codec);
15703 }
15704
15705 static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
15706                                         unsigned int res)
15707 {
15708         switch (res >> 26) {
15709         case ALC880_MIC_EVENT:
15710                 alc861vd_lenovo_mic_automute(codec);
15711                 break;
15712         default:
15713                 alc_automute_amp_unsol_event(codec, res);
15714                 break;
15715         }
15716 }
15717
15718 static struct hda_verb alc861vd_dallas_verbs[] = {
15719         {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15720         {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15721         {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15722         {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15723
15724         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15725         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15726         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15727         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15728         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15729         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15730         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15731         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15732
15733         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15734         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15735         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15736         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15737         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15738         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15739         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15740         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15741
15742         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15743         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15744         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15745         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15746         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15747         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15748         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15749         {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15750
15751         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15752         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15753         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15754         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15755
15756         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15757         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15758         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15759
15760         { } /* end */
15761 };
15762
15763 /* toggle speaker-output according to the hp-jack state */
15764 static void alc861vd_dallas_setup(struct hda_codec *codec)
15765 {
15766         struct alc_spec *spec = codec->spec;
15767
15768         spec->autocfg.hp_pins[0] = 0x15;
15769         spec->autocfg.speaker_pins[0] = 0x14;
15770 }
15771
15772 #ifdef CONFIG_SND_HDA_POWER_SAVE
15773 #define alc861vd_loopbacks      alc880_loopbacks
15774 #endif
15775
15776 /* pcm configuration: identical with ALC880 */
15777 #define alc861vd_pcm_analog_playback    alc880_pcm_analog_playback
15778 #define alc861vd_pcm_analog_capture     alc880_pcm_analog_capture
15779 #define alc861vd_pcm_digital_playback   alc880_pcm_digital_playback
15780 #define alc861vd_pcm_digital_capture    alc880_pcm_digital_capture
15781
15782 /*
15783  * configuration and preset
15784  */
15785 static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
15786         [ALC660VD_3ST]          = "3stack-660",
15787         [ALC660VD_3ST_DIG]      = "3stack-660-digout",
15788         [ALC660VD_ASUS_V1S]     = "asus-v1s",
15789         [ALC861VD_3ST]          = "3stack",
15790         [ALC861VD_3ST_DIG]      = "3stack-digout",
15791         [ALC861VD_6ST_DIG]      = "6stack-digout",
15792         [ALC861VD_LENOVO]       = "lenovo",
15793         [ALC861VD_DALLAS]       = "dallas",
15794         [ALC861VD_HP]           = "hp",
15795         [ALC861VD_AUTO]         = "auto",
15796 };
15797
15798 static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
15799         SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
15800         SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
15801         SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
15802         /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
15803         SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
15804         SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
15805         SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
15806         SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
15807         /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
15808         SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
15809         SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
15810         SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
15811         SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
15812         SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
15813         SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
15814         {}
15815 };
15816
15817 static struct alc_config_preset alc861vd_presets[] = {
15818         [ALC660VD_3ST] = {
15819                 .mixers = { alc861vd_3st_mixer },
15820                 .init_verbs = { alc861vd_volume_init_verbs,
15821                                  alc861vd_3stack_init_verbs },
15822                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15823                 .dac_nids = alc660vd_dac_nids,
15824                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15825                 .channel_mode = alc861vd_3stack_2ch_modes,
15826                 .input_mux = &alc861vd_capture_source,
15827         },
15828         [ALC660VD_3ST_DIG] = {
15829                 .mixers = { alc861vd_3st_mixer },
15830                 .init_verbs = { alc861vd_volume_init_verbs,
15831                                  alc861vd_3stack_init_verbs },
15832                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15833                 .dac_nids = alc660vd_dac_nids,
15834                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15835                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15836                 .channel_mode = alc861vd_3stack_2ch_modes,
15837                 .input_mux = &alc861vd_capture_source,
15838         },
15839         [ALC861VD_3ST] = {
15840                 .mixers = { alc861vd_3st_mixer },
15841                 .init_verbs = { alc861vd_volume_init_verbs,
15842                                  alc861vd_3stack_init_verbs },
15843                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15844                 .dac_nids = alc861vd_dac_nids,
15845                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15846                 .channel_mode = alc861vd_3stack_2ch_modes,
15847                 .input_mux = &alc861vd_capture_source,
15848         },
15849         [ALC861VD_3ST_DIG] = {
15850                 .mixers = { alc861vd_3st_mixer },
15851                 .init_verbs = { alc861vd_volume_init_verbs,
15852                                  alc861vd_3stack_init_verbs },
15853                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15854                 .dac_nids = alc861vd_dac_nids,
15855                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15856                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15857                 .channel_mode = alc861vd_3stack_2ch_modes,
15858                 .input_mux = &alc861vd_capture_source,
15859         },
15860         [ALC861VD_6ST_DIG] = {
15861                 .mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
15862                 .init_verbs = { alc861vd_volume_init_verbs,
15863                                 alc861vd_6stack_init_verbs },
15864                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15865                 .dac_nids = alc861vd_dac_nids,
15866                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15867                 .num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
15868                 .channel_mode = alc861vd_6stack_modes,
15869                 .input_mux = &alc861vd_capture_source,
15870         },
15871         [ALC861VD_LENOVO] = {
15872                 .mixers = { alc861vd_lenovo_mixer },
15873                 .init_verbs = { alc861vd_volume_init_verbs,
15874                                 alc861vd_3stack_init_verbs,
15875                                 alc861vd_eapd_verbs,
15876                                 alc861vd_lenovo_unsol_verbs },
15877                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15878                 .dac_nids = alc660vd_dac_nids,
15879                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15880                 .channel_mode = alc861vd_3stack_2ch_modes,
15881                 .input_mux = &alc861vd_capture_source,
15882                 .unsol_event = alc861vd_lenovo_unsol_event,
15883                 .setup = alc861vd_lenovo_setup,
15884                 .init_hook = alc861vd_lenovo_init_hook,
15885         },
15886         [ALC861VD_DALLAS] = {
15887                 .mixers = { alc861vd_dallas_mixer },
15888                 .init_verbs = { alc861vd_dallas_verbs },
15889                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15890                 .dac_nids = alc861vd_dac_nids,
15891                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15892                 .channel_mode = alc861vd_3stack_2ch_modes,
15893                 .input_mux = &alc861vd_dallas_capture_source,
15894                 .unsol_event = alc_automute_amp_unsol_event,
15895                 .setup = alc861vd_dallas_setup,
15896                 .init_hook = alc_automute_amp,
15897         },
15898         [ALC861VD_HP] = {
15899                 .mixers = { alc861vd_hp_mixer },
15900                 .init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
15901                 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15902                 .dac_nids = alc861vd_dac_nids,
15903                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15904                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15905                 .channel_mode = alc861vd_3stack_2ch_modes,
15906                 .input_mux = &alc861vd_hp_capture_source,
15907                 .unsol_event = alc_automute_amp_unsol_event,
15908                 .setup = alc861vd_dallas_setup,
15909                 .init_hook = alc_automute_amp,
15910         },
15911         [ALC660VD_ASUS_V1S] = {
15912                 .mixers = { alc861vd_lenovo_mixer },
15913                 .init_verbs = { alc861vd_volume_init_verbs,
15914                                 alc861vd_3stack_init_verbs,
15915                                 alc861vd_eapd_verbs,
15916                                 alc861vd_lenovo_unsol_verbs },
15917                 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15918                 .dac_nids = alc660vd_dac_nids,
15919                 .dig_out_nid = ALC861VD_DIGOUT_NID,
15920                 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15921                 .channel_mode = alc861vd_3stack_2ch_modes,
15922                 .input_mux = &alc861vd_capture_source,
15923                 .unsol_event = alc861vd_lenovo_unsol_event,
15924                 .setup = alc861vd_lenovo_setup,
15925                 .init_hook = alc861vd_lenovo_init_hook,
15926         },
15927 };
15928
15929 /*
15930  * BIOS auto configuration
15931  */
15932 static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
15933                                                 const struct auto_pin_cfg *cfg)
15934 {
15935         return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
15936 }
15937
15938
15939 static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
15940                                 hda_nid_t nid, int pin_type, int dac_idx)
15941 {
15942         alc_set_pin_output(codec, nid, pin_type);
15943 }
15944
15945 static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
15946 {
15947         struct alc_spec *spec = codec->spec;
15948         int i;
15949
15950         for (i = 0; i <= HDA_SIDE; i++) {
15951                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
15952                 int pin_type = get_pin_type(spec->autocfg.line_out_type);
15953                 if (nid)
15954                         alc861vd_auto_set_output_and_unmute(codec, nid,
15955                                                             pin_type, i);
15956         }
15957 }
15958
15959
15960 static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
15961 {
15962         struct alc_spec *spec = codec->spec;
15963         hda_nid_t pin;
15964
15965         pin = spec->autocfg.hp_pins[0];
15966         if (pin) /* connect to front and use dac 0 */
15967                 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
15968         pin = spec->autocfg.speaker_pins[0];
15969         if (pin)
15970                 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
15971 }
15972
15973 #define ALC861VD_PIN_CD_NID             ALC880_PIN_CD_NID
15974
15975 static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
15976 {
15977         struct alc_spec *spec = codec->spec;
15978         int i;
15979
15980         for (i = 0; i < AUTO_PIN_LAST; i++) {
15981                 hda_nid_t nid = spec->autocfg.input_pins[i];
15982                 if (alc_is_input_pin(codec, nid)) {
15983                         alc_set_input_pin(codec, nid, i);
15984                         if (nid != ALC861VD_PIN_CD_NID &&
15985                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
15986                                 snd_hda_codec_write(codec, nid, 0,
15987                                                 AC_VERB_SET_AMP_GAIN_MUTE,
15988                                                 AMP_OUT_MUTE);
15989                 }
15990         }
15991 }
15992
15993 #define alc861vd_auto_init_input_src    alc882_auto_init_input_src
15994
15995 #define alc861vd_idx_to_mixer_vol(nid)          ((nid) + 0x02)
15996 #define alc861vd_idx_to_mixer_switch(nid)       ((nid) + 0x0c)
15997
15998 /* add playback controls from the parsed DAC table */
15999 /* Based on ALC880 version. But ALC861VD has separate,
16000  * different NIDs for mute/unmute switch and volume control */
16001 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
16002                                              const struct auto_pin_cfg *cfg)
16003 {
16004         static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
16005         hda_nid_t nid_v, nid_s;
16006         int i, err;
16007
16008         for (i = 0; i < cfg->line_outs; i++) {
16009                 if (!spec->multiout.dac_nids[i])
16010                         continue;
16011                 nid_v = alc861vd_idx_to_mixer_vol(
16012                                 alc880_dac_to_idx(
16013                                         spec->multiout.dac_nids[i]));
16014                 nid_s = alc861vd_idx_to_mixer_switch(
16015                                 alc880_dac_to_idx(
16016                                         spec->multiout.dac_nids[i]));
16017
16018                 if (i == 2) {
16019                         /* Center/LFE */
16020                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16021                                               "Center",
16022                                           HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
16023                                                               HDA_OUTPUT));
16024                         if (err < 0)
16025                                 return err;
16026                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16027                                               "LFE",
16028                                           HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
16029                                                               HDA_OUTPUT));
16030                         if (err < 0)
16031                                 return err;
16032                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16033                                              "Center",
16034                                           HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
16035                                                               HDA_INPUT));
16036                         if (err < 0)
16037                                 return err;
16038                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16039                                              "LFE",
16040                                           HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
16041                                                               HDA_INPUT));
16042                         if (err < 0)
16043                                 return err;
16044                 } else {
16045                         const char *pfx;
16046                         if (cfg->line_outs == 1 &&
16047                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
16048                                 if (!cfg->hp_pins)
16049                                         pfx = "Speaker";
16050                                 else
16051                                         pfx = "PCM";
16052                         } else
16053                                 pfx = chname[i];
16054                         err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16055                                           HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
16056                                                               HDA_OUTPUT));
16057                         if (err < 0)
16058                                 return err;
16059                         if (cfg->line_outs == 1 &&
16060                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
16061                                 pfx = "Speaker";
16062                         err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16063                                           HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
16064                                                               HDA_INPUT));
16065                         if (err < 0)
16066                                 return err;
16067                 }
16068         }
16069         return 0;
16070 }
16071
16072 /* add playback controls for speaker and HP outputs */
16073 /* Based on ALC880 version. But ALC861VD has separate,
16074  * different NIDs for mute/unmute switch and volume control */
16075 static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
16076                                         hda_nid_t pin, const char *pfx)
16077 {
16078         hda_nid_t nid_v, nid_s;
16079         int err;
16080
16081         if (!pin)
16082                 return 0;
16083
16084         if (alc880_is_fixed_pin(pin)) {
16085                 nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
16086                 /* specify the DAC as the extra output */
16087                 if (!spec->multiout.hp_nid)
16088                         spec->multiout.hp_nid = nid_v;
16089                 else
16090                         spec->multiout.extra_out_nid[0] = nid_v;
16091                 /* control HP volume/switch on the output mixer amp */
16092                 nid_v = alc861vd_idx_to_mixer_vol(
16093                                 alc880_fixed_pin_idx(pin));
16094                 nid_s = alc861vd_idx_to_mixer_switch(
16095                                 alc880_fixed_pin_idx(pin));
16096
16097                 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16098                                   HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
16099                 if (err < 0)
16100                         return err;
16101                 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16102                                   HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
16103                 if (err < 0)
16104                         return err;
16105         } else if (alc880_is_multi_pin(pin)) {
16106                 /* set manual connection */
16107                 /* we have only a switch on HP-out PIN */
16108                 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
16109                                   HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
16110                 if (err < 0)
16111                         return err;
16112         }
16113         return 0;
16114 }
16115
16116 /* parse the BIOS configuration and set up the alc_spec
16117  * return 1 if successful, 0 if the proper config is not found,
16118  * or a negative error code
16119  * Based on ALC880 version - had to change it to override
16120  * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
16121 static int alc861vd_parse_auto_config(struct hda_codec *codec)
16122 {
16123         struct alc_spec *spec = codec->spec;
16124         int err;
16125         static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
16126
16127         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
16128                                            alc861vd_ignore);
16129         if (err < 0)
16130                 return err;
16131         if (!spec->autocfg.line_outs)
16132                 return 0; /* can't find valid BIOS pin config */
16133
16134         err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
16135         if (err < 0)
16136                 return err;
16137         err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
16138         if (err < 0)
16139                 return err;
16140         err = alc861vd_auto_create_extra_out(spec,
16141                                              spec->autocfg.speaker_pins[0],
16142                                              "Speaker");
16143         if (err < 0)
16144                 return err;
16145         err = alc861vd_auto_create_extra_out(spec,
16146                                              spec->autocfg.hp_pins[0],
16147                                              "Headphone");
16148         if (err < 0)
16149                 return err;
16150         err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
16151         if (err < 0)
16152                 return err;
16153
16154         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
16155
16156         if (spec->autocfg.dig_outs)
16157                 spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID;
16158
16159         if (spec->kctls.list)
16160                 add_mixer(spec, spec->kctls.list);
16161
16162         add_verb(spec, alc861vd_volume_init_verbs);
16163
16164         spec->num_mux_defs = 1;
16165         spec->input_mux = &spec->private_imux[0];
16166
16167         err = alc_auto_add_mic_boost(codec);
16168         if (err < 0)
16169                 return err;
16170
16171         alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
16172
16173         return 1;
16174 }
16175
16176 /* additional initialization for auto-configuration model */
16177 static void alc861vd_auto_init(struct hda_codec *codec)
16178 {
16179         struct alc_spec *spec = codec->spec;
16180         alc861vd_auto_init_multi_out(codec);
16181         alc861vd_auto_init_hp_out(codec);
16182         alc861vd_auto_init_analog_input(codec);
16183         alc861vd_auto_init_input_src(codec);
16184         if (spec->unsol_event)
16185                 alc_inithook(codec);
16186 }
16187
16188 enum {
16189         ALC660VD_FIX_ASUS_GPIO1
16190 };
16191
16192 /* reset GPIO1 */
16193 static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
16194         {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
16195         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
16196         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
16197         { }
16198 };
16199
16200 static const struct alc_fixup alc861vd_fixups[] = {
16201         [ALC660VD_FIX_ASUS_GPIO1] = {
16202                 .verbs = alc660vd_fix_asus_gpio1_verbs,
16203         },
16204 };
16205
16206 static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
16207         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
16208         {}
16209 };
16210
16211 static int patch_alc861vd(struct hda_codec *codec)
16212 {
16213         struct alc_spec *spec;
16214         int err, board_config;
16215
16216         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
16217         if (spec == NULL)
16218                 return -ENOMEM;
16219
16220         codec->spec = spec;
16221
16222         board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
16223                                                   alc861vd_models,
16224                                                   alc861vd_cfg_tbl);
16225
16226         if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
16227                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
16228                        codec->chip_name);
16229                 board_config = ALC861VD_AUTO;
16230         }
16231
16232         alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups);
16233
16234         if (board_config == ALC861VD_AUTO) {
16235                 /* automatic parse from the BIOS config */
16236                 err = alc861vd_parse_auto_config(codec);
16237                 if (err < 0) {
16238                         alc_free(codec);
16239                         return err;
16240                 } else if (!err) {
16241                         printk(KERN_INFO
16242                                "hda_codec: Cannot set up configuration "
16243                                "from BIOS.  Using base mode...\n");
16244                         board_config = ALC861VD_3ST;
16245                 }
16246         }
16247
16248         err = snd_hda_attach_beep_device(codec, 0x23);
16249         if (err < 0) {
16250                 alc_free(codec);
16251                 return err;
16252         }
16253
16254         if (board_config != ALC861VD_AUTO)
16255                 setup_preset(codec, &alc861vd_presets[board_config]);
16256
16257         if (codec->vendor_id == 0x10ec0660) {
16258                 /* always turn on EAPD */
16259                 add_verb(spec, alc660vd_eapd_verbs);
16260         }
16261
16262         spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
16263         spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
16264
16265         spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
16266         spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
16267
16268         if (!spec->adc_nids) {
16269                 spec->adc_nids = alc861vd_adc_nids;
16270                 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
16271         }
16272         if (!spec->capsrc_nids)
16273                 spec->capsrc_nids = alc861vd_capsrc_nids;
16274
16275         set_capture_mixer(codec);
16276         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
16277
16278         spec->vmaster_nid = 0x02;
16279
16280         codec->patch_ops = alc_patch_ops;
16281
16282         if (board_config == ALC861VD_AUTO)
16283                 spec->init_hook = alc861vd_auto_init;
16284 #ifdef CONFIG_SND_HDA_POWER_SAVE
16285         if (!spec->loopback.amplist)
16286                 spec->loopback.amplist = alc861vd_loopbacks;
16287 #endif
16288
16289         return 0;
16290 }
16291
16292 /*
16293  * ALC662 support
16294  *
16295  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
16296  * configuration.  Each pin widget can choose any input DACs and a mixer.
16297  * Each ADC is connected from a mixer of all inputs.  This makes possible
16298  * 6-channel independent captures.
16299  *
16300  * In addition, an independent DAC for the multi-playback (not used in this
16301  * driver yet).
16302  */
16303 #define ALC662_DIGOUT_NID       0x06
16304 #define ALC662_DIGIN_NID        0x0a
16305
16306 static hda_nid_t alc662_dac_nids[4] = {
16307         /* front, rear, clfe, rear_surr */
16308         0x02, 0x03, 0x04
16309 };
16310
16311 static hda_nid_t alc272_dac_nids[2] = {
16312         0x02, 0x03
16313 };
16314
16315 static hda_nid_t alc662_adc_nids[2] = {
16316         /* ADC1-2 */
16317         0x09, 0x08
16318 };
16319
16320 static hda_nid_t alc272_adc_nids[1] = {
16321         /* ADC1-2 */
16322         0x08,
16323 };
16324
16325 static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
16326 static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
16327
16328
16329 /* input MUX */
16330 /* FIXME: should be a matrix-type input source selection */
16331 static struct hda_input_mux alc662_capture_source = {
16332         .num_items = 4,
16333         .items = {
16334                 { "Mic", 0x0 },
16335                 { "Front Mic", 0x1 },
16336                 { "Line", 0x2 },
16337                 { "CD", 0x4 },
16338         },
16339 };
16340
16341 static struct hda_input_mux alc662_lenovo_101e_capture_source = {
16342         .num_items = 2,
16343         .items = {
16344                 { "Mic", 0x1 },
16345                 { "Line", 0x2 },
16346         },
16347 };
16348
16349 static struct hda_input_mux alc663_capture_source = {
16350         .num_items = 3,
16351         .items = {
16352                 { "Mic", 0x0 },
16353                 { "Front Mic", 0x1 },
16354                 { "Line", 0x2 },
16355         },
16356 };
16357
16358 #if 0 /* set to 1 for testing other input sources below */
16359 static struct hda_input_mux alc272_nc10_capture_source = {
16360         .num_items = 16,
16361         .items = {
16362                 { "Autoselect Mic", 0x0 },
16363                 { "Internal Mic", 0x1 },
16364                 { "In-0x02", 0x2 },
16365                 { "In-0x03", 0x3 },
16366                 { "In-0x04", 0x4 },
16367                 { "In-0x05", 0x5 },
16368                 { "In-0x06", 0x6 },
16369                 { "In-0x07", 0x7 },
16370                 { "In-0x08", 0x8 },
16371                 { "In-0x09", 0x9 },
16372                 { "In-0x0a", 0x0a },
16373                 { "In-0x0b", 0x0b },
16374                 { "In-0x0c", 0x0c },
16375                 { "In-0x0d", 0x0d },
16376                 { "In-0x0e", 0x0e },
16377                 { "In-0x0f", 0x0f },
16378         },
16379 };
16380 #endif
16381
16382 /*
16383  * 2ch mode
16384  */
16385 static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
16386         { 2, NULL }
16387 };
16388
16389 /*
16390  * 2ch mode
16391  */
16392 static struct hda_verb alc662_3ST_ch2_init[] = {
16393         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
16394         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16395         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
16396         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16397         { } /* end */
16398 };
16399
16400 /*
16401  * 6ch mode
16402  */
16403 static struct hda_verb alc662_3ST_ch6_init[] = {
16404         { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16405         { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16406         { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
16407         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16408         { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16409         { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
16410         { } /* end */
16411 };
16412
16413 static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
16414         { 2, alc662_3ST_ch2_init },
16415         { 6, alc662_3ST_ch6_init },
16416 };
16417
16418 /*
16419  * 2ch mode
16420  */
16421 static struct hda_verb alc662_sixstack_ch6_init[] = {
16422         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16423         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16424         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16425         { } /* end */
16426 };
16427
16428 /*
16429  * 6ch mode
16430  */
16431 static struct hda_verb alc662_sixstack_ch8_init[] = {
16432         { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16433         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16434         { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16435         { } /* end */
16436 };
16437
16438 static struct hda_channel_mode alc662_5stack_modes[2] = {
16439         { 2, alc662_sixstack_ch6_init },
16440         { 6, alc662_sixstack_ch8_init },
16441 };
16442
16443 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
16444  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
16445  */
16446
16447 static struct snd_kcontrol_new alc662_base_mixer[] = {
16448         /* output mixer control */
16449         HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
16450         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16451         HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
16452         HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16453         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16454         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16455         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16456         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16457         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16458
16459         /*Input mixer control */
16460         HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
16461         HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
16462         HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
16463         HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
16464         HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
16465         HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
16466         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
16467         HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
16468         { } /* end */
16469 };
16470
16471 static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
16472         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16473         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16474         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16475         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16476         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16477         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16478         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16479         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16480         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16481         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16482         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16483         { } /* end */
16484 };
16485
16486 static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
16487         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16488         HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16489         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16490         HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16491         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16492         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16493         HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16494         HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16495         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16496         HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16497         HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16498         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16499         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16500         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16501         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16502         HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16503         HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16504         { } /* end */
16505 };
16506
16507 static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
16508         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16509         HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
16510         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16511         HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
16512         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16513         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16514         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16515         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16516         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16517         { } /* end */
16518 };
16519
16520 static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
16521         HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16522         ALC262_HIPPO_MASTER_SWITCH,
16523
16524         HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
16525         HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16526         HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16527
16528         HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
16529         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16530         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16531         { } /* end */
16532 };
16533
16534 static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
16535         ALC262_HIPPO_MASTER_SWITCH,
16536         HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16537         HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16538         HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16539         HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16540         HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
16541         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16542         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16543         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16544         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16545         { } /* end */
16546 };
16547
16548 static struct hda_bind_ctls alc663_asus_bind_master_vol = {
16549         .ops = &snd_hda_bind_vol,
16550         .values = {
16551                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16552                 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
16553                 0
16554         },
16555 };
16556
16557 static struct hda_bind_ctls alc663_asus_one_bind_switch = {
16558         .ops = &snd_hda_bind_sw,
16559         .values = {
16560                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16561                 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16562                 0
16563         },
16564 };
16565
16566 static struct snd_kcontrol_new alc663_m51va_mixer[] = {
16567         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16568         HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
16569         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16570         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16571         { } /* end */
16572 };
16573
16574 static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
16575         .ops = &snd_hda_bind_sw,
16576         .values = {
16577                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16578                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16579                 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16580                 0
16581         },
16582 };
16583
16584 static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
16585         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16586         HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
16587         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16588         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16589         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16590         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16591
16592         { } /* end */
16593 };
16594
16595 static struct hda_bind_ctls alc663_asus_four_bind_switch = {
16596         .ops = &snd_hda_bind_sw,
16597         .values = {
16598                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16599                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16600                 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16601                 0
16602         },
16603 };
16604
16605 static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
16606         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16607         HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
16608         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16609         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16610         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16611         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16612         { } /* end */
16613 };
16614
16615 static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
16616         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16617         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16618         HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16619         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16620         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16621         HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16622         HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16623         { } /* end */
16624 };
16625
16626 static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
16627         .ops = &snd_hda_bind_vol,
16628         .values = {
16629                 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16630                 HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
16631                 0
16632         },
16633 };
16634
16635 static struct hda_bind_ctls alc663_asus_two_bind_switch = {
16636         .ops = &snd_hda_bind_sw,
16637         .values = {
16638                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16639                 HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
16640                 0
16641         },
16642 };
16643
16644 static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
16645         HDA_BIND_VOL("Master Playback Volume",
16646                                 &alc663_asus_two_bind_master_vol),
16647         HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16648         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16649         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16650         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16651         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16652         { } /* end */
16653 };
16654
16655 static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
16656         HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16657         HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16658         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16659         HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16660         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16661         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16662         { } /* end */
16663 };
16664
16665 static struct snd_kcontrol_new alc663_g71v_mixer[] = {
16666         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16667         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16668         HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16669         HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16670         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16671
16672         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16673         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16674         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16675         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16676         { } /* end */
16677 };
16678
16679 static struct snd_kcontrol_new alc663_g50v_mixer[] = {
16680         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16681         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16682         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16683
16684         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16685         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16686         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16687         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16688         HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16689         HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16690         { } /* end */
16691 };
16692
16693 static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
16694         .ops = &snd_hda_bind_sw,
16695         .values = {
16696                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16697                 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16698                 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
16699                 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16700                 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16701                 0
16702         },
16703 };
16704
16705 static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
16706         .ops = &snd_hda_bind_sw,
16707         .values = {
16708                 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16709                 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
16710                 0
16711         },
16712 };
16713
16714 static struct snd_kcontrol_new alc663_mode7_mixer[] = {
16715         HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
16716         HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
16717         HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
16718         HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16719         HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16720         HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16721         HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16722         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16723         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16724         { } /* end */
16725 };
16726
16727 static struct snd_kcontrol_new alc663_mode8_mixer[] = {
16728         HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
16729         HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
16730         HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
16731         HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16732         HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16733         HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16734         HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16735         { } /* end */
16736 };
16737
16738
16739 static struct snd_kcontrol_new alc662_chmode_mixer[] = {
16740         {
16741                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
16742                 .name = "Channel Mode",
16743                 .info = alc_ch_mode_info,
16744                 .get = alc_ch_mode_get,
16745                 .put = alc_ch_mode_put,
16746         },
16747         { } /* end */
16748 };
16749
16750 static struct hda_verb alc662_init_verbs[] = {
16751         /* ADC: mute amp left and right */
16752         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16753         {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16754
16755         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16756         {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16757         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16758         {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16759         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16760         {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16761
16762         /* Front Pin: output 0 (0x0c) */
16763         {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16764         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16765
16766         /* Rear Pin: output 1 (0x0d) */
16767         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16768         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16769
16770         /* CLFE Pin: output 2 (0x0e) */
16771         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16772         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16773
16774         /* Mic (rear) pin: input vref at 80% */
16775         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16776         {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16777         /* Front Mic pin: input vref at 80% */
16778         {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16779         {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16780         /* Line In pin: input */
16781         {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16782         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16783         /* Line-2 In: Headphone output (output 0 - 0x0c) */
16784         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16785         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16786         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16787         /* CD pin widget for input */
16788         {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16789
16790         /* FIXME: use matrix-type input source selection */
16791         /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
16792         /* Input mixer */
16793         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16794         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16795
16796         /* always trun on EAPD */
16797         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16798         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16799
16800         { }
16801 };
16802
16803 static struct hda_verb alc663_init_verbs[] = {
16804         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16805         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16806         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16807         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16808         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16809         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16810         { }
16811 };
16812
16813 static struct hda_verb alc272_init_verbs[] = {
16814         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16815         {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16816         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16817         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16818         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16819         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16820         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16821         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16822         { }
16823 };
16824
16825 static struct hda_verb alc662_sue_init_verbs[] = {
16826         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16827         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
16828         {}
16829 };
16830
16831 static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
16832         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16833         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16834         {}
16835 };
16836
16837 /* Set Unsolicited Event*/
16838 static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
16839         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16840         {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16841         {}
16842 };
16843
16844 static struct hda_verb alc663_m51va_init_verbs[] = {
16845         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16846         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16847         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16848         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16849         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16850         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16851         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16852         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16853         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16854         {}
16855 };
16856
16857 static struct hda_verb alc663_21jd_amic_init_verbs[] = {
16858         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16859         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16860         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16861         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16862         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16863         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16864         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16865         {}
16866 };
16867
16868 static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
16869         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16870         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16871         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16872         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
16873         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16874         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16875         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16876         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16877         {}
16878 };
16879
16880 static struct hda_verb alc663_15jd_amic_init_verbs[] = {
16881         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16882         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16883         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16884         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16885         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16886         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16887         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16888         {}
16889 };
16890
16891 static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
16892         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16893         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16894         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16895         {0x21, AC_VERB_SET_CONNECT_SEL, 0x0},   /* Headphone */
16896         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16897         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16898         {0x15, AC_VERB_SET_CONNECT_SEL, 0x0},   /* Headphone */
16899         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16900         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16901         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16902         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16903         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16904         {}
16905 };
16906
16907 static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
16908         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16909         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16910         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16911         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16912         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16913         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16914         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16915         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16916         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16917         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16918         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16919         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16920         {}
16921 };
16922
16923 static struct hda_verb alc663_g71v_init_verbs[] = {
16924         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16925         /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
16926         /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
16927
16928         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16929         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16930         {0x21, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
16931
16932         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16933         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
16934         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
16935         {}
16936 };
16937
16938 static struct hda_verb alc663_g50v_init_verbs[] = {
16939         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16940         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16941         {0x21, AC_VERB_SET_CONNECT_SEL, 0x00},  /* Headphone */
16942
16943         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16944         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16945         {}
16946 };
16947
16948 static struct hda_verb alc662_ecs_init_verbs[] = {
16949         {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
16950         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16951         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16952         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16953         {}
16954 };
16955
16956 static struct hda_verb alc272_dell_zm1_init_verbs[] = {
16957         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16958         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16959         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16960         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16961         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16962         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16963         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16964         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16965         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16966         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16967         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16968         {}
16969 };
16970
16971 static struct hda_verb alc272_dell_init_verbs[] = {
16972         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16973         {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16974         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16975         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16976         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16977         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16978         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16979         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16980         {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16981         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16982         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16983         {}
16984 };
16985
16986 static struct hda_verb alc663_mode7_init_verbs[] = {
16987         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16988         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16989         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16990         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16991         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16992         {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16993         {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
16994         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16995         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16996         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
16997         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16998         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16999         {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17000         {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17001         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17002         {}
17003 };
17004
17005 static struct hda_verb alc663_mode8_init_verbs[] = {
17006         {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17007         {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17008         {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17009         {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
17010         {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17011         {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17012         {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17013         {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17014         {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17015         {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17016         {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},  /* Headphone */
17017         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17018         {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17019         {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17020         {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17021         {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17022         {}
17023 };
17024
17025 static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
17026         HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
17027         HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
17028         { } /* end */
17029 };
17030
17031 static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
17032         HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
17033         HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
17034         { } /* end */
17035 };
17036
17037 static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
17038 {
17039         unsigned int present;
17040         unsigned char bits;
17041
17042         present = snd_hda_jack_detect(codec, 0x14);
17043         bits = present ? HDA_AMP_MUTE : 0;
17044
17045         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17046                                  HDA_AMP_MUTE, bits);
17047 }
17048
17049 static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
17050 {
17051         unsigned int present;
17052         unsigned char bits;
17053
17054         present = snd_hda_jack_detect(codec, 0x1b);
17055         bits = present ? HDA_AMP_MUTE : 0;
17056
17057         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17058                                  HDA_AMP_MUTE, bits);
17059         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17060                                  HDA_AMP_MUTE, bits);
17061 }
17062
17063 static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
17064                                            unsigned int res)
17065 {
17066         if ((res >> 26) == ALC880_HP_EVENT)
17067                 alc662_lenovo_101e_all_automute(codec);
17068         if ((res >> 26) == ALC880_FRONT_EVENT)
17069                 alc662_lenovo_101e_ispeaker_automute(codec);
17070 }
17071
17072 /* unsolicited event for HP jack sensing */
17073 static void alc662_eeepc_unsol_event(struct hda_codec *codec,
17074                                      unsigned int res)
17075 {
17076         if ((res >> 26) == ALC880_MIC_EVENT)
17077                 alc_mic_automute(codec);
17078         else
17079                 alc262_hippo_unsol_event(codec, res);
17080 }
17081
17082 static void alc662_eeepc_setup(struct hda_codec *codec)
17083 {
17084         struct alc_spec *spec = codec->spec;
17085
17086         alc262_hippo1_setup(codec);
17087         spec->ext_mic.pin = 0x18;
17088         spec->ext_mic.mux_idx = 0;
17089         spec->int_mic.pin = 0x19;
17090         spec->int_mic.mux_idx = 1;
17091         spec->auto_mic = 1;
17092 }
17093
17094 static void alc662_eeepc_inithook(struct hda_codec *codec)
17095 {
17096         alc262_hippo_automute(codec);
17097         alc_mic_automute(codec);
17098 }
17099
17100 static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
17101 {
17102         struct alc_spec *spec = codec->spec;
17103
17104         spec->autocfg.hp_pins[0] = 0x14;
17105         spec->autocfg.speaker_pins[0] = 0x1b;
17106 }
17107
17108 #define alc662_eeepc_ep20_inithook      alc262_hippo_master_update
17109
17110 static void alc663_m51va_speaker_automute(struct hda_codec *codec)
17111 {
17112         unsigned int present;
17113         unsigned char bits;
17114
17115         present = snd_hda_jack_detect(codec, 0x21);
17116         bits = present ? HDA_AMP_MUTE : 0;
17117         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17118                                 AMP_IN_MUTE(0), bits);
17119         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17120                                 AMP_IN_MUTE(0), bits);
17121 }
17122
17123 static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
17124 {
17125         unsigned int present;
17126         unsigned char bits;
17127
17128         present = snd_hda_jack_detect(codec, 0x21);
17129         bits = present ? HDA_AMP_MUTE : 0;
17130         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17131                                 AMP_IN_MUTE(0), bits);
17132         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17133                                 AMP_IN_MUTE(0), bits);
17134         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
17135                                 AMP_IN_MUTE(0), bits);
17136         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17137                                 AMP_IN_MUTE(0), bits);
17138 }
17139
17140 static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
17141 {
17142         unsigned int present;
17143         unsigned char bits;
17144
17145         present = snd_hda_jack_detect(codec, 0x15);
17146         bits = present ? HDA_AMP_MUTE : 0;
17147         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17148                                 AMP_IN_MUTE(0), bits);
17149         snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17150                                 AMP_IN_MUTE(0), bits);
17151         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
17152                                 AMP_IN_MUTE(0), bits);
17153         snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17154                                 AMP_IN_MUTE(0), bits);
17155 }
17156
17157 static void alc662_f5z_speaker_automute(struct hda_codec *codec)
17158 {
17159         unsigned int present;
17160         unsigned char bits;
17161
17162         present = snd_hda_jack_detect(codec, 0x1b);
17163         bits = present ? 0 : PIN_OUT;
17164         snd_hda_codec_write(codec, 0x14, 0,
17165                          AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
17166 }
17167
17168 static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
17169 {
17170         unsigned int present1, present2;
17171
17172         present1 = snd_hda_jack_detect(codec, 0x21);
17173         present2 = snd_hda_jack_detect(codec, 0x15);
17174
17175         if (present1 || present2) {
17176                 snd_hda_codec_write_cache(codec, 0x14, 0,
17177                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17178         } else {
17179                 snd_hda_codec_write_cache(codec, 0x14, 0,
17180                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17181         }
17182 }
17183
17184 static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
17185 {
17186         unsigned int present1, present2;
17187
17188         present1 = snd_hda_jack_detect(codec, 0x1b);
17189         present2 = snd_hda_jack_detect(codec, 0x15);
17190
17191         if (present1 || present2) {
17192                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17193                                 AMP_IN_MUTE(0), AMP_IN_MUTE(0));
17194                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17195                                 AMP_IN_MUTE(0), AMP_IN_MUTE(0));
17196         } else {
17197                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17198                                 AMP_IN_MUTE(0), 0);
17199                 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17200                                 AMP_IN_MUTE(0), 0);
17201         }
17202 }
17203
17204 static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
17205 {
17206         unsigned int present1, present2;
17207
17208         present1 = snd_hda_codec_read(codec, 0x1b, 0,
17209                         AC_VERB_GET_PIN_SENSE, 0)
17210                         & AC_PINSENSE_PRESENCE;
17211         present2 = snd_hda_codec_read(codec, 0x21, 0,
17212                         AC_VERB_GET_PIN_SENSE, 0)
17213                         & AC_PINSENSE_PRESENCE;
17214
17215         if (present1 || present2) {
17216                 snd_hda_codec_write_cache(codec, 0x14, 0,
17217                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17218                 snd_hda_codec_write_cache(codec, 0x17, 0,
17219                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17220         } else {
17221                 snd_hda_codec_write_cache(codec, 0x14, 0,
17222                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17223                 snd_hda_codec_write_cache(codec, 0x17, 0,
17224                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17225         }
17226 }
17227
17228 static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
17229 {
17230         unsigned int present1, present2;
17231
17232         present1 = snd_hda_codec_read(codec, 0x21, 0,
17233                         AC_VERB_GET_PIN_SENSE, 0)
17234                         & AC_PINSENSE_PRESENCE;
17235         present2 = snd_hda_codec_read(codec, 0x15, 0,
17236                         AC_VERB_GET_PIN_SENSE, 0)
17237                         & AC_PINSENSE_PRESENCE;
17238
17239         if (present1 || present2) {
17240                 snd_hda_codec_write_cache(codec, 0x14, 0,
17241                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17242                 snd_hda_codec_write_cache(codec, 0x17, 0,
17243                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17244         } else {
17245                 snd_hda_codec_write_cache(codec, 0x14, 0,
17246                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17247                 snd_hda_codec_write_cache(codec, 0x17, 0,
17248                         AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17249         }
17250 }
17251
17252 static void alc663_m51va_unsol_event(struct hda_codec *codec,
17253                                            unsigned int res)
17254 {
17255         switch (res >> 26) {
17256         case ALC880_HP_EVENT:
17257                 alc663_m51va_speaker_automute(codec);
17258                 break;
17259         case ALC880_MIC_EVENT:
17260                 alc_mic_automute(codec);
17261                 break;
17262         }
17263 }
17264
17265 static void alc663_m51va_setup(struct hda_codec *codec)
17266 {
17267         struct alc_spec *spec = codec->spec;
17268         spec->ext_mic.pin = 0x18;
17269         spec->ext_mic.mux_idx = 0;
17270         spec->int_mic.pin = 0x12;
17271         spec->int_mic.mux_idx = 9;
17272         spec->auto_mic = 1;
17273 }
17274
17275 static void alc663_m51va_inithook(struct hda_codec *codec)
17276 {
17277         alc663_m51va_speaker_automute(codec);
17278         alc_mic_automute(codec);
17279 }
17280
17281 /* ***************** Mode1 ******************************/
17282 #define alc663_mode1_unsol_event        alc663_m51va_unsol_event
17283
17284 static void alc663_mode1_setup(struct hda_codec *codec)
17285 {
17286         struct alc_spec *spec = codec->spec;
17287         spec->ext_mic.pin = 0x18;
17288         spec->ext_mic.mux_idx = 0;
17289         spec->int_mic.pin = 0x19;
17290         spec->int_mic.mux_idx = 1;
17291         spec->auto_mic = 1;
17292 }
17293
17294 #define alc663_mode1_inithook           alc663_m51va_inithook
17295
17296 /* ***************** Mode2 ******************************/
17297 static void alc662_mode2_unsol_event(struct hda_codec *codec,
17298                                            unsigned int res)
17299 {
17300         switch (res >> 26) {
17301         case ALC880_HP_EVENT:
17302                 alc662_f5z_speaker_automute(codec);
17303                 break;
17304         case ALC880_MIC_EVENT:
17305                 alc_mic_automute(codec);
17306                 break;
17307         }
17308 }
17309
17310 #define alc662_mode2_setup      alc663_mode1_setup
17311
17312 static void alc662_mode2_inithook(struct hda_codec *codec)
17313 {
17314         alc662_f5z_speaker_automute(codec);
17315         alc_mic_automute(codec);
17316 }
17317 /* ***************** Mode3 ******************************/
17318 static void alc663_mode3_unsol_event(struct hda_codec *codec,
17319                                            unsigned int res)
17320 {
17321         switch (res >> 26) {
17322         case ALC880_HP_EVENT:
17323                 alc663_two_hp_m1_speaker_automute(codec);
17324                 break;
17325         case ALC880_MIC_EVENT:
17326                 alc_mic_automute(codec);
17327                 break;
17328         }
17329 }
17330
17331 #define alc663_mode3_setup      alc663_mode1_setup
17332
17333 static void alc663_mode3_inithook(struct hda_codec *codec)
17334 {
17335         alc663_two_hp_m1_speaker_automute(codec);
17336         alc_mic_automute(codec);
17337 }
17338 /* ***************** Mode4 ******************************/
17339 static void alc663_mode4_unsol_event(struct hda_codec *codec,
17340                                            unsigned int res)
17341 {
17342         switch (res >> 26) {
17343         case ALC880_HP_EVENT:
17344                 alc663_21jd_two_speaker_automute(codec);
17345                 break;
17346         case ALC880_MIC_EVENT:
17347                 alc_mic_automute(codec);
17348                 break;
17349         }
17350 }
17351
17352 #define alc663_mode4_setup      alc663_mode1_setup
17353
17354 static void alc663_mode4_inithook(struct hda_codec *codec)
17355 {
17356         alc663_21jd_two_speaker_automute(codec);
17357         alc_mic_automute(codec);
17358 }
17359 /* ***************** Mode5 ******************************/
17360 static void alc663_mode5_unsol_event(struct hda_codec *codec,
17361                                            unsigned int res)
17362 {
17363         switch (res >> 26) {
17364         case ALC880_HP_EVENT:
17365                 alc663_15jd_two_speaker_automute(codec);
17366                 break;
17367         case ALC880_MIC_EVENT:
17368                 alc_mic_automute(codec);
17369                 break;
17370         }
17371 }
17372
17373 #define alc663_mode5_setup      alc663_mode1_setup
17374
17375 static void alc663_mode5_inithook(struct hda_codec *codec)
17376 {
17377         alc663_15jd_two_speaker_automute(codec);
17378         alc_mic_automute(codec);
17379 }
17380 /* ***************** Mode6 ******************************/
17381 static void alc663_mode6_unsol_event(struct hda_codec *codec,
17382                                            unsigned int res)
17383 {
17384         switch (res >> 26) {
17385         case ALC880_HP_EVENT:
17386                 alc663_two_hp_m2_speaker_automute(codec);
17387                 break;
17388         case ALC880_MIC_EVENT:
17389                 alc_mic_automute(codec);
17390                 break;
17391         }
17392 }
17393
17394 #define alc663_mode6_setup      alc663_mode1_setup
17395
17396 static void alc663_mode6_inithook(struct hda_codec *codec)
17397 {
17398         alc663_two_hp_m2_speaker_automute(codec);
17399         alc_mic_automute(codec);
17400 }
17401
17402 /* ***************** Mode7 ******************************/
17403 static void alc663_mode7_unsol_event(struct hda_codec *codec,
17404                                            unsigned int res)
17405 {
17406         switch (res >> 26) {
17407         case ALC880_HP_EVENT:
17408                 alc663_two_hp_m7_speaker_automute(codec);
17409                 break;
17410         case ALC880_MIC_EVENT:
17411                 alc_mic_automute(codec);
17412                 break;
17413         }
17414 }
17415
17416 #define alc663_mode7_setup      alc663_mode1_setup
17417
17418 static void alc663_mode7_inithook(struct hda_codec *codec)
17419 {
17420         alc663_two_hp_m7_speaker_automute(codec);
17421         alc_mic_automute(codec);
17422 }
17423
17424 /* ***************** Mode8 ******************************/
17425 static void alc663_mode8_unsol_event(struct hda_codec *codec,
17426                                            unsigned int res)
17427 {
17428         switch (res >> 26) {
17429         case ALC880_HP_EVENT:
17430                 alc663_two_hp_m8_speaker_automute(codec);
17431                 break;
17432         case ALC880_MIC_EVENT:
17433                 alc_mic_automute(codec);
17434                 break;
17435         }
17436 }
17437
17438 #define alc663_mode8_setup      alc663_m51va_setup
17439
17440 static void alc663_mode8_inithook(struct hda_codec *codec)
17441 {
17442         alc663_two_hp_m8_speaker_automute(codec);
17443         alc_mic_automute(codec);
17444 }
17445
17446 static void alc663_g71v_hp_automute(struct hda_codec *codec)
17447 {
17448         unsigned int present;
17449         unsigned char bits;
17450
17451         present = snd_hda_jack_detect(codec, 0x21);
17452         bits = present ? HDA_AMP_MUTE : 0;
17453         snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17454                                  HDA_AMP_MUTE, bits);
17455         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17456                                  HDA_AMP_MUTE, bits);
17457 }
17458
17459 static void alc663_g71v_front_automute(struct hda_codec *codec)
17460 {
17461         unsigned int present;
17462         unsigned char bits;
17463
17464         present = snd_hda_jack_detect(codec, 0x15);
17465         bits = present ? HDA_AMP_MUTE : 0;
17466         snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17467                                  HDA_AMP_MUTE, bits);
17468 }
17469
17470 static void alc663_g71v_unsol_event(struct hda_codec *codec,
17471                                            unsigned int res)
17472 {
17473         switch (res >> 26) {
17474         case ALC880_HP_EVENT:
17475                 alc663_g71v_hp_automute(codec);
17476                 break;
17477         case ALC880_FRONT_EVENT:
17478                 alc663_g71v_front_automute(codec);
17479                 break;
17480         case ALC880_MIC_EVENT:
17481                 alc_mic_automute(codec);
17482                 break;
17483         }
17484 }
17485
17486 #define alc663_g71v_setup       alc663_m51va_setup
17487
17488 static void alc663_g71v_inithook(struct hda_codec *codec)
17489 {
17490         alc663_g71v_front_automute(codec);
17491         alc663_g71v_hp_automute(codec);
17492         alc_mic_automute(codec);
17493 }
17494
17495 static void alc663_g50v_unsol_event(struct hda_codec *codec,
17496                                            unsigned int res)
17497 {
17498         switch (res >> 26) {
17499         case ALC880_HP_EVENT:
17500                 alc663_m51va_speaker_automute(codec);
17501                 break;
17502         case ALC880_MIC_EVENT:
17503                 alc_mic_automute(codec);
17504                 break;
17505         }
17506 }
17507
17508 #define alc663_g50v_setup       alc663_m51va_setup
17509
17510 static void alc663_g50v_inithook(struct hda_codec *codec)
17511 {
17512         alc663_m51va_speaker_automute(codec);
17513         alc_mic_automute(codec);
17514 }
17515
17516 static struct snd_kcontrol_new alc662_ecs_mixer[] = {
17517         HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17518         ALC262_HIPPO_MASTER_SWITCH,
17519
17520         HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
17521         HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
17522         HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
17523
17524         HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
17525         HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17526         HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17527         { } /* end */
17528 };
17529
17530 static struct snd_kcontrol_new alc272_nc10_mixer[] = {
17531         /* Master Playback automatically created from Speaker and Headphone */
17532         HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17533         HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17534         HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17535         HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17536
17537         HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17538         HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17539         HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
17540
17541         HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17542         HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17543         HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
17544         { } /* end */
17545 };
17546
17547 #ifdef CONFIG_SND_HDA_POWER_SAVE
17548 #define alc662_loopbacks        alc880_loopbacks
17549 #endif
17550
17551
17552 /* pcm configuration: identical with ALC880 */
17553 #define alc662_pcm_analog_playback      alc880_pcm_analog_playback
17554 #define alc662_pcm_analog_capture       alc880_pcm_analog_capture
17555 #define alc662_pcm_digital_playback     alc880_pcm_digital_playback
17556 #define alc662_pcm_digital_capture      alc880_pcm_digital_capture
17557
17558 /*
17559  * configuration and preset
17560  */
17561 static const char *alc662_models[ALC662_MODEL_LAST] = {
17562         [ALC662_3ST_2ch_DIG]    = "3stack-dig",
17563         [ALC662_3ST_6ch_DIG]    = "3stack-6ch-dig",
17564         [ALC662_3ST_6ch]        = "3stack-6ch",
17565         [ALC662_5ST_DIG]        = "6stack-dig",
17566         [ALC662_LENOVO_101E]    = "lenovo-101e",
17567         [ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
17568         [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
17569         [ALC662_ECS] = "ecs",
17570         [ALC663_ASUS_M51VA] = "m51va",
17571         [ALC663_ASUS_G71V] = "g71v",
17572         [ALC663_ASUS_H13] = "h13",
17573         [ALC663_ASUS_G50V] = "g50v",
17574         [ALC663_ASUS_MODE1] = "asus-mode1",
17575         [ALC662_ASUS_MODE2] = "asus-mode2",
17576         [ALC663_ASUS_MODE3] = "asus-mode3",
17577         [ALC663_ASUS_MODE4] = "asus-mode4",
17578         [ALC663_ASUS_MODE5] = "asus-mode5",
17579         [ALC663_ASUS_MODE6] = "asus-mode6",
17580         [ALC663_ASUS_MODE7] = "asus-mode7",
17581         [ALC663_ASUS_MODE8] = "asus-mode8",
17582         [ALC272_DELL]           = "dell",
17583         [ALC272_DELL_ZM1]       = "dell-zm1",
17584         [ALC272_SAMSUNG_NC10]   = "samsung-nc10",
17585         [ALC662_AUTO]           = "auto",
17586 };
17587
17588 static struct snd_pci_quirk alc662_cfg_tbl[] = {
17589         SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
17590         SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
17591         SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
17592         SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
17593         SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
17594         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1),
17595         SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
17596         SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
17597         SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
17598         SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
17599         SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
17600         SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
17601         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
17602         SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
17603         SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
17604         SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
17605         SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
17606         SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
17607         SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
17608         SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
17609         SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
17610         SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
17611         SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
17612         SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
17613         SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
17614         SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
17615         SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
17616         SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
17617         SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
17618         SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
17619         SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
17620         SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
17621         SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
17622         SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
17623         SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
17624         SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
17625         SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
17626         /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
17627         SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
17628         SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
17629         SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
17630         SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1),
17631         SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
17632         SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
17633         SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
17634         SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
17635         SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
17636         SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
17637         SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
17638         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
17639         SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
17640         SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
17641         SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
17642         /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
17643         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
17644         SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
17645         SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
17646         SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
17647         SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
17648         SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
17649         SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
17650         SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
17651         SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
17652         SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
17653                       ALC662_3ST_6ch_DIG),
17654         SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
17655         SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
17656         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
17657                       ALC662_3ST_6ch_DIG),
17658         SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13),
17659         SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
17660         SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
17661         SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
17662         SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
17663                                         ALC662_3ST_6ch_DIG),
17664         SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
17665                            ALC663_ASUS_H13),
17666         SND_PCI_QUIRK(0x8086, 0xd604, "Intel mobo", ALC662_3ST_2ch_DIG),
17667         {}
17668 };
17669
17670 static struct alc_config_preset alc662_presets[] = {
17671         [ALC662_3ST_2ch_DIG] = {
17672                 .mixers = { alc662_3ST_2ch_mixer },
17673                 .init_verbs = { alc662_init_verbs },
17674                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17675                 .dac_nids = alc662_dac_nids,
17676                 .dig_out_nid = ALC662_DIGOUT_NID,
17677                 .dig_in_nid = ALC662_DIGIN_NID,
17678                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17679                 .channel_mode = alc662_3ST_2ch_modes,
17680                 .input_mux = &alc662_capture_source,
17681         },
17682         [ALC662_3ST_6ch_DIG] = {
17683                 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
17684                 .init_verbs = { alc662_init_verbs },
17685                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17686                 .dac_nids = alc662_dac_nids,
17687                 .dig_out_nid = ALC662_DIGOUT_NID,
17688                 .dig_in_nid = ALC662_DIGIN_NID,
17689                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17690                 .channel_mode = alc662_3ST_6ch_modes,
17691                 .need_dac_fix = 1,
17692                 .input_mux = &alc662_capture_source,
17693         },
17694         [ALC662_3ST_6ch] = {
17695                 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
17696                 .init_verbs = { alc662_init_verbs },
17697                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17698                 .dac_nids = alc662_dac_nids,
17699                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17700                 .channel_mode = alc662_3ST_6ch_modes,
17701                 .need_dac_fix = 1,
17702                 .input_mux = &alc662_capture_source,
17703         },
17704         [ALC662_5ST_DIG] = {
17705                 .mixers = { alc662_base_mixer, alc662_chmode_mixer },
17706                 .init_verbs = { alc662_init_verbs },
17707                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17708                 .dac_nids = alc662_dac_nids,
17709                 .dig_out_nid = ALC662_DIGOUT_NID,
17710                 .dig_in_nid = ALC662_DIGIN_NID,
17711                 .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
17712                 .channel_mode = alc662_5stack_modes,
17713                 .input_mux = &alc662_capture_source,
17714         },
17715         [ALC662_LENOVO_101E] = {
17716                 .mixers = { alc662_lenovo_101e_mixer },
17717                 .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
17718                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17719                 .dac_nids = alc662_dac_nids,
17720                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17721                 .channel_mode = alc662_3ST_2ch_modes,
17722                 .input_mux = &alc662_lenovo_101e_capture_source,
17723                 .unsol_event = alc662_lenovo_101e_unsol_event,
17724                 .init_hook = alc662_lenovo_101e_all_automute,
17725         },
17726         [ALC662_ASUS_EEEPC_P701] = {
17727                 .mixers = { alc662_eeepc_p701_mixer },
17728                 .init_verbs = { alc662_init_verbs,
17729                                 alc662_eeepc_sue_init_verbs },
17730                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17731                 .dac_nids = alc662_dac_nids,
17732                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17733                 .channel_mode = alc662_3ST_2ch_modes,
17734                 .unsol_event = alc662_eeepc_unsol_event,
17735                 .setup = alc662_eeepc_setup,
17736                 .init_hook = alc662_eeepc_inithook,
17737         },
17738         [ALC662_ASUS_EEEPC_EP20] = {
17739                 .mixers = { alc662_eeepc_ep20_mixer,
17740                             alc662_chmode_mixer },
17741                 .init_verbs = { alc662_init_verbs,
17742                                 alc662_eeepc_ep20_sue_init_verbs },
17743                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17744                 .dac_nids = alc662_dac_nids,
17745                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17746                 .channel_mode = alc662_3ST_6ch_modes,
17747                 .input_mux = &alc662_lenovo_101e_capture_source,
17748                 .unsol_event = alc662_eeepc_unsol_event,
17749                 .setup = alc662_eeepc_ep20_setup,
17750                 .init_hook = alc662_eeepc_ep20_inithook,
17751         },
17752         [ALC662_ECS] = {
17753                 .mixers = { alc662_ecs_mixer },
17754                 .init_verbs = { alc662_init_verbs,
17755                                 alc662_ecs_init_verbs },
17756                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17757                 .dac_nids = alc662_dac_nids,
17758                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17759                 .channel_mode = alc662_3ST_2ch_modes,
17760                 .unsol_event = alc662_eeepc_unsol_event,
17761                 .setup = alc662_eeepc_setup,
17762                 .init_hook = alc662_eeepc_inithook,
17763         },
17764         [ALC663_ASUS_M51VA] = {
17765                 .mixers = { alc663_m51va_mixer },
17766                 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
17767                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17768                 .dac_nids = alc662_dac_nids,
17769                 .dig_out_nid = ALC662_DIGOUT_NID,
17770                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17771                 .channel_mode = alc662_3ST_2ch_modes,
17772                 .unsol_event = alc663_m51va_unsol_event,
17773                 .setup = alc663_m51va_setup,
17774                 .init_hook = alc663_m51va_inithook,
17775         },
17776         [ALC663_ASUS_G71V] = {
17777                 .mixers = { alc663_g71v_mixer },
17778                 .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
17779                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17780                 .dac_nids = alc662_dac_nids,
17781                 .dig_out_nid = ALC662_DIGOUT_NID,
17782                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17783                 .channel_mode = alc662_3ST_2ch_modes,
17784                 .unsol_event = alc663_g71v_unsol_event,
17785                 .setup = alc663_g71v_setup,
17786                 .init_hook = alc663_g71v_inithook,
17787         },
17788         [ALC663_ASUS_H13] = {
17789                 .mixers = { alc663_m51va_mixer },
17790                 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
17791                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17792                 .dac_nids = alc662_dac_nids,
17793                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17794                 .channel_mode = alc662_3ST_2ch_modes,
17795                 .unsol_event = alc663_m51va_unsol_event,
17796                 .init_hook = alc663_m51va_inithook,
17797         },
17798         [ALC663_ASUS_G50V] = {
17799                 .mixers = { alc663_g50v_mixer },
17800                 .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
17801                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17802                 .dac_nids = alc662_dac_nids,
17803                 .dig_out_nid = ALC662_DIGOUT_NID,
17804                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17805                 .channel_mode = alc662_3ST_6ch_modes,
17806                 .input_mux = &alc663_capture_source,
17807                 .unsol_event = alc663_g50v_unsol_event,
17808                 .setup = alc663_g50v_setup,
17809                 .init_hook = alc663_g50v_inithook,
17810         },
17811         [ALC663_ASUS_MODE1] = {
17812                 .mixers = { alc663_m51va_mixer },
17813                 .cap_mixer = alc662_auto_capture_mixer,
17814                 .init_verbs = { alc662_init_verbs,
17815                                 alc663_21jd_amic_init_verbs },
17816                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17817                 .hp_nid = 0x03,
17818                 .dac_nids = alc662_dac_nids,
17819                 .dig_out_nid = ALC662_DIGOUT_NID,
17820                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17821                 .channel_mode = alc662_3ST_2ch_modes,
17822                 .unsol_event = alc663_mode1_unsol_event,
17823                 .setup = alc663_mode1_setup,
17824                 .init_hook = alc663_mode1_inithook,
17825         },
17826         [ALC662_ASUS_MODE2] = {
17827                 .mixers = { alc662_1bjd_mixer },
17828                 .cap_mixer = alc662_auto_capture_mixer,
17829                 .init_verbs = { alc662_init_verbs,
17830                                 alc662_1bjd_amic_init_verbs },
17831                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17832                 .dac_nids = alc662_dac_nids,
17833                 .dig_out_nid = ALC662_DIGOUT_NID,
17834                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17835                 .channel_mode = alc662_3ST_2ch_modes,
17836                 .unsol_event = alc662_mode2_unsol_event,
17837                 .setup = alc662_mode2_setup,
17838                 .init_hook = alc662_mode2_inithook,
17839         },
17840         [ALC663_ASUS_MODE3] = {
17841                 .mixers = { alc663_two_hp_m1_mixer },
17842                 .cap_mixer = alc662_auto_capture_mixer,
17843                 .init_verbs = { alc662_init_verbs,
17844                                 alc663_two_hp_amic_m1_init_verbs },
17845                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17846                 .hp_nid = 0x03,
17847                 .dac_nids = alc662_dac_nids,
17848                 .dig_out_nid = ALC662_DIGOUT_NID,
17849                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17850                 .channel_mode = alc662_3ST_2ch_modes,
17851                 .unsol_event = alc663_mode3_unsol_event,
17852                 .setup = alc663_mode3_setup,
17853                 .init_hook = alc663_mode3_inithook,
17854         },
17855         [ALC663_ASUS_MODE4] = {
17856                 .mixers = { alc663_asus_21jd_clfe_mixer },
17857                 .cap_mixer = alc662_auto_capture_mixer,
17858                 .init_verbs = { alc662_init_verbs,
17859                                 alc663_21jd_amic_init_verbs},
17860                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17861                 .hp_nid = 0x03,
17862                 .dac_nids = alc662_dac_nids,
17863                 .dig_out_nid = ALC662_DIGOUT_NID,
17864                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17865                 .channel_mode = alc662_3ST_2ch_modes,
17866                 .unsol_event = alc663_mode4_unsol_event,
17867                 .setup = alc663_mode4_setup,
17868                 .init_hook = alc663_mode4_inithook,
17869         },
17870         [ALC663_ASUS_MODE5] = {
17871                 .mixers = { alc663_asus_15jd_clfe_mixer },
17872                 .cap_mixer = alc662_auto_capture_mixer,
17873                 .init_verbs = { alc662_init_verbs,
17874                                 alc663_15jd_amic_init_verbs },
17875                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17876                 .hp_nid = 0x03,
17877                 .dac_nids = alc662_dac_nids,
17878                 .dig_out_nid = ALC662_DIGOUT_NID,
17879                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17880                 .channel_mode = alc662_3ST_2ch_modes,
17881                 .unsol_event = alc663_mode5_unsol_event,
17882                 .setup = alc663_mode5_setup,
17883                 .init_hook = alc663_mode5_inithook,
17884         },
17885         [ALC663_ASUS_MODE6] = {
17886                 .mixers = { alc663_two_hp_m2_mixer },
17887                 .cap_mixer = alc662_auto_capture_mixer,
17888                 .init_verbs = { alc662_init_verbs,
17889                                 alc663_two_hp_amic_m2_init_verbs },
17890                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17891                 .hp_nid = 0x03,
17892                 .dac_nids = alc662_dac_nids,
17893                 .dig_out_nid = ALC662_DIGOUT_NID,
17894                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17895                 .channel_mode = alc662_3ST_2ch_modes,
17896                 .unsol_event = alc663_mode6_unsol_event,
17897                 .setup = alc663_mode6_setup,
17898                 .init_hook = alc663_mode6_inithook,
17899         },
17900         [ALC663_ASUS_MODE7] = {
17901                 .mixers = { alc663_mode7_mixer },
17902                 .cap_mixer = alc662_auto_capture_mixer,
17903                 .init_verbs = { alc662_init_verbs,
17904                                 alc663_mode7_init_verbs },
17905                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17906                 .hp_nid = 0x03,
17907                 .dac_nids = alc662_dac_nids,
17908                 .dig_out_nid = ALC662_DIGOUT_NID,
17909                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17910                 .channel_mode = alc662_3ST_2ch_modes,
17911                 .unsol_event = alc663_mode7_unsol_event,
17912                 .setup = alc663_mode7_setup,
17913                 .init_hook = alc663_mode7_inithook,
17914         },
17915         [ALC663_ASUS_MODE8] = {
17916                 .mixers = { alc663_mode8_mixer },
17917                 .cap_mixer = alc662_auto_capture_mixer,
17918                 .init_verbs = { alc662_init_verbs,
17919                                 alc663_mode8_init_verbs },
17920                 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17921                 .hp_nid = 0x03,
17922                 .dac_nids = alc662_dac_nids,
17923                 .dig_out_nid = ALC662_DIGOUT_NID,
17924                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17925                 .channel_mode = alc662_3ST_2ch_modes,
17926                 .unsol_event = alc663_mode8_unsol_event,
17927                 .setup = alc663_mode8_setup,
17928                 .init_hook = alc663_mode8_inithook,
17929         },
17930         [ALC272_DELL] = {
17931                 .mixers = { alc663_m51va_mixer },
17932                 .cap_mixer = alc272_auto_capture_mixer,
17933                 .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
17934                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17935                 .dac_nids = alc662_dac_nids,
17936                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17937                 .adc_nids = alc272_adc_nids,
17938                 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
17939                 .capsrc_nids = alc272_capsrc_nids,
17940                 .channel_mode = alc662_3ST_2ch_modes,
17941                 .unsol_event = alc663_m51va_unsol_event,
17942                 .setup = alc663_m51va_setup,
17943                 .init_hook = alc663_m51va_inithook,
17944         },
17945         [ALC272_DELL_ZM1] = {
17946                 .mixers = { alc663_m51va_mixer },
17947                 .cap_mixer = alc662_auto_capture_mixer,
17948                 .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
17949                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17950                 .dac_nids = alc662_dac_nids,
17951                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17952                 .adc_nids = alc662_adc_nids,
17953                 .num_adc_nids = 1,
17954                 .capsrc_nids = alc662_capsrc_nids,
17955                 .channel_mode = alc662_3ST_2ch_modes,
17956                 .unsol_event = alc663_m51va_unsol_event,
17957                 .setup = alc663_m51va_setup,
17958                 .init_hook = alc663_m51va_inithook,
17959         },
17960         [ALC272_SAMSUNG_NC10] = {
17961                 .mixers = { alc272_nc10_mixer },
17962                 .init_verbs = { alc662_init_verbs,
17963                                 alc663_21jd_amic_init_verbs },
17964                 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17965                 .dac_nids = alc272_dac_nids,
17966                 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17967                 .channel_mode = alc662_3ST_2ch_modes,
17968                 /*.input_mux = &alc272_nc10_capture_source,*/
17969                 .unsol_event = alc663_mode4_unsol_event,
17970                 .setup = alc663_mode4_setup,
17971                 .init_hook = alc663_mode4_inithook,
17972         },
17973 };
17974
17975
17976 /*
17977  * BIOS auto configuration
17978  */
17979
17980 /* convert from MIX nid to DAC */
17981 static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
17982 {
17983         if (nid == 0x0f)
17984                 return 0x02;
17985         else if (nid >= 0x0c && nid <= 0x0e)
17986                 return nid - 0x0c + 0x02;
17987         else
17988                 return 0;
17989 }
17990
17991 /* get MIX nid connected to the given pin targeted to DAC */
17992 static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
17993                                    hda_nid_t dac)
17994 {
17995         hda_nid_t mix[4];
17996         int i, num;
17997
17998         num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
17999         for (i = 0; i < num; i++) {
18000                 if (alc662_mix_to_dac(mix[i]) == dac)
18001                         return mix[i];
18002         }
18003         return 0;
18004 }
18005
18006 /* look for an empty DAC slot */
18007 static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
18008 {
18009         struct alc_spec *spec = codec->spec;
18010         hda_nid_t srcs[5];
18011         int i, j, num;
18012
18013         num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
18014         if (num < 0)
18015                 return 0;
18016         for (i = 0; i < num; i++) {
18017                 hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
18018                 if (!nid)
18019                         continue;
18020                 for (j = 0; j < spec->multiout.num_dacs; j++)
18021                         if (spec->multiout.dac_nids[j] == nid)
18022                                 break;
18023                 if (j >= spec->multiout.num_dacs)
18024                         return nid;
18025         }
18026         return 0;
18027 }
18028
18029 /* fill in the dac_nids table from the parsed pin configuration */
18030 static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
18031                                      const struct auto_pin_cfg *cfg)
18032 {
18033         struct alc_spec *spec = codec->spec;
18034         int i;
18035         hda_nid_t dac;
18036
18037         spec->multiout.dac_nids = spec->private_dac_nids;
18038         for (i = 0; i < cfg->line_outs; i++) {
18039                 dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
18040                 if (!dac)
18041                         continue;
18042                 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
18043         }
18044         return 0;
18045 }
18046
18047 static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
18048                               hda_nid_t nid, unsigned int chs)
18049 {
18050         return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
18051                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
18052 }
18053
18054 static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
18055                              hda_nid_t nid, unsigned int chs)
18056 {
18057         return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18058                            HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
18059 }
18060
18061 #define alc662_add_stereo_vol(spec, pfx, nid) \
18062         alc662_add_vol_ctl(spec, pfx, nid, 3)
18063 #define alc662_add_stereo_sw(spec, pfx, nid) \
18064         alc662_add_sw_ctl(spec, pfx, nid, 3)
18065
18066 /* add playback controls from the parsed DAC table */
18067 static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
18068                                              const struct auto_pin_cfg *cfg)
18069 {
18070         struct alc_spec *spec = codec->spec;
18071         static const char *chname[4] = {
18072                 "Front", "Surround", NULL /*CLFE*/, "Side"
18073         };
18074         hda_nid_t nid, mix;
18075         int i, err;
18076
18077         for (i = 0; i < cfg->line_outs; i++) {
18078                 nid = spec->multiout.dac_nids[i];
18079                 if (!nid)
18080                         continue;
18081                 mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
18082                 if (!mix)
18083                         continue;
18084                 if (i == 2) {
18085                         /* Center/LFE */
18086                         err = alc662_add_vol_ctl(spec, "Center", nid, 1);
18087                         if (err < 0)
18088                                 return err;
18089                         err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
18090                         if (err < 0)
18091                                 return err;
18092                         err = alc662_add_sw_ctl(spec, "Center", mix, 1);
18093                         if (err < 0)
18094                                 return err;
18095                         err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
18096                         if (err < 0)
18097                                 return err;
18098                 } else {
18099                         const char *pfx;
18100                         if (cfg->line_outs == 1 &&
18101                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
18102                                 if (cfg->hp_outs)
18103                                         pfx = "Speaker";
18104                                 else
18105                                         pfx = "PCM";
18106                         } else
18107                                 pfx = chname[i];
18108                         err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18109                         if (err < 0)
18110                                 return err;
18111                         if (cfg->line_outs == 1 &&
18112                             cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
18113                                 pfx = "Speaker";
18114                         err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18115                         if (err < 0)
18116                                 return err;
18117                 }
18118         }
18119         return 0;
18120 }
18121
18122 /* add playback controls for speaker and HP outputs */
18123 /* return DAC nid if any new DAC is assigned */
18124 static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
18125                                         const char *pfx)
18126 {
18127         struct alc_spec *spec = codec->spec;
18128         hda_nid_t nid, mix;
18129         int err;
18130
18131         if (!pin)
18132                 return 0;
18133         nid = alc662_look_for_dac(codec, pin);
18134         if (!nid) {
18135                 /* the corresponding DAC is already occupied */
18136                 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
18137                         return 0; /* no way */
18138                 /* create a switch only */
18139                 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18140                                    HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
18141         }
18142
18143         mix = alc662_dac_to_mix(codec, pin, nid);
18144         if (!mix)
18145                 return 0;
18146         err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18147         if (err < 0)
18148                 return err;
18149         err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18150         if (err < 0)
18151                 return err;
18152         return nid;
18153 }
18154
18155 /* create playback/capture controls for input pins */
18156 #define alc662_auto_create_input_ctls \
18157         alc882_auto_create_input_ctls
18158
18159 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
18160                                               hda_nid_t nid, int pin_type,
18161                                               hda_nid_t dac)
18162 {
18163         int i, num;
18164         hda_nid_t srcs[4];
18165
18166         alc_set_pin_output(codec, nid, pin_type);
18167         /* need the manual connection? */
18168         num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
18169         if (num <= 1)
18170                 return;
18171         for (i = 0; i < num; i++) {
18172                 if (alc662_mix_to_dac(srcs[i]) != dac)
18173                         continue;
18174                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
18175                 return;
18176         }
18177 }
18178
18179 static void alc662_auto_init_multi_out(struct hda_codec *codec)
18180 {
18181         struct alc_spec *spec = codec->spec;
18182         int pin_type = get_pin_type(spec->autocfg.line_out_type);
18183         int i;
18184
18185         for (i = 0; i <= HDA_SIDE; i++) {
18186                 hda_nid_t nid = spec->autocfg.line_out_pins[i];
18187                 if (nid)
18188                         alc662_auto_set_output_and_unmute(codec, nid, pin_type,
18189                                         spec->multiout.dac_nids[i]);
18190         }
18191 }
18192
18193 static void alc662_auto_init_hp_out(struct hda_codec *codec)
18194 {
18195         struct alc_spec *spec = codec->spec;
18196         hda_nid_t pin;
18197
18198         pin = spec->autocfg.hp_pins[0];
18199         if (pin)
18200                 alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
18201                                                   spec->multiout.hp_nid);
18202         pin = spec->autocfg.speaker_pins[0];
18203         if (pin)
18204                 alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
18205                                         spec->multiout.extra_out_nid[0]);
18206 }
18207
18208 #define ALC662_PIN_CD_NID               ALC880_PIN_CD_NID
18209
18210 static void alc662_auto_init_analog_input(struct hda_codec *codec)
18211 {
18212         struct alc_spec *spec = codec->spec;
18213         int i;
18214
18215         for (i = 0; i < AUTO_PIN_LAST; i++) {
18216                 hda_nid_t nid = spec->autocfg.input_pins[i];
18217                 if (alc_is_input_pin(codec, nid)) {
18218                         alc_set_input_pin(codec, nid, i);
18219                         if (nid != ALC662_PIN_CD_NID &&
18220                             (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
18221                                 snd_hda_codec_write(codec, nid, 0,
18222                                                     AC_VERB_SET_AMP_GAIN_MUTE,
18223                                                     AMP_OUT_MUTE);
18224                 }
18225         }
18226 }
18227
18228 #define alc662_auto_init_input_src      alc882_auto_init_input_src
18229
18230 static int alc662_parse_auto_config(struct hda_codec *codec)
18231 {
18232         struct alc_spec *spec = codec->spec;
18233         int err;
18234         static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
18235
18236         err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
18237                                            alc662_ignore);
18238         if (err < 0)
18239                 return err;
18240         if (!spec->autocfg.line_outs)
18241                 return 0; /* can't find valid BIOS pin config */
18242
18243         err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
18244         if (err < 0)
18245                 return err;
18246         err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
18247         if (err < 0)
18248                 return err;
18249         err = alc662_auto_create_extra_out(codec,
18250                                            spec->autocfg.speaker_pins[0],
18251                                            "Speaker");
18252         if (err < 0)
18253                 return err;
18254         if (err)
18255                 spec->multiout.extra_out_nid[0] = err;
18256         err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
18257                                            "Headphone");
18258         if (err < 0)
18259                 return err;
18260         if (err)
18261                 spec->multiout.hp_nid = err;
18262         err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
18263         if (err < 0)
18264                 return err;
18265
18266         spec->multiout.max_channels = spec->multiout.num_dacs * 2;
18267
18268         if (spec->autocfg.dig_outs)
18269                 spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
18270
18271         if (spec->kctls.list)
18272                 add_mixer(spec, spec->kctls.list);
18273
18274         spec->num_mux_defs = 1;
18275         spec->input_mux = &spec->private_imux[0];
18276
18277         add_verb(spec, alc662_init_verbs);
18278         if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18279             codec->vendor_id == 0x10ec0665)
18280                 add_verb(spec, alc663_init_verbs);
18281
18282         if (codec->vendor_id == 0x10ec0272)
18283                 add_verb(spec, alc272_init_verbs);
18284
18285         err = alc_auto_add_mic_boost(codec);
18286         if (err < 0)
18287                 return err;
18288
18289         if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18290             codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
18291             alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0x21);
18292         else
18293             alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
18294
18295         return 1;
18296 }
18297
18298 /* additional initialization for auto-configuration model */
18299 static void alc662_auto_init(struct hda_codec *codec)
18300 {
18301         struct alc_spec *spec = codec->spec;
18302         alc662_auto_init_multi_out(codec);
18303         alc662_auto_init_hp_out(codec);
18304         alc662_auto_init_analog_input(codec);
18305         alc662_auto_init_input_src(codec);
18306         if (spec->unsol_event)
18307                 alc_inithook(codec);
18308 }
18309
18310 static int patch_alc662(struct hda_codec *codec)
18311 {
18312         struct alc_spec *spec;
18313         int err, board_config;
18314
18315         spec = kzalloc(sizeof(*spec), GFP_KERNEL);
18316         if (!spec)
18317                 return -ENOMEM;
18318
18319         codec->spec = spec;
18320
18321         alc_fix_pll_init(codec, 0x20, 0x04, 15);
18322
18323         if (alc_read_coef_idx(codec, 0)==0x8020){
18324                 kfree(codec->chip_name);
18325                 codec->chip_name = kstrdup("ALC661", GFP_KERNEL);
18326                 if (!codec->chip_name) {
18327                         alc_free(codec);
18328                         return -ENOMEM;
18329                 }
18330         }
18331
18332         board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
18333                                                   alc662_models,
18334                                                   alc662_cfg_tbl);
18335         if (board_config < 0) {
18336                 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
18337                        codec->chip_name);
18338                 board_config = ALC662_AUTO;
18339         }
18340
18341         if (board_config == ALC662_AUTO) {
18342                 /* automatic parse from the BIOS config */
18343                 err = alc662_parse_auto_config(codec);
18344                 if (err < 0) {
18345                         alc_free(codec);
18346                         return err;
18347                 } else if (!err) {
18348                         printk(KERN_INFO
18349                                "hda_codec: Cannot set up configuration "
18350                                "from BIOS.  Using base mode...\n");
18351                         board_config = ALC662_3ST_2ch_DIG;
18352                 }
18353         }
18354
18355         err = snd_hda_attach_beep_device(codec, 0x1);
18356         if (err < 0) {
18357                 alc_free(codec);
18358                 return err;
18359         }
18360
18361         if (board_config != ALC662_AUTO)
18362                 setup_preset(codec, &alc662_presets[board_config]);
18363
18364         spec->stream_analog_playback = &alc662_pcm_analog_playback;
18365         spec->stream_analog_capture = &alc662_pcm_analog_capture;
18366
18367         spec->stream_digital_playback = &alc662_pcm_digital_playback;
18368         spec->stream_digital_capture = &alc662_pcm_digital_capture;
18369
18370         if (!spec->adc_nids) {
18371                 spec->adc_nids = alc662_adc_nids;
18372                 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
18373         }
18374         if (!spec->capsrc_nids)
18375                 spec->capsrc_nids = alc662_capsrc_nids;
18376
18377         if (!spec->cap_mixer)
18378                 set_capture_mixer(codec);
18379
18380         switch (codec->vendor_id) {
18381         case 0x10ec0662:
18382                 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
18383                 break;
18384         case 0x10ec0272:
18385         case 0x10ec0663:
18386         case 0x10ec0665:
18387                 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
18388                 break;
18389         case 0x10ec0273:
18390                 set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
18391                 break;
18392         }
18393         spec->vmaster_nid = 0x02;
18394
18395         codec->patch_ops = alc_patch_ops;
18396         if (board_config == ALC662_AUTO)
18397                 spec->init_hook = alc662_auto_init;
18398 #ifdef CONFIG_SND_HDA_POWER_SAVE
18399         if (!spec->loopback.amplist)
18400                 spec->loopback.amplist = alc662_loopbacks;
18401 #endif
18402
18403         return 0;
18404 }
18405
18406 static int patch_alc888(struct hda_codec *codec)
18407 {
18408         if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
18409                 kfree(codec->chip_name);
18410                 codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
18411                 if (!codec->chip_name) {
18412                         alc_free(codec);
18413                         return -ENOMEM;
18414                 }
18415                 return patch_alc662(codec);
18416         }
18417         return patch_alc882(codec);
18418 }
18419
18420 /*
18421  * patch entries
18422  */
18423 static struct hda_codec_preset snd_hda_preset_realtek[] = {
18424         { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
18425         { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
18426         { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
18427         { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
18428         { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
18429         { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
18430         { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
18431         { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
18432         { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
18433           .patch = patch_alc861 },
18434         { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
18435         { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
18436         { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
18437         { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
18438           .patch = patch_alc882 },
18439         { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
18440           .patch = patch_alc662 },
18441         { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
18442         { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
18443         { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
18444         { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
18445         { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
18446         { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
18447         { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
18448           .patch = patch_alc882 },
18449         { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
18450           .patch = patch_alc882 },
18451         { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
18452         { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
18453         { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
18454           .patch = patch_alc882 },
18455         { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
18456         { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
18457         { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
18458         {} /* terminator */
18459 };
18460
18461 MODULE_ALIAS("snd-hda-codec-id:10ec*");
18462
18463 MODULE_LICENSE("GPL");
18464 MODULE_DESCRIPTION("Realtek HD-audio codec");
18465
18466 static struct hda_codec_preset_list realtek_list = {
18467         .preset = snd_hda_preset_realtek,
18468         .owner = THIS_MODULE,
18469 };
18470
18471 static int __init patch_realtek_init(void)
18472 {
18473         return snd_hda_add_codec_preset(&realtek_list);
18474 }
18475
18476 static void __exit patch_realtek_exit(void)
18477 {
18478         snd_hda_delete_codec_preset(&realtek_list);
18479 }
18480
18481 module_init(patch_realtek_init)
18482 module_exit(patch_realtek_exit)